合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# 数学和加密函数(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,附录提供了一个例子. `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](http://me.tryblockchain.org/web3js-sign-ecrecover-decode.html)