以太坊Sharding FAQ

当前位置:首页 > 币圈百科 > 以太坊Sharding FAQ

以太坊Sharding FAQ

2022-11-15币圈百科204

简介

目前,在所有的区块链协议中,每个节点都存储着所有的状态(账户余额、合同代码和存储等。)并处理所有事务。这提供了很多安全性,但是极大地限制了可伸缩性:区块链不能处理比单个节点更多的事务。为此,比特币被限制在每秒3-7次交易,以太坊每秒7-15次交易,以此类推。那么,这就提出了一个问题:有没有办法创建一种新的机制,只允许一小组节点来验证每一笔交易?只要有足够的节点来验证每个事务,系统仍然是高度安全的,但是有足够的节点来允许系统并行处理许多事务。我们能否利用这项技术来大幅提高区块链的吞吐量?

有哪些简单但有缺陷的方法可以解决这个问题?

“简单的解决方案”主要分为三类。首先是直接放弃独立区块链的可扩展性,而是假设用户会使用很多不同的“altcoins”。这种方法极大地提高了吞吐量,但代价是安全性:用这种方案增加N因子的吞吐量必然伴随着N因子的安全性的降低。所以可以证明对于大于n的小值是不可行的,第二种就是简单的提高块大小限制。这种方法是可行的,而且在某些情况下可能是正确的处理方式,因为区块链的大小可能更多地受到政治而不是实际技术因素的制约。然而,不管个人在个别案例中的信念如何,这种方案不可避免地有其局限性:如果区块链运行足够长的时间,运行在消费级硬件上的节点将退出,网络将开始依赖于仅运行区块链的少数超级计算机,这可能导致极大的中心化风险。第三种是“合并采矿”,这是一种多个区块链共存的技术,但所有区块链共享相同的采矿激励(或股权证明系统中的赌注)。目前,Namecoin已经通过这种技术从比特币区块链获得了很大一部分安全性。如果所有矿工都参与,理论上在不影响安全的情况下,吞吐量可以提高N倍。但是,也存在这样的问题,它增加了n倍的每个矿工的计算和存储负荷。所以,其实这个方法只是一个隐藏的限制块大小的方法。即使这被认为是可以接受的,仍然存在这样的缺陷:这些区块链并没有真正“绑在一起”;只需要少量的经济激励就可以说服矿商放弃或妥协特定的区块链。这种可能性是非常真实的,有合并挖矿被攻击的【实际历史事件】,有明确主张使用合并挖矿攻击作为“治理特征”的开发者。对于一个特定的联盟来说,摧毁区块链是无利可图的。如果每个链条上只有少数矿工参与联合开采,集权的风险会减轻,但联合开采的安全效益也会大打折扣。

听起来好像有某种可扩展性困境在起作用。这是什么困境?能突破吗?

这三个困境表明区块链系统最多只能有以下三个属性中的两个:

去中心化

(定义为系统可以在每个参与者只能访问O(c)资源的场景下运行,即普通笔记本电脑或小型VPS)

可伸缩性

(定义为能够处理O(n) O(c)事务)

安全性

(定义为最多使用O(n)资源来抵御安全攻击)

在本文的其余部分, 我们假设交易负载、国家规模和加密货币市值都与n成正比

有人认为由于梅特卡夫定律,一种加密货币的市值应该与n ^ 2成正比,而不是n,他们对吗?

没有。

为什么不呢?

梅特卡夫定律认为网络的价值与用户数量的平方(n 2)成正比,因为如果网络有n个用户,那么网络对每个用户都是有价值的,但是每个用户的价值与用户数量成正比,因为如果一个网络有n个用户,通过网络有n-1个潜在的连接,每个用户都可以从中受益。在实践中,经验研究表明,具有N个用户的网络的价值“对于N的小值,与N 2成比例;对于N的大值,与nlog n成比例”。这很好理解,因为对于n的一个小值,这个论点成立,但是一旦系统变大,两个影响会减缓增长。首先,实践中的增长通常发生在社区中,所以在一个中等规模的网络中,网络通常已经提供了每个用户所关心的大部分连接。其次,人脉往往可以互相替代。你可以争辩说,人们只能从k个连接中得到~O(log(k))的值——有23个牌子的除臭剂可以选择是好的,但并不是说比有22个选择更好,一个选择和零个选择是非常重要的区别。另外,即使加密货币的价值与k个用户的O(k * log(k))成正比,如果我们接受上述解释作为出现这种情况的原因,也意味着交易量也是O(k * log(k)),因为每个用户的log(k)值理论上来自于用户通过网络进行的log(k)连接,状态大小在很多情况下也应该遵循O(k)。所以假设n=O(k * log(k)),并且基于N(生态系统大小)和C(单个节点的计算能力)是我们使用的完美模型。

