3.1. 共识算法简介¶
3.1.1. 什么是账本?¶
大多数对区块链有使用价值的应用在某种意义上都跟踪一组交易,即从某个实体中增减资源的记录集合。 这种交易集合被称为 账本。 定义账本的内容是任何使用区块链的系统的核心。
3.1.2. 什么是分布式账本?¶
现在你了解了区块链如何工作,你可以理解它最基本的属性之一:任何知道区块链头哈希指针并且可以访问链节点的人都能够验证链是"正确的"。 这意味着任何有权访问的人都可以看到链没有被篡改过。
这个基本属性使得分发区块链(即系统的账本)成为可能,以便许多参与者持有副本。 在某些情况下,可能甚至不存在账本的"真实"或"规范"副本。 有很多参与者持有副本,只要他们对内容达成一致(每个人都可以通过知道头区块的哈希指针来验证),就没问题。
3.1.3. 如何更新分布式账本?¶
但仅仅能够持有自己的账本副本本身是没用的。 要真正有用,必须有一种方法来更新账本。 如果账本只有一个中心"控制者",这相对容易。 该实体可以更新账本,然后向其他参与者广播新的头哈希指针和区块链节点的副本。 这意味着每个人仍然可以保留他们的账本副本,每个人可以验证之前的区块没有被更改("篡改"),每个人可以验证最新的更改与链的其余部分自洽。
但是,拥有唯一修改账本权限的中心化权威对某些系统中的参与者来说是不可接受的。 最值得注意的是,加密货币被认为在没有控制更新账本的"所有者"时作为货币系统更有用。
3.1.4. 什么是共识算法?¶
那么,这在实践中意味着什么? 我们希望能够分发(制作副本)账本, 并且 我们希望多个实体能够更新账本。 嗯,如果我们打算这样做,那么在账本内容上达成可靠 共识 是必要的。 具体来说,这意味着每个人必须就下一个添加到区块链的区块内容达成一致。 更新区块链并使每个人同意此更新的过程称为 共识算法。
已经提出和实现了各种共识算法。 这些包括 工作量证明、权益证明、拜占庭协议、燃烧证明、容量证明 以及许多变体。 共识算法的一些基本特征是: (1) 谁可以提议下一个区块?(有时这是社区的一个子集。) (2) 社区的其他人如何"验证"提议的区块是可以接受的? (3) 在所有账本观察者之间传达更新信息的实际机制是什么? 许多共识算法通过要求提议者消耗一些资源(计算周期、内存或他们的一些加密货币)来解决 (1)。 如果提议者成功添加了新区块,那么他们将获得一些加密货币或其他资源的奖励,由加密货币系统本身支付(比特币就是这样工作的),或者由被此过程添加到区块链的交易参与者支付(以太坊就是一个例子)。
在分布式环境中实现分发此更新信息以达成共识的机制至少有两个挑战。 第一个挑战是无法保证通用时钟甚至网络内的可靠消息传递。 只有在做出一些合理的时序假设之后,算法才能确定所有消息已成功传递并达成一致的决定。 第二个挑战是系统中可能存在不诚实的恶意参与者(不遵循共识协议)甚至颠覆系统中的其他参与者。 如果系统中有足够多的恶意参与者(通常称为 对手 ),那么没有共识算法能够成功。 因此,必须有关于对手能力以及诚实参与者比例的假设。 通常,关于通信网络也有假设。 幸运的是,良好的共识算法只要大多数参与者是"诚实的"就能成功。
共识显然失败了,如果区块链中存在长期的 分叉,其中多个区块被不同的参与者组接受为区块链中的下一个区块。 请特别注意每个共识协议避免长期分叉的方式。
与其抽象地讨论共识协议,我们将在现有区块链系统中具体地解决共识。 这些系统自然分为两类: 无许可系统,任何人都可以加入作为共识协议的潜在参与者; 以及 许可系统,只有指定的、受信任的参与者才被允许执行共识协议。 无许可系统更常见,我们考虑这些例子:
Bitcoin
Ethereum
Algorand
每个系统都有相关的加密货币。 虽然加密货币在无许可系统中不是必需的,但这只是它们在历史上主要被使用的方面。
我们还将描述这个许可系统:
Hyperledger
