L M D G h o s t 机 制

Dora Dōjo Workshop
资助金额:100 USDT
分享者:北邮在读硕士 Syshems
本项目由Dora Dōjo资助,文章转载请联系
Telegram: @DoraDojo0
WeChat: @DoraDojo0

以太坊 Gasper 协议是由 Casper FFG 和 GHOST 协议构成的。GHOST 是 Greedy Heaviest Observed Subtree(贪婪最重可观察子树)协议的缩写,Eth2 在其 PoS 机制中采用的 LMD GHOST 机制是 GHOST 的一个变体。本课题旨在探究 LMD GHOST 分叉选择机制,先从 GHOST 说起,逐步拆解 LMD Ghost 工作原理。

一、GHOST 和 LMD

LMD GHOST 是共识机制的本质,作为一个分叉选择规则,就像中本共识中的「最重链规则」一样,它有自己的一套属性和权衡。LMD GHOST 是 LMD (Latest Message Driven) 和 Ghost (Greedy Heaviest-Observed Sub-Tree) 的组合,我们先从 GHOST 开始说起。

1、GHOST

GHOST 协议出自 Sompolinsky 和 Zohar 在 2013 年发表的一篇关于如何安全地提高比特币交易吞吐量的论文。论文指出:增加块的大小或减少出块时间都会使链更容易在网络中分叉,因为网络具有不受控制的延迟;若通过上述方法提升链的吞吐量将造成链的分叉和重组,这不利于链上交易的安全;在允许延迟的情况下,如果用 GHOST 分叉选择取代比特币「最长链原则」,允许区块生产更频繁、更稳定。

简单来说,GHOST 的分叉选择不是遵循最重的链,而是遵循最重的子树。它认识到对区块的投票不仅仅只是针对该区块,而是隐含地对其每个祖先进行投票,因此整个子树都有关联的权重。

然而,尽管该论文证明 GHOST 协议有效,但比特币并没有采用,PoW 以太坊也没有采用 GHOST (尽管最初计划要使用),而是继续使用旧的工作量证明“叔块奖励”。

2、LMD

GHOST 协议被用在 PoS 以太坊的断言 (attestation) 部分,所有验证器都是投票人,每个验证器平均每 6.4 分钟 (1个epoch) 通过发布一个断言来为其对网络的看法投票一次。这就是 LMD 中 “message driven” 的意思,也就是分叉选择不是由提议者添加的区块驱动的(对比 PoW 出块人也是投票人),而是由所有验证者发布的消息 (断言 & 投票) 驱动的。

“L” 代表 “Latest”,只考虑来自每个验证器的最新消息,所有早期消息都将被丢弃不作为投票考虑。Vitalik 之前考虑过类似的方案,例如 IMD (Immediate, 无限期保留所有断言)、FMD (Fresh, 考虑当前 epoch 和往前一个 epoch)、RLMD (Recent Latest) 等。

二、LMD Ghost 工作原理

假设给定一棵区块树和一组投票,LMD GHOST 会告诉验证器哪个区块应该被认为是链头,验证器根据此规则进行投票。但这一依据并非是全局“上帝视角”,而仅仅是验证器自己的视角,它可能与其他节点的结论不同。但总的来说,诚实的验证者将在他们看到的最佳头部上构建他们的区块,反映到全局视角上看就是选出了区块链的链头。

1、接收&存储断言

1.1 head block votes

每个诚实的验证器在每个 epoch 都会进行一次断言,其中包含最佳链头的投票。节点可以通过 gossip 网络区块来直接/间接接收断言。

class AttestationData(Container):
    slot: Slot
    index: CommitteeIndex
    # LMD GHOST vote
    beacon_block_root: Root
    # FFG vote
    source: Checkpoint
    target: Checkpoint

1.2 Storing latest messages

节点收到断言后,需要调用分叉选择的 on_attestation() 处理程序。由 on_attestation() 处理程序对证明执行一些基本的有效性检查:

  • 断言是否太旧 / 太新
    断言必须来自当前或上一个 epoch ,且必须早于前一个 slot 。
  • beacon_block_root 是否正确
    本地是否已经收到了投票的区块。 如果没有,我们可能会尝试从其他节点处获取。
  • 签名是否正确
    验证者签署证明并对其负责。
  • 断言是否有冲突
    若当前断言与其他断言相互冲突,可以发起 slashing 挑战。
def update_latest_messages(store: Store, attesting_indices: Sequence[ValidatorIndex], attestation: Attestation) -> None:
    target = attestation.data.target
    beacon_block_root = attestation.data.beacon_block_root
    non_equivocating_attesting_indices = [i for i in attesting_indices if i not in store.equivocating_indices]
    for i in non_equivocating_attesting_indices:
        if i not in store.latest_messages or target.epoch > store.latest_messages[i].epoch:
            store.latest_messages[i] = LatestMessage(epoch=target.epoch, root=beacon_block_root)

