上一期我们讲了拜占庭将军问题——在已知有叛徒的分布式军队中,将军们如何达成共识,执行共同的作战计划,来取得战争的胜利。
针对此问题的深入研究,科学家们提出了口头协议和书面协议两个方案
解决方案一:口头协议
将军派信兵向其他所有将军传达口信,每个将军再将自己收到的口信传达给其他将军以供决策,最终多数投票即为共识。最终达成以下三点:
1、每个被发送的消息都能够被正确投递;
2、信息接受者知道消息是谁发的;
3、沉默(不发消息 ) 可以被检测;
但这个方案存在的缺陷也很明显:消息无法溯源,不会告知消息的上一来源是谁,如有叛徒,则难以找到叛徒所在。
解决方案二:书面协议
将军派信兵向其他将军发送书面信息,并附其签章,其他将军收到书信后附上自己的意见与签章再发给剩余将军,最终得到共识。实现了以下三点:
1、签章有记录,解决溯源问题
2、签章难以伪造,篡改会被发现
3、将军们都可验证签章的真伪
但这一解决方案依然存在缺陷:签章记录的保存人不一定可信,真正可信的签名体系很难实现。
以上两个方案,在任意时间,系统中可能会存在多个提案,即每个将军都可以传出自己的意见。
这就是一个由互不信任的军队所构成的分布式网络,要获得最大的利益,又必须一起努力才能完成,如何达成一致的共识,变成了一个难题。
虽然,拜占庭将军问题是由莱斯利·兰伯特提出的,但真正解决这一难题的是中本聪。
解决方案三:区块链技术
区块链中通过引入【工作量证明机制】来提升做叛徒的成本,在工作量证明下,只有第一个完成规定计算工作的节点才能广播区块。
通过工作量证明就增加了发送信息的成本,降低节点发送消息的速率,即:一段时间内(10分钟)只有一个节点可以传播信息。
同时在广播时会附上自己的签名,由于签名是不可伪造的,所以就保证了消息来源的可追溯性。
这个过程就像一位将军在向其他的将军发起一个进攻提议一样,如果是诚实的将军就会立刻同意进攻提议,而不会发起自己新的进攻提议。
这就是比特币网络中是单个区块达成共识的方法。
假设攻下一个城堡需要多次的进攻,每次进攻的提议必须基于之前最多次数的胜利进攻下提出的,这样约定之后,将军在收到进攻提议时,就会检查一下这个提议是不是基于最多胜利提出的,如果不是,将军就不会同意这样的提议,如果是的,将军就会把这次提议记下来。
这就是比特币网络最长链选择机制。
如果不同的将军先后解出了题,各自先后在这个网络发布消息,于是各个节点都会收到来自不同节点发起的进攻或者不进攻的消息,那怎么办呢?
只有时间最早的发起者才是有效的。
中本聪巧妙的设计了一个时间戳的东西,为每个将军在解好题的时间(出块时间)盖上时间印章。
将军们又凭什么要一起做工作量证明呢?中本聪设置了一个奖励机制,比特币的奖励机制是每打包一个块,奖励一定数量的比特币,这样将军们就会尽最大努力维护系统的稳定性。