主页 > imtoken最新版app > 以太坊颠覆自我:引入密码学实现2.0性能突破

以太坊颠覆自我:引入密码学实现2.0性能突破

imtoken最新版app 2024-01-15 05:08:23

性能是阻碍公链发展的瓶颈,提升性能是大多数希望超越以太坊的公链的主要设计目标。 然而,今天回过头来看,我们会发现,这些公链选择的方式,大部分都是为了提升分布式系统的性能而设计的,但是由于分布式系统的CAP定理(不可能三角),是有代价的为提高绩效而付出的代价。 当这个分布式系统的目的是账本时,这些成本甚至可能是不可接受的。

以太坊也一直在尝试各种方法来提高性能。 在 2.0 推出前夕,它“尝试”了密码学。 以太坊2.0将是一条基于“分布式系统+密码学”的公链。 这种密码学不是指用于签名和隐私的部分,而是指高性能系统的核心组件。 那部分。

从这个角度来看,或许可以说,颠覆以太坊的不是别人,而是自己。 跳出了分布式系统设计的单一思路,走上了分布式系统+密码学的组合设计之路。

本文将尝试介绍分布式系统设计如何与以太坊2.0中的密码学设计相结合,实现公链性能的突破。

状态分片:从单个账本到多个账本

区块链是一个分布式账本,区块节点是记账的矿工,他们负责将交易写入账本。 除了争夺记账权,区块生产者最重要的工作,或者说他们自己的工作,就是检查他们打包的交易是否合法。 完成这项工作并不难,因为出块节点手里拿着账本,它只需要检查交易发送方是否有钱。

对于非分片公链,所有节点持有同一个账本; 并且为了防止记账冲突,一次只允许一个出块节点记账。 以太坊提出状态分片,实际上是把一个账本分成多个账本。 这样,有的节点记账在1号账本,有的节点记账在2号账本……(相当于7-11平台从一个收银台增加到多个收银台),多个节点同时记账,整个公链的性能将得到质的提升。

但是如果我们固定出块节点和账本/分片的关系,比如确定a、b、c、d四个节点负责1号账本,那么坏人只需要买a、b、c、d中的一些。 它可以销毁账本,公链性能提升的同时,安全性也会成比例下降。

因此,需要将出块节点随机动态分配到不同的账本上,以保证分片公链与非分片公链具有同等的安全性。 但是动态分配会带来新的问题:节点应该持有哪个账本? 它可能被分配到 64 个分类账(以太坊计划启动 64 个分片)中的任何一个来记账。

以太坊给出的解决方案是出块节点不带任何账本,或者说出块节点不需要账本记账。

这将带来两大好处。 首先,无论该节点被分配到哪个分片,都可以立即开始记账(出块),几乎不需要时间来获取和同步该分片的账本。 因此节点可以很容易地在不同分片之间跳转; 二是出块节点不需要存储账本,不需要很高的硬件配置。 任何人抵押 32ETH 都可以成为验证者,这对于以太坊 PoS 的去中心化以及整个公链的安全非常有帮助。

但是一个新的问题出现了:如果区块生产者没有账本,它如何知道交易发送者是否有足够的钱? 这就是密码学发挥作用的地方。

向量承诺:从查询到证明

没有账本也能记账,听上去很不可思议,但思路很简单:过去,一个节点有一个账本,一笔交易来了,就翻账本,检查这笔交易是否合法; 以后节点没有账本,交易发送方在提交交易时,需要提交密码学证明(为了区分,下文均指密码学证明作为证明),你可以证明你的交易合法。

为什么出块节点可以通过一个证明来判断某笔交易是否合法呢? 这里涉及密码学的两个重要概念,第一个叫做“成员证明”。 它指的是证明一个人是一个群体的一部分的过程。 如果能够证明某个账户状态是整个账本状态的一部分,那么出块节点当然可以相信这个账户状态,并以此作为判断交易合法性的依据。

第二种叫做“Vector Commitment”,可以把一个群体,不管这个群体有多大,都压缩成只有一个数字,然后给出一个成员身份证明,表明一个个体属于这个数字后面的群体。 ,并可以证明个体在群体中的地位,更新证书。

Merkle树是可以用于向量承诺的方法之一,我们以它为例来看看如何实现成员证明。

下图是Merkle树。 底层的叶子节点存储应用数据,其他非叶子节点存储其子节点的哈希值。 如果知道绿色节点和所有黄色节点的值,可以从下到上进行三次哈希运算,得到Merkle树根节点的值,即6c0a。

以太坊是单账本吗_哪些币是以太坊的代币_以太坊是传销吗

那么,如果验证者拥有树根(6c0a)的值,证明提供者将绿色节点的值和黄色节点的所有值作为证明给验证者,验证者是否能够计算哈希值的三倍? 等于6c0a判断绿色节点的值是否在这棵Merkle树中? 答案是肯定的。 这是 Merkle 树中绿色节点的成员资格证明,它是作为矢量承诺完成的,这几乎就是比特币 SPV 节点(简单支付验证)的工作方式。

如下图所示,SPV节点并不存储完整的区块/账本,而是在每个区块中存储默克尔树的根节点(默克尔树的叶子节点存储区块中的所有交易),当它需要query 当一笔交易存在时,会向全节点索要一笔交易的证明,类似于上面绿色节点和黄色节点值的一个封装(Merkle路径),然后SPV节点计算总这些值的hash值是否等于自己手上Merkle树根的值。 如果相等,则说明该交易是默克尔树的成员,即该交易存在。

以太坊是单账本吗_哪些币是以太坊的代币_以太坊是传销吗

SPV节点只存储区块头(绿框),区块头包含Merkle树的根(红框)

SPV节点通过成员证明判断交易是否存在。 证明系统由三部分组成:节点有一个简短的总结(树根); 证明提供者提供证明; 节点计算证明是否与自己手牌匹配中的总结一致。

至此,我们完成了“无账查账”,也就是变查询思维为证明思维; 接下来我们要实现的是“记账无账”。

对于以太坊 2.0 分片上的出块节点,其证明体系也由抽象、证明和验证三部分组成,但必须使用交易发送者(不是全节点)给出的证明来判断是否有新的交易是否合法(而不是旧交易是否存在),并以此判断作为记账的依据。

无状态:从账本证明到行为证明

想象一个小村庄,村民之间每天只有 3 笔交易,村长负责记帐。 A现在想转5块钱给B,传统的思路很简单:村长查看A的账户里有没有5块钱,如果有就记下这笔新的交易。

现在换个思路:假设A今天早上要转5块钱给B,而村长知道A的账户昨天早上有10元,那么如果A能证明昨天的3笔交易与他无关,正确的? 意思是他的账户今天早上还有10美元? 这样一来,村长能不能不查账本就记下这笔新的交易呢? 答案是肯定的。

如果 A 昨天有交易怎么办? 这很简单。 此时A并没有证明自己没有交易,而是证明自己昨天只有一笔交易,那笔交易花费了3元; 村长知道他还有7块钱,可以记录新的交易。

这种思想转变很重要,一定要了解。 这就是“无状态”这个东西的奥秘所在。 不难发现以太坊是单账本吗,即使是一个不持有账本的SPV节点,在查询交易的时候其实也需要用到账本,或者说状态,只不过它本身并没有存储状态,而是去全节点去获取这种状态的证明; 但在这种新思路下,状态的作用完全可以被“行为证明”所取代,那么这条链就可以设计成无状态的。 (注:“行为证明”一词无出处,为便于理解作者描述)

如何实现无状态? 如何借助行为证明完成记账? 依旧是会员认证的方式。 是否可以使用 Merkle 树来完成这个成员证明? 理论上是可以的,但是对于“无状态”的应用场景来说,使用它的开销太高了。 在这篇文章中,我们介绍了通过可聚合子向量承诺的成员身份证明,用于无账簿记账。

可聚合子向量承诺 (aSVC) 是 Alin Tomescu、Ittai Abraham、Vitalik Buterin(以太坊)、Justin Drake(以太坊广场)、Dankrad Feist(以太坊)、Dmitry Khovratovich 的论文“无状态加密货币的聚合子向量承诺”的最新研究成果(以太坊)。 其工作过程如下:

1、初始化分片,即在建立账本时确定账户的初始情况。 假设一个分片在建立时有100个账户,这些账户都有初始余额。 我们需要用v(i)来表示第i个账户,它是一对值如(地址i,余额i); 用 V 表示所有账户,它是一组值,比如(地址1,余额1)(地址2,余额2)...(地址100,余额100)。

同时需要生成两个值。 第一个叫c,是对V的承诺,代表此时分片的所有账户和账户中的余额。 出块节点手里拿着c(可以类比为默克尔树的根,方便理解),作为以后验证的总结。

第二个叫做π(i),它是v(i)是V的成员的证明,代表第i个账户,该账户的余额在总账V中,每个账户持有且只持有自己的 π(i),就是以后发送交易时提交给区块节点的证明。

在初始化阶段,承诺和证明的生成需要一个初始“状态”。

2. 第一次交易。 账户 i 发起整个分片的第一笔交易。 这时候需要把π(i)和交易提交给区块节点,区块节点计算π(i)看结果和自己手里的c是否一致。 如果匹配,你就可以相信发送方的账户余额有多少,以此来判断其提交的交易是否合法。

3.接下来是关键点:更新c和π(i)。

c(commitment to the entire ledger)不再根据状态生成,而是在第一笔交易前使用c和第一笔交易引起的余额变化生成; π(i) (账户对自身的证明) 不是根据状态生成的,它是在第一笔交易发生之前用 π(i) 生成的,第一笔交易对账户的改变。

完成c和π(i)的更新后以太坊是单账本吗,出块节点有一个新的承诺(new c)可以承诺所有用户的新余额,账户也有一个新的证明(new π(i)可以证明它的新平衡))。

以此类推,每笔交易都会改变一次c,将所有的π(i)改变一次,但这次改变不再依赖于状态数据,而是依赖于旧的c和π(i),以及之前的交易; 当一笔新的交易需要验证时,出块节点手中始终持有最新的c。 它可以通过c和账户提供的π(i)来判断一笔交易是否合法,是否可以打包成块。

所以至此,终于实现了“没有账本也能记账”。 无论对于区块生产者还是账户,他们手中掌握的是某种密码学证明,而不是账本的状态。 另外需要说明的是,statelessless和sharding看起来是绝配,但是statelessness不是为sharding设计的,是为公链设计的。

aSVC的设计目标是成为一种高效的成员资格证明,减少上述过程中的通信开销和计算开销,使该方案可以用于无状态区块链的实现。 从论文的角度来看,使用aSVC方案,c和π(i)的大小只有几十个字节,π(i)的更新时间为O(1),验证时间也为O( 1). 它支持将多个证明聚合为一个 O(1) 证明。 这种低开销的实现正是 aSVC 的全部意义所在。 不过,正如 Vitalik 在以太坊研究者论坛上的讨论,aSVC 仍然需要进一步优化。

文末是全文的简要总结:分布式系统的状态分片设计与密码学的成员证明设计相结合,实现了以太坊2.0性能的突破。

1. 为了安全,以太坊2.0的状态分片需要随机分配出块节点。

2.如果出块节点需要账本,账本同步将成为新的性能瓶颈,账本存储也会影响PoS的去中心化。

3. 有没有不用账本验证余额的方法?

4. 第一个思路转变:将查账本的方式转变为证明账本的方式。 这需要借助密码学来完成。

5、思维转变之二:将证明账本状态的方式改为证明交易行为的方式,实现无状态、无账本记账。 这需要借助密码学来完成。

6.密码学的工具很多。 有了目标后,就需要根据应用需求,选择并组合合适的工具,形成解决方案,并对方案进行优化。

可聚合的子向量承诺

在本文中,我们用自然语言描述了 aSVC 的工作。 有兴趣的可以通过aSVC的API定义来更清楚的了解。 如下图所示:第一个红框是在初始化时生成一个commitment c,第二个红框是根据交易更新c; 第一个绿框是在初始化时生成一个证明π(i),第二个绿框是到交易更新π(i); 蓝色方框是使用c和π(i)进行验证的区块节点。

以太坊是单账本吗_哪些币是以太坊的代币_以太坊是传销吗

上述过程中,核心工作是根据交易引起的变化,将旧的c变为新的c,将旧的π(i)变为新的π(i)。 不仅要能够完成更新,而且这次更新的开销是可以接受的,这是aSVC需要解决的关键问题。 下面以c的更新为例,介绍一下aSVC是如何做的。

上面说了,c promises 的是 V,从 c 到 new c 其实就是从 promised V 到 promising 一个 new V。对于 V 来说,它是由一系列的点组成的,(address 1, balance 1) 是一个点, (address 2, balance 2) 是另一个点... (address 100, balance 100) 是第100个点。

借助拉格朗日插值,这一系列点可以变成一个多项式(多项式表示的曲线通过所有这些点),这意味着对一系列点的承诺可以变成对多项式的承诺; 从 c 到新 c 等同于从提交一个多项式到提交另一个多项式。

虽然多项式具有各种神奇的特性,但对多项式和多项式变换的承诺可以小而快。 然后通过这种从点到多项式的转换,可以使 c 的更新成本可以接受。

但这只是对aSVC方案思想的简单片面的介绍。 本方案还使用了很多其他的工具和方法,目前还在追求更好的设计。 如果您想了解更多信息,可以阅读原始论文。 3.1 和 4.1 节是对理解整篇论文最有帮助的部分。

感谢:郭宇

作者:安必实验室特约研究员李华

论文下载地址为:。