主页 > imtoken2022官网版 > 分布式系统中的八卦协议与比特币中的区块链技术

分布式系统中的八卦协议与比特币中的区块链技术

imtoken2022官网版 2023-02-14 05:22:13

在分布式系统中,一些状态是通过网络通信传递消息来达成一致的。 具体方法有很多,大体上可以分为三类。 一是选师傅,大家听师傅听一段时间。 凡是主子提议的,谁都听,不是主子提议的,谁都不听。 一种方法是重新选举master; 一种是Paxos,任何人都可以发起提案,通过特定的算法保证大家可以达成共识,不会产生冲突; 另一种是Gossip,每个人在每个周期内随机找一个master 其他节点同步彼此不知道的状态,概率最终会收敛,让所有节点都得到最新的状态,但是节点越多越慢收敛性是,它必须是最终一致性。 今天要说的主要是第三种,八卦。

Gossip是最终一致性,集群越大,延迟越大。 但它也有自己的优点,其中之一就是没有中心节点,不存在一个中心节点挂掉整个系统的时候跪下的问题。 当然,在现代分布式系统中,有很多方法可以提高中心节点的可用性,交换的是系统简单,可以实现强一致性。 因此,很多系统,尤其是与数据库相关的分布式存储领域比特币合约要多少钱可以做,大多还是采用以中心节点为中心的解决方案,只有Dynamo和对应的Cassandra使用了Gossip,不管数据库本身流行与否,但是这种类型近年来,新的分布式数据库很少采用这种架构。 Gossip等P2P虽然不适用于数据库,但在其他地方还是可以使用的。 除了不需要中心节点外,另一个好处是不需要每个节点直接相互通信。 只要任意两个节点最终能够通过其他节点进行传输,即强连接系统,就可以达成共识。 这在公共网络中非常重要。 比如不同内网的两个内网节点,根本无法直接互联。

历史上最火的 P2P 协议可能是 BitTorrent。 每个人都从其他节点下载并上传到其他节点。 只要一个节点拥有所有数据,甚至整个集群中对应文件的每一部分,最终每个人都会有完整的文档可用。 这其实就是Gossip协议对状态进行约定的过程,只不过是从“约定几个状态”变成了“约定一个文件的几个区间的内容”。 在分布式系统中,有一个中心节点要方便得多。 一方面,一般来说,一个系统的所有节点都在一个机房,也就是一个内网,节点数量还是非常有限的。 因此,在很多情况下优于P2P。 然而,在广域网中,集群中的节点数非常多。 如果你连接到一个中心节点,即使是一个有多个节点的中心服务,需要的机器数量和带宽都是非常大的。 因此,P2P很好的解决了这个问题。 每个人只要提供一点CPU和一点带宽就可以得到一个完整的文件,而且下载速度很容易超过从某台服务器单线程下载的速度。 即使一个节点掉线了,它仍然可以被下载。 删除文件以防止发布是完全不可能的。

不管是分布式数据库还是BT下载,其实都依赖一个前提,就是不会有节点闹事,故意传错数据,或者故意丢弃一些数据不给你。 这个问题被描述为分布式系统中的“拜占庭将军问题”。 我们使用的分布式数据库采用的任何共识算法都没有考虑这个问题。 数据库可能没问题,代码是自己写的,网络都是内网,没有被攻击的问题(bug不算),任何数据都是可信的。 即使在公网上传输数据,每个节点只需要通过一些认证协议来证明是自己,就不会出现问题。 但是P2P下载都是匿名的,无法证明是自己,如果有人故意上传错误的文件,污染整个系统,理论上有可能大部分人得到错误的内容,达成错误的协议。 比如去年出现的被迅雷下的木马中了的XCode就是如此。

因此,比特币设计者要想对各种状态(每个账户有多少钱,不同账户之间的转账记录)达成共识,P2P是必须的,关键是如何处理拜占庭将军问题。

首先,与其他网络协议类似,公钥和私钥方式的加密可以保证每个人都能证明自己是自己。 公钥可以随意传输,不用担心丢失,私钥不能公开。 数学运算可以保证每个人都可以根据加密的结果来判断产生这个数据的人是否是这个公钥对应的私钥的持有者。 公钥(或对应的hash)可以作为此人的public id,也就是所谓的钱包地址。

