译者注: 提前说明以下信息, 也许可以帮助读者更好地理解本文的内容以及我们在翻译用词上的选择: 在以太坊 2.0 中, 验证者的职责之一是提交 attestation, 可以理解为投票; 但在一条 attestation 中, 验证者投票的内容却有三项, 而不是一项: 一个是对信标链区块的投票, 用于 LMD Ghost 算法, 选择出主链; 一个是对 epoch(时段)的投票, 用于 Casper FFG 算法, 敲定检查点; 检查点以前的区块将不可逆转, 而检查点也会成为新一轮 LMD Ghost 算法的起点 (可以想象成不断刷新的创世状态); 还有一个是对分片链状态(crosslink) 的投票, 用于确定分片链的最新状态. 虽然都属投票, 但不同类型的投票指向的具体内容不同, 为整个系统贡献的属性也不同. 本文所讲的内容, 即是与 Casper FFG 相关的投票, 关键概念是 justification 和 finalization. 虽然文章后面也谈到了 LMD Ghost, 但应当把 LMD Ghost 和 Casper FFG 当成相互独立但可互补的两个东西.
有鉴于此, 虽然有译者将 attestation 翻译为 "证明", 但我们决定对上述所有概念都采取与其字面意义更接近的翻译, 不将任何一个概念翻译为 "证明" 或是 "投票", 以免造成更大的混淆.
如果你对以太坊 2.0 中 辩护(justification) 与 确定化(finalization) 等术语感到一头雾水, 你绝对不是唯一搞不清楚的人; 让我们通俗地解释这两个词究竟是什么意思.
我们先聊聊, 确定性(finality) 到底指的是什么? 你一定已经注意到, 不论是使用密码学货币平台或 dApp , 都要等到数个区块产生后交易才能被确认(confirmed). 这是个 相对 可靠的办法(但并不是 100% 的保证), 让你确定交易的状态且交易不会被逆转, 也就是所谓的确定性.
以太坊 2.0 提供了一种确定性保障 -- 将上链交易变成一个记录在区块链上的客观事实, 而不仅仅是 "该交易可能会保留在最长链上" 而已. 这很重要, 如果区块能够及时确认, 那么链上的交互行为就能进行得更快更完备.
我们再搞清楚一点, 先从一些定义开始.
注意: 后面的内容涉及比较多底层技术, 不过仍会像 2.0 系列 https://our.status.im/tag/two-point-oh/ 的其他文章一样简单易懂. 如果发现任何需要添加的内容, 请 联系我 https://twitter.com/bitfalls .
在谈论细节之前, 我们先理清楚几个定义:
LMD GHOST : 最新消息驱动型 GHOST 算法( Last Message Driven Greediest Heaviest Observed SubTree), 以太坊 2.0 的分叉选择规则.
Casper FFG :Casper FFG 协议( Casper, the Friendly Finality Gadget), 以太坊 2.0 用于提供确定性保障的协议.
分叉选择规则 : 一种机制, 给定整条区块链, 可以输出从创世块到区块 S 的区块链路径, 并让 S 所在的链可以被认为是权威链(也称 "主链","根链").
epoch : 在以太坊 2.0 中, 指的是时长 6.4 分钟的时间单位, 每个 epoch (时段)包含 64 个 slot(时隙, 每个时隙为 6 秒 ).
不一定每个时隙都能产生区块, 而 epoch 中最后一个 slot 称为 边界时隙 ( boundary slot ), 或称为 检查点 ( checkpoint ).
所谓 委员会 ( committee ), 就是 随机 https://our.status.im/two-point-oh-randomness/ 选出的一个验证者集合; 每个委员会都会被分配到一个具体的时隙中, 委员会中第一位验证者负责出块 (propose block), 其他验证者则来见证(attest) 该区块.
有了这些概念, 接下来让我们开始讨论辩护 (justification) 与确定化(finalization).
Casper FFG
Casper 是一种用于合理化 (justifying) 及敲定时间段的方法(既适用于一般的区块链网络中的区块, 也适用于以太坊 2.0 中的 epoch). 它是一种通用的 "小工具", 能够被添加到任何区块链中; 不过在 PoS 区块链上才能发挥 Casper 的最大用处.
确定性 (Finality) 是一种概念, 即两个相互冲突的检查点不可能都被确定下来(不可逆转); 亦可称作经济确定性, 因为一旦两个相互冲突的检查点都被敲定, 则系统中至少有 1/3 的验证者会被 罚没押金 .
你可能会有疑问, 为什么 1/3 的验证者会被罚没押金?
一旦出现两个相互冲突的检查点, 意味这两个检查点各自收到 2/3 以上的验证者投票; 因为最终只有一个检查点能成立, 所以至少会有 1/3 的人重复投票. 这 1/3 重复投票的验证者会被认为是恶意参与者而被罚没押金. 为了避免这样的无效操作, 验证者最好的办法就是在每一轮投票前确认信标链的状态, 然后给合适的检查点投票.
那么如何理解 "检查点确定成立" 中的 "确定" 呢? 我们得先聊聊 合理化(justification, 上文称为 "辩护") .
合理化 (Justification) 指的是验证者对检查点进行投票, 并决议出哪个检查点要置于当前信标链的最前端的操作. 只要超过 2/3 的验证者 (即绝对多数) 对 一对 epoch (例如 source epoch S -> Target epoch T, 即来源时段和目标时段)达成共识, 我们会说这两个 epoch 被合理化了( justified ); 不论这两个 epoch 当中有没有被跳过的 epoch , 只要同一列中的两个 epoch 被证明了, 则我们称前一个 epoch 被敲定了(finalized).
注意: 为了方便理解, 上述是大幅简化过后的定义; 还有其他影响因素, 但不在本文讨论范围中.
所以说, 一个 "已确定(finalized)" 的 epoch 肯定经过合理化(justified); 反之, 一个 "合理化(justified)" 的 epoch 则不一定确定了, 还存在反转的可能. 一旦 epoch 达到 "最终" 状态, 就难以被更改.
提醒一下, 当我们说验证者在进行证明 / 确定时, 并不是指验证者对 epoch 本身投票 -- 这听起来好像某些人在用投票来决定当时是什么时间一样 (我们都知道当前是哪个时间, 根本没必要投票). 验证者其实是对这些 epoch 中的内容 -- 它们各自最后时隙(边界时隙) 的根状态, 进行投票. 因此验证者通过对 epoch 投票进行 证明 / 确定, 来选择区块链的最新有效状态(译者注: 原文如此. 但这么说也有点引人误解).
复联 4 的终局之战, 奇异博士看到了平行世界中的 1400 万种可能. 在这些平行世界中, 时间呈线性进行, 每一天, 每一小时都在所有世界中同时发生; 但在所有这些世界中, 只会产生一个可取的结果 -- 其它结果都是分叉.
LMD GHOST
分叉选择进行的方式在此.
GHOST 算法早期在 PoW 和其他区块链上非常受欢迎; GHOST 算法依循 "最重的" 子树, 也就是最长链(译者注: 大略可以这么说, 但这么说实际上是不严谨的). 以比特币为例, 最重分支指的是在其区块中投入最多算力的的链, 这条链也就是最长链. 虽然说最长链很容易看出来, 但这条最长链只在 概率上确定 , 在任何时候都有可能在另一分叉上长出更长的链(虽然这种几率极小).
在最新消息驱动 ( LMD )GHOST 方法中, 算法运行是基于 "消息( message )", 也就是 attestation ("见证信息") 的. 总的来说, 拥有最多投票的分叉链就会被认为是 "权威链".
上图展示了最新消息驱动 GHOST 方法的细节; 笑脸符号 代表见证信息, 每个区块中有个数字, 代表见证的数量总和, 也就是该区块的权重. 在上图中, 虽然最上面那条链是最长链, 但绿色那条才是 "权威链".
Gasper
在以太坊 2.0 中, Casper 和 GHOST 合称为 Gasper, 是以太坊 2.0 的核心共识协议.
让我们来看看 Justin Drake 在 EthCC 大会上对以太坊 2.0 做的简报.
上图的两个方框中, 表示在分叉选择时的两种非法条件. 左边方框表明, 不允许在同个时间里, 为两个不同的根状态投票(即, 你不可以在同一时间投票给两个包含不同内容的 epoch). 右边方框表明, 如果一个时段直接来自一些已敲定的时段, 则不允许绕过这些时段来给新时段投票. 换句话来说, 不允许跳过当前的候选 epoch 而直接上票给将来的 epoch .
图中下方展示两种 "确定" 的分叉链. 第一个和第二个红圈所代表的 epoch 已经确定了, 因为它们后面跟着已确定的第三 epoch 和第四 epoch. 然而第三, 第四 epoch 存在于两个平行分叉中, 究竟那一条分叉才是 "权威链" 呢?
根据第一条规则: 不允许进行重复投票. 简报中上面那条分叉似乎是合法的, 因为其上已经有了一个确定的 epoch , 但下面的分叉中也有被确定的 epoch , 只是确定得稍稍晚了点!
这就总结出, 下方分叉是无效的, 因为如果按照后来被确定的 epoch 来形成一条链, 就意味着前面被确定, 但由于分叉而被跳过的 epoch, 被 "环绕( surrounded)" 了起来; 换句话说, 一个新投出来的 epoch 接上了来自另一个分叉的 epoch. 这种情形是不合法的 -- 因为被确定的检查点必须按照时间顺序进行. 如果发生了这种情况, 很多的验证者会因为把票投给了一条 "非法链" 上的 epoch, 而受到严重的惩罚. 根据 "重复投票(double vote)" 和 "环绕投票(surroundedvote)" 规则可以辨识出哪些验证者在作恶, 而作恶代价将是非常高昂的.
以上就是全部内容! 如果你是验证者, 请确保自己在一个 slot 中只投了一次票, 并确保你的投票结果与其他人的投票结果一致, 以避免被罚没(别担心, 这些功能都会集成到 以太坊 2.0 客户端 https://nimbus.status.im/ ).
希望本文帮你弄清楚辩护 (justification) 与确定化 (finalization) 的定义, 如果还有不明白的地方, 请通过 推特 https://twitter.com/bitfalls 告诉我. 最后, 感谢 Dustin https://github.com/tersec , Mamy https://github.com/mratsim , Justin https://twitter.com/drakefjustin 和 Danny https://twitter.com/dannyryan 的协助!
来源: http://www.tuicool.com/articles/fyEzeau