有哪些仅部分解决可扩展性问题的适度简单的方法

许多碎片化建议(如NUS的Loi Luu等人提出的这种早期BFT碎片化方案,以及针对比特币提出的这种Merklix树方案1)试图只碎片化事务或只碎片化状态,而不考虑其他方面2。这些努力令人钦佩,可能会带来效率的提高,但它们遇到了根本性的问题,它们只能解决其中一个瓶颈。我们希望每秒能够处理超过10,000个事务,并且我们不必强迫每个节点成为超级计算机或存储一兆字节的状态数据。这就需要一个综合的解决方案,即状态存储的工作量。事务处理,甚至事务的下载和广播都分散在各个节点上。特别是,这需要在P2P级别进行改变,因为广播模型不可扩展,因为它需要每个节点下载并重复广播O(n)个数据(每个发送的事务),而我们的去中心化标准假设是每个节点只能访问各种O(c)个资源。

有哪些方法可以避免“分割”任何东西?

Bitcoin-NG可以通过另一种区块链设计来增加可扩展性,即如果节点花费大量的CPU时间来验证块,网络会更加安全。在简单的PoW区块链中,存在很高的中心化风险,如果阈值增加到块验证节点CPU时间的5%以上,共识安全性会被削弱;比特币NG的设计缓解了这个问题。然而,这仅仅将事务可伸缩性提高了5-50倍3,4,而没有提高状态可伸缩性。也就是说,比特币-NG方法和碎片化并不互斥,当然可以同时实现。基于渠道的策略(闪电网、闪电网等。)可以通过常数因子来扩展事务容量,但是它们不能扩展状态存储,并且它们还会带来自己独特的妥协和限制,尤其是在拒绝服务攻击方面;可以说,通过碎片化(加上其他技术)实现上链延伸和通过渠道实现下链延伸是必要的,也是互补的。使用高级加密还有其他方法。例如基于Mimblewimble和ZK-斯纳克的策略来解决可伸缩性问题的特定部分。初始化所有节点的同步,而不是从创建块验证整个历史,节点可以验证密码以证明当前状态合法地遵循历史记录。 这些方法确实解决了合法性问题,但值得注意的是,我们可以依靠密码经济学,以比纯密码学更简单的方式解决同样的问题——参见当前以太坊中快速同步和神同步的实现。这两种方法都不能缓解状态大小的增长或在线事务处理的限制。

国家规模、历史、密码经济学,天啊!在我们继续之前,让我们定义一些这样的术语!

状态:代表系统“当前状态”的信息集合;在最简单的模型中,确定事务是否有效,以及事务的结果,应该只取决于状态。比如比特币中的UTXO的状态数据,以太坊中的balances nonces码存储,Namecoin中的域名注册项。

历史

:自创建该块以来所有交易的有序列表。在一个简单的模型中,当前状态应该是创建状态和历史的确定性函数。

事务

:进入历史的对象。实际上,事务代表用户想要做的事情,并且被加密和签名。

状态转移函数

:获取状态、应用事务并输出新状态的函数。所涉及的计算可能包括增加或减少为交易指定的账户中的余额、验证数字签名和运行合同代码。

Merkel树

:一种可以存储大量数据的加密哈希树结构,其中只需要O(log(n))的空间和时间来验证每一个单独的数据项。详情见此。在以太坊中,每个块的事务集已经保存在默克尔树中,树的根在块中提交。

Receipt:表示事务执行结果的对象。它不存储在状态中,但仍然存储在默克尔树中并提交给块,以便节点可以在没有所有数据的情况下有效地验证证明。日志是以太坊的收据。在碎片模型中,收据用于促进异步跨碎片通信。

轻型客户端

:一种与区块链交互的方式。它只需要非常少量的计算资源。默认情况下,它只需要跟踪区块链的头,并根据需要请求有关交易、状态和收据的相关信息,并验证默克尔证明的相关数据。

州根

:代表州的默克尔树的根哈希为5。

(以太坊的状态树和状态根是如何嵌入块结构的)

碎片化背后的基本思想?

