在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地址。 那么,判断一个地址是否是合约地址的充分必要条件是什么呢?