数学和加密函数(Mathematical and Cryptographic Functions)
asser(bool condition)
:
如果条件不满足,抛出异常。
addmod(uint x, uint y, uint k) returns (uint)
:
计算(x + y) % k
。加法支持任意的精度。但不超过(wrap around?)2**256
。
mulmod(uint x, uint y, uint k) returns (uint)
:
计算(x * y) % k
。乘法支持任意精度,但不超过(wrap around?)2**256
。
keccak256(...) returns (bytes32)
:
使用以太坊的(Keccak-256)计算HASH值。紧密打包。
sha3(...) returns (bytes32)
:
等同于keccak256()
。紧密打包。
sha256(...) returns (bytes32)
:
使用SHA-256计算HASH值。紧密打包。
ripemd160(...) returns (bytes20)
:
使用RIPEMD-160计算HASH值。紧密打包。
ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)
:
通过签名信息恢复非对称加密算法公匙地址。如果出错会返回0,附录提供了一个例子1.
revert()
:
取消执行,并回撤状态变化。
需要注意的是参数是“紧密打包(tightly packed)”的,意思是说参数不会补位,就直接连接在一起的。下面来看一个例子:
keccak256("ab", "c")
keccak256("abc")
//hex
keccak256(0x616263)
keccak256(6382179)
//ascii
keccak256(97, 98, 99)
上述例子中,三种表达方式都是一致的。
如果需要补位,需要明确的类型转换,如keccak256("\x00\x12")
等同于keccak256(uint16(0x12))
需要注意的是字面量会用,尽可能小的空间来存储它们。比如,keccak256(0) == keccak256(uint8(0))
,keccak256(0x12345678) == keccak256(uint32(0x12345678))
在私链(private blockchain)
上运行sha256
,ripemd160
或ecrecover
可能会出现Out-Of-Gas
报错。因为它们实现了一种预编译的机制,但合约要在收到第一个消息后才会存在。向一个不存在的合约发送消息,非常昂贵,所以才会导致Out-Of-Gas
的问题。一种解决办法是每个在你真正使用它们前,先发送1 wei
到这些合约上来完成初始化。在官方和测试链上没有这个问题。
参考资料
使用ecrecover实现签名检验的例子。http://me.tryblockchain.org/web3js-sign-ecrecover-decode.html ↩