将状态分成K=O(n/c)个分区,我们称之为“切片”。比如以太坊的分片方案,可能会把所有以0x00开头的地址放到一个分片里,把所有以0x001开头的地方放到另一个分片里,以此类推。在最简单的碎片化形式中,每个碎片都有自己的事务历史,在某个碎片化K中的事务影响仅限于碎片化K的状态.一个简单的例子是多资产区块链,其中有k个分部,每个分部存储余额并处理特定的资产相关交易。在更高级的碎片形式中,包含了一些形式的跨碎片通信功能,其中一个碎片上的事务可以触发另一个碎片上的事件。

分段式区块链的基本设计是什么?

一个简单的方法如下。有一些节点称为协调器,它们接受片K上的事务(根据协议,协调器可以选择哪个片K或随机分配K)并创建排序规则。一个排序规则有一个排序头,以及一条“这是片K上事务的排序”形式的短消息。它期望片K的前状态根是0x12bc57,当前排序的事务的默克尔根是0x3f98ea,事务处理后的状态根应该是0x5d0cc1。和协调器#1、2、4、5、8、11、13.98,99签了。

一个块必须包括每个片的排序头,一个块在以下条件下有效:

每个排序规则中给定的前状态根必须与相关片的当前状态根匹配

排序规则中的所有事务都有效

排序规则中给定的后状态根必须与上面给定的状态执行排序规则中的事务结果匹配

排序规则必须由该片的至少三分之二的注册协调者签名

。需要注意的是,这样的系统中有几个“层次化”的节点:

超级All-node

-处理所有排序规则中的所有事务,并保持所有片的满状态

相反,如果某个段中三分之二的协调者认为某个排序规则有效,那么该排序规则有效。

单切片节点

-充当顶级节点,但也处理某个切片的所有事务,并保持完整状态。

Light Node

-仅下载并验证顶级块的块头;不处理任何排序头或事务,除非它需要读取特定片的状态的一些特定信息,在这种情况下,它下载该片的最接近排序头的默克尔分支,并下载该状态下的默克尔证明的期望值。

这里的挑战是什么?

跨片通信

-以上设计不支持跨片通信。我们如何安全地增加跨片段通信。

单一碎片接管攻击

-如果攻击者接管了一个碎片中的大部分协调者,要么获得足够的签名来阻止任何排序规则,要么更糟,提交一个无效的排序规则?

欺诈检测

-如果得到一个无效的校对,节点(包括轻节点)如何可靠地知道它,以便验证欺诈,并在确认它是欺诈后拒绝校对?

数据可用性问题

-作为欺诈检测的子集,在整理中缺失数据的特殊情况会怎样?

超二次切片

-在n c^2的特殊情况下,在上面给出的简单设计中,会出现排序头超过O(c)的情况,所以普通节点将无法处理,只能处理顶级块。所以需要在事务和顶层块头中直接超过两级间接寻址(也就是我们需要的“一片一片”)。实现这个目标最简单最好的方法是什么?

然后,事务的结果取决于在其他碎片中发生的先前事件;一个典型的例子是货币转移,其中货币可以从片I转移到片J。首先,在片I中创建“借方”交易以销毁代币,然后在片J中创建“贷方”交易以创建代币,并且借方交易的收据被用作合法的信用证明。

但是CAP定理意味着完全安全的分布式系统是不可能的,所以碎片化是不可能的?

CAP定理是分布式共识的结果。一个简单的描述就是:“在网络分区的情况下,必须选择一致性或者可用性,不可兼得”。直观的说法很简单:如果将网络分成两半,在一半网络中发送事务“向A’发送10个令牌”,而在另一半网络中发送事务“向B发送10个令牌”,那么系统不可用,因为一个或两个事务不会被处理或变得不一致,因为网络的一半将看到第一个事务完成,而另一半将看到第二个事务完成。注意,CAP定理与扩展性无关;它适用于多个节点需要就某个值达成一致的任何情况,而不管它们同意的数据量。现有的去中心化系统都在可用性和一致性之间找到了一些折中的方法,碎片化并没有从根本上造成这方面的困难。

怎样才能促进跨片交流?

最令人满意的一个场景是,有很多应用没有太多独立用户,这些应用之间只是偶尔或者很少交互;在这种情况下,应用程序可以在一个单独的片上生存,并通过使用收据与其他片通信。

这通常包括将每笔交易细分为“借方”和“贷方”。例如,假设我们有一个交易,其中帐户A在片M上,我们期望向片n上的帐户B发送100个令牌。这些步骤如下:

在片M (i)上发送一个交易扣除账户A的100个代币(ii) 创建一个收据。收据对象并不直接保存在状态中,但收据的生成能通过默克尔证明来验证。

