15 判断一个地址是否是合约地址的充分必要条件是什么

在openzepplin中,其address.sol中,通过如下方式来判断一个地址是不是合约地址:

uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;

然而,这并不是一个充分必要条件,例如对于正在构建的合约,其合约地址对应的extcodesize就是0,但他是一个合约地址,不是EOA地址。 在黄皮书中,提到:

If the codeHash field is the Keccak-256 hash of the empty string, i.e. $\boldsymbol{\sigma}[a]_{\mathrm{c}} = \texttt{KEC}\big(()\big)$, then the node represents a simple account, sometimes referred to as a ``non-contract'' account

即:如果一个地址的codehash值等于keccak256(()), 则该地址是一个EOA地址。 那么,判断一个地址是否是合约地址的充分必要条件是什么呢?

请先 登录 后评论

最佳答案 2021-08-13 18:34

在 EVM 层面是不区分哪种地址的,没法找到这个 充分必要条件:

不过依然可以根据使用场景达到相应的目的:

如果你要限制一个函数只能由外部 EOA 访问(即不能由合约访问),你可以这样限定:

msg.sender == tx.origin

其他的场景下,只要使用 openzepplin 的 isContract 就可以。

请先 登录 后评论

其它 1 个回答

stirlingx - 去中心化搬砖工
请先 登录 后评论
  • 2 关注
  • 1 收藏,4395 浏览
  • bixia1994 提出于 2021-08-13 14:48