*本文只介绍技术,不构成投资建议。
书接上回(回归链圈哈哈),了解了区块链的底层加密函数和它的三个性质之后。我们可以来看一下哈希指针与数据结构了。老规矩,先上图:
来自我的幕布
首先我们要看一下什么是哈希指针(hash pointer):
a hash pointer tells us where something is and what it's value was。
简单的说,hash pointer包含了传统指针的意义(即指向一个地址)和计算一个哈希值【hash_pointer = (pointer, hash_value)】。指针我们应该很好理解,就是返回上一个block的地址,而计算的一个哈希值是什么呢。
hash pointer
这就要讲一下为什么要计算哈希值了。如果只有指针的话,其实就是传统意义上的数据库了,此时当你把数据改变时,同时需要改变数据的指针或者新建立一个指针。但是我们的比特币要做什么呢?记录转账数据呀!转账数据不能随便改的!(付过的钱、欠的债都是要认哦)当然,现实生活中确实会有资金被盗或者转账失败等事情发生(这种情况现在很多机构也在讨论),但至少在比特币里面你必须保证数据不能回撤,不然就不可信了嘛。
多说一句,为什么比特币要这么设计呢(就是不能回撤)?其实也是因为去中心化的特点决定的,如果可以回撤,怎么回撤是一个很难解决的问题(这个问题也困扰了以太坊甚至导致了分叉)。
so,其实哈希指针要做的事情就是:
1) 检索信息(即历史转账信息);
2) 检验信息是否被修改过(防篡改)。
怎么做到这两点呢?
temper-evident
先介绍一下防篡改(temper-evident)。
还记得哈希函数的三大特性吗?(忘了的回去复习!)其实关键就在于collision free,也就是说,如果我们的pointer计算出一个值,你再把之前的记录改了,那么新的计算结果就会出现问题。
temper-evident 防篡改
就是这么简单。不过,其实,防篡改不是不能改,是你改的话需要把需要改的数据之后的pointer的值都改掉。这个其实也是可以的,埋坑。
第二个要做的则是检索历史记录。
检索这是事情是有很多技巧的,尤其是在面对大量的数据的时候。这里要介绍一下比特币用到的检索方法:Merkle Tree。
Merkle树是一种由哈希指针构建的二进制树。假设我们有很多个包含着数据的区块,这些块就是树的叶子。我们将这些区块分为两个一组,对于每一组我们建立一个包含两个哈希指针的数据结构,每个指针都指向一个块。这些被指向的数据机构就建起了树的下一个层,我们又依次将这些数据分为两个一组,对于每一组我们建立一个包含两个哈希指针的数据结构。我们持续这样做,直到我们到达一个单独的块,称之为树根。
Merkle tree
Merkle Tree其实是把二叉树加上了hash计算得到的。因为二叉树的结构可以使得查询速度很快(具体原因我就不懂了),可以做到:
如果某数据在这个树形图里,需要展示log n个pointer来证明,也大概需要log n单位的时间。
查询数据
也因此,我们查询一个block会很快。数据结构是不是很神奇呢?关于二叉树的知识,感兴趣的朋友可以去吴军的谷歌方法论里面听第78课。当然也欢迎联系我分享给你~
有了哈希函数和数据结构,我们都可以做一个区块链出来了。不过貌似还差了什么?没错,就是身份认证。谁花钱总是要确定的吧?so,下一部分是数字签名以及应用,敬请关注。
欢迎与我交流,我的微信号q734550709。
ETH赞赏地址:
0x88317662aaa503678341476e40c5d93627826a91
*您的赞赏是对作者最大的鼓励!~











网友评论