等待第一个交易被包含进来(有时候需要等待终止化,这取决于系统)

在分片N上发送一个交易,包含来自(1)收据的默克尔证明。这个交易也检查分片N上的状态以确保收据是”未花费“;如果是的话,那么它将账户B增加100个代币,并且保存在状态中代表收据已花费。

可选地,(3)中的交易也保存收据,然后可以在分片M中用来执行进一步的操作,这取决与原操作是否成功。

在更复杂的分片形式中,交易在某些场景下可能具有分散在不同分片上的效果,并且可以从多个分片状态中同时请求数据。

不同类型的应用程序怎么样与分片区块链融合?

有些应用程序完全不需要跨分片交互;多资产区块链和不需要互操作性的完全异构应用程序的区块链是最简单的案例。如果应用程序不需要彼此交互,如果可以异步交互,面临的挑战会更容易应对。也就是说,如果交互可以以分片A上的应用程序的形式完成,则生成收据,在分片B上的交易“消费”该收据并基于它执行一些操作,并且可能向分片A发送包含某些响应的“回调”。总的来说这个模式是很简单的,并且不难将其整合入高级程序语言中。

需要注意的是,与可用于分片内通信的机制相比,用于异步跨分片通信的协议内置机制可能会有所不同并且功能较弱。在不可扩展的区块链中的当前可用的一些功能在可扩展区块链中只能用于分区内通信7。

什么是火车旅馆问题

下面的例子是Andrew Miller提供的。 假设用户想要购买一张火车票并预订一家旅馆,并且想要确保这个操作是原子的 - 无论是保留成功还是两者都不成立。 如果火车票和酒店预订应用程序在同一个分片上,这很容易:创建一个交易,试图进行两个预订,除非两个预订都成功,否则引发异常,并且回滚所有。 但是,如果两者在不同的分片上,这并不是那么容易; 即使没有加密经济/去中心化的问题,这实质上也是数据库原子事务的问题。

只有异步消息,最简单的解决方法是先预订火车,然后再预订旅馆,然后一旦两个预订都成功就都确认;预订机制将阻止其他人预留(或者至少会确保有足够的空间开放让所有的预订被确认)一段时间。然而,这意味着该机制依赖于额外安全假设:来自于跨分片的消息可以在固定的周期内被包含在另外的分片中。

使用跨分片同步交易,问题更容易,但创建可以跨分片原子同步交易的分片解决方案的挑战本身绝对是重要的。

如果单个应用程序的使用量超过 O(c),则该应用程序需要存在多个区块链中。这样做的可行性取决于应用程序自身的具体情况。一些应用程序(如货币)很容易并行化,而另外一些应用程序(例如某些类型的市场设计)则不能并行化智能串行处理。

我们知道分片区块链的属性有一个事实是不可能实现的。阿姆达尔定律表明在应用程序有任何不可并行化组件的情况下,一旦容易获得并行化,不可并行化组件就会快速成为瓶颈。在像以太坊的通用计算平台中,很容易提出不可并行化计算的例子:一个跟踪内部变量x的合约,一旦接到到一个交易就将变量x设置为sha3(x, tx_data)就是个简单的例子。没有分片方案可以给与这种形式的个别应用程序超过O(c)的性能。因此,随着时间的推移,分片区块链协议将会越来越好地能够处理越来越多样化的应用程序类型和应用程序交互,但分片架构至少在规模超过O(c)的某些方面总是落后于单分片的架构。

我们正在运行的是哪些安全模型?

评估区块链设计的安全性有几个竞争模型:

诚实的大多数

(或诚实的绝对多数):我们假设有一组验证者,而且这些验证者的?(或?或?)由攻击者控制,其余的验证者诚实地遵循协议。

不协调的大多数

:我们假设所有的验证者在博弈论的上都是合理的(除了攻击者,他们有动机使用某种方式来攻击网络),但是不超过一部分(通常在?和?之间)协调他们的行动。

协调选择

:我们假定所有的验证者都是由同一个参与者控制的,或者完全有能力协调他们之间的经济上最优的选择。我们可以讨论联合的成本(或联合的利润)达到一些不良的结果。

贿赂攻击者模式

:我们采取不协调的多数模型,而不是让攻击者成为参与者之一,攻击者处于协议之外,并有能力贿赂任何参与者来改变他们的行为。攻击者被模拟为拥有预算,这是他们愿意支付的最高金额,我们可以讨论他们的成本,即他们最终为破坏协议平衡而支付的金额。

