以太坊 2.0 使用权益证明机制来保护网络,也就是由许多叫做 “验证者” 的计算机线程来投票决定哪一个区块能够上链(即所谓的 “attesting”,作见证),当然也会自己提出备选区块。不过,验证者不是仅仅只有 “开” 和 “关” 两种状态:从成为验证者到退出验证者的整个生命周期中,其状态会经过多次转换。本文会深入研究验证者的生命周期,展示各阶段和转换过程的实质、如何触发转换,以及每种转换的历时 1。
先说明一下时间单位:
以太坊 2.0 中的时间通常是用 “epoch(时段)” 这种单位来度量的,1 个时段是 384 秒,也就是六分半钟。为便于理解,基于这一度量的时间我都转化成了以分钟、小时、天为单位,并在附录的脚注中提供详细信息。
在深入细节以前,我们先来看看验证者生命周期的概况、了解一下用于表述不同状态的术语。
图 1:验证者生命周期一览
各标签所示的阶段如下:
已存入保证金(Deposited):保证金要约已被以太坊 1.0 区块链打包
等待激活(Pending):保证金要约被以太坊 2.0 网络接受
活跃(Active):验证者要见证区块及提议区块
即将退出(Exiting):验证者即将停止见证及提议区块
被罚没(Slashing):因为作弊被抓,验证者停止见证和提议区块
完全退出(Exited):验证者完全退出,不再参与任一流程
也可由此定义出一种基本状态:“正在见证(attesting)”,激活、主动退出及完全退出都在该状态中,处于该状态的验证者被指望去见证及提议区块。这个状态是最重要的,在此状态下,验证者需要连接以太坊 2.0 网络、同步数据,以履行责任,避免被惩罚。
图 2:“正在见证” 状态
定义完了这些阶段之后,我们就来详细考察它们之间的转换过程。
保证金要约被接受是验证者生涯的开始;这个接受过程是在以太坊 1.0 链上发生的,因为验证者资金原本就放在以太坊 1.0 链上。但 1.0 链接受之时,2.0 链还不能感知到这笔存款。
验证者的保证金存入阶段大概要历时 7.5 个小时 2,以保证链重组影响到 Eth1 交易的顺序乃至保证金要约无效化的概率足够小。这个阶段完成后,验证者就进入等待激活阶段 3。
图 3:从保证金存入阶段转到等待激活阶段
保证金在 Eth1 链上存入足够久之后,它就会被 Eth2 链接受。这标志着验证者正式开始接受 Eth2 的组织。假设一位验证者存入了至少 32 ETH 4,那么 TA 就可以开始作见证了。
等待激活的验证者会组成一个队列:在一个时间点,Eth2 链上能激活和能退出的验证者数量都是一个比较小的数量(所以要排队)5,以保证验证者集合的稳定性。如果队列是空的,那么等待激活的验证者会在大约 25 分钟以后激活 6;如果队列很长,那可能要几天甚至几周才能激活。不过,排完队之后,验证者就可以直接激活、参与见证。
图 4:从等待激活到活跃阶段
一般来说,一名验证者的绝大部分时间都处于这个阶段。活跃验证者大约每 6 分钟要发出一条见证消息,偶尔要自己提议区块 7。验证者会一直保持在活跃状态,除非出现下列三种情况:
该验证者因没有及时发出见证消息而遭受惩罚,最终其余额低于 16 ETH
该验证者主动要求退出,方法是发送相应的一笔交易(在刚激活的 9 天内不能发出此种交易)
该验证者被证明作恶
在前面两种情况中,验证者都会被加入退出队列(一段时间内能离开活跃状态的验证者数量也是有限的,就跟能进入的验证者数量受限一样,大概是每几分钟可以离开 1 个)。
图 5:从激活状态到即将离开
在第三种情况下,验证会被加入作恶者队列,接受惩罚。
图 6:从激活状态到被罚没状态
值得注意的是,如果有需要,验证者总是能够发送额外的保证金要约(包含相同的验证者信息)来 “充值” 余额(但是有效余额的上限是 32)。这样就能避免验证者余额低于 16 然后被放到退出队列里去。
虽然主动退出的验证者表达了停止验证的意愿(不论是自愿还是被迫的),但是,他们是不能立即退出的。相反,虽然处于即将退出状态,他们还是要照常承担职责,跟活跃状态时候一样要见证和提议区块。这样保证了网络的稳定性,避免了验证者立即退出会造成的冲击。
就像验证者想激活的时候有个等待激活状态和队列,想要退出的验证者也有一个队列,一段时间里仅允许少量验证者退出。同样地,主动退出阶段要花费的时间取决于排在前面的验证者有多少。
图 7:从正在退出到完全退出
验证者违反协议后被抓,就要立即被罚没 1 ETH(从其余额中扣除),然后进入被罚没状态,这跟即将退出状态类似,但是还要遭受惩罚。这一点我们在下文的 “完全退出” 部分讨论。
图 8:从被罚没到完全退出
处于即将离开状态乃至已经完全退出的验证者,都有可能被罚没(验证者完全退出到可以取出资金以前有一段间隔,在此期间是可以被罚没的)。这样能防止作恶的验证者利用正常的退出机制、在作恶被发现以前逃之夭夭。结果就是状态模型变得更加复杂:
图 9:补充罚没条件之后
转到完全退出状态之时,验证者就正式结束了自己的工作,不再需要见证和提议区块,也不再需要紧跟 Eth2 区块链的实时动态了。
转成完成退出状态之后,大概还有一天的延迟 8,之后才能取出验证者余额。不过,如果一个验证者是从被罚没状态中完全退出的,那还要接受两项额外的惩罚。
第一项,从完全退出到能够取款的间隔会长得多,要 36 天 9。第二项,在这 36 天期间,系统还会根据该验证者作恶被抓的时间点前后 18 天内被罚没的验证者数量对该验证者施加进一步的惩罚。那么该验证者的有效余额损失比例 10 将如下图所示:
图 10:被罚没的有效余额与同期被罚没的验证者比例的关系
36 天的周期走完,被罚没验证者剩下的余额就能拿走了。
从这个生命流程图中可以看出,没有额外的机制让一个完全退出的验证者重新激活。因此,一旦某个验证者退出,其资金就会一直休眠,等待验证者前来取走。不过,Eth2 Phase 0 时候,资金是不能转账的 —— 因此所有完全退出的验证者的资金都仍保存在质押系统中,直至开启转账功能。没有转账功能,是因为用户帐户模式还未引入。
把上面所有详细信息补充到流程图中,可以得到一个完整的图:
图 11:补充后的验证者生命流程图
请细看其中补充的条件、各阶段的历时、转换过程,这些细节对成功运行 Eth2 验证设施非常关键。从初始化保证金到取出保证金,这个生命流程图点出了各阶段可能发生的情况,也为验证者在全时段中的表现提供了清晰的解释。
注 1:要注意的的是,以太坊 2.0 的规范没有一个显式的状态机,因此,各阶段的名称都是作者为便于描述而给出的。
注 2:1024 个以太坊 1.0 区块的时间加上 32 个以太坊 2.0 的时段。
注 3:这里假设验证者存够了 32 ETH。如果没有存够,则该验证者会一直停留在保证金存入阶段,直到该验证者另外发起保证金要约,使其余额超过 32 ETH。
注 4:如果不到 32 ETH,那还可以另外再存入,提高该验证者的余额。
注 5:每个时段有 (激活验证者数量 + 主动退出验证者数量 + 被罚没验证者数量)/63356 个名额,下限是 4 个。
注 6:即 4 个时段的长度。
注 7:每一个验证者都需要在一个时段中的某个时隙(slot)发出见证消息,而每一个时隙都会有一名验证者被随机选中作为区块提议者。
注 8:256 个时段。
注 9:8192 个时段。
注 10:注意,罚没力度最高是 100% 的有效余额,但有效余额的上限是 32 ETH,无论该验证者的实际余额是多少。