合约调用的边界情况
边界情况总是较少受到关注,更容易被忽视,但又对理解问题很关键。solidity合约调用的问题也是如此,几乎所有教程、文档都不提及。这对学习者、开发者很不利。所以说一下。
一个非合约的地址能够接受任何形式上正确的transaction。这实际上将没有代码的一个address当成消极被动的实体,一个白痴,它不懂如何拒绝。你去调用一个合约函数,地址搞错了,用了一个非合约地址,不要指望交易会revert。它总是成功的。
上一条说得非合约地址,并不意味着它是来自于一个公司钥对。它可能是任何一个160位的数据块。向这种地址转账,钱就进了黑洞。数量上这种黑洞地址远多于真实的外部账号地址。黑洞占统治地位。
发送到有代码的合约地址的交易,即合约调用,并不总是被接受(我们这里说的是被接受,并不一定成功执行),取决于合约的函数安排。自定义的函数只接受对应的selector的调用,receive用于拦截calldata为空的情况,fallback在receive之后兜底。如果value大于0,则要看上述链条解析出的接受者是否是payble。一个transaction在一个合约中可能找不到接受函数,这时调用失败。非合约地址就不会发生这种失败。这个过程很多开发者并未彻底搞清楚。
上面几条列一下,以为记