比特币的Eyal and Sirer’s selfish mining fix工作量证明是健壮的,在诚实的大多数高达?的假设下,在不协调的大多数高达?的假设下。Schellingcoin在诚实的大多数假设和在不协调的大多数假设下高达?,在协调选择模型下具有ε(即略微大于零)的攻击成本,并且在贿赂攻击者模型中由于P + epsilon attacks要求具有P + ε预算要求和ε成本。

混合模型也是存在的。例如,即使是在协调选择模型和贿赂攻击者模型中,通常也会做出一个

诚实的少数人

的假设,某些部分(可能是1-15%)的验证者会无视激励而采取利他行为。 我们也可以讨论由50-99%的验证者组成的联盟,试图破坏协议或伤害其他验证者; 例如在工作量证明中,一个51%算力大小的联盟可以通过拒绝包含其他矿工产出的区块来增加增加自己的收入。

诚实的大多数模型可能是非常不切实际的,并且已经被证明了 - 比特币的SPV mining fork是个实际的例子。它证明了很多;例如,一个诚实的大多数模型意味着诚实的矿工自愿烧毁他们自己的资金,以某种方式惩罚攻击者。不协调的大多数模型的假设可能是现实的;还有个中间模型,其中大多数节点是诚实的但有个预算,如果他们失去了太多资金就回停止。

贿赂攻击者模式在某些情况下被批评为不切实际的对抗行为,尽管其支持者认为,如果一个协议的设计考虑了贿赂攻击者模型,那么它应该能够大幅降低共识成本,因为51%的攻击变成一个可以从中恢复的事件。 我们将在不协调的大多数和贿赂攻击者模型的背景下评估分片。

我们怎么样解决在不协调的大多数模型中的单分片接管攻击?

简单来说,随机抽样。 每个分片被分配一定数量的协调者(例如,150),在每个分片上批准区块的协调者都是从分片的样本中获取的。样本可以半频繁地(例如每12小时一次)或最频繁地(也就是说,没有真正的独立抽样过程,每个块从全局池中的每个分片随机选择协调者)进行重新洗牌。

结果是,在一个诚实/不协调的多数模型中,相对于每一个单节点正在验证和创建块,即使在任何给定的时间在每个分片上只有几个节点验证和创建块,安全级别实际上并不低得多。 原因是简单统计:如果你在全局集合上假设一个?诚实的绝对多数,如果样本的大小是150,那么以99.999%的概率就可以满足样本的诚实多数条件。 如果你假定在全局组合上有一个?诚实的绝对多数,那么这个概率就会增加到99.999999998%(这里请看细节 )。

因此,至少在诚实/不协调的大多数情况下,我们有:

去中心化

(每个节点只存储O(c) 数据,因为它是O(c) 分片的一个轻客户端,所以存储O(1) * O(c) = O(c)的块头数据,以及对应于当前分配给它的一个或多个分片的完整状态和近期历史的O(c)数据)

可扩展性

(有O(c) 个分片,每个分片有O(c) 的容量,最大容量是n = O(c^2))

安全性

(攻击者需要控制整个O(n)大小的验证池中的至少 蓑衣网小编2022 ? ,以便有机会接管网络)。

在Zamfir模型中(或者在“非常非常适应性的对手”模型中),事情并不是那么容易,但是我们稍后会做到这一点。 请注意,由于采样的不完善性,安全阈值确实从1/2降低到了?,但相对于可能是100-1000倍的可扩展性收益而不会损失去中心化,这仍然是一个令人惊讶的低安全性损失。

你怎么样在工作量证明和权益证明中做这个抽样?

蓑衣网小编2022

在权益证明中,这很容易。 已经有一个“活动验证者集合”在状态中被跟踪,并且可以直接从这个集合中简单地抽样。 协议内算法运行并为每个分片选择150个校验者,或者每个校验者独立地运行一个算法,该算法使用一个共同的随机源来(可证实地)确定它们在任何给定时间的分片。 请注意,抽样任务是“强制性的”是非常重要的。 验证者不能选择它们进入的碎片。 如果验证者可以选择,那么攻击者可以用小权益集中他们的权益到一个分片上并攻击它,从而消除系统的安全性。

