比特币中最基本的结构就是区块链,区块链就是由一个一个区块组成的链表
Hash pointer 哈希指针
-
普通指针:
- 普通指针存储某个结构体在内存中的地址,实际中为了便于程序移植性等原因,一般存储逻辑地址而非物理地址(稍稍涉及了汇编的知识)
- 普通指针存储某个结构体在内存中的地址,实际中为了便于程序移植性等原因,一般存储逻辑地址而非物理地址(稍稍涉及了汇编的知识)
-
哈希指针:
- 区块链系统中使用哈希指针
- 哈希指针除了要存指向的结构体的地址,还要保存该结构体的哈希值
- 好处是不仅可以找到该结构体的位置,同时还能检测该结构体的内容是否被篡改,因为我们保存了它的哈希值
如图为一个简单的区块链模型 genesis block 创世区块
Block chain is a linked list using hash pointers.
- 一个区块的哈希指针怎么计算:
- 把前面整个区块的内容(包括其中的hash pointer),合在一起取哈希值
- 通过这种结构,可以实现tamper-evident log(防篡改)
- 改变区块对于区块链来说是牵一发而动全身的
- 如果有人改变了一个区块,那么后面一个区块的哈希指针就对不上,那他就得改下一个,以此类推,这一个的改变会影响后面所有的区块,这使恶意节点的攻击难度变得很困难
- 也正是由于哈希指针,实际应用中,普通用户没必要保存所有区块的内容,可以只保存最近的几千个区块,如果要用到以前的区块,可以向系统中其他节点要这个区块,不过得到的区块未必是真实的(也可能是含有恶意的节点发送的),所以还需要进行验证:
- 验证方法:获取区块的前提是我们已经有此区块的哈希指针,获得一个区块后,计算它的哈希值,然后对比我们已知的哈希指针中的哈希值即可
Merkle Tree
- Merkle Tree中用哈希指针代替了普通指针
- 对第一层的根节点取哈希,叫根哈希 root hash
- Merkle Tree这种结构的好处是 只要记住根哈希值,就能检测出对树任何部位的修改
在比特币系统中,各区块之间通过哈希指针连接在一起,而在一个区块中,所包含的交易通过merkle tree的结构组织在一起。每个区块分块头(block header)和块身(block body)两部分,块头中存有root hash(但没有具体的交易信息),块身中保存着交易列表。
Merkle Tree的作用
提供merkle proof:
- 关于merkle proof,先引入比特币中节点的概念,比特币中节点分为轻节点( light node )和全节点( full light ),全节点保存区块时保存整个区块的内容,即块头块身都保存,而轻节点只保存区块的块头。
之所以区分全节点和轻节点是由于硬件的局限。 - 如何使用:
- 下面考虑一个问题,如何向轻节点证明某个交易是写入区块链的?
- 这时便要用到merkle proof:我们将此笔交易到根节点的路径称为merkle proof,全节点将该merkle proof 发送给轻节点,轻节点根据其从下往上验证沿途的哈希值都是正确的即可(注意只能验证该路径的,来自别的路径的哈希值我们无法验证其正确性),直到算出根哈希值root hash,对比轻节点存储的块头中的根哈希,由此验证该交易是否被写入区块链。
- merkle proof 可以证明merkle tree 里面包含了某个交易,所以这种证明又叫 proof of membership 或 proof of inclusion。
- 对于一个轻节点来说,验证一个merkle proof 复杂度是多少?
- 假设最底层有n个交易,则merkle proof 复杂程度是θ(log(n))。
- 证明一个交易存在与否是很高效的。
- 如何证明merkle tree里面没有包含某个交易?即proof of non-membership.
- 可以把整棵树传给轻节点,轻节点收到后验证树的构造都是对的,每一层用到的哈希值都是正确的,说明树里只有这些叶节点,要找的交易不在里面,就证明了proof of non-membership。问题在于,它的复杂度是线性的θ(n),是比较笨的方法。
- 如果要实现较为高效的证明,那么需要对merkle tree的叶子按其哈希值进行排序,这样复杂度就是log形式的了,但代价是要排序,这种排好序的merkle tree叫做 sorted merkle tree.
- 然而比特币系统没有要做不存在证明的需求,所以并没有对merkle tree进行排序
扩展:本文介绍了比特币中两种最基本的数据结构:区块链和merkle tree,他们都是用哈希指针来构造的。除此之外,哈希指针还能用另一个方面:
只要一个数据结构是无环的(非循环链表),都能用哈希指针代替普通指针。有环的话存在一个问题,他们的哈希值没法计算,没法确定一个哈希值固定的区块。
本系列文章为个人学习笔记,文章的所有内容均不构成任何投资比特币或其他数字货币的意见和建议,也不赞成个人炒作任何数字货币!