阅读(3873) (14)

数学和密码函数

2022-05-12 11:08:01 更新
addmod(uint x, uint y, uint k) returns (uint)

计算在哪里以任意精度执行加法并且不会在 (x + y) % k2**256k != 0

mulmod(uint x, uint y, uint k) returns (uint)

计算在哪里以任意精度执行乘法并且不会在 处回绕。断言从版本 0.5.0 开始。(x * y) % k2**256k != 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