万字实录 | 张韧做客 Zero Knowledge 播客,畅聊共识协议安全性和 NC-Max 那些事

深入分析共识协议的安全性问题

Zero Knowledge 是业内著名的专注于零知识证明的英文播客,深入探讨新兴 Web 3 技术,与正在构建它的社区成员们。该播客的听众为同行开发者和希望了解该区块链内部运作的人们。播客的创建者 Fredrik Harrysson 与 Anna Rose 表示,他们不投机,不多谈交易,更多专注于技术本身。

最近的播客邀请到了 Nervos 研究员张韧。张韧和主持人一起聊了聊他在共识算法上的研究工作,并从 Ren 之前做的关于评估 PoW 共识协议安全性的研究开始,讨论到了他为 Nervos 设计的共识协议 NC-Max。Nervos 中文社区为大家整理了播客的内容文稿,供小伙伴们查看。

万字实录 | 张韧做客 Zero Knowledge 播客,畅聊共识协议安全性和 NC-Max 那些事

文收录 | Kazafa

播客创建者 Anna:欢迎张韧做客 Zero Knowledge 播客。在今年四月份,我们和 Ittai Abraham (注:VMware Research 研究员)有一集关于共识的话题。在那期节目之后,之前上过我们节目的 Alan Szepieniec(Nervos 哈希算法的作者)联系我说:「嘿,我在 Nervos 有一位同事,如果你们正在探讨有关共识的话题,你真的应该和他聊聊。」这就是张韧。我们早就想请你来我们节目聊一聊共识协议这个话题,也很开心你今天终于能加入我们的节目!

播客创建者 Fredrik:所以我们今天有一些非常有趣的话题, 深入挖掘共识的东西。但是在我们挖掘之前,让我们先来谈谈你吧,你是怎样进入这个领域的,是什么让你对这方面的研究感到兴奋?

Ren:我在读硕的时候就在做点对点网络的研究。我在 COSIC 攻读博士学位期间,开始四处寻找有趣的课题,这个历程大约花了两年时间,我不得不说我失败了。所以最后我准备了几个研究课题,去问了一些组里的资深成员。比如说,你觉得哪个研究课题是最有意思的?而他们都推荐我去研究比特币,他们说「研究加密货币的最佳时机已经过去了,但也许你还是会因此得到一个 PHD:)」那是 2014 年的事了。

我从 2014 年开始从事比特币和加密货币的研究,结果发现这个领域比他们预期的要持久的多。

Anna:当他们说这句话的时候,他们实际上是想说最激动人心的部分已经过去了,还是暗示说整个趋势将会消失?

Ren:我想在那个时候,整个趋势似乎正在消失。比特币的价格每天都在下跌,领域里关于比特币的论文也越来越少,但谁知道以后会发生什么呢?

Fredrik:这是有道理的, 因为比特币其实很简单,它的概念很简单。你不会觉得对于这样一个简单的东西,有几十年的研究要做。但是我们现在已经过了十年了,人们还在不断地发表论文。

Ren:特别是当时比特币网络还比较小,大概只有 600 个节点,当网络越大,你就能在里面找到更多有趣的研究问题。所以当时大家认为比特币网络不是一个很令人兴奋的研究对象。之所以还是决定要研究它,就是因为它是有些混乱,混乱的地方通常就有机会。

