我们说,在一个分布式系统里面各个节点取得了共识,这到底是什么意思呢?区块链技术的代表,比特币系统,的各个节点,又达成的是什么具体的共识呢?共识为什么如此重要呢?我们这篇试图来回答这些问题。因为这个问题圈内弄得很玄乎,所以我从能说明白的地方开始,免得招些无谓的板砖。
首先我们来看一个分布式系统的共识。他的定义清晰而又明确,一致就是分布式系统中所有正常工作的(未崩溃)节点,都将某个变量设定为相同的值(或者0,或者1)。而所谓的不一致,则是对同一个变量,一些节点的值设定为一,而另外一些节点的值设定为零。这些节点都是正常节点,既不是故意的捣乱,也不是系统崩溃。
我们可以用状态机拷贝来把这个问题转换为一个通讯问题。每个节点都有一个相同的状态机,从同样的状态出发,如果他们收到的消息(数据)相同,而且以相同的顺序提交,那么他们就会停留在一个相同的状态。这个状态设定的变量值,就是相同的。这时候,我们说系统达成了一致(共识)。
把同样的数据,按同样的顺序发送给每个节点的过程,就是 atomic broadcast,或者叫 reliable multicast,或者叫 total ordering multicast。不要问我为什么有这个多名字,他们之间的微妙区别,我也不敢说我都懂。好消息是,在可靠的广播基础上,一定可以实现atomic multicast。而total order multicast,据说就是 atomic multicast的另外一个名字。
状态机相同加上数据拷贝相同,系统就能达成一致。而状态机也可以作为数据来拷贝,所以整个一致性问题就等效于数据拷贝问题(Data Replication)。推论:如果状态机够快,整个分布式系统的瓶颈,就是通讯拷贝或者说数据拷贝的性能(Data Replication)。现在的CPU/GPU等确实很快,而广域分布系统的通讯确实是核心性能瓶颈。
具体到比特币系统,他们取得一致性的是那些变量呢? 代码清晰明确,比特币系统,对每个地址的交易(Transaction 打包了叫区块Block),和地址的余额(Unspent Transaction Output, UTXO, 好比银行账号的人民币余额), 达成了一致。其中,把UTXO在各个地址(匿名账号) 之间转来转去的记录叫交易。
再往上一层,一次交易就是交易的双方,就某个价值转移达成了一致意见,比如十块钱从A到B转账交换一个红薯。一次交易是两次转账,A 转账10块钱给B,B转帐一个红薯给A。
继续往上走,在社会协同的层面,社会意义层面,有很多共识本质是什么的讨论。这很有趣也很重要,但不是本篇能够涵盖的内容了。貌是生产力和生产关系的讨论,也许以后的篇章会涉及。
技术部分
State Machine Replication 是Lamport 经典论文提出的解决分布式计算容错与并行的方法论,其中的关键环节是一致性。
一致性的 Data Replication 解释,朋友表示简洁明了。那是美国院士 Ken的原创,不敢掠人之美。如果有不准确的地方,那则是我的水平问题。