最全!Solidity全局变量及API
1. 区块和交易属性API
blockhash(uint blockNumber)
block.coinbash(address)
block.difficulty(uint)
获得当前区块难度block.gaslimit(uint)
block.number(uint)
block.timestamp(uint)
gasleft() returns(uint256)
msg.data(bytes)
msg.sender(address)
msg.sig(byte4)
调用函数的标识符msg.value(uint)
tx.gasprice(uint)
tx.origin(address paybale)
交易起始发送者
2. ABI编码以及解码函数API
abi.encode(bytes memory data,(...)) returns (...)
对给定的数据进行ABI解码,数据的类型又括号中的第二个参数给出。for example:
1
(uint a,uint[2] memory b,bytes memory c) = abi.decode(data,(uint,uint[2],bytes))
abi.decode(...) returns (bytes)
对给定参数进行ABI编码,即上一个方法反向操作。abi.encodePacked(...) returns (bytes)
对给定参数进行ABI编码,不同的是:decode()函数会把参数填充到32字节长度,而该函数编码的参数会紧密地拼在一起。abi.encodeWithSelector(bytes4 selector, ...) returns (bytes)
从第二个参数开始ABI编码并在前面加上给定地函数选择器selector
abi,encodeWithSignature(string signature, ...) returns (bytes)
等价于abi.encodeWithSelector(bytes4(keccak256(signature)), ...)
for example
1
2
3
4
5payable(attackedContract).call(
abi.encodeWithSignature(
"withdraw(uint256)",
address(attackedContract).balance
));等同于
1
2
3
4
5payable(attackedContract).call(
abi.encodeWithSelector(
bytes4(keccak256("withdraw(uint256)")),
address(attackedContract).balance
));
3. 数学和密码学函数API
addmod(uint x,uint y, uint k) returns (uint)
计算(x+y) % k,即先求和再求模,求和可以在任意精度下执行,和可以超过2的256次,会对k!=0做检查。mulmod(uint x,uint y, uint k) returns (uint)
计算(x*y) % k,即先乘再求模,同样可以在任意精度下执行,会对k!=0做检查。keccak256(bytes memory) returns (bytes32)
用Keccak-256算法计算哈希。sha256(bytes memory) returns (bytes32)
计算SHA-256的哈希。ripemd160(bytes memory) returns (bytes20)
计算参数的RIPEMD-160哈希。ecrecover(bytes32 hash, uint8 v, byte32 r, bytes32 s) returns (address)
通过椭圆曲线签名恢复与公钥地址。r:签名的前32个字节;
s:签名的第二个32个字节
v:签名的最后一个字节;
参考书籍
- 智能合约技术与开发 - 熊丽兵