在工作量证明中,这是比较困难的,就像“直接的”工作量证明计划一样,不能阻止矿工将工作量于某一特定的分片。 有可能使用proof-of-file-access forms工作量证明来将个人矿工锁定到单独的分片,但是很难确保矿工不能快速下载或生成可用于其他分片的数据并因此避开 这种机制。 最为人所知的方法是通过Dominic Williams发明的一种叫做“拼图塔”的技术,矿工首先在一个共同链上进行工作量证明,然后将这些证明导入到关于权益风格验证池的证明中,然后验证池就像在权益证明的情况下一样。

一个可能的中间路线可能如下所示。 矿工可以花费大量的(O(c)大小)工作来创建一个新的“密码身份”。 工作量证明方案的确切值,然后选择他们在哪个分片上产生下一个块。他们可以花费O(1)大小的工作量在分片上创建一个块,然后工作量证明的价值决定了他们接下来可以继续产块的分片8。注意的是,所有这些方法都以某种方式工作量证明“有状态”,这是必要的。

取样的频率高低有哪些折衷?

选择频率只影响怎么样自适应攻击者使得协议仍然安全防御他们; 例如,如果您认为适应性攻击(例如不诚实的验证者发现他们是同一个样本的一部分并且共同勾结)可能在6小时内发生但不会更早,那么采样时间为4 小时而不是12小时。 这是一个赞成尽快抽样的理由。

每个区块进行抽样的主要挑战是重新改组会带来非常高的开销。 具体来说,验证分片上的块需要知道该分片的状态,因此每次验证器被重新改组时,验证器需要下载他们所在的新分片的整个状态。这需要强大的状态大小控制策略(即经济上确保状态不会增长过大,无论是删除旧账户,限制创建新账户的比率还是两者的结合),以及相当长的重组时间。

目前,Parity客户端可以在?3分钟内通过“warp-sync”下载和验证完整的以太坊状态快照; 如果我们增加20倍以弥补增加的使用量(10 tx / sec而不是0.5 tx / sec)(我们假定未来的状态大小控制策略和从长期使用中积累的“灰尘”大致抵消了) 得到约60分钟的状态同步时间,这表明12-24小时的同步周期但不少于是安全的。

有两条可能的途径可以克服这个挑战。

我们是否可以强制更多的状态保持在用户端,以便交易可以被验证,而不需要验证器来保存所有的状态数据?

这里的技术往往涉及要求用户存储状态数据,并为他们发送的每一个交易单独提供Merkle证明。 一个交易将与一个正确执行Merkle证明一起发送,这个证明将允许一个只有状态根的节点计算新的状态根。 这种正确执行证明将包括需要遍历的trie中对象的子集,以访问和验证交易必须验证的状态信息; 因为Merkle证明的大小是 O(log(n)),所以访问恒定数量对象的交易证明也是 O(log(n))大小。

(Merkle树中对象的子集,需要在访问多个状态对象的交易的Merkle证明中提供)

以纯粹的形式实施这个计划有两个缺陷。 首先,它引入了O(log(n))的开销,尽管可以说这个O(log(n))开销并不像看起来那么糟糕,因为它确保了验证器总是可以简单地将状态数据保存在内存中, 它永远不需要处理访问硬盘驱动器9的开销。 其次,如果交易访问的地址是静态的,那么它可以很容易地实施,但是如果所讨论的地址是动态的那么是很困难实施的,也就是说,如果交易执行的代码是read(f(read(x))),其中某些状态读取的地址取决于其他状态读取的执行结果。 在这种情况下,交易发送者认为交易将在发送交易时读取的地址可能与交易被打包在块中时实际读取的地址不同,因此Merkle证明可能是不充分的10。

一种折中方法是允许交易发送者发送一个证明,该证明包含访问数据的最可能的可能性; 如果证明是充分的,则交易将被接受,如果状态意外地变化并且证明不足,则发送者必须重新发送或者网络中的一些帮助者节点重新发送交易并添加正确的证明。 那么开发者可以自由地进行具有动态行为的交易,但是行为越动态,交易实际上被打包在块中的可能性就越小。

注意验证者在这种方法下的交易包含策略需要很复杂,因为他们可能会花费数百万的gas处理一笔交易运行到最后一步才发现访问到他们没有的一些状态条目。 一个可能的妥协是验证者有一个策略,只接受(i)低gas成本的交易,例如< 100k, (ii)静态地指定一组允许访问的合约,并包含这些合约的整个状态的证明。 请注意,这只适用于最初广播交易时; 一旦交易被打包在一个块中,执行顺序是固定的,因此只能提供与实际需要访问的状态对应的最小Merkle证明。

