数学和密码函数
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)
计算在哪里以任意精度执行乘法并且不会在 处回绕。断言从版本 0.5.0 开始。
(x * y) % k
2**256
k != 0
keccak256(bytes memory) returns (bytes32)
计算输入的 Keccak-256 哈希
笔记
曾经有一个keccak256被调用的别名sha3,在 0.5.0 版本中被删除。
sha256(bytes memory) returns (bytes32)
计算输入的 SHA-256 哈希
ripemd160(bytes memory) returns (bytes20)
计算输入的 RIPEMD-160 哈希
ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)
从椭圆曲线签名中恢复与公钥关联的地址或在错误时返回零。函数参数对应签名的 ECDSA 值:
r
= 签名的前 32 个字节s
= 第二个 32 字节的签名v
= 签名的最后 1 个字节
ecrecover
返回一个address
,而不是一个。请参阅应付转换地址,以防您需要将资金转移到恢复的地址。address payable
有关更多详细信息,请阅读示例用法。
警告
如果您使用ecrecover,请注意可以将有效签名转换为不同的有效签名,而无需知道相应的私钥。在 Homestead 硬分叉中,此问题已针对 _transaction_ 签名(请参阅EIP-2)进行了修复,但 ecrecover 功能保持不变。
这通常不是问题,除非您要求签名是唯一的或使用它们来识别项目。OpenZeppelin 有一个ECDSA 帮助程序库,您可以将其用作包装器而ecrecover不会出现此问题。
笔记
在运行或在私有区块链sha256上运行时,您可能会遇到 Out-of-Gas。这是因为这些功能是作为“预编译合约”实现的,并且只有在它们收到第一条消息后才真正存在(尽管它们的合约代码是硬编码的)。不存在的合约的消息更昂贵,因此执行可能会遇到 Out-of-Gas 错误。此问题的解决方法是先将 Wei(例如 1)发送到每个合同,然后再将它们用于实际合同。这在主网上或测试网上都不是问题。ripemd160ecrecover