区块结构和Merkle树
一个区块的结构如下:
一个区块包含2个主要的部分:区块头和区块体
区块头是区块的元信息,而区块体是当前区块中所有验证过的交易记录,而merkel根是这些记录的hash值。
区块头是80字节,而平均每个交易至少是250字节,而且平均每个区块包含2000个交易。因此,包含完整交易的区块比区块头的4千倍还要大。
Merkel树
Merkel树是从Hash List的技术上扩展过来的。
Hash List是多机器分块下载超大资源,验证下载资源的可靠性而来的。超大文件被切成N个小块,放在不同的对等机器上,同时会在可信节点(原服务器)生成各个块的hash值,这些hash值以链式的方式组织。而为了保证从可信节点下载的hash文件也是可靠的,最后又根据各个块的hash算出一个根hash。既可以通过该文件检验大文件的各个小块,又可以用于自身的自校验了。
Merkel树的构建过程
- 对每个数据块计算hash值
- 对这批hash块,相邻hash合并计算新的hash块,合并的规则是:
- 偶数个块,相邻两两合并计算新的hash块,得到新的一层hash块,再次重复2)的操作
- 奇数个块,依然是两两合并计算新的hash块,最后一个块单独计算hash,得到新的一层hash块,再次重复2)的操作
- 块个数为1,进入3)
- 最后计算得到根hash,这样Merkel树就形成了
Merkel树的特点
- Merkel树是二叉树,也可以是多叉树
- Merkel树的叶子节点才是真正的数据
- Merkel树的其他节点都是根据它的下层子节点hash计算出来的(这样的好处是非叶子节点可以对其叶子节点进行校验)
Merkel树的改进优势
可以看出Hash List只有2层,当要校验时,需要将整个Hash记录文件下载下来;而Merkel树可以进行分支校验,部分的验证数据的正确性。
就是说在下载Merkel树的时候,只需要Root Hash是从可信机器上下载,其他的分支可以从对应的机器上下载,各个分支的根可以对其子树进行检测,而Root Hash对整个Merkel树进行检测。这样就确保了整个大文件的完整形,而各个分支又可以独立处理。这优点是Hash List做不到的。
Merkel树的修改
首先需要说明的是,Merkel树不适合经常变更的数据。
修改就是从待修改的叶子节点一直向父节点更新,一直到Root Hash,需要改动的数据不多;插入和删除就比较复杂
Merkel树在比特币中的使用
如上面区块图所示,Merkel树的树根作为头部信息放在区块头中,这样做的好处就是,可以仅下载区块头而不需要下载整个区块下的每一笔交易及其每一个区块就能完成验证。每笔交易的验证可以在需要的时候下载验证。区块头才80字节。
插入新节点的过程
?
验证合法性的过程
只要知道部分的节点(和待验证节点相关的节点)的hash,不需要其他节点的信息。