如果验证者不立即重新重组,还有一个提高效率的机会。 我们可以期望验证者存储来自已经处理的交易的证明的数据,以便该数据不需要被再次发送; 如果k交易是在一个重组周期内发送的,那么这就将Merkle证据的平均大小从log(n) 减少到log(n) -log(k)。

随机抽样的随机性是怎么样产生的?

首先,重要的是要指出,即使随机数的产生是高度可利用的,这对协议来说也不是一个致命的缺陷。 相反,它只是意味着有一个中等偏高的中心化激励。 原因在于,由于随机性选取相当大的样本,因此很难将随机性偏差超过一定数量。

如上所述,最简单的方法就是通过二项式分布。 如果希望避免大小为N的样本被超过50%攻击,并且攻击者具有全球权益池的p%,则攻击者能够在一轮中获得大多数的概率是:

下面是一个表格,说明N和P的各种值在实践中的概率:

| | N=50 | N=100 | N=150 | N=250 || - | ------ | --------- | --------- | --------- || p=0.4 | 0.0978 | 0.0271 | 0.0082 | 0.0009 || p = 0.33 | 0.0108 | 0.0004 | 1.83 * 10-5 | 3.98 * 10-8 || p = 0.25 | 0.0001 | 6.63 * 10-8 | 4.11 * 10-11 | 1.81 * 10-17 || p = 0.2 | 2.09 * 10-6 | 2.14 * 10-11 | 2.50 * 10-16 | 3.96 * 10-26 |(编者注:原表格如此)

因此,对于N> = 150,任何给定的随机种子将导致有利于攻击者的样本的可能性确实非常小11,12。 这就意味着从随机性的安全角度来看,攻击者需要在选择随机值的顺序上有非常大的自由度,以彻底打破抽样过程。 大多数权益证明随机性的漏洞不允许攻击者简单地选择种子; 在最坏的情况下,他们给了攻击者许多机会从许多伪随机生成的选项中选出最有利的种子。 如果对此非常担心,可以简单地将N设置为更大的值,并且在计算随机性的过程中添加适度的硬key-derivation函数,从而需要超过2100计算步骤来找到足够随机性偏差。

现在,我们来看看为了获利而不是直接接管,试图更轻微影响随机性的攻击风险。 例如,假设有一个算法从一些非常大的集合中伪随机地选择了1000个验证者(每个验证者获得$ 1的奖励),攻击者拥有10%的权益,所以攻击者的平均“诚实”收入为100, 攻击者可以操纵随机性来“重新掷骰子”(攻击者可以无限次地执行此操作),这个成本是1美元。

由于中心极限定理,样本数量的标准偏差,并且基于数学上的其他已知结果,N个随机样本的期望最大值略低于M + S * sqrt(2 * log(N)),其中M是 平均值和S是标准差。 因此,操纵随机性和有效地重掷骰子(即增加N)的奖励急剧下降, 重新选择你的预期奖励是100美元,一个重新选择105.5美元,两个108.5美元,其中三个110.3美元,其中四个111.6美元,五个112.6美元,六个113.5美元。 因此,在五次重试之后,它不值得这样做。 结果,一个有10%权益的经济动机的攻击者会(在社会上浪费)花5美元获得13美元的额外收入,净盈余为8美元。

然而,这种逻辑假定单轮重掷骰子是昂贵的。 许多比较老的权益证明算法有一个“权益磨损”漏洞,重掷掷骰子只是在本地计算机上进行计算; 具有此漏洞的算法在分片环境中肯定是不可接受的。 较新的算法(参见关于权益证明FAQ的“验证器选择”部分)具有只能通过在块创建过程中自愿放弃一个点来完成掷骰子的属性,这需要放弃奖励和费用。 减轻边缘经济动机的攻击对样本选择的影响的最好办法是找到增加成本的方法。 一种将N轮投票的成本增加一倍的方法是由Iddo Bentov设计的多数位方法; Mauve论文分片算法期望使用这种方法。

多米尼克·威廉斯(Dominic Williams)最为研究和倡导的确定性门限签名方法是另一种不被少数群体联盟利用的随机数生成方式。 这里的策略是使用确定性的门限签名来从选择样本中生成随机种子。 确定性阈值签名具有这样的属性,即不管给定的一组参与者中的哪一个向算法提供其数据,只要至少?的参与者诚实地参与,值就保证相同。 这种方法显然不是经济上可以利用的,并且完全抵抗各种形式的权益磨损,但是它有几个弱点:

它依赖于更复杂的密码学