Fredrik:我们今天要谈的第一篇论文,就是你与 Bart Preneel 合写的那篇论文《Lay Down the Common Metrics:评估 PoW 共识协议的安全性》(https://www.chainnews.com/articles/877157649464.htm)。我还没有读过论文, 但我读了摘要,它的内容相当有趣,最有意思的是它里面谈到人们通常会如何分析共识算法以及为什么有些分析方式是错误的。那你能不能谈一下这篇论文是关于什么的,你在里面发现了什么?

Ren:有一段时间我对自私挖矿攻击很着迷,所以我试图找到解决这种攻击的方法,找到一种对这种攻击免疫的共识协议。我试着设计了十几个协议来评估它们的安全性,所有的协议都不完美。我对这些方案都不满意,所以我没有公布任何一个方案。几年后,我发现这些我认为是欺诈的想法由其他人陆续发表出来了,而且他们声称他们的协议是安全的,比中本聪共识好,比比特币的共识协议好。我觉得这是不对的。人们需要被告知,这些想法是有缺陷的。他们开辟了新的攻击载体,而设计者并没有意识到这一点。

Anna:他们并不了解你的研究,他们并不是看到了你的研究,然后就拿去用了,这些应该是他们自己得出的结论,对吧?

Ren:对。因为这些想法都是比较简单直接的,就是你第一眼看觉得是有道理的。但是如果你深挖一下,真正地去分析他们的安全性,你会发现问题。

尤其让我感到生气的是,很多论文都是通过模拟,针对某些攻击策略来论证其共识系统的安全性。2013 年有这样一篇论文,叫《Majority is not Enough》(https://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf),里面针对自私挖矿攻击分析了其协议的安全性,并号称这个新的共识协议要优于中本聪共识。然而,我认为这并不是一个安全证明。为什么呢?也许你的系统、你的新设计会激发新的、专门针对你的攻击方法。

当我们在论证一个共识协议的安全性时,通常需要找到一个更为严谨的方式:比如要么你能证明在新的共识协议下,无论攻击者采取何种攻击策略,他都不能获得更多的利润或者造成更多的损失;要么你设法分析攻击者所有可能会采取的策略,无论该攻击者在某个策略空间内做什么,他都不能造成更多的损失。我认为这样才是正确的分析一个共识协议安全性的方式。

Fredrik:这是一个常见的问题,人们不会老老实实、直截了当地谈论他们的取舍,只会说,我们发明了这个新东西,它比另一个东西更安全,但是对可能产生的新问题避而不谈。

Ren:是啊,所以我集合了一组这类新的共识协议,通过马尔科夫(Markov)决策过程来分析它们的安全性,然后写了这篇论文。

Anna:好的。你在论文中提到的那些新的共识协议都是已经存在的对吗?我们可以讨论一下。

Ren:是的,有一个协议叫统一平局协议(Uniform tie-breaking protocol),是在 Ethereum 中实现的,但是我想所有的 Ethereum 开发者和研究者,他们都知道这个协议的漏洞。所以这不是一个很大的问题。而且还有一个协议叫作 Rootstock,是一个和我论文中提到的 Reward Spitting protocol 非常相似的协议。另外一个比较著名的协议是 FruitChains

FruitChains 是由 Elaine Shi 设计的,声称与激励相容,可以抵抗自私挖矿攻击。但是我发现它只是比中本聪共识对自私挖矿攻击的抵抗力更强。如果每个区块都是经过 100 个区块确认的、如果你只用 6 个区块信息,和比特币的中本共识一样,那么 FruitChains 其实更容易受到自私挖矿的攻击。

所以在中本共识上的问题就像 Fredrik 问的那样,就是它没有完美的链质。也就是说,一个攻击者拥有不到 50% 的挖矿能力,就可以安全地让区块链中最后几个区块失效。这也是为什么中本聪共识只能提供概率意义上的安全保障。

而对于这种号称比中本聪共识更安全的新设计,我们认为它需要满足两个要求之一:要么它能实现更好的链质量,要么它们能更好地抵御三种攻击:

  • 自私挖矿攻击
  • 双花攻击
  • 进一步分叉攻击(审查攻击)

相应的我们将所有这些新的共识协议分为两组:第一组声称能实现更好的链质量,第二组则声称能实现更强的抗攻击能力,我们据此分析他们的安全性。

我采用了马尔科夫决策过程(Markov Decision Process)作为分析框架,它可以让我们在一个部分随机的环境中模拟一个战略参与者的行为。

战略玩家指的是攻击者,部分随机环境指的是环境相对固定(它以已知的方式响应攻击者):如果攻击者这样做,在什么概率下,会发生某些情况,在什么概率下,会发生另外一些情况。攻击者可以任意选择挖哪条链以及任意时间发布他挖到的任意个区块。攻击者在攻击链质量或者进行我提到的这三种攻击方面能做的最好的是什么。

Anna:所以你的模型中,你实际上分析了两种情况。

Ren:第一类叫「更好的链质量协议」。而另一个是三种抗攻击协议。

Anna:所以要么是更好的链质量,要么就是这些具体的攻击矢量,但在你的模型中,你是在做这些东西的组合,还是你总是专注于其中之一?

Ren:我觉得有两个不同的标准。你可以从两个不同的维度来考虑。只要你能在其中一个维度打败中本聪共识,就算你赢。

Anna:我明白了,但是基于新的共识协议,可能会引起一些新的攻击方式,最后你可能会有一个不太安全的链,对吧?

Ren:如果你的链质量比中本共识好, 那么你自然有更好的抗攻击能力。因为中本共识的根本问题在于,它的 Chain Quality 并不完美。然而,如果你不能达到更好的链质量,一些协议声称,他们仍然可以比中本共识更好,因为他们更能够抵抗所有已知的攻击方式。所以我们把协议分成两组,第一组声称他们在链质量上比基于中本聪共识的链好,所以我们也就不需要分析他们如何应对攻击了。

Anna:有哪些共识协议声称链质量更好呢?

Ren:有一些协议声称他们更好,但是并没有声称他们在所有方面都更为优越,为了方便,我们把他们归为第一类协议。但第二类协议通常声称自己采用了新的激励机制,但是与中本聪共识拥有相同的链质量。基本上他们使用的是相同的比特币主干协议,但是声称可以更好地抵御各类攻击。所以我想看看是不是真的这样。

Anna:在这种情况下,你是在分析他们的链质量是否相同,还是在分析他们是否真的能抵御这些攻击?因为我的理解是,如果他们试图在某一个方向上改进,他们就可能面临新的攻击?

Ren:这是在抗攻击协议的范围内。所以有两组情况:第一组是「更好的链质量协议」,第二组是「抗攻击协议」。

关于「更好的链质量协议」,他们对中本聪共识进行了修改。中本聪共识简单来说,由两个基本规则组成:第一个是矿工只认最长的链,第二个是如果矿工看到两条在竞争的、长度相同的链,会在先收到的那条链上进行挖矿。

如果你按照这两个规则走,你会和中本聪共识有同样的链质量;如果你修改这两条基本的规则,那我就把你放在「更好的链质量协议」里。如果你不修改这两个基本规则,而是修改奖励机制,你用新的机制来鼓励大家不做自私挖矿、不做审查攻击,那么我相信你是一个「抗攻击协议」

Fredrik:更具体地说,有哪些协议是可以做到改进链质量的?

Ren:我觉得最有趣的例子(对有些人来说是最反常的例子)是有一个协议,我叫它「最小的 Hash Tie-Breaking 协议」。

我起这个名字是因为我不想说出任何具体的项目。在这个最小哈希平局打破协议中,设计者认为如果我总是在最新的一个区块哈希值最小的链上挖矿,那么所有诚实的矿工都会自然而然地在同一条链上挖矿,算力永远不会被分割,链变得更加安全。

这是他们的直觉。所以这是一个「更好的链质量协议」,因为它修改了中本聪共识中的首接策略(当两条链长度相同时,要求矿工在他们更早接收的链上挖矿)。

Fredrik:直觉让我觉得很有道理,因为就像你一样, 在编程中任何时候我们谈论时间,都会出错。如果你说的是「更先收到」,那显然对每个人来说都会不同,因为网络延迟或者什么其他的原因,它基本上只是一个随机的偏差。那么最小哈希值平分协议又有什么问题吗,或者说直觉其实就是正确的?

Ren:直觉是不对的。在一些极端的情况下,最小哈希值平分协议的表现比中本聪共识略好。但是,对于我们分析的大多数参数来说,它的表现其实比中本聪共识更差,因为它会面临两种新的攻击:第一个我称之为「后发赶超」,比如说,如果你是一个攻击者,你在挖一条秘密链有一个区块,诚实链有两个区块,那么在中本聪共识里,你通常会直接放弃,因为诚实链比较长,你没办法追上。

但是,在最小哈希值平分协议中,如果你的链比较短,而较长的那条链尖有非常大的哈希值,那么你可以继续挖矿,因为你知道,如果你发现你的秘密链有下一个区块,你就会放出两个区块,尽管你放出的时间比诚实链晚,但你的哈希值比诚实链尖小的概率非常大。

所以所有的诚实矿工都会转回你的链,他们会放弃之前的链,在你的链上挖矿。所以这个最小哈希值平分协议启用了这种新的攻击行为,攻击者可以选择何时采用这种行为。这就像是在攻击者的工具箱里放了一个新的工具,这也是为什么它会削弱协议安全性。

第二种攻击方式是,假设你有一个秘密区块,这个区块的哈希值非常小。你是一个非常小的矿工,区块的哈希值非常小,这样你就可以确定,在 99% 的概率下,下一个诚实区块的哈希值会比你的哈希值大。那么你可以说,好吧,现在我扣下这个区块是安全的,我会秘密地进行挖矿。

另一方面,如果你是一个小矿工,你发现一个区块的哈希值比较大,这样你知道有非常大的概率,如果你扣下一个区块,你会输掉区块竞赛,那么你可能会选择释放区块。因为最小哈希值平分协议,你可以准确估计自私挖矿攻击的成功率。它给攻击者提供了更多的信息来选择什么时候扣块,什么时候放块。所以这也给攻击者的工具箱里放了一个新的工具,因为攻击者拥有了几个新的工具,可以更有把握地进行攻击。这就削弱了链的安全性。

Anna:我想这是一个「更好的链质量协议」的例子,但我还是有点困惑,因为你之前不是说过如果有「更好的链质量」,那么它就是安全的吗?就像你刚才说的,我觉得我有点回到之前你有这两类,那些你没有分析的,但是你一直说如果他们有更好的链质量比你没有分析,我就很困惑。

Ren:是的。如果他们有「更好的链质量」,我们就不去分析他们的激励机制。

Anna:是的,我们不分析他们的激励机制。但在这种情况下它有什么呢?它没有更好的链质量,还是它有更好的链质量?

Ren:这个协议声称有更好的链质量,但它失败了。

因为它通过模拟分析了它的安全性。我明白了。有一个主要的信息,你不应该,你永远不应该通过模拟来分析你的安全性,我想是一个特定的攻击者策略。因为你的协议可能会激发新的针对协议的攻击策略。

Fredrik:那么,第二类的例子是什么,你改变了激励机制。

Ren:第二个我可以举出几个例子,我将谈论「子链(Subchains)」。这是 Peter Rizun 博士在一个叫 The Ledger 杂志上发表的一个协议。在这个协议中,矿工被允许发布具有较小哈希值的区块。

这里有两个哈希目标,一个更大的目标和一个较小的目标。在比特币共识协议中,如果区块小于一个预定义的阈值,你才能发布你的区块,就是较小目标。但是在 Subchains 中,如果你没有找到一个区块,但是你的备选区块的哈希结果小于大目标,你也可以发布这个备选区块(我们把它叫做「弱区块」)。这样做的好处是,他们希望在将其纳入正式区块之前,可以更快地确认交易。

因为弱区块的加入,所以出块间隔实际上变小了。正式区块可以获得所有的区块奖励,而弱区块只是一个用来同步交易的工具,得不到任何区块奖励。

然而每当有两条竞争链时,还是会通过比较这两条链的长度来解决分叉问题,正式区块和弱区块都会被计算在链的长度中。这种协议我们称之为「奖励幸运协议」,他们并不关心哪个区块是诚实的、哪个区块是恶意的。他们关心的是哪个区块是最幸运的(哈希值更小),并且只奖励那些哈希值较小的区块 。虽然弱区块参与了共识协议的过程,但是得不到任何奖励,这类「奖励幸运协议」的问题在于,幸运的弱区块不一定是好的区块。所以这种在奖励发放方面的歧视产生了一种新的攻击方式。

攻击的方式是这样的:每当攻击者发现一个弱区块, 它就会扣留一个区块, 希望诚实的矿工可以发现一个正式区块,这样我就可以用我的弱区块来使诚实矿工开采的正式区块无效。因为反正弱区块是得不到任何奖励的,所以扣下这个弱区块没有任何风险。这就好比,我有了一个新的工具来攻击系统,而且这个工具是没有成本的。

每当攻击者发现一个区块时,如果攻击者不想承担任何经济风险,他可以作为一个诚实的矿工发布这个区块。所以,这个协议又可以让攻击者校准成功率,选择更合理、更准确的策略来攻击系统。

Fredrik:有意思。在这两个例子中,就像你所说的那样,你在攻击者的工具箱中又放了一个工具,人们是如何通过引入更多的复杂性来实现的呢?他们就像,「哦,我想简化这个,或者我想让这个路径更复杂。或者我想让这个路径更优化,或者我想引入这些其他的概念,让 X、Y 或 Z 更简单」。但其实通过引入这个新的东西,那其实是攻击者可以利用的另一个东西,这是一件他们可以隐瞒的事情,这是一件他们可以获得更多信息的事情。这样他们的攻击就有可能更成功。

Ren:是的,我完全同意,复杂是安全的敌人,如果你想要一个更安全的协议,通常应该做的第一件事就是尝试去简化协议,看看可以削减掉哪些东西,这就是为什么 NC-Max 是基于中本聪共识(Nakamoto Consensus)而设计的,我们试图从最开始着手,不引入任何新的攻击变量。

Anna:创建这个评估共识协议安全性的模型过程中,你有什么其他的收获或想法吗? 

Ren:通过这个研究,我们有几点想强调:

第一点有关如何分析安全性。

你永远不应该只通过模拟单一攻击者的攻击方式来分析协议的安全性,那样是很危险的。另外,不要设计一个太过复杂的协议,如果连协议设计者都无法分析它,那情况也会变得很危险,因为复杂是安全的敌人。

而有关我们在激励机制上的测试结果,我们发现,没有一种激励机制可以阻止这三种攻击。

如果你奖励所有的区块候选人,不管他们是诚实还是恶意的,这就会让双花行为没有风险可言。对于一个攻击者来说,既然我总会得到奖励,那我为什么不尝试双花呢,即使我失败了,我也可以得到奖励。

如果你没收所有可疑挖矿者的奖励,比方说无论什么时候,只要他们和最长链进行竞争,就不会得到任何区块奖励。这实际上是为攻击者引入了一个审查网络的工具,就是说,如果你把这些交易包含进区块里,我会尝试让你的区块变得无效。即使我失败了,只要我发现了点什么,我还可以通过可以没收你的奖励,以迫使理性的矿工加入审查攻击,以避免经济损失。

如果你只奖励幸运区块,而幸运区块不一定是诚实区块,如此一来,就给了攻击者机会,他们可以在「幸运」的时候老老实实执行,而在「不幸运」的时候进行作恶。

综上所述,我们发现了一个取舍,我们称之为「奖励坏的人还是惩罚好的人」

Anna:好的,你刚刚只是举了两个例子,但显然你已经分析了很多其他例子,在这篇论文里面我们可以看到吗?或者说你是否还有使用这个模型去分析其他共识协议的工作?

Ren:这篇通用指标论文中涉及到了七个不同的协议,在这之后,这部分的工作其实还一直进行着。

有一篇论文叫 SquirRL,它基于马尔科夫决策过程(Markov Decision Process)的方法进行了扩展,马尔科夫决策过程的问题是,它只能对有少量状态的协议进行建模,如果协议变得越来越复杂,那么它就超出了马尔科夫决策过程的计算能力。

(注:SquirRL 论文为 SquirRL: Automating Attack Analysis on Blockchain Incentive Mechanisms with Deep Reinforcement Learning:https://arxiv.org/abs/1912.01798)

所以这些研究人员就采用深度学习来模拟更复杂的协议,深度学习是著名的围棋游戏 AlphaGo 使用的一种技术,它使我们能够对更复杂的协议进行建模,他们也得到了一些有趣的结果。

Anna:我意识到这是一个与 PoS 非常不同的模型,但我想知道,你发现的这些工具或分析方法可以应用于 PoS 这种模型吗?我们能它们归在同一类别吗?

Ren:我认为它是相关的。

一般来说,我觉得应用马尔科夫决策过程或者深度学习来分析 PoS 协议不存在什么困难,但分析 PoS 协议的问题是,你无法直接集合一组协议,让他们彼此竞争,知道谁是第一,谁是第二,没有这种简单的结果。

你无法把它们放在同一个约束当中,对不同 PoS 协议来说,它们通常有着不同的安全假设,这意味着每个协议都在自己的规则中进行游戏,所以你不能只是统一规则,强行把它们放到同一个领域。

所以在这方面会有一些复杂度,但总的来说,我认为在分析 PoS 协议时,应用马尔科夫决策过程或深度学习是很有意思的一件事。

Anna:在你自己的研究中,你是否真正探索过这一点?

Ren:也许以后会,但不是现在。

Fredrik:我很想深入了解更多有关马尔科夫决策过程或深度学习方面的内容,但这样的话,我们可能需要另外一小时的时间了(笑)。

所以,我们应该继续谈谈你之前预告的内容——NC-Max,这是你和其他人一起设计的一个共识算法对吧?这是我们今天要讲的第二篇论文,能不能请你高屋建瓴的和我们聊聊,什么是 NC-Max?它想做什么?

Ren:当然没问题,我应该从后面的故事说起。

我们都很喜欢「中本聪共识」(Nakamoto consensus,简称 NC),其中有三个原因。

首先,它只有一系列最低要求的安全假设。与通常有不同很多安全假设的 PoS 协议不同,中本聪共识的安全假设非常少,而这样的好处是,协议很好理解。到目前为止,工业学术界有许多篇论文对中本聪共识进行了详细的分析,所以我们完全知道它的优点和缺点。

中本聪共识的第二个优点是,它将通信开销降到了最低。在中本聪共识中,特别是在比特币中,如果你发现了一个新的区块,你可以把它作为一个 13 千字节左右的致密区块传播,就这样,一条消息确认一组交易,这是理论的极限,你不可能做的比这更好,因为一条消息来自一组交易,而其他所有的协议在通信开销方面都更贵。

我们喜欢中本聪共识的第三点原因是,它是基于链的,也就是说所有的交易有一个全局顺序,它不会像 DAG 协议那样存在重复打包的问题。如果你用的是 DAG 协议,那么很有可能区块中会同时包含很多重复的交易,而要想去除这些重复的交易,要么需要一定的计算能力,要么需要一定的通信成本。

中本聪共识的问题在于它的吞吐量非常低,这也是为什么很多协议设计者为了实现更高的吞吐量而放弃中本聪共识甚至放弃工作量证明的原因。

Anna:你说吞吐量提高,是不是指的就是,实际处理交易速度的性能扩展?

Ren:性能扩展有两个指标,第一个是吞吐量,一秒钟可以确认多少笔交易;第二个是延迟,指的是交易广播时间和交易确认时间之间的时间差,中本聪共识的主要问题是吞吐量。

所以从我的角度来说,在你放弃中本聪共识之前,先检查一下网络的情况。我们来看一下低吞吐量的瓶颈是什么,我们能不能在这个瓶颈上做一些事情,而不是完全放弃基于链的结构。

所以我认为,我和其他共识协议设计者的主要区别在于,他们没有计算机网络的背景。当我在 Blockstream 和 Peter Wuille 以及 Gregory Maxwell 一起实习的时候,我们讨论了很多关于比特币如何传播区块和交易的问题,而这最终导致了这个研究的诞生。

一般而言,我们看一个节点带宽时,可以把它分成三个不同的部分,第一部分是用来同步交易的,这其实是我们想要的部分,我们要把这部分最大化,我们每秒能够同步的交易越多,吞吐量就越高。第二部分是共识本身消耗的带宽。我们希望把这部分降到最低,中本聪共识已经做到了,第三部分是闲置的带宽,有一部分时间,我们没有传输任何交易,也没有传输任何区块。

Anna:你刚才用的词是闲置,像是某个时候,什么都没发生。

Ren:对的。中本聪共识的问题在于为了维持它的安全性, 孤块率必须很低,而由于所有的区块时间间隔都遵循指数分布,如果我们想要一个非常低的孤块率,那我们就需要很长的平均区块间隔时间。

平均区块间隔时间长,就会导致闲置时间变长,所以尽管网络实际上可以每秒传输 2500 笔交易,但大部分时间网络都是闲置的,因为如果我们减少区块时间间隔,网络孤块率会更高,协议的安全性会变差。

Fredrik:就在最近一期的 Podcast 里, 我们谈到了这个点,不过是在以太坊语境下的。我们谈到了 mempool (待处理、未确认的交易集)是如何工作以及交易是如何分布的,以及我们看到实际挖矿节点时,mempool 是什么样的。

它们实际上是在推送交易,在网络方面,它们每秒推送数千笔交易,但它们并不是都被包含在一个区块里,就像竞争性交易,人们在 DEX 上互相出价,诸如此类。因此,这并不是解决交易中的网络问题,它会将它们包含在一个区块中,并给矿工足够的时间来处理该区块,并且希望在下一个区块上继续。

Ren:对的,在 Ethereum 中,计算是一个瓶颈,这也是为什么Nervos 选择使用 UTXO 模型的原因,我后面会详细介绍。

我们解决比特币闲置时间过长的方法,就是要找到导致高孤块率的瓶颈所在。我们要加速区块传播,降低区块时间间隔,增加区块大小,但这并不是说我们要无限地增加区块大小或者降低区块时间间隔,只要我们设法找到一个平衡点,即区块间隔足够低,区块足够大,所有的节点带宽都被耗尽,那么,我们就完成了任务。如果我们能够把节点带宽用完,那么我们就不用引入 DAG 协议了。

那,区块传播延迟的瓶颈是什么?我们发现,区块传播的瓶颈其实是区块中的新的交易。「新的交易」的定义是指还没有完成传播就被包含到区块中的交易。

交易通常会在 15 秒内传播至整个网络。假设区块间隔是 10 分钟,在前 9 分 45 秒内的交易,都在包含到区块之前,就已经得到了传播。但是,如果有一些交易是在最后 15 秒才首次广播,并且它们被包含到了下一个区块中,那么这些交易中有可能有一些没有被同步到网络中。

它们必须和区块一起传播,这样做的问题是,如果我是一个节点,当我收到致密区块时(致密区块中包含着删减的交易哈希,可以把它看作是交易的压缩版),如果没有「新的交易」,你可以直接把这个致密区块转发给下面的节点。

但是,如果有一些「新的交易」,你必须先向之前的节点查询这个交易,只有在等到他们回复之后,你才能把这个致密区块转发给下面的节点,所以额外同步这个新的交易的往返,其实就构成了提高区块传播速度的主要障碍。

Anna:这是业界广为流传的研究结论了,还是说是你在研究过程中想要弄清楚的东西?

Ren:它被比特币核心开发者所熟知,但这在比特币中并不是一个太大的问题,因为在比特币中,大多数区块都没有「新的交易」。

它被比特币核心开发者所熟知,但这在比特币中并不是一个太大的问题,因为在比特币中,大多数区块都没有「新的交易」。

在比特币里,当一个区块第一次广播时,它可以在 600 毫秒内同步到网络中 90% 的节点。这点非常好,但是,如果区块比较大,或者区块间隔比较短,那区块中的新的交易就会比较多。

那,我们如何消除这些新的交易呢?

我们的解决方案是:首先,我们把交易同步和交易确认解耦。比如说,在每个区块里面,有一个字段,我们叫它交易提案区,所有的交易必须先出现在这个交易提案区里面(以删减哈希的形式)。而之前的交易区,或者我们叫它交易承诺区。

交易必须先出现在交易提案区,只有在两个区块之后,才能被嵌入到到交易承诺区。

因此这样做的好处是,每当你作为节点收到到新的区块时,所有提交的交易都已同步,你可以直接将致密区块转发给下面的节点,这样,同步这些新的交易的额外往返就从区块传播的关键路径中移除了。

并且,交易提案区中的交易有效性并不影响区块的有效性,交易提案区可以有缺失的交易、畸形的交易、甚至双花的交易。这些都没关系,后来的矿工可以直接跳过这些交易,只认可那些有效的交易,这样,他们收到的交易已经是通过两步确认机制了。我们设法消除新的交易,确保所有的区块在 600 毫秒内同步整个网络。

所以这就使得我们能够把平均区块间隔缩短到两三秒,同时保持一个很低的孤块率。

Fredrik:这听起来很有趣,我简单总结一下。

一个比特币的区块时间是 10 分钟,你可以提交交易,它会被传递到整个网络,如果你的交易是在那个时间段内提交的(9 分 45 秒内),并且被包括在内,那对任何人来说,这都不是一个「新的交易」,因为在区块出现的时候,每个人都已经看到了它,对吧?

所以本质上你所做的是将矿工可以选择的交易集限制在这个区域内,在这个区域内,它将被传递到整个网络中。就像在比特币的例子中,比特币矿工只允许包含在前 9 分 45 秒内收到的交易。

Ren:对,矿工只会认可在两个区块之前提出的交易。

Fredrik:我明白了。

还有一件事,我觉得它和 PBFT(Practical Byzantine Fault Tolerance) 非常相似,在 PBFT 中,有预准备、准备和提交这三个阶段,听起来非常相似。

Ren:这就是为什么我说,可以把它看作是 HotStuff 的工作量证明版本,HotStuff 是一个更明显的流水线式协议,在任何共识协议中,其实有两种技术可以用来并行处理事务。第一种叫做流水线式操作,它在 NC-Max 中使用,同样,在 HotStuff 中也是如此。

第二种类型叫做并发操作。

流水线式操作相对并发操作的好处是,安全分析要简单得多,因为它没有那么多同时在挖的区块,你可以只需用以前的技术来分析安全性,一切都不变。而且它的功能更强,因为网络仍然保持着一个全局的交易顺序。

Anna:另外,有点想问问同步和异步的问题

Ren:一般来说,所有的工作量证明协议都是同步协议。

Anna:好的,明白了。

我只是在想说,节目之前有好几期节目,我们谈了些这部分的东西,网络范围和部分同步,但在这个情况下,它是同步的。那么,对于 NC-Max,它是同步协议吗?鉴于你已经对流水线式操作和并发操作有了一些研究。

Ren:其实我最喜欢 NC -Max 的部分是有其他协议可以将交易同步和交易确认解耦,比如 Prism,Prism 是另一个将这两件事解耦的例子

(论文为 Prism: Deconstructing the Blockchain to Approach Physical Limits:https://dl.acm.org/doi/10.1145/3319535.3363213

但 NC-Max 的好处是,交易承诺区和交易提案区被重新耦合在同一个区块结构中,这大大简化了安全分析,因为 NC-Max 仍然遵循比特币主干协议,使用的是「最长链」原则。

所以之前所有对中本聪共识进行的安全分析都可以直接适用于 NC-Max,不需要我们证明其他额外的东西,所有的安全证明都是成立的。除此之外,我们还有一个额外的安全改进,就是在 NC-Max 中,自私挖矿是不赚钱的。

但这需要一个相对较大的安全证明,如果你感兴趣的话,可以看论文了解更多细节。

Anna:我其实是想问的是,鉴于你之前的工作都是在寻找协议新的一些威胁点, 那么,你能找到 NC -Max 引入的新的威胁点吗?

我其实是想问的是,鉴于你之前的工作都是在寻找协议新的一些威胁点, 那么,你能找到 NC -Max 引入的新的威胁点吗?

Ren:实际上,是有一个威胁的。

有一个被之前的工作所忽略,但 NC-Max 能够缓解的威胁,它叫做「交易扣留攻击」,攻击的原理是这样的,如果你是一个矿工,你想进行自私挖矿但不想让任何人发现,你可以做一个全是新的交易的区块,你的区块实际上比其他所有的区块传播得慢,这就给了你一些时间来进行自私挖矿,但没有人可以指责你,因为你可以说:「好吧,我在区块被挖出来之后,马上就发布了,只是,交易同步的速度比其他区块慢而已」。

在 NC-Max 中,这种攻击更难发起,因为如果你想发起这种攻击,你必须先传播这些新的交易,然后在两个区块之后,你能找到一个区块包含这些交易。而且你还不能立即发起攻击,只有当你在特定距离上有两个区块被开采出来后,你才能发起攻击,这就是为什么这种攻击在 NC-Max 中比在中本聪共识中更难发起的原因。

Anna:我进一步的问题是,有没有新的攻击是你不能减轻的?

Ren:我觉得不会。

因为 NC -Max 遵循比特币主干协议,使用的是「最长链」原则,以及相对相同的区块结构,它符合中本聪共识的所有安全假设。

Anna:明白了, 我们刚才详细介绍了 NC-Max 。

现在我想知道的是,你在 Nervos 这个项目工作,这是一个网络。NC-Max 的工作和 Nervos 有什么关系?我们过去还请了 Alan(Nervos 密码学研究员) 上过节目,也许你可以给我们多讲讲 NC-Max 是如何和 Nervos 这个网络相整合的。

Ren:其实很简单,Nervos CKB 使用 NC-Max 作为它的共识机制。而 Alan 的工作和 Nervos CKB 之间的关系也很简单,Alan 设计了 EagleSong,它被用作工作量证明算法的哈希函数。 

这就是我们和 Nervos 的关系,但我认为共识协议是 Nervos CKB 最无聊的部分,它有一些更让人兴奋的功能。

Anna:是啊,如果你愿意的话,请多告诉我们一些有关 Nervos CKB 的东西,因为我们实际上从来没有在节目中谈论过它。

Ren:当然,Nervos 的设计有三件事我觉得值得一提。

第一点是,Nervos CKB 使用的是 UTXO 模型,UTXO 模型对用户自定义代币来说更容易,在以太坊里,很多安全漏洞来源之一就是所有的用户自定义代币都存在 ERC20 合约里面,像是用户的所有账户余额都存储在同一个合约中,所以,如果黑客破解了这个合约,那基本上就可以任意修改用户的余额。

而 UTXO 模型可以让我们把访问控制权还给用户,你的资产存在你自己的 UTXO 里,你可以决定用什么签名算法来解锁这些资产,所以,在智能合约方面不存在单点故障。

Anna:等等,你可以在 Nervos CKB上运行智能合约, 但它使用的是 UTXO 模型,那还有其他项目可以这样做吗?

因为我主要了解的是以太坊,我一直以为你需要有一个账户模型才能做智能合约的东西,但我猜,好像不是……。

Ren:不, 其实你不需要一个账户模型才能支持智能合约,有其他产品也可以做到这一点,但我想我们是最早的一个。

Anna:明白了,我在想那是什么样子,智能合约到底是如何在 UTXO 上运行的?

Ren:我稍后就会谈到这部分。

在 Nervos 中 script 分为两种,第一种叫做 lock script,你可以把它想象成你公寓的锁,第二种叫做 type script。你可以把它想象成你公寓里的家具。你正在运行的实际代码是为了执行智能合约,而将 lock script 和 type script 分开的好处是,它可以消除很多安全漏洞。

在以太坊里面,基本上谁能修改智能合约,谁就能修改变量,它与执行功能的代码混合在一起,而在 Nervos CKB 中,这两种脚本是分开的,这样就很难被攻击。

另外,用户可以定义自己的 lock script,你可以说我更喜欢 Schnorr 签名,也可以说更喜欢 ECDS 签名,这些都是很灵活的,这是 Nervos 的 UTXO 模型。

Nervos 的第二个新东西是它的经济模型,原生代币 CKB 代表了存储空间。在以太坊里面,你只需支付一次性费用,而无论占用存储空间有多大,它都永远不收取任何链上存储的费用。

在 Nervos CKB 中,我们使用了不同的经济模型,每个 UTXO 都有一定数量的存储空间,所有的空间都有利息,如果你使用了这个存储空间,那么利息就归矿工所有,如果你不使用那个存储空间,那么你可以保留这个利息。

Anna:所以用户要为存储付费,对吗?

Fredrik:是的,没错,就像是状态租赁,但它不需要让我的智能合约一直活跃,我必须不断地把合约的钱送来,而 Nervos CKB 的付款像是通过通胀来付款。

Ren:是的,而且有交易费。

有意思的是,你可以用任意一种资产来支付交易费,并没有 Gas 机制。你可能知道,以太坊的许多攻击就是来自于费用估算和共识机制之间的紧密耦合,而我们认为这是没有必要的,我们把它去掉,看看它的效果如何。

Nervos 设计的第三个亮点是,它使用 RISC-V 来打造虚拟机,RISC-V 是一个硬件指令集,这意味着它非常强大,你可以用任何你想要的编程语言来编程,包括 Solidity,你可以实现任何你想要的密码学原语,而这就方便了跨链操作和算法更新,因为在很多跨链操作中,不同的链使用不同的签名算法,但在 Nervos 中,这不是个问题,因为你可以随时从密码学库中调用。

Fredrik:有没有一种有效的方法可以将 RISC-V 编译成 x86?或者这是否意味着你的矿工需要购买 RISC-V 的 CPU?

Ren:我不是这方面的专家,目前为止我被告知,目前它的速度比 EVM 稍慢,但他们正在优化它。

Fredrik:好的,我认为那应该是在仿真模式下跑的,因为如果在实际的硬件上运行 RISC-V,它会很快。

Ren:对,这个环境下运行的 RISC -V 预计比在硬件上运行要慢 50 倍,而且有人告诉我,相对 Web Assembly,RISC-V 指令集实现起来更简单。

Anna:总结一下,我很好奇你现在在做什么研究?你有什么正在进行的工作吗?

Ren:有一件大事我真的很想做,就是写一篇论文,叫做「Lay down the Common Metrics 2.0」

近些年有很多新的协议出来,但有些协议还是犯了同样的错误,就是把模拟作为安全分析,我想分析它们的安全性,找出这些协议中新的攻击方式。

作者:火星财经,仅作分享,存在异议请联系平台删除。本文观点不代表刺猬财经 - 刺猬区块链资讯站立场。