如何区分合约地址还是普通账号地址?

  • Tiny熊
  • 更新于 2019-09-17 11:25
  • 阅读 12296

如何区分合约地址还是普通账号地址?

如何区分合约地址还是普通账号地址?

我们经常有需要区分一个地址是合约地址还是外部账号地址,区分的关键是看这个地址有没有与之相关联的代码。 EVM提供了一个操作码EXTCODESIZE,用来获取地址相关联的代码大小(长度),如果是外部账号地址,则没有代码返回。因此我们可以使用以下方法判断合约地址及外部账号地址:

  function isContract(address addr) internal view returns (bool) {
    uint256 size;
    assembly { size := extcodesize(addr) }
    return size > 0;
  }

如果是在合约外部判断,则可以使用web3.eth.getCode(),或者是对应的JSON-RPC方法eth_getcode。 getCode()用来获取参数地址所对应合约的代码,如果参数是一个外部账号地址,则返回"0x";如果参数是合约,则返回对应的字节码,如下所示:

web3.eth.getCode("0xa5Acc472597C1e1651270da9081Cc5a0b38258E3") "0x"

web3.eth.getCode("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8")

"0x600160008035811a818181146012578301005b601b6001356025565b8060005260206000f25b600060078202905091905056"

这样我们就可以通过getCode()的内容判断是哪一种地址了。

点赞 0
收藏 0
分享

0 条评论

请先 登录 后评论
Tiny熊
Tiny熊
0x1231...6564
登链社区发起人 登链团队对 DEFI 应用有深刻的理解和丰富的开发经验,如果你有开发、审计、培训合作等需求, 加我微信:xlbxiong 。 咨询问题在问答区提问即可,微信好友太多,不看问题,请凉解~