作者:Steven Li(胡飞瞳)
来源:IPFS原力区
散列(hash)函数是区块链所利用的技术中的最为基础的部分了,也是非常重要的部分之一。一个好的散列函数在一个密码体系中的地位也十分重要。Filecoin作为新一代的区块链,在散列函数的采用上也十分大胆。其中Posaidon就是比较新的散列算法。
IT人士对于散列(Hash)再熟悉不过了。Hash表是一种基本的数据结构,而这种数据结构是依靠hash函数来进行索引和访问的。由于Hash函数在寻址上具有很高的效率上的优势,算法复杂度基本上是O(1)。因此,Hash函数被广泛应用与数据库和其他数据处理系统中。
简单来说,散列函数就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。通常输入的数据长度要大于运算得出的散列值,同时因为这个散列值一定程度上可以代表原数据,因此也被成为摘要。工程师比较熟悉的 md5 就是使用最为广泛的 hash 函数,一般用来验证数据的完整性。
因为散列值是一个固定长度,比如说md5sum的输出是128位,也就是16字节,那么这个散列值的所有可能性就是 2^128。这个范围和IPv6的地址范围差不多。
一个 hash 函数可以由以下特性来进行评估:
除了hash函数的一般性特性只要,用于密码学的 hash 函数有更严格的要求:
前面提到的 md5 散列函数,在区块链系统中完全没有被采用,其主要原因就是在碰撞安全性不能满足要求,密码学界在2007年就发现了其碰撞破解的办法,而最新的发现其双块攻击在普通计算机上就可以很快实现。而广泛使用的SHA256函数的碰撞安全性是 md5 的 2^64 倍,
IPFS的CID(内容标识,也就是散列之)在数据格式的定义上采用MultiHash,也就是说,是一个可扩展的数据格式和方案。用户可以根据需要随时支持新的协议。其格式大致如下:
大家常见的以 Qm 打头的CID是采用SHA256算法的,Qm是SHA256的base58编码后的结果。当前,IPFS支持的常见hash算法包括:
注1: SHA家族的算法,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布,是美国的政府标准。SHA-x表示第x代。
注2: BLAKE2的改进版本于2012年12月21日宣布推出。它由Jean-Philippe Aumasson、Samuel Neves、Zooko Wilcox-O'Hearn和Christian Winnerlein设计,用于取代广泛使用但已被攻破的MD5和SHA-1算法。Blake2的特点是计算更快,安全性高。
由于 Filecoin 的代码基于IPFS之上,因此IPFS中使用的hash算法,也就自然在Filecoin中被采用,包括使用于libp2p, IPLD, 以及存储市场和检索市场。
这一点可以从Filecoin在选择 Blake-2b 和 SHA-3 上可以看出来,Blake算法曾被其发明人Jean-Philippe Aumasson, Luca Henzen, Willi Meier, and Raphael C.-W. Phan 提交到NIST去竞争 SHA-3,但最终败给了 Keccak(以太坊目前使用,将来也可能替换)。但 Blake2 效率更高,在实践中安全性不输SHA-3。因此,blake2在Filecoin中被广泛采用。
在Filecoin中 blake2b 使用在以下一些地方:
Filecoin区别于现有区块链的一个显著特点是它的证明系统,也就是其复制证明和时空证明机制。在这一套机制中,hash算法也被广泛用到。
基于Feistel算法的hash函数,又成为F-Hash。Filecoin采用F-Hash来为SDR过程中的每一个节点计算找寻父节点,这些父节点随机分布,没有规律,同时,这些父节点又完全均匀地分布在整个sector的空间中。这简直就是使用F-Hash的最佳场合。
在ZCash中,PedersenHash 是为 PedersenCommitment服务,这在ZCash的交易中起到举足轻重的作用。Filecoin的复制证明和时空证明采用与ZCash类似的零知识证明,所以顺理成章地采用PedersenHash。
在这种情况下,Filecoin团队毅然决定,在Filecoin的证明系统中,与零知识证明相关的hash算法采用 Pedersen Poseidon。
这带来一个问题,那就是对SHA又特殊支持的芯片效率要高很多。这也就是为什么Filecoin团队最近一直在暗示AMD CPU效率更高的原因,因为AMD的多数芯片都支持 SHA-NI,而Intel目前并不支持。这个问题是的Intel设备非常尴尬,也使得市场处于一个不平衡的状态。
既然如此,为什么Filecoin团队不换一个Hash算法,来达成某种平衡,不同的设备都可以进入网络进行竞争对Filecoin网络来说不是更好吗?但是,我的判断是,并不会。因为这里又充分的理由采用SHA-256。具体原因是什么,留给读者自己思考。