继续上一篇介绍散列函数的特性, 我已经介绍了散列函数的第一大特性(碰撞阻力 Collision‐resistance ),后两个特性分别是隐秘性(hiding)和谜题友好( Puzzle friendliness)。在反复构思这一篇内容之后,我决定暂时先不介绍“谜题友好”特性,因为在比特币技术架构里,这是为了比特币矿工挖矿用的技术特性,现在说太早,也很难说明白。我将来再填这个坑。
隐秘性比较好理解,跟碰撞阻力恰好是两个方向看散列函数。碰撞阻力指的是想要找到两个不同的输入得到相同散列值输出,是非常非常非常困难的。而隐秘性则反过来,只知道输出的散列值是几乎不可能有办法知道输入了什么。
《三国演义》里的诸葛亮神通广大,经常派将军们出去打仗,出征前会神秘的给将军一个锦囊,反复叮嘱不能随便打开看,一定要遇到什么特定困难情况时才能打开。将军们服从命令听从指挥,出征后果然遇到了诸葛亮说的困难情况,正不知如何是好,旁边一员副将一定会出现并提醒将军,不是有个锦囊吗?将军往往哎呀一声有如惊醒梦中人,赶紧从怀中摸出锦囊,打开一看,恍然大呼“丞相神机妙算呀!”。于是依照锦囊妙计,运筹帷幄大败敌军。这个锦囊就可以看作散列值,而里面的计谋就是输入信息,散列函数的隐秘性主要应用就是证明诸葛亮不是事后诸葛亮,即便预测错误,也不能抵赖。
现在我要把散列值换一个称呼,散列值也称作哈希值,因为许多文章和书都习惯用哈希值,所以未来我们也改称哈希值,跟行业接轨。
说了散列函数的两大特性,各位也对哈希值大致理解了吧,如果还不了解,咱们私聊,开小灶。哈希值的应用在比特币技术框架中几乎随处可见,说它是瑞士军刀一点不为过,而哈希值作为指针的应用,更成为目前行业里对区块链技术理解的一个缺省共识。
各位还记得我前面说过区块链就是区块+链,而这个链就是一个指针,用某种方式指向上一个区块,可以是书的页码,也可以是账本的时间或者日期。现在我们把这个指针统统换成哈希值,经过这么改造后的区块链就是目前各种文章书籍里说的区块链。我们现在也同样把区块链这个名词的定义与行业习惯进行接轨,今后我们再提及区块链,就是用哈希值作为指针(哈希指针)的区块链。
这里要解释一下作为指针的哈希值是从那里来的?这个哈希值是前一个区块作为数据输入,计算所得的哈希值。区块链结构如下图所示:
此图来自于普林斯顿大学Arvind Narayanan, Joseph Bonneau, Edward Felten,Andrew Miller, Steven Goldfeder等四位教授编著的网络课程教材《Bitcoin and Cryptocurrency Technologies》,之后的图也来自于同一本书。
图中从左向右是区块的先后次序,每一个区块头部有一个“prev:H()”,意思就是这里放的是上一个区块(prev:H()+data)经过散列函数计算的哈希值。当然,区块链的第一个区块并没有前一个区块,所以没有指针,一般我们称第一个区块为“创世区块”。
按照这样的结构,很显然就带来一个效应,所有的区块数据都被绑定在了一起,一但某人想修改某个区块里的数据,那么我们已经知道有一点差异的数据经过散列函数计算后会输出完全不一样的哈希值,那么修改数据后的区块哈希值就明显变化了。于是他修改区块里的数据后必须再修改后一个区块头存放的哈希指针,结果又造成后一个区块的哈希值也变化了,再下一个区块头也需要修改,那么再下一个......如此造成要修改一个区块的数据必须修改以后的所有区块,如下图所示。
这种用哈希指针把数据绑定起来的办法并不是比特币的发明,早在1991年为了安全地对数字文件按照时间顺序进行记录,准确反映文件创建的时间顺序,而不是为了虚拟货币体系,哈勃(Haber)和斯托尔内塔(Stornetta)发表了一系列论文来介绍他们发明的这种数据结构。如下图所示,其中的签名(sig)是指我们还没说到的电子签名。
他们后来又提出来了一个提升效率的方案:不必单独连接各个文件,而是把它们集合成块,然后在一条链中链接整个区块。
可见区块链可以组成很多形状,但是不可能是环形,为什么呢?作为思考题留给各位,请在公众号回答。答对的我记上,将来说不定会有啥奖品哦。
采用哈希值为指针在比特币技术框架里不仅用在区块链上,也用在区块内的数据结构。比特币区块中的主要数据是大约十分钟内的许多条转账记录,为了提高存储校验效率,在区块中转账记录的存放采用了一个叫梅克尔树的结构,如下图所示:
梅克尔树是1979年由瑞夫·梅克尔(Ralph Merkle)提出,是一个应用哈希值的二叉数据结构。每片树叶就是原始数据(data),在比特币里原始数据就是每一条转账记录。这些转账记录都被两两分组,指向转账交易数据的哈希指针被存储在上一层的父节点中,然后这些父节点再次被两两分组合并计算哈希值,而用这个哈希值作为指针存放在更上一层的父节点,一直持续,直到根节点。就如同树叶到树枝,树枝到树干,树干到树根。那么最后根的哈希值就绑定了所有叶子的信息,更改任何一点点信息都造成其上层的所有指针信息全部要更改。
梅克尔树的好处是对于存储信息来说可以节省空间,并不是人人都想保存所有细节数据的,只保存树根哈希值或所关心的转账记录树叶所在的那根分支的信息,就锁定了全部其他数据。此外对于查找和校验某一片叶子是不是存在,计算机处理这种结构也是高效的,只要按下图的路径从下往上计算并对照校验即可。
比特币区块与区块之间,区块内的数据都是用了哈希值作为指针,可见这种用法已经深入到比特币技术的每个细节。
图示:哈希值在比特币中无处不在
今天我们不需要太多深入比特币的数据详情,这在未来要专门谈。本篇的目标是告诉大家,哈希值对于了解区块链技术,是基础的基础。
领取专属 10元无门槛券
私享最新 技术干货