一、下面是一些常用的數學函數,使用他們更加安全可靠

addmod(uint x, uint y, uint k) returns (uint): 計算 x + y 然後對 k 取模。

mulmod(uint x, uint y, uint k) returns (uint): 計算 x * y 然後對 k 取模。

二、hash函數相關API

hash函數又稱散列函數:任意長度輸入,通過散列算法(MD4、MD5、ripemd-160、SHA「Secure Hash Algorithm」密碼散列函數家族),變換成固定長度的輸出。

SHA家族:

SHA1:160位bit值,目前被證明不是特別安全,有可能不同輸入的值會得到同一個hash值

SHA2:SHA-224、SHA-256、SHA-384和SHA-512,後面不同的數字代表計算出的hash值長度

SHA3:Keccak算法

solidity提供了哪些hash函數呢?

keccak256(...) returns (bytes32): 基於Keccak-256哈希算法,計算不定長輸入的哈希值。

sha256(...) returns (bytes32): 基於SHA-256哈希算法,計算不定長輸入的哈希值。

ripemd160(...) returns (bytes20): 基於RIPEMD-160哈希算法,計算不定長輸入的哈希值。

sha3(...) returns (bytes32): 這實際上是對keccak256函數的別名,Solidity0.4.16及以後的版本不再建議使用該函數。

在solidity中的函數選擇器hash值就是用keccak256哈希算法計算出來的,取前4個字節的hash值作爲函數選擇器的標識

三、ecrecover函數

我們可以通過橢圓曲線簽名來恢復與公鑰關聯的地址,ecrecover(bytes32 hash,uint8 v,bytes32 r,bytes32 s)returns(address)

四個參數分別是:

hash:被簽名數據的hash值,r、s、v分別來自簽名結果串。

r = signature[0:64]

s = signature[64:128]

v = signature[128:130]+27