主页 > 比特派钱包和imtoken哪个安全 > 从零读懂区块链(九):去中心化网络如何解决独立节点副本过大的问题?

从零读懂区块链(九):去中心化网络如何解决独立节点副本过大的问题?

完整的比特币数据库(即区块链)所需磁盘空间巨大,目前需要140G以上的磁盘空间,对于普通用户来说还是很高的。 由于区块链网络的去中心化特性,网络中的每个节点都必须是独立的,不受其他节点的限制。 每个节点都必须存储区块链的完整副本,才能完成相应的工作。 此外,由于节点是网络的完全参与者,它们还需要验证其他交易并参与挖矿。 与其他节点交互和下载新区块也需要一定的网络流量。

1000

但这样一来,随着使用比特币的人数不断增长,这一规则将很难被大众接受。 因为不可能每个人都运行一个全节点来完成大部分我不关心的事情。 比如买卖双方只关心我交易的付款和发货情况,其他数据不关心。

753

在中本聪为比特币网络设计的文档中,可以使用“简化支付验证(SPV)”(Simplified Payment Verification,SPV)来解决这个问题。 SPV是比特币轻节点,不需要下载整个区块链,也不需要验证区块和交易。 它在区块链网络中查找交易以验证付款。

792

由于 SPV 节点不存储完整区块链数据库的内容,因此它需要连接到一个完整节点以检索必要的数据。 这种机制允许多个轻钱包同时只运行一个全节点。

绝大多数普通用户表现为轻节点,全节点只占一小部分。 所谓“比特币扩容”,重点是整个节点的扩容,因为随着链条的扩容,交易信息量越来越大,存储容量也越来越满。 但是对于轻量级节点就不存在这个问题。 足够的。

为了实现 SPVbtc验证节点,需要有一种方法可以在不下载整个区块的情况下检查一个区块是否包含某个交易。 这就是 Merkle 树应该完成的任务。

通过前面的学习,我们知道区块链的整个系统是由两类数据结构相互嵌套组合而成的。 第一类数据结构是“哈希链”结构,可以看作是区块链的垂直方向。 逻辑结构; 第二种数据结构是“默克尔树”结构,可以看作是区块链的横向结构,实际上是一种使用哈希指针的二叉树结构,如下图所示:

720

Merkle 树是区块链的基本组成部分。 它采用二叉树结构,树上的每个节点存储一个哈希值。 Merkle根节点字段是针对区块体中的所有交易记录。 以二叉树的形式两两地迭代拼接并进行哈希运算,可以得到最终的哈希值,称为默克尔根哈希。 此根哈希包含在块头信息中。 我们常说的区块哈希,其实是指整个区块头的哈希值,不包括打包在区块体中的交易哈希。

在默克尔树结构中,所有的区块都可以成对分组,而指向这些区块的指针存储在上层的父块中,这些父块再次成对分组,然后指向前一个区块的父块层的层,依此类推,直到创世块。

通过哈希链和默克尔树两种数据结构,我们可以严格逆向验证每笔交易的真实性。 Merkle root hash相当于区块中所有交易记录的快照,通过与Merkle root hash的比较,可以很容易地检测到区块中交易记录的任何变化。 Merkle根哈希主要用于简单支付验证(SPV),在验证交易是否在区块中时也可以大大降低网络传输成本。

SPV节点只需从全节点获取一笔交易对应的Merkle根节点哈希值和打包路径过程中的哈希值,即可验证一笔交易的有效性。 用户只需要保存区块头(包括 Merkle 根),在需要验证交易时获取 Merkle 树路径。

从上面的分析,可能有同学看到了,即使没有Merkle树,区块链也可以运行,但是这样一来,系统效率就会变得很低。 因为所有的交易信息都必须打包成区块,每个区块只能容纳少量的交易信息,这在大规模交易场景中是无法容忍的。

870

没有交易信息的区块头(Block header)大小只有80字节。 一年产生的数据是4.2MB。 (80 字节 * 6 * 24 * 365 = 4.2MB)。 100年后只有400M,最低端的电脑也能满足运行要求。

下面以16笔交易为例来说明Merkle的原理。 如下图,16笔交易用字母a~p表示。 Ha表示对交易a进行哈希计算得到的交易指纹。

1000

上图中,SPV轻节点将交易e的交易ID提供给全节点。 全节点如果发现这笔交易,会反馈另外5个哈希值给SPV节点,如上图橙色部分所示。 这里需要注意的是,轻节点提交给全节点的是交易的ID,不是交易的哈希值,所以全节点需要查询才能知道交易ID的哈希值,所以这个过程完全是节点无法伪造哈希。

SPV节点对这笔交易e进行哈希计算后,结合全节点提供的哈希值Hf进行哈希计算,得到Hef,以此类推,最终计算出Merkle根的哈希值。 然后将计算出的Merkle根值与全节点反馈的Merkle根值进行比较。 如果两者一致,则证明交易确实被打包到这个区块中。

当区块大小从 16 笔交易(4KB)急剧增加到 65,535 笔交易(16MB)时,Merkle 搜索路径长度增长极其缓慢。 只需要一个区块头结构,再加上这样的搜索路径的开销,节点就可以以很小的代价快速定位到一笔交易。一般来说,对于一个包含N笔交易的区块体,通过确认其中一笔交易的算法复杂度默克尔是

44

.

849

从上面的分析可以看出,SPV节点在验证交易时,由于SPV本身并没有保存全网所有的交易数据,所以不知道这笔交易被打包到了哪个区块中。 SPV节点需要连接一个全节点,向全节点查询某个交易ID的相关信息,包括打包块高度、Merkle根和交易哈希路径。

SPV节点向全节点提交查询请求时,只向全节点提供交易的ID,不提供交易的哈希值。 全节点不知道这笔交易对应的哈希值是多少btc验证节点,只能从区块中读取。 因此,全节点无法伪造 Merkle 根和路径哈希来欺骗 SPV 节点。

根据全节点反馈的区块高度和之前从全网获取的当前最新区块高度,可以知道交易被确认了多少次。 如果经过6次确认,即打包区块后面有超过6个新区块,可以证明交易已确认,不可修改。

需要注意的是,比特币系统中有两种验证方式:交易验证和支付验证。

上面我们说的是支付验证,也就是验证存在性,即验证一笔支付交易在区块链网络的主链上是否存在,以及确认了多少次。

交易验证是验证交易的合法性,由矿工完成,验证的内容比支付验证复杂得多。 需要验证一个地址是否有足够的余额,是否存在重复支付,交易脚本是否可以执行。

838

通过默克尔树,我们可以大大减少区块链的数量,减少验证过程。 从上面我们知道,有一种强大的加密技术叫做哈希算法,它是非对称加密技术的一种。 它广泛应用于区块链。 所以下次我们会和大家一起探讨非对称加密技术,欢迎继续关注,谢谢!