地址类型的成员
<address>.balance
(uint256
)-
魏地址余额
<address>.code
( )bytes memory
-
地址处的代码(可以为空)
<address>.codehash
(bytes32
)-
地址的代码哈希
<address payable>.transfer(uint256 amount)
-
将给定数量的 Wei 发送到Address,失败时恢复,转发 2300 gas 津贴,不可调整
<address payable>.send(uint256 amount) returns (bool)
-
发送给定数量的 Wei 到地址
false
,失败返回,转发 2300 gas 津贴,不可调整 <address>.call(bytes memory) returns (bool, bytes memory)
-
使用给定的有效载荷发出低级
CALL
,返回成功条件和返回数据,转发所有可用的气体,可调 <address>.delegatecall(bytes memory) returns (bool, bytes memory)
-
使用给定的有效载荷发出低级
DELEGATECALL
,返回成功条件和返回数据,转发所有可用的气体,可调 <address>.staticcall(bytes memory) returns (bool, bytes memory)
-
使用给定的有效载荷发出低级
STATICCALL
,返回成功条件和返回数据,转发所有可用的气体,可调
有关详细信息,请参阅地址部分。
警告
在执行另一个合约函数时应尽可能避免使用.call(),因为它会绕过类型检查、函数存在检查和参数打包。
警告
使用 有一些危险send:如果调用堆栈深度为 1024,则传输失败(这总是由调用者强制执行的),如果接收者用完 gas,它也会失败。因此,为了进行安全的 Ether 转账,请始终检查 的返回值send,使用transfer甚至更好:使用收款人取款的模式。
警告
由于 EVM 认为对不存在的合约的调用总是成功的,Solidity 包括extcodesize在执行外部调用时使用操作码的额外检查。这确保了即将被调用的合约要么实际存在(它包含代码),要么引发异常。
.call()对地址而不是合约实例(即、 .delegatecall()、.staticcall()和).send()进行操作的低级调用不包括此检查,这使得它们在 gas 方面更便宜,但也不太安全。.transfer()
笔记
在 0.5.0 版本之前,Solidity 允许合约实例访问地址成员,例如this.balance. 现在这是禁止的,必须明确转换为地址:address(this).balance.
笔记
如果通过低级委托调用访问状态变量,则两个合约的存储布局必须对齐,以便被调用合约能够按名称正确访问调用合约的存储变量。如果存储指针作为函数参数传递,就像高级库的情况一样,情况当然不是这样。
笔记
在 0.5.0 版本之前,,.call只返回成功条件,不返回数据。.delegatecall.staticcall
笔记
在 0.5.0 版本之前,有一个成员调用callcode,其语义与delegatecall.