(具体来说,椭圆曲线和配对)。其他方法仅仅依赖于对常见散列算法的随机预言。

当许多验证器脱机时,它会失败

。 公共区块链的预期目标就是能够在网络的很大一部分节点同时消失但剩余节点大部分是诚实的情况下,它依然可以存活; 确定性门限签名方案在这一点上不能提供这种属性。

在Zamfir模型中

,有超过? 的验证器串通是不安全的。 上述权益证明FAQ中描述的其他方法仍然会使操作随机性变得非常昂贵,因为来自所有验证人的数据被混合到种子中,并且进行任何操作都需要通用串通或彻底排除其他验证者。

有人可能会认为确定性门限签名方法在一致性较好的情况下工作得更好,其他方法在可用性较好的情况下工作得更好。

在贿赂攻击者或协调选择模式中通过随机抽样进行分片的关注点是什么?

在贿赂攻击者或协调选择模型中,验证者是随机抽样的事实并不重要:不管样本是什么,攻击者都可以贿赂绝大多数样本做攻击者喜欢的事情,或者攻击者直接控制大多数的样本,并且可以指挥样本以低成本(O(c) 成本)执行任意的动作。

在这一点上,攻击者有能力对该样本进行51%的攻击。 由于存在跨分片扩散风险,威胁进一步放大:如果攻击者破坏了分片的状态,攻击者就可以开始向其他分片发送无限量的资金,并执行其他跨分片的恶作剧。 总而言之,贿赂攻击者或协调选择模型的安全性并不比简单地创O(c) altcoins好得多。

我们怎么样改进?

基本上是通过全面解决欺诈检测问题。

解决这个问题的一个主要类别是使用挑战-响应机制。 挑战-响应机制通常依赖于一个升级原则:事实上X(例如,“在#54分片的排序#17293是有效的”)最初被接受为真,如果至少有k个验证人签署声明(背后有存款)为真。 但是,如果发生这种情况,那么在这个挑战期间,2k验证者可以签署声明,声明这是错误的。 如果发生这种情况,4k验证人可以签署一个声明,说明声明实际上是真实的,等等,直到一方放弃或大多数验证人已经签署声明,此时每个验证人和客户端自己检查X是否为真。 如果X被裁定为正确,那么所有提出这种声明的人都会得到奖励,每个提出错误声明的人都会受到惩罚,反之亦然。

看看这个机制,你可以证明恶意行为者失去了一定数量的资金,与他们被迫查看给定数据的行为者数量成比例。 强迫所有用户查看数据需要大量的验证者签署错误的声明,这可以用来惩罚他们,所以迫使所有用户查看一段数据的成本是 O(n); 这防止了挑战-响应机制被用作拒绝服务向量。

什么是数据可用性问题,我们怎么样使用纠删码来解决它?

Seehttps://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding

我们可以通过某种奇特的密码累加器方案来消除解决数据可用性的需要吗?

不。假设有一个方案存在一个表示状态的对象S(S可能是一个散列),以及个别用户持有的可以证明存在状态对象的辅助信息(“证人”)(例如 S是Merkle根,证人是分支,尽管其他结构如RSA累加器确实存在)。 存在广播一些数据的更新协议,并且该数据改变S以改变状态的内容,并且还可能改变证人。

假设某个用户在该状态下有一组N个对象的证人,并且更新了这些对象中的M个。 接收到更新信息后,用户可以检查所有N个对象的新状态,从而查看哪个M被更新。 因此,更新信息本身至少编码~M * log(N)个比特的信息。 因此,为了实现M个交易的效果,每个人需要接收的更新信息必须是O(M)。14

那么这意味着我们实际上可以创建可扩展的分片区块链,其中发生不良事件的成本与整个验证人集的大小成正比?

有一个微不足道的攻击,攻击者总是可以焚烧O(c)资金来暂时降低分片的质量:通过发送高交易费用的交易来制造垃圾,迫使正常用户无法进入。这种攻击是不可避免的;你可以用灵活的gas限制进行补偿,甚至可以尝试根据使用情况尝试自动重新分配节点到分片的“透明分片”方案,但是如果某个特定的应用程序是不可并行的,Amdahl法则保证你无能为力。在这里打开的攻击(提醒:它只适用于Zamfir模式,而不是诚实/不协调的大多数)可以说没有比垃圾交易攻击严重得多。因此,我们已经达到了单个分片安全性的已知限制,并且试图走得更远是没有价值的。

以太坊Sharding FAQ | 分享给朋友: