实现BTC的1万倍扩容,MIT与斯坦福打造的新协议Prism是什么?

[复制链接]
7575 |0
发表于 2020-2-22 00:00:02 | 显示全部楼层 |阅读模式

注:本文是斯坦福区块链周的演讲实录,为来自麻省理工的Lei Yang发表的演讲,题为《Prism:BTC的1万倍扩容》。

大家好。我很高兴能在这里谈谈我们对Prism共识协议的实施和评估,该协议的性能比BTC高出1万倍。这是麻省理工学院,斯坦福大学和其他几所大学之间合作的结果。我要感谢我的合作者,包括我的导师和其他相关参与者。

我们都知道BTC有很好的安全性,但就性能而言,却不是。它每秒只能处理7笔交易,每一个都需要几个小时来确认。BTC将性能与安全连接在一起。BTC将这些参数与一个设计参数联系在一起:挖矿率。

如果我们想要提高性能,那么将在安全性方面遭受很多损失,反之亦然。Prism要做的就是打破这种联系。

我们对中本聪共识协议进行了自然延伸。我们对其进行解构,并对每个部分进行扩展。prism协议是一个非常自然和漂亮的协议。它非常简单,我们在短短6个月的时间里就将它应用到10000行Rust代码中。

就在演讲开始之前,我在AWS上启动了100个虚拟机实例。我将在每一个虚拟机上发布一个Prism实例。代码在github上是开源的。

在这次演讲中,我将讨论Prism共识协议,然后我将讨论系统部署,然后我们将进行评估。

让我们快速回顾一下BTC共识协议,它使用了最长链规则,每个矿工都会尝试扩展和挖最长的链。当出现一个分叉时,当两个区块意外地连接到同一个父块时,矿工将选择最长的分叉。他们总是选择最长链。

这里涉及了一个名为挖矿率的参数,它定义了矿工挖出新块的平均速度。在BTC中,这个速度是每10分钟1个区块。

BTC协议的一个重要部分是交易的确认。一笔交易出现,我们可以立即确认,但有一个问题。攻击者有可能在挖一条私有的链,因为挖矿过程是随机的,是一个泊松过程(poisson process)。有可能这个矿工很幸运,可以在头几个区块挖矿速度较快,当这种情况发生时攻击者会释放自己的私有链,突然我们的交易就不再来自真正的最长链。

中本聪提出了一个解决方案,与其立即确认交易,不如等到确认其已经在最长链里。即使攻击者能够幸运地获得最初的几个块,从长远来看攻击者也不太可能获胜。中本聪在他的白皮书中进行了计算。所以你必须等待一定数量的区块才能获得不可篡改的可能。

吞吐量是BTC确认交易的平均速度,以及在一段时间内可以确认多少交易,计算方法是乘以区块大小、每个区块有多少交易、以及挖矿速率(我们挖这些区块的速度有多快)。然后是延时,也就是确认一个交易需要多长时间。这个计算可以通过确定深度和挖掘速率的除法来完成。

为了提高性能,我们可以提高挖矿速率来获得更高的吞吐量和更低的延时。我们还可以增加区块大小以获得更高的吞吐量。然而,因为分叉,这是行不通的,如果我们提高挖矿速率或增加区块大小,我们只能得到更多的分叉。这是因为当网络上的两个节点不能足够快地相互传播消息时,就会发生分叉,这样它们就会意外地在同一个父块上进行挖矿。如果我们提高挖矿速率,两个节点更有可能在短时间内意外地挖出新块。如果我们增加区块的大小,那么区块在整个网络中传播的时间会更长,这将导致分叉率的增加。分叉不是好事,因为会损害安全性。分叉降低了诚实挖矿的能力。

 

解构Prism

 

现在我们来谈谈Prism。我们解除性能和安全的联系是为了提高性能。在BTC中,一个区块实际上有两种作用:第一种是新区块会将一些交易添加到账本中,第二种是更含蓄的,新区块也会对其所有间接和直接区块进行认证。这就好比说,证明某条链是最长链。

因此,第一种作用直接与吞吐量相关。交易提交得越快,账本能包含的交易就越多。第二个角色与确认延时相关:我们投票的速度越快,你对交易的信心就越高。

1. 吞吐量

在BTC中,我们已经看到了由于分叉而导致的吞吐量有限。如果存在一个根本就没有分叉概念的结构,会怎么样呢?这就是我们引入“交易区块”(transaction block)的原因。

“交易区块”由矿工以较高的挖矿速率挖出,但是交易区块之间没有任何链结构。所以我们可以非常快地挖出它们,而不用导致分叉,因为在这个设计中根本不存在分叉。

然后我们将这些“交易区块”带到“申请人区块”(proposer blocks)。这些是轻量级区块,只包含指向这些交易区块的哈希指示。“申请人区块”将以BTC的速度开采,并以BTC最长链连接在一起。因为我们挖矿的速度很慢,而且这些区块很小,所以不管你怎样提高吞吐量,都不会导致分叉增加。

这就是为什么Prism可以在不牺牲安全性的情况下实现底层网络的物理限制。Prism同时基于最长链和工作量证明。

矿工将同时挖出两种类型的区块。他们将使用区块的哈希值来决定其会变成什么类型的区块:交易或申请人。

2. 延时

为了处理延时,我们首先注意到,即使我们引入了申请人链,投票率也不会增加,因为只有一个申请人链在进行投票。所以让我们再做一次解构,把投票和申请人区块分开。

我们把申请人区块分成了两部分。一个包含指向交易区块的哈希指示,另一个是投票者区块(voter block),它只包含对申请人区块投票的指示。我们不再在申请人区块中采用最长链结构。相反,我们假设在投票区块中有一个像BTC一样的最长链结构。

到目前为止,我们还没有改善确认延时,因为我们仍然只有一个投票者链,而且这个投票者链是安全的是非常重要的,所以我们仍然需要等待25个确认,否则攻击者可以像攻击BTC一样攻击投票者链。

现在我们已经把申请人和投票工作分开了,我们可以引入许多投票者链,比如1000个投票者链。一个有趣的发现是,现在我们有1000个投票者链,我们不需要每一个都是安全的。即使攻击者能够攻击一个投票链的概率为30%,但是攻击者同时攻击500个投票链的概率仍然很低。这就是为什么我们可以在不牺牲安全性的情况下降低Prism中的确认延时。

3. 性能

在我们于2019年发表的一篇论文中,我们从数学上证明,只要对手的算力低于50%,Prism就能像BTC一样,保证安全性、活跃度和一致性。对于吞吐量,Prism提供1 -beta乘以c,其中beta是对手的能力,c是底层网络吞吐量。对于确认延时,Prism的确认延时与底层网络延时d成正比,与确认可靠性成正比,与投票者链的数量成反比。

这看起来很有希望,但我们来看看它在现实世界中的表现。这是理论不能告诉我们的。首先,我们必须承认这个协议比BTC稍微复杂一点。其次,在理论上,我们假设了一个简化的网络模型。还记得吗,当我们描述Prism的确认延迟时,我们使用了大O符号,所以它是成比例的,我们不知道这里的常数;最后,网络中一定还有其他瓶颈,那么这些瓶颈是什么呢?

这就是我们做系统部署的原因。

 

部署Prism

 

我们通过10000行Rust代码实现了Prism的部署,其基于UTPundiO模型,并pay-to-pubkey交易。代码是开源的。

Prism可以实现每秒70000交易和10秒的延迟。

区块链客户端的作用是:1)参与共识。它接收新的区块,将它们连接成一条链,并挖出新的区块。2)同样重要的是,其可以获取区块并生成交易的顺序。

Prism共识协议的核心角色是对交易进行排序。与BTC不同,我们允许双花交易。只要每个人都同意这个顺序,那么他们就可以计算UTNPXSO集并自行删除无效的或重复花费的交易。这是账本记录模块的工作,它按交易的顺序依次执行,以生成最终更新的UTPundiO集。

在部署之后,我们了解到Prism能够将区块链的瓶颈从共识转移到账本记录。这个瓶颈在于UTPundiO集的存储。为了实现高吞吐量,你必须并行处理共识和记账。

我们做了一些优化。我们做了“计分板”(Scoreboarding)来平行记账。我们做的账本保持异步一致,以便我们可以并行共识。我们还在客户端引入了一个功能设计模式,并禁用了交易广播,以获得较高的网络效率。

