由于版本更新比较快。过去一部分写法,现在使用0.5.10
版本开发合约时,部分报错。再去翻翻官方的最新的文档。
msg.sender
(address
) 消息发送者(当前调用)msg.value
(uint
) 随消息发送的 wei 的数量msg.data
(bytes
) 完整的 calldatamsg.gas
(uint
) 剩余 gas ,( 弃!)推荐使用gasleft()
msg.sig
(bytes4
) calldata 的前 4 字节(也就是函数标识符)tx.gasprice
(uint) 交易的 gas 价格tx.origin
(address) 交易发起者(完全的调用链)block.blockhash(uint blockNumber) (bytes32)
指定区块的区块哈希,仅可用于最新的 256 个区块且不包括当前区块,( 弃!)推荐使用blockhash(uint blockNumber)
block.coinbase
(address
): 挖出当前区块的矿工地址block.difficulty
(uint
): 当前区块难度block.gaslimit
(uint
): 当前区块 gas 限额block.number
(uint
): 当前区块号block.timestamp
(uint
): 自 unix epoch 起始当前区块以秒计的时间戳.balance
(uint256
): 以 Wei 为单位的地址类型的余额。.transfer(uint256 amount)
: 向地址类型发送数量为 amount 的 Wei,失败时抛出异常,发送 2300 gas 的矿工费,不可调节。.send(uint256 amount) returns (bool)
:向地址类型发送数量为 amount 的 Wei,失败时返回 false
,发送 2300 gas 的矿工费用,不可调节。.call(...) returns (bool)
: 发出低级函数 CALL
,失败时返回 false
,发送所有可用 gas,可调节。.callcode(...) returns (bool)
:已禁止使用。.delegatecall(...) returns (bool)
:发出低级函数 DELEGATECALL
,失败时返回 false
,发送所有可用 gas,可调节。now
(uint
): 目前区块时间戳(block.timestamp
)blockhash(uint blockNumber)returns(bytes32)
指定区块的区块哈希,限制256个之内gasleft() returns(uint)
剩余的 gas, (msg.gas
)staticcall()
doc
type(C).name
The name of the contract.type(C).creationCode
type(C).runtimeCode
abi.decode(bytes memory encodedData, (...)) returns (...)
解码一份已压缩的数据,类型在括号中作为第二个参数给出。
示例 (uint a, uint[2] memory b, bytes memory c) = abi.decode(data, (uint, uint[2], bytes))
abi.encode(...) returns (bytes memory)
对给定参数进行编码
abi.encodePacked(...) returns (bytes memory)
对给定参数执行 紧打包编码
abi.encodeWithSelector(bytes4 selector, ...) returns (bytes memory)
对给定参数进行编码,并以给定的函数选择器作为起始的 4 字节数据一起返回
abi.encodeWithSignature(string signature, ...) returns (bytes memory)
等价于 abi.encodeWithSelector(bytes4(keccak256(signature), ...)
assert
导致的交易失败,会扣取剩余的gas,其他的会返回剩余的gas
assert(bool condition)
条件不满足,则使当前交易没有效果,用于检查内部错误。require(bool condition)
条件不满足则撤销状态更改,用于检查由输入或者外部组件引起的错误。require(bool condition, string message)
,上同,可以同时提供一个错误消息。revert()
终止运行并撤销状态更改。revert(string reason)
终止运行并撤销状态更改,可以同时提供一个解释性的字符串。代表本合约的地址
使用继承层次结构中更高一级(父类)的合约的方法。
selfdestruct(address payable recipient)
销毁合约,并把余额发送到指定地址。
addmod(uint x, uint y, uint k) returns (uint)
计算 (x + y) % k
,加法会在任意精度下执行,并且加法的结果即使超过 2**256
也不会被截取。从 0.5.0 版本的编译器开始会加入对 k != 0
的校验(assert)。
mulmod(uint x, uint y, uint k) returns (uint)
计算 (x * y) % k
,乘法会在任意精度下执行,并且乘法的结果即使超过 2**256
也不会被截取。从 0.5.0 版本的编译器开始会加入对 k != 0
的校验(assert)。
keccak256(bytes memory) returns (bytes32)
计算Ethereum-SHA-3 (Keccak-256)哈希。(sha3
已放弃使用)
sha256(bytes memory) returns (bytes32)
计算 SHA-256 哈希。
ripemd160(bytes memory) returns (bytes20)
计算 RIPEMD-160 哈希。地址本身是用这个生成的。
Solidity官方文档