在通过上述检查后,需要将断言插入到节点的 Store (有关链状态的信息存储库) 中,使用 [update_latest_messages()](https://eth2book.info/capella/part3/forkchoice/phase0/#update_latest_messages) 完成存储。随着时间的推移,节点的 Store 构建一个列表,其中包含它收到的每个验证器的最新投票。请注意,只能存储当前 epoch 或后一个 epoch 收到断言,一旦断言进入 Store ,它就会无限期地保留在那里,并继续为分叉选择做出贡献,直到它被更新为最近的投票。

2、找到链头的区块

GetHead(Store)→HeadBlock,节点的 Store 是它对世界的看法,它收到的所有信息都可能影响 Store 中的信息,进而影响分叉选择。Store 的相关部分如下:

  • 区块树,过往区块依据逻辑将它们连接成树
  • 来自验证器的投票列表
  • 验证器的有效质押余额,作为算法计算中的权重

2.1 获取权重

GHOST 算法的目标是从给定的区块树中选择一个「叶子块」作为链头的区块,其中叶子是没有任何后代的块。获取权重的具体流程如下:

  1. 从 Store 中获取信息,计算区块的权重:
    get_head() starts from the root block, A, of a block tree. The numbers show the weights of the votes for each block.

  1. 根据区块权重,计算树枝的权重:
    The get_weight() function when applied to a block returns the total weight of the subtree of the block and all its descendants. These weights are shown on the lines between child and parent blocks.

  1. 从根节点递归寻找最大权重的树枝,直至「叶子块」并作为链头区块:
    At block A, branch C is heavier. At C, branch E is heavier. Block E is a leaf block, so it is GHOST’s choice for the head of the chain. Our blockchain is [A ← C ← E]. A “longest chain” rule would have chosen block G, although that branch has minority support from
    validators.

  1. 如果根在 B 处和 C 处的子树权值相等,将根据区块 B 和区块 C 的哈希值选择最大的作为子数根。

3、总结 GHOST 的优势

了解了 GHOST 协议的工作原理后,也许更容易了解为什么我们更喜欢 GHOST 而不是最长链原则:分叉的出现表明区块传播时间已经变得与区块生产间隔 (slot) 相似或超过了区块生产间隔 (slot) ;简而言之,并非所有验证器都能及时看到所有区块来证明它们或在它们的基础上进行构建。

三、LMD Ghost 奖惩机制

加密经济系统保护自身安全的方法之一是奖励良好行为并惩罚不良行为。

1、激励

在 LMD GHOST 时,提议者和证明者都会因准确找到链头而获得不同方式的奖励。

  • 区块提议者在正确的链头之上出块的动机是显而易见的:如果不这么做,提议的区块很可能不会被包含在最终的规范链中。在这种情况下,提议者将不会收到任何区块奖励。这是一种隐性激励而非显性激励;与 PoW 中的矿工奖励类似。
  • 验证者因准确投票而获得直接奖励。当验证者做出准确的头部投票,并且其证明被包含在下一个 slot 的块中时,它会收到微奖励。表现完美的验证者将通过准确的投票获得协议总奖励的约 22%。反过来,提议者也会被激励将此类证明包含在区块中,因为他们每成功进入一个区块,就会获得相应的微额奖励。

2、Slashing

事实上,在权益证明下,验证者通过发布多个相互矛盾的消息来模棱两可几乎是没有成本的。权益证明设计的重大突破之一是采用 slashing 作为解决“无利害关系”问题的方法。由于验证者对他们的消息进行数字签名,因此找到两条相互矛盾的签名消息就可以判定为作恶证据,并对作恶者进行惩罚。

2.1 Proposer slashing

对于 PoS 来说,生产区块可以看作几乎没有成本。当出现下图情况时,验证器为了避免押错分叉产生无效区块,最优选择是在两条分叉链同时构造区块,这可能会造成分叉的无限延续。这就是经典的 Nothing at stake 问题。

正如上面所说,解决方案是检测两个相互矛盾的块,并惩罚作恶的验证器。作恶行为的检测并不是协议决定的,而是依靠于第三方检测并构建 ProposerSlashing 证明。该证明仅需要包含两个签名的信标块标头,这足以证明提议者在同一插槽中签署了两个块。随后的区块提议者将把证明包含在一个区块中(并因此得到很好的奖励),协议将削减违规验证者的余额,并将其从活动验证者集中剔除。

2.2 Attester slashing

类似地,当轮到验证者发布证明时,它应该运行其分叉选择规则并投票给它认为最好的头块。这里的问题是,攻击者可能会做出多个相互矛盾的断言,以引发或延长分叉并阻止网络收敛在单个链上。补救措施是相同的:检测并惩罚矛盾的证明。

参考

Vitalik’s paper:https://arxiv.org/pdf/2003.03052.pdf

以太坊Ghost协议:以太坊Ghost协议 · Qin Yuan's blog

PoS vs PoW:给比特币友的 “权益证明” 指南

Ethereum.orgGasper | ethereum.org

LMD GHOST:Upgrading Ethereum | 2.3.3 LMD Ghost

FLP 不可能三角 (FLP impossibility) :https://groups.csail.mit.edu/tds/papers/Lynch/jacm85.pdf