区块共识

分布式系统由于引入了多个节点,所以系统中会出现各种非常复杂的情况;随着节点数量的增加,节点失效、故障或者宕机就变成了一件非常常见的事情,解决分布式系统中的各种边界条件和意外情况也增加了解决分布式一致性问题的难度。 节点之间的网络通信收到干扰甚至阻断以及分布式系统的运行速度的差异都是解决分布式系统一致性所面临的难题。

保证一致性、可用性和分区容错性

一是节点直接可以正常通信,二是冲突需要在有限的时间内解决,只有在这两个条件成立时才能达到最终一致性。

拜占庭将军问题

它是分布式领域中最复杂、最严格的容错模型。 系统不会对集群中的节点做任何的限制,它们可以向其他节点发送随机数据、错误数据,也可以选择不响应其他节点的请求,这些无法预测的行为使得容错这一问题变得更加复杂。

有一组将军分别指挥一部分军队,每一个将军都不知道其它将军是否是可靠的,也不知道其他将军传递的信息是否可靠,但是它们需要通过投票选择是否要进攻或者撤退: 它们都认为自己的选择是大多数人的选择,这时就出现了严重的不一致问题。

拜占庭帝国想要进攻一个强大的敌人,为此派出了10支军队去包围这个敌人。这个敌人虽不比拜占庭帝国,但也足以抵御5支常规拜占庭军队的同时袭击。这10支军队在分开的包围状态下同时攻击。他们任一支军队单独进攻都毫无胜算,除非有至少6支军队(一半以上)同时袭击才能攻下敌国。他们分散在敌国的四周,依靠通信兵骑马相互通信来协商进攻意向及进攻时间。困扰这些将军的问题是,他们不确定他们中是否有叛徒,叛徒可能擅自变更进攻意向或者进攻时间。在这种状态下,拜占庭将军们才能保证有多于6支军队在同一时间一起发起进攻,从而赢取战斗?

拜占庭将军问题中并不去考虑通信兵是否会被截获或无法传达信息等问题,即消息传递的信道绝无问题。Lamport已经证明了在消息可能丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。所以,在研究拜占庭将军问题的时候,已经假定了信道是没有问题的. 如果叛徒的数量大于或等于1/3,拜占庭问题不可解。 假设只有3个人,A、B、C,三人中如果其中一个是叛徒。当A发出进攻命令时,B如果是叛徒,他可能告诉C,他收到的是“撤退”的命令。这时C收到一个“进攻”,一个“撤退“,于是C被信息迷惑,而无所适从。 如果A是叛徒。他告诉B“进攻”,告诉C“撤退”。当C告诉B,他收到“撤退”命令时,B由于收到了司令“进攻”的命令,而无法与C保持一致。 正由于上述原因,在只有三个角色的系统中,只要有一个是叛徒,即叛徒数等于1/3,拜占庭问题便不可解。

Paxos Raft

节点并不会故意的发送错误信息,在类似系统中,最常见的问题就是节点失去响应或者失效

工作量证明(POW,Proof-of-Work)

请求服务的节点解决一个不容易解答但是容易验证的问题,

每一个节点不断改变 NONCE 来得到不同的结果 HASH,如果得到的 SHA-256(block header+NONCE) 结果在小于某个范围 难度 越小难度越大,来获得当前区块的记账权

随着网络算力的不断改变比特币也会不断改变当前问题的难度,保证每个区块被发现的时间在 10min 左右

防止错误或者无效请求的原理就是增加客户端请求服务的工作量,而适合难度的谜题又能够保证合法的请求不会受到影响

攻击者对已出现的区块信息进行修改,必须完成该区块外加之后所有区块的工作量,并最终赶上和超越诚实节点的工作量。除非攻击者掌握过半数的算力

POS (Proof-of-Stake)

权益证明

试图解决POW机制中大量资源被浪费的情况。 占有币越多,时间越长, 币龄(每个币每天产生1币龄)越高 就有记账权 每被清空365个币龄,就会从区块中获得0.05个币的利息。

委托权益证明(DPOS,Delegated Proof-of-Stake)

每一个人选出可以代表自己利益的人参与到记账权的争夺中,这样多个小股东就能够通过投票选出自己的代理人,保障自己的利益。 每一个参与者都能够选举任意数量的节点生成下一个区块,得票最多的前 N 个节点会被选择成为区块的创建者,下一个区块的创建者就会从这样一组当选者中随机选取,除此之外,N 的数量也是由整个网络投票决定的,所以可以尽可能地保证网络的去中心化