NC-MAX:让中本聪共识再次伟大(下)

Nervos Network 采用的共识机制提案 NC-MAX 于19日由 Nervos 研究员张韧正式提交,本文是《NC-MAX:让中本聪共识再次伟大》的下篇,在上篇中,我们主要讲述了 NC-MAX 解决了当前中本聪共识中存在的哪些问题,本文将带大家深入理解两步交易确认和动态难度调节机制,看看 NC-MAX 具体是如何解决这些问题的。

一句话读懂 NC-MAX

NC-MAX 是 Nervos Network 提出的共识机制,是中本聪共识的升级版。NC-MAX 通过消除区块传播延迟的瓶颈,缩短区块间隔时间,解决了比特币网络中交易处理吞吐量较低,交易确认延迟较长的问题;通过动态难度调节机制,将所有有效区块纳入难度调整中,让自私挖矿不再有利可图。

两步交易确认

区块和致密区块结构:

在 NC-MAX 共识协议中,一个区块包含以下几个部分:

%E6%8D%95%E8%8E%B73

  • 区块头(header)中放置区块的元信息
  • 区块确认区(commitment zone)中是确认的交易
  • 提案区(proposal zone)中会放置交易id,用于n个高度后的区块的确认
  • 叔块头(uncle headers)和叔块提案区(uncles’ proposal zones)会放置叔块的相关信息

区块数据结构示意图

与NC类似,在NC-MAX中,一个致密区块使用交易的 shortid 即预填写的交易列表来替换区块的提交区,致密区块的其他所有字段保持不变。

附加区块结构:

  • 前四个字段的总大小不应大于硬编码的区块大小限制。实现区块大小限制的主要目的是避免超出公共节点的带宽。叔块的提案区不计入容量限制,因为它们通常在区块被挖掘时已经同步。
  • 提案区中 txpid 的数量也有硬编码的上限。

两步交易确认:

孤块的出现是因为区块广播的延迟,而区块广播的延迟主要是因为同步Fresh Transaction(发送方有而接收方没有的交易)。

NC-MAX 采用两步交易确认来缓解这个问题。

中本聪共识下区块传播过程

NC-MAX 共识下区块传播过程

每个矿工只允许打包前面h-m到h-n之间提案区以及叔块提案区的交易。

在提案中的具体定义是这样的:

定义 4: 一个非coinbase交易将被提交在高度 hc ,如果满足以下所有条件 (1) 该交易在同一链的高度hp 提案, 并且 Wclose ≤ hc − h p ≤ Wfar (2) 该交易位于主链块的提交区,高度为 hc ; (3) 该交易与主链中之前提交的任何交易没有冲突。 coinbase 交易在高度 hc 时提交(如果满足(2))。

WcloseW far 定义了交易提案与提交之间链上最靠近和最远的距离。我们要求 W close 足够大,使 Wclose 区块间隔足够长,以便将交易传播到网络。

这两个参数还根据节点内存中提案交易池的最大交易数来设置。由于提案的交易总数有限,所以可以将它们存储在内存中,因此在大多数情况下不需要从硬盘中获取新提交的交易。

当提交交易时,交易被认为嵌入到区块链中。因此,接收者需要 σ 确认,则至少需要等待 Wclose + σ 区块交易广播后,才会认可该笔交易。

事实上, Wclose - 区块的额外延迟由我们的协议缩短的区块间隔来补偿,这样就不会影响可用性。

让我们通过下面这一张图更好地去理解这一个过程:

当前区块高度为 h,在区块高度 h-m 到 h-n 区间内的提案区和叔块提案区中有 TXa、TXb…TXz 等多笔交易被打包至提案区,当区块高度达到 h-1 时,因为只能打包前 h-m-1 到 h-n-1 个区块的提案区中的交易,因此在区块高度为 h-1 时,不能打包区块高度为 h-n 中提案区内的交易 TXx、TXy、TXz。

而当区块高度到达 h 时,可以打包区块高度从 h-m 到 h-n 区域内所有在提案区内的未被之前块打包的交易,包括叔块提案区的交易也可以打包,所以如图所示,区块高度 h 的块中打包了 TXa、TXd、TXx。

通过两步交易确认的方式,保证了矿工总是有足够的已经同步完的交易可以打包,消除了同步 Fresh Transaction 带来的区块广播的延迟,最终可以降低孤块率。

而且因为在 compact block 中已经包含了所有已确认交易的 id,矿工在新区块中不会将这部分交易包含进来,矿工可以很容易地为交易确认做贡献,并获得手续费。

区块传播协议:

节点应该广播所有具有有效工作证明的块,包括孤块,因为它们在主链中可能被称为叔块。有效的工作量证明不能用来污染网络,因为计算他们是消耗时间的。

我们协议的区块传播协议在大多数情况下消除了新交易的额外往返广播。当往返广播不可避免时,我们的协议确保它仅在传播中持续一跳。这是通过以下三个规则实现的:

  1. 如果发送节点先前不知道某些已提交的交易,则它们将嵌入在预先填充的交易列表中并与致密区块一起发送。事实上,这只发生在自私挖矿攻击中,否则交易会在提案时同步。如果发送方和接收方共享相同的提案列表却非广播交易列表,因此修改将删除额外的往返广播。

  2. 如果某些已提交的交易仍然丢失,则接收方将在短暂超时后查询发送方。触发此机制不仅需要成功的自私挖矿攻击,还需要对交易传播进行攻击,以使节点之间产生不一致的提案交易池。未能及时发送这些交易会导致接收方断开连接并将发送方列入黑名单。具有不完整提交区的区块将不会进一步传播。

  3. 只要提交区完整并有效,节点就可以在接收所有新提案的交易之前开始转发致密区块。在我们的协议中,节点从上游对等节点请求新提案的交易,并同时向其他对等节点发送致密区块。此修改不会降低安全性,因为提案区中的交易不会影响区块的有效性。

前两条规则确保了自私挖矿攻击造成的额外往返广播不会超过一次广播。

动态难度调节机制

NC-MAX 会设定一个固定的孤块率,并根据实际网络状况,在下一个难度周期(Epoch)进行动态难度调整。如果实际孤块率低于设定值,说明网络可以处理更多的交易,在下一个难度周期可以继续降低难度,这个时候出块时间将会降低,吞吐量会增加,区块奖励会相应减少。反过来,如果实际孤块率高于设定值,说明网络处理不了这么多交易,在下一个难度周期应该提高难度,会使出块时间增加,吞吐量会下降,区块奖励也相应增加。

NC-MAX 修改了Nakamoto 共识难度调整机制,使得:

  1. 自私挖矿不再有利可图;

  2. 根据网络的带宽和延迟动态调整吞吐量。

为了实现目标1, 我们的协议在计算上一个时期的调整后的哈希率估计时包含所有块而不是仅主链, ,其确定每个奖励单元的下一个时期所需的计算工作量。

为了实现目标2, 我们的协议计算下一个时期中具有最后一个时期的孤块率的主链块的数量。然后通过组合这些结果来计算块奖励和目标。

在 NC-MAX 共识协议中,下一个Epoch的难度调整不只是计算已确认区块的数量,还会将孤块以及叔块考虑进来,因此攻击者不能使用自私挖矿的方式来使得网络降低难度,所以也不能使用同样的算力获得更多的收益,最终自私挖矿在CKB中变得无利可图。

NC-MAX 还会设置几个上限和下限应用于哈希率估算和主链块的数量,因此 NC-MAX 协议不会损害网络的去中心化或抗攻击性。

关于动态难度调整的具体公式请参见 CKB 共识机制提案原文:

1 Like

有点烧脑 学习一下吧!