记分板在现代CPU设计中被用来执行并行指令。假设我们有两个CPU,希望一次执行两笔交易。如果第二笔交易开始,那么第二笔交易就会通过,但是第一笔会失败,因为那是违反交易顺序的,是不正确的。

计分板技术引入了一种很简单的表格,在我们执行交易之前,我们会记录下这个交易将会接触到什么币,将会使用什么币,将会产生什么币。在执行另一笔交易之前,我们将查看记分板,看看是否有我们将要生产或使用的币已经存在于记分板中。在开始第一笔交易之前,我们会在记分板上标注a和c,假如我们在随后的交易中再次碰到了a币,就会产生冲突。然后执行一笔不同的交易,我们发现他们可以同时完成。对于其余的交易,我们发现它们之间没有冲突,所以它们也可以一起执行,我们得到了正确的结果。

在优化之后,客户端在CPU内核上实现了几乎线性的扩展,即扩展到8个内核,并且在此基础上,SSD和数据库为性能设置了上限。

另一个重要的优化是我们根据共识进行异步账。我们注意到,在Prism中,账本更新的频率与区块挖出的速度相比非常低,因为我们有1000个投票者链。每一个投票者链和每一个单独的投票者区块非常不可能触发一些新的交易被确认,不像BTC,每一个新的区块触发一些交易被确认。因此,我们不会在每次接收到区块时都进行记录,而是将其放入一个来自共识逻辑的异步循环中,这样它就可以在自己的循环中运行。我们能够在共识逻辑中删除很多锁,并且我们的共识逻辑是无全局锁的,所以它可以使用多个线程和多个CPU内核并行地处理即将到来的区块,这样就可以保持较高的区块速率。

 

部署评估

 

最后,我将介绍我的评估结果。我们使用了100到1000个AWS EC2实例,这些都是轻量级实例,不如我现在用的笔记本电脑。我们将节点连接到拓扑结构中——每个节点连接到4个随机节点。我们在每个节点之间引入了一个120ms的传播延时。对于每个节点,我们设置了400mbps的入口和出口带宽限制器来模拟真实的互联网。

我们将我们的部署与BTC和bitDavinci-ng进行了比较,并测试了Pism是否可以扩展到更多的节点(比如这里的1000个节点),并评估了我们的部署在CPU或带宽利用率方面是否有效。最后,我们评估了“Prism”在不同类型攻击下的表现。

Prism每秒有7万笔交易。我们可以看到,最长链协议将性能与安全性结合在一起,因此如果你想要增加区块大小以获得更高的吞吐量,那么必须降低挖矿速率,从而获得更高的延时。这是一个权衡曲线,如果你增加延时,那么你也可以增加吞吐量,但如果你想要低延时,那么你必须付出吞吐量的代价。

我们的参数在最长链协议,所以它比今天的BTC快得多。但是,我们的确认延时仍然无法少于100秒,并且吞吐量不能超过每秒10000笔交易。

我们通过修改我们的代码在bitDavinci-ng进行了部署,我们看到bitDavinci-ng实现了更好的吞吐量,但延时仍然像BTC或最长链协议,因为它本质上使用最长链协议进行投票和确认。

最后,我们与Algorand进行了比较。我们在相同的AWS拓扑设置中运行公开的Algorand代码,我们发现其吞吐量极限为每秒1000笔交易。

然后我们评估了不同安全设置下的协议。我们发现,在Prism的确认延时方面,我们只付出了一点代价,而且我们没有损失任何吞吐量,因为在Prism中,我们将吞吐量与安全性解耦了。

最后,我们还测试了具有更高安全设置的prism。

我们的部署非常高效。超过75%的CPU功率用于必要的任务,如检查签名和更新UTPundiO集。对于带宽,由于我们使用了1000个投票者链,它可能看起来效率很低,但实际上超过99.5%的数据是实际有用的数据,少于0.4%的是投票者区块。

Prism的解构方式是将BTC中的区块解构为一个申请人和一个投票者,并将每个部分进行扩容以接近性能的极限。我们发现,为了获得高吞吐量,我们必须并行化一切——共识和记账客户端。

我们发现prism能够将瓶颈从共识转移到记账、SSD和数据库。而且,Prism是中本聪共识的自然延伸。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门版块
快速回复 返回顶部 返回列表