求教,什么是Sdurk区块链术语大全内部通信?

前言我们已经知道每个区块内的数据结构是如何组织,也知道区块之间是如何链接起来,然而区块链是一个分布式P2P系统,这个分布式系统是由许多独立节点组成。这些节点是怎么进行通信,又是如何保存区块链数据?
1.区块链的不可篡改性区块链是一个开放的分布式账本系统,其中一个重要特性就是区块链的不可篡改性。要怎么做到又开放又保证数据不被篡改?区块链给出的解决方案是:历史交易数据没有修改或更新的做法,只有不停添加新的交易数据,以事务推进系统的状态。这就是区块链的不变性(Immutability),数据在被创建或写入后就不能被更改,也就是数据变成了只读数据。单单只是定义一个交易数据不变性的规则是不足以实现不可篡改的,区块链的数据结构保证了系统具有检测数据变化的能力。我们使用上文的区块链结构图,一条只有两个区块的区块链,来说明区块链是如何检测区块数据是否发生改变。图1:Data2数据改变后会影响整条链的哈希引用图1中标注了红色的路径是一条发生了数据错误的路径。任何一个箭头指向方向的数据发生了变化,都会立刻造成箭头末端的哈希引用失效,最终,数据异常会直接导致链头B2的哈希引用失效。举个例子,如果Data2的交易数据发生了改动,则首先对应的R2哈希引用就会失效,若要掩饰这个数据异常,需要重新生成一个新的R2。新的R2会导致原来由R1和旧的R2生成的哈希引用R12失效,又需要重新生成R12,层层向上,最终到链头B2也会失效。任意的数据变动,都需要修改一整条历史数据的溯源路径,才能达到篡改的目的。越早的数据,其历史记录越长,篡改的成本就越高。2.新区块的创建过程前面我们简单提到过区块头的作用,是用于存储与交易数据无关的内容,比如上一块区块的哈希引用、Merkle树的根节点哈希引用。实际上,完整的区块头至少需要包含以下信息:包含交易数据的Merkle树的根节点上一个区块头的哈希引用哈希谜题的难度级别解决哈希谜题的时间解决哈希谜题的nonce根据区块头必要信息,区块链中每个节点在创建一个新区块时,都需要完成如下过程:获取包含要添加的事务数据的Merkle树的根节点。从链头创建对该新区块头的哈希引用。获得哈希谜题的难度级别,难度级别由区块链其他相关协议定义的。获取当前的时间。创建一个包含第1点到第4点中提到的数据的初步区块头。解决初步区块头的哈希难题。通过在初步区块头中添加解决哈希难题的nonce来完成新的区块。图2:完整的区块头至少需要包含的元素图2描述了区块头中的完整信息,其中哈希谜题的难度级别是限制新区块的出块效率的关键。这些元素会组成新区块的哈希引用。新区块被创建后,其他节点会对新区块进行区块验证,验证内容包括:是否包含前一个区块的有效哈希引用。Merkle树的根节点哈希引用是否有效。哈希谜题的难度级别是否正确。时间戳是在其前一个区块头的时间戳之后。是否包含nonce。前5点数据组合起来的哈希值是否满足指定的难度级别。极小的交易数据改动都会影响一系列区块的哈希引用,此时原有的哈希谜题的nonce就不再满足区块验证,需要对影响到的区块全部重新进行哈希谜题的运算,找到新的nonce。而难度级别的存在又保证了这个哈希谜题的运算是十分消耗算力的,因此也提高了区块数据篡改的代价成本。区块链的不变性取决于由哈希谜题引起的计算成本,而哈希谜题的难度决定了哈希谜题计算的工作量。如果难度级别太低,则数据篡改成本不够高,无法保证数据安全性。但如果难度级别太高,又会影响区块链的吞吐量,降低添加新块的效率。实际上,区块链应用程序很少对所有块使用固定的难度级别,通常会基于添加新块的速度来动态调整难度级别。3.区块链系统的节点通信区块链是由众多分布式节点组成的系统,每个节点都保留系统的历史交易记录(可能是完整记录或只包含必要块头信息的历史记录)。仅仅只是单个节点组成的区块链不是完整意义的系统,因为修改单节点里存储的区块链数据成本还不算高。可是当系统内的节点包含成千上万个呢?每个节点内都有一份区块链的历史交易数据,此时数据的篡改成本就从单节点变成了起码修改超半数的节点数据了。3.1.分布式系统的通信特点当我们系统内有许多独立的节点时,我们就需要思考一个问题:如何让系统内所有节点都能收到最新的区块数据?区块链系统与传统的中心化系统不同,没有统一的中心节点做数据的分发工作。区块链系统包含众多独立且分散的节点,节点各自维护自己版本的不可变账本,存储整个历史的交易数据。在解答数据如何做到全局统一这个问题之前,我们先看看区块链这个分布式系统的特点:每个节点都通过互联网与该系统连接。每个节点都由一个唯一的地址来标识。每个节点都可以在任何时间断开连接并重新连接到系统。每个节点都独立地维护与其通信的其他节点列表。节点之间的通信是基于消息传递的。消息通过使用其唯一的互联网地址,通过互联网从一个节点发送到另一个节点。节点通过网络进行通信,又因为它们可以随时断开连接和重新连接,所以消息的传递也因为这个特征而受到影响。为了适应节点的动态变化,分布式系统网络中传递消息具有以下特征:消息不能保证一定能到达目的节点,有可能会丢失。消息可能会多次到达。消息的顺序可能与发送顺序不同。3.2.区块链解决方案针对分布式系统的特点和消息的特征,区块链的节点通信采取gossip方式。gossip,直译过来就是八卦、聊闲话。一般人们会跟什么类型的对象聊八卦和闲话?答案是身边的人。gossip方式的信息发送也是如此,每个接收到新消息的节点都将其转发给与其相邻的通信节点,这些邻近节点也会以同样的方式处理新消息,发给它们各自的邻近节点。最终,这个过程会确保每个节点都能接收到新消息,而不用担心消息会丢失,因为每个消息都可能不止一次发送给某个节点。其次,由于消息可以通过其数字指纹:加密哈希值来识别,因此节点可以很容易地识别重复接收的消息并忽略它们。最后,交易数据和区块头都包含时间戳,节点可以根据客观标准对它们进行排序,这样就算消息不按顺序抵达也没有关系。3.3.节点通信目的在区块链系统中,节点之间依靠消息进行信息的传递,节点之间通信的目的可以分为三类:保持现有的连接处于活动状态网络中的每台计算机都独立地维护与其通信的节点列表。这个列表只包含组成整个系统的所有节点的一个子集。每台计算机都会定期验证这些节点是否仍然可用。这个判断一般通过节点列表发送一个小消息来完成的,称为ping,收到ping消息的节点会用一个称为pong的消息进行回复。多次不回复ping消息的节点将被原节点从自身维护的通信节点列表中删除。建立新的连接每个节点都可以通过向组成系统的任何节点发送相应的请求消息来请求加入区块链系统。被请求的节点将查询者的地址添加到其节点列表中,并发送一个确认作为回复。当请求加入节点收到回复时,这个节点也将回复人的地址添加到自己的节点列表中。最后,一个新的连接建立了,系统又增加了一个节点。分发新消息节点之间发送的消息类型也可以分为三类:新的交易数据和新的区块;断开一段时间后重新连接到系统的节点将接收此期间错过的所有交易数据和区块;新加入系统的节点会收到整个区块链系统的所有历史记录。4.区块链系统的节点数据处理在了解完区块链系统内的节点通信规则后,我们就能开始讨论节点在接收到新数据之后该如何对数据进行处理了。我们知道了创建一个区块需要进行复杂的哈希谜题运算,也知道区块链是一个公开的系统,允许系统内的节点创建新数据。那么,应该如何协调节点,确保节点只将有效的交易数据和新区块添加到链上?区块链给出了一个很简单的解决办法:每个节点既是新区块的提出者,又是其他节点的监督者,并且会为添加有效数据和区块的节点提供奖励。其核心在于,区块链对“好”的节点提供了奖励机制,这让所有节点都有一种动机去正确地处理数据,并监督和指出任何同类节点所犯的任何错误。4.1. 建立新区块的规则在区块链中,有一系列规则指引节点处理新数据和新区块,这些规则实际就是区块链算法的一部分。下面列出一些建立新区块时的必要规则,这里假设区块链使用的共识算法是工作量证明(PoW)。1、验证规则在添加新数据或新区块之前,节点需要对数据有效性进行验证。验证包含两部分:交易数据的验证规则、区块头的验证规则。交易数据的验证规则定义了描述事务需要哪些数据。这些规则包括形式化的正确性、语义的正确性和授权。这部分是业务数据的合法性验证,不同类型的区块链系统对交易数据的验证规则可以是不同的。区块头的验证规则主要关注区块头的形式化和语义正确性,核心是验证哈希谜题的正确性。只有区块头包含哈希谜题的正确解的区块才会被进一步处理,无法通过哈希谜题验证的区块会被丢弃。2、奖励创建有效的区块需要花费大量算力,因为节点需要解决复杂的哈希谜题。区块链算法会对创建新区块的节点提供奖励,作为计算成本的补偿。比如,在比特币中,新区块的提出者会获得一定数量的比特币作为奖励。3、惩罚对于恶意节点,比如提出无效的区块或数据,需要有一定的惩罚机制。常见的惩罚机制有:收回过去被接受但后来被认定为无效的区块对应的奖励。又或者,对于提出新区块的节点不给任何奖励。4、竞争为了获得新区块的奖励,各个节点都会努力进行哈希谜题的运算,这样会因为竞争而造成没必要的资源浪费。区块链算法基于两个标准设计了持续的奖励竞争:速度竞争和质量竞争。只有同时赢得两个竞争的节点才能提交新区块从而获得奖励。这两个竞争过程依次进行,具体过程如下:速度竞争:看哪个节点最快算出满足条件的哈希谜题答案。胜者会进入质量竞争,败者会成为质量竞争的裁判。质量竞争:判断速度竞争的胜者所提交的数据块的正确性。一旦一个节点提交了一个新的块,它将被发送到系统的所有节点。通过接收一个新的区块,每个节点必须在质量竞争中充当裁判,使用第1点中的验证规则来验证数据块的正确性。如果验证成功,新块会加入到节点的区块链上;验证失败则会抛弃该区块。本轮竞争结束后,就会启动新一轮的速度竞争。依靠上述规则,区块链的节点之间就能够自发地运作。每个节点既是区块提出者,又是监督者。在任何给定的时间点,系统的所有节点都处于以下两个阶段之一:1、验证系统其中一个节点创建和提交的新区块是否合法。2、努力成为下一个创建新区块的节点,而新块又必须由所有其他节点来验证合法性。在这系列规则下,区块链系统不仅确保了新数据能够被所有节点验证,而且还确保了所有节点具有相同的工作节奏,这种相同的工作节奏是保证所有节点保持相同的历史数据版本的核心。4.2. 节点的基本运作过程基于上述规则,我们就能总结区块链节点的基本运作过程:新的交易数据和新的区块将以gossip的方式转发到所有节点。每个节点都在一个收件箱中收集新的交易数据,通过优先级进行选择处理。每个节点都会立即以最高的优先级处理新的区块。每个节点都会根据验证规则对数据的正确性进行校验。每个节点只将有效的交易数据收集到一个Merkle树中,并通过解决哈希谜题开始创建一个新的区块。一旦一个节点完成了哈希谜题,它就会将新创建的区块发送给所有其他节点。每个节点根据验证规则校验新区块的正确性。每个节点都将有效的块添加到其自身的区块链的副本中。如果新区块被标识为无效,它将被丢弃,节点继续回到第5点计算哈希谜题。如果新区块被标识为有效,则节点将从自己的收件箱中删除新块中包含的事务,节点回到第5点计算新区块。如果已经添加到区块链里的区块被识别为无效,则该区块及其所有的区块都将从区块链中删除,这些区块内的交易数据会被添加到节点收件箱中再次处理。如果新区块被接收,其提出的节点将获得区块中包含的所有交易数据的费用(gas)作为奖励。如果区块标记为无效,那么对应的奖励也会被移除。这个运作过程依赖于一个假设:区块链系统内存在大多数诚实节点。如果恶意节点占大多数,那么这套规则就无效了。当恶意节点掌握超过网络总算力的51%时,它们可以发动“51%攻击”,这意味着它们可以控制区块链系统并进行双重支付攻击。5.总结本文介绍了区块链系统中的节点如何进行通信和数据处理。但是,由于消息传递中的延迟或错误,系统的每个节点维护的数据历史版本可能仍然不同,这就是数据一致性问题。下一篇文章,我们将讨论如何解决区块链系统内不同版本的数据历史而导致的冲突。
参考文章CFE C. Blockchain Basics: A Non-Technical Introduction in 25 Steps[J]. The CPA Journal, 2023, 93(3/4): 13-13.Okupski K. Bitcoin developer reference[M]//Eindhoven. 2014.Wood G. Ethereum: A secure decentralised generalised transaction ledger[J]. Ethereum project yellow paper, 2014, 151(2014): 1-32.更多文章,欢迎戳戳公众号:或者个人website:

我要回帖

更多关于 区块链术语大全 的文章

 

随机推荐