但这只是解决了“转账记录”的正确性,而不是别的,比如这个账户里有多少钱。 所以需要就“每个账户余额有多少”达成共识,而这个数据可以通过存储每个账户的初始值和所有的历史转账记录来解决(反正转账记录是要存的)。 并且需要保证全局使用相同顺序的转账记录。 在任何人看来,A先转50给B,然后B再转30给C。这样一来,只要大家能就这条转账记录的顺序达成一致,就相当于对每个账户的每个状态都达成了一致在世界上,这当然是最终的一致性。 但是,由于无法确定网络通信的顺序,不同节点收到的转账请求顺序完​​全不同,因此需要借助一种手段来确定“官方”接受的交易记录和顺序。 某个节点可以暂时说了算(反正就是选择一些交易记录,确定顺序来验证交易的合法性),但是你不能永远让某个节点说了算(否则这个节点不能' t伪造别人的交易记录,但可以阻止某些人做交易),也就是短期内是专制,但长期是民主。 如果这是在局域网中,各个节点成对通信的话,用本文第一段说的“通过某种方式定期选举master”就可以了,但是在广域网中,有这样的很多节点,不可能也没有必要 两者互相通信(尤其是内网ip问题),而且由于采用了类似Gossip协议的方式,导致整个集群的消息传递有延迟,所以需要一种特殊的方法来保证某个时间段内只有一个master。

因此,比特币的设计者设计了所谓的“区块链”技术,其核心是保证在一定时间内只有少数节点有资格被认可为主人。 具体的方法就是结合过去大家约定好的历史数据,你现在准备接受的转账请求序列,和一个可以随意改变的数字,做一个hash。 结果必须小于一个大家都认可的数字。 如果我们使用的哈希算法比较复杂,理论上不可逆,那么我们只能通过枚举“可以随意改变的数字”来找到一个可行的(当然不是唯一的)答案。 由于枚举的复杂度高,有一定概率在一段时间内只能计算出少量的节点。 并且因为hash是不可逆的,不可能有人直接求出可行解,别人计算出来的可行解的内容也不能随意改变(一旦交易序列的部分发生改变,得到的hash将不会改变)符合要求) 。 一旦有人提出要求,就可以通过八卦协议将消息发送到其他节点。 每个人都需要同意,一旦你发现别人比你先计算出来,那么你就会放弃,认为这个人计算出的结果对应的转账请求就是“共识”; 并同意,如果多个人声称在某个时间段内,master以一定的逻辑接受其中一个(例如,谁选择的时间长,也选择两个hash结果中较小的),而拒绝另一个. 然后根据Gossip算法可以知道,最终整个集群都能知道这段时间内达成共识的交易记录。

每计算一次哈希,这部分数据就是一个“块”,每个块都是一个依赖于前提条件的块,所以它是一条链,即“区块链”。

由于集群中的节点数和总算力是浮动的,不能因为节点太多就不断地计算出新的区块。 因此,对哈希结果大小的要求也是动态调整的。 如果过去的几个块说明集群中的平均算力比较大,降低哈希结果的阈值,增加难度; 否则,降低难度。 在概率上,保证平均每 M 分钟可以计算出一个区块。 如果 M 太大,传输会很慢。 M太小,概率上同时计算结果的节点太多,冲突太多,难以处理。 另外,由于区块中的记录是集群认可的交易记录,但是由于整个集群中可能同时计算多个不同的区块,所以从最终一致性的角度,我们可以确定这些冲突的区块最终会成为其中之一。 的更换。 但是如果最后一个非法区块X曾经计算出一个账户多了10块钱,然后这个人很快就把钱转走了去现实中买东西,并且因为有些节点还没有收到真正的合法区块X比特币合约要多少钱可以做,所以使用结果会被替换,计算区块X+1,同时接受转账请求转10块钱走,那么当这个区块和后面的区块最终失效时,这个人并没有得到任何币,但是如果你得到了一些东西在现实中,会悲剧的。。。所以一般来说,如果一条转账记录在block X中,那么在集群计算block X+N的时候,一定要考虑在block X中。 收入。 这个N设置为安全值后,可以保证即使有最终一致性,大家也不会先交易后被取消。 如果设置N不够,那么币的公信力基本就废掉了,俗称“分叉”。 和M一样,N也需要设置一个合适的值。 太大的话转账会慢(准确的说是转账确认慢),太小会有风险。

至此,我们可以保证所有交易记录不被伪造,保证交易过程的确认由集群的节点轮流完成(防止某个节点故意恶心人阻塞某些交易)。 而这个确认过程需要大量的计算资源(哈希的枚举,所以GPU在这个计算上有很大的优势),为什么要花电来做这个呢? 比特币的设计者通过“分配原始余额”来鼓励大家这样做。 每个计算出区块的人都可以分配一定数量的比特币作为奖励,让每个人都有动力去做计算,俗称“挖矿”。 所以大家的余额其实就是挖矿收益+转账收益。 只要整个系统中的大多数人都遵循既定的规则(比如区块的识别、区块难度的识别、交易的识别等),即使有人闹事,大家也会置之不理。 但是如果有人花费大量的计算资源,让自己的哈希能力超过别人的总和,那么就有了51%的攻击。 所谓51%攻击不能伪造交易给自己转账(因为是通过公钥和私钥认证的),而是计算合法区块速度更快,计算出比公网单位分值更高的区块链时间和掩饰秘密,故意使自己与外界隔绝。 同时,先用比特币转账买东西,然后等N个区块交易对方确认交易再把东西给你。 这时候我覆盖的区块链公开了,之前的所有交易都作废了,然后我一个比特币都没有丢。 然后得到了真正的东西......

以上是一个“加强版的Gossip”,可以说是一个去中心化的共识算法,很大程度上解决了拜占庭将军问题。 因此,它不仅仅用于电子货币。 比如我们可以建立一个公开记录数据的系统,把转账记录变成一堆字节,用类似的算法支持大家记录一个公开的实名消息(比特币本质上是实名的,大家知道每个账户的所有交易记录,但每个人都不知道现实中谁拥有这个实名比特币账户,所以在这个意义上是匿名的),无法篡改伪造,也无法被他人封锁。 而这些用途可以由一些真正需要它的实体(公司、国家等)来完成。 他们需要一个公开公平的分布式无中心系统来记录这些(比如跨行转账、统计数据等)。 实名挖矿算力块,那么只要大家同意提供特定的算力,就可以搭建类似的系统,只需要考虑不被51%攻击的问题。