solidity中的 Keccak SHA3算法 ,跟函数选择器的关系

Keccak 和 SHA3 的产生背景

最早出现并经常出现在大家视线中的是MD5,它是一种哈希算法。但是他被证明是不安全的,已出现碰撞。除了MD5,还有SHA1,SHA2,SHA3等等,现在最流行的安全且效率高的哈希算法是 SHA3-256。

在区块链技术中流行的哈希算法是SHA3,SHA3是美国国家标准技术研究所所设计的一套SHA哈希算法,SHA3它不是SHA2的替代品,而是一种有别于SHA2的全新哈希设计方案。在15年8月才最终被才被NIST正式批准的。

我们知道以太坊时在13年开始设计,15年7月30日正式上线公网。在这段时间内容SHA3还没有成为正式标准。那么以太坊是使用什么哈希算法的呢?使用的是一种名为 Keccak 的哈希算法。这个算法来头不小,它是NICI组织的SHA3哈希算法竞赛的胜出者,相当有名气。

可以说Keccak是SHA3正式批准前的名字,但正式批准的SHA3还是和Keccak有许多不一样的地方,我们并不能认为SHA3和Keccak是完全对等的。

在以太坊中,常见的区块哈希、交易哈希、状态哈希等等都使用的Keccak256哈希算法。 256表示创建的信息指纹长度是256位,即32字节。当然以太坊也在慢慢向标准的SHA3算法靠拢,不管你是在开发DAPP还是做其他与要计算哈希值得工作,也建议你使用SHA3,除非你不得不做一些兼容性工作。在 Ether.js中同时提供了Keccak256和SHA256的哈希算法。同样在Solidity中也内置提供了Keccak256和SHA256,同大家灵活使用。

比特币、以太坊都是一种链式结构的区块链。一个区块信息中包含了上一个区块(父块)的哈希值,从而保证了区块的安全指向。随着区块被更多的子块间接引用,进一步强化了区块的安全性。

Keccak 算法

为了隐藏起某些信息,且保证这些信息不被篡改,需要用到哈希算法。keccak256算法则可以将任意长度的输入压缩成64位16进制的数,且哈希碰撞的概率近乎为0.

在solidity编程中,有时候会以keccak值进行输入,这样其他节点就不知道你的具体信息是什么。当一定的时间过去后,你再公布你的具体信息,其他节点就可以验证你公布的信息的keccak值是否与之前申明的一致,从而判断你有没有撒谎。

函数选择器

在Solidity中,函数选择器是对函数头进行keccak256()计算取前4个字节,事件选择器是对事件头进行keccak256()计算取完整的32字节。在ethers.js里对这个keccak256进行了封装,变成了ethers.utils.id()

在ether.js中 :

let transferTopic = ethers.utils.keccak256( ethers.utils.toUtf8Bytes("Transfer(address,address,uint256)"));

// 等价于  ethers.utils.id("Transfer(address,address,uint256)")

你可能感兴趣的:(solidity,以太坊,区块链)