在计算机科学领域,分布式一致性是个相当重要且被广泛探索与论证的问题。对于区块链分布式网络而言,问题的核心在于确保某个变更在分布式网络中得到一致的执行结果,是被多个参与方都承认的。换句话说,这个信息是真实可信未被篡改的。
区块链百科No.15:分布式一致性
热力学第二定律告诉我们,
熵增过程是一个自发的由有序向无序发展的过程。
在物理学中,熵是描述一个系统内在混乱程度的物理量。对于一个孤立的系统来说,在没有外力干预做功的前提下,系统内在混乱程度是会不断增加的,也就是熵是增加的。这个并不难理解,就像我们为了保持房屋整洁,定期必须打扫,要不然就会越来越乱。
分布式系统就是一个典型的熵增过程。
在分布式系统中,要协调大量机器有序地完成任务并不是一件容易的事情。对于分布式系统而言,如果对于系统不加以外力的控制和干预,系统将自主走向混乱和无序。换句话说,分布式一致性之所以重要,就是需要一步步厘清无序,通过使用相应的策略和算法抵抗熵增,使整个系统达成共识,保持有序和确定。
❶
分布式系统中的问题
要清楚理解分布式一致性,首先需要对分布式系统的特性有清晰的认识。或者通俗理解,在分布式系统中,我们可能会遇到哪些问题呢?
Crash Fault 故障错误
故障错误是分布式环境中最常遇到的一类问题:比如网络随时可能会中断;或者由于信道的不稳定,消息的传送出现延迟;以及物理机磁盘或CPU问题,部分节点或者副本随时会宕机、暂停运行等。实际上,这些问题都是由于物理硬件不可靠、不稳定多带来的一些必然风险,也是分布式系统中必须考虑并解决的最基本的错误。
Byzantine Fault 拜占庭错误
如果说上面的故障错误,仍然有着非此即彼的假设,并且不带有主观上刻意为之的含义。实际中还存在灰色地带,就是网络中可能存在作恶节点,其会随意篡改或伪造数据,那么一致性问题的难度就大幅增加。我们常把这类存在“捣乱者”,可能会篡改或伪造数据或响应信息的错误,称之为拜占庭错误(Byzantine Fault)。
❷
解决一致性问题的思路
通常而言,如果系统处于可信的内部网络环境中,大多时候只需要考虑故障错误可能就足够了。比如传统的整个网络体系是相对封闭的,又有多重防火墙的保护,外界很难接入或攻击;各个节点也是由公司统一部署的,机器或运行的软件遭到篡改的可能性极小。我们需要考虑的是网络的延迟、不稳定,以及机器随时可能出现的宕机、故障。因此传统分布式一致性算法是面向数据库或文件的。
而在区块链的分布式系统中,达成一致的共识机制是面向交易对或价值传输双方。
显然,我们此时面临的挑战更大了,除了要考虑通信网络和机器硬件的不可靠之外,还必须要考虑和应对系统中的“捣乱者”。因为在较为开放的网络,或者是完全开放的网络中,任何人都可以随意接入到网络中;而节点机器和上面部署的软件也是由各个公司或个人自己提供和部署的,那么如果利益足够大,很可能会有人对网络中的某个节点发起攻击、故意篡改软件代码改变其执行逻辑、甚至可能故意篡改磁盘上持久化的数据。
❸
分布式一致性的要求
从传统的封闭分布式网络环境中的一致性,到有权限控制的分布式场景中的一致性,再到区块链网络中的共识机制,我们面对的问题越来越复杂,但规范的说,分布式的一致性算法应该满足:
可终止性(Termination):一致性的结果在有限时间内能完成;
共识性(Consensus):不同节点最终完成决策的结果应该相同;
合法性(Validity):决策的结果必须是其它进程提出的提案。简单理解即达成的结果必须是节点执行操作的结果,如影院共计100张票,如果两个平台分别卖出10张,那么达成的结果是还剩下80张,而不能说卖光了。
从单纯的数据一致性,到强调节点之间的共识与认同,我们已经走在路上,而该领域正在进行的创新性积极探索,也必将让世界变得更加可信。