最全!Solidity全局变量及API

1. 区块和交易属性API

  1. blockhash(uint blockNumber)
  2. block.coinbash(address)
  3. block.difficulty(uint) 获得当前区块难度
  4. block.gaslimit(uint)
  5. block.number(uint)
  6. block.timestamp(uint)
  7. gasleft() returns(uint256)
  8. msg.data(bytes)
  9. msg.sender(address)
  10. msg.sig(byte4) 调用函数的标识符
  11. msg.value(uint)
  12. tx.gasprice(uint)
  13. tx.origin(address paybale) 交易起始发送者

2. ABI编码以及解码函数API

  1. 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))
  2. abi.decode(...) returns (bytes)对给定参数进行ABI编码,即上一个方法反向操作。

  3. abi.encodePacked(...) returns (bytes) 对给定参数进行ABI编码,不同的是:decode()函数会把参数填充到32字节长度,而该函数编码的参数会紧密地拼在一起。

  4. abi.encodeWithSelector(bytes4 selector, ...) returns (bytes) 从第二个参数开始ABI编码并在前面加上给定地函数选择器selector

  5. abi,encodeWithSignature(string signature, ...) returns (bytes) 等价于 abi.encodeWithSelector(bytes4(keccak256(signature)), ...)

    for example

    1
    2
    3
    4
    5
    payable(attackedContract).call(
    abi.encodeWithSignature(
    "withdraw(uint256)",
    address(attackedContract).balance
    ));

    等同于

    1
    2
    3
    4
    5
    payable(attackedContract).call(
    abi.encodeWithSelector(
    bytes4(keccak256("withdraw(uint256)")),
    address(attackedContract).balance
    ));

3. 数学和密码学函数API

  1. addmod(uint x,uint y, uint k) returns (uint)计算(x+y) % k,即先求和再求模,求和可以在任意精度下执行,和可以超过2的256次,会对k!=0做检查。

  2. mulmod(uint x,uint y, uint k) returns (uint) 计算(x*y) % k,即先乘再求模,同样可以在任意精度下执行,会对k!=0做检查。

  3. keccak256(bytes memory) returns (bytes32)用Keccak-256算法计算哈希。

  4. sha256(bytes memory) returns (bytes32) 计算SHA-256的哈希。

  5. ripemd160(bytes memory) returns (bytes20) 计算参数的RIPEMD-160哈希。

  6. ecrecover(bytes32 hash, uint8 v, byte32 r, bytes32 s) returns (address) 通过椭圆曲线签名恢复与公钥地址。

    r:签名的前32个字节;

    s:签名的第二个32个字节

    v:签名的最后一个字节;

参考书籍

  • 智能合约技术与开发 - 熊丽兵

最全!Solidity全局变量及API
http://nangbowan.github.io/2022/11/04/Solidity全局变量及API/
作者
Science_Jun
发布于
2022年11月4日
许可协议