阅读(398) (12)

地址类型的成员

2022-05-12 11:08:26 更新
<address>.balanceuint256)

地址余额

<address>.code( )bytes memory

地址处的代码(可以为空)

<address>.codehashbytes32)

地址的代码哈希

<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.