区块链学习区块链研究金马带你定投区块链

比特币网络中的区块链

2017-07-12  本文已影响259人  云天明ytm_ltd

概述

区块是交易的集合,区块相互咬合成为区块链。
为什么要咬合?因为这种咬合关系,构成父子孙的牢不可破的稳定关系,才使得账本不可篡改。
怎么咬合的?每个区块头里面包含“父区块哈希值”字段,也就是记得自己的父区块信息,这样最终形成一根长链条,父子孙区块的顺序是对每个区块头进行SHA256加密哈希,可生成一个哈希值,再通过这个哈希值,可以识别出区块链中的对应区块。

区块结构

区块头是80字节,平均每个交易至少是250字节,而且平均每个区块至少包含超过500个交易。因此,一个包含所有交易的完整区块比区块头的1000倍还要大。


区块结构

区块头

区块头结构

区块头由三组区块元数据组成。首先是一组引用父区块哈希值的数据,这组元数据用于将该区块与区块链中前一区块相连接。第二组元数据,即难度、时间戳和nonce,与挖矿竞争相关。第三组元数据是merkle树根(一种用来有效地总结区块中所有交易的数据结构)。

如何识别一个区块:区块标识符和区块高度

用什么唯一标识一个区块,就是区块标识符,又叫区块哈希值。如何唯一标识一个区块,就是通过SHA256算法对区块头进行二次哈希计算而得到的数字指纹。网络中每个节点都可以对区块头进行哈希计算得到区块标识符。
相信大家注意到了,这个概念不存在数据结构中,它是当该区块从网络被接收时由每个节点计算出来的。区块标识符可能会作为区块元数据的一部分被存储在一个独立的数据库表中,以便于索引和更快地从磁盘检索区块。
还有一个概念也可以识别区块,就是区块高度。第一个区块,其区块高度为0,后续的区块比它高1。在区块链分叉环境中,区块高度和区块标识符不是一一对应的。同样区块高度也不是区块头数据结构中。

第一个区块:创世纪区块

不管是什么样的节点,都必须明确创世纪的区块标识符。这样做的目的是所有节点认祖归宗,只有一个祖先。

区块是如何认祖归宗的?

每个区块有自己的区块标识符(区块哈希值),然后在区块头中还清楚记得自己的父区块的区块哈希值,这个是节点在添加一个节点时必须做的。

Merkle 树

默克树是区块头数据结构中的一个字段,他的作用是记录这个区块中所有的交易信息。

在比特币网络中,Merkle树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。生成一棵完整的Merkle树需要递归地对哈希节点对进行哈希,并将新生成的哈希节点插入到Merkle树中,直到只剩一个哈希节点,该节点就是Merkle树的根。在比特币的Merkle树中两次使用到了SHA256算法,因此其加密哈希算法也被称为double-SHA256。
当N个数据元素经过加密后插入Merkle树时,你至多计算2*log2(N)次就能检查出任意某数据元素是否在该树中,这使得该数据结构非常高效。

在Merkle树中计算节点
上图是只有4笔交易的默克树。首先对交易进行哈希,比如HA = SHA256(SHA256(txA)),HB = SHA256(SHA256(txB)),然后将这两片叶子组成一个树枝:HAB=SHA256(SHA256(HA + HB))。最后形成树根HABCD=SHA256(SHA256(HAB + HCD)) 一颗囊括了许多数据元素的Merkle树以及其中的交易路径

真正的区块可能包括成千上百个交易,如何在一个区块头中完整记录这样的交易信息,数据量将非常惊人。通过这种方法就可以将无论多少交易信息变为最后的默克树根,这些交易都会采用这样的方法归纳起来,产生一个仅仅32字节的数据作为Merkle根。无论区块中有一个交易或者有十万个交易,Merkle根总会把所有交易归纳为32字节。这将大大节省数据空间。
除此之外的好处,计算工作量的减轻。任何一个节点想要证明一笔交易所处的区块,只需要进行与该笔交易相关的哈希,就可以验证。就像上图中:

一个节点能够通过生成一条仅有4个32字节哈希值长度(总128字节)的Merkle路径,来证明区块中存在一笔交易K。该路径有4个哈希值(在上图中由蓝色标注)HL、HIJ、HMNOP和HABCDEFGH。由这4个哈希值产生的认证路径,再通过计算另外四对哈希值HKL、HIJKL、HIJKLMNOP和Merkle树根(在图中由虚线标注),任何节点都能证明HK(在图中由绿色标注)包含在Merkle根中。

实际比特币网络中,要找到上千笔交易中的一笔交易,比特币节点就能够通过高效地产生一条10或者12个哈希值(320-384字节)的路径来实现。Merkle树的高效随着交易规模的增加而变得异常明显。


Merkle树的效率

简单支付验证(SPV)

默克树根的机制为SPV实现提供了可能。SPV节点只需要区块头信息就可以进行验证一笔交易在默克树跟中的路径,并实现交易的确认。
具体来讲,SPV钱包要验证一笔交易,先在通信链接上建立起bloom过滤器,找到符合过滤条件的交易地址。其他节点找到符合的地址后,就给SPV节点发个消息:区块哈希值,连接目标交易与Merkle根的Merkle路径。SPV节点找到区块,验证交易。

简而言之,SPV节点会收到少于1KB的有关区块头和Merkle路径的数据,其数据量比一个完整的区块(目前大约有1MB)少了一千倍有余。

上一篇 下一篇

猜你喜欢

热点阅读