目前,在全部的区块链协议中每一个节点存储全部的状态(帐户余额,合约代码和存储等等)而且处理全部的交易。这提供了大量的安全性,但极大的限制了可扩展性:区块链不能处理比一个单节点更多的交易。很大程度上由于这个缘由,比特币被限制在每秒3-7笔交易,以太坊每秒7-15笔交易,等等。而后,这提出了一个问题:是否有方法建立一个新的机制,只让一个小集合的节点来验证每笔交易?只要有足够多的节点验证每笔交易那么系统依然是高度安全的,但又足够少使得系统系统能够并行处理不少的交易,咱们是否可使用这种技术来大大增长区块链的吞吐量?git
”简单的解决方案“主要由三大类。第一个是直接放弃独立区块链缩放性,而是假设用户将使用许多不一样的”altcoins"。这种方法极大提高了吞吐量,可是是以安全性为代价:使用这种方案在在吞吐量上N-factor的增长必然伴随在安全性上N-factor的降低。所以,对于大于N小值能够被论证是不可行的。github
第二个是简单增长区块大小限制。这种方式能够起做用,并且在某些状况下多是正确的处理方法,由于区块链大小可能更多受到政治上的约束而不是现实的技术考量。但无论我的对于个别案例的信念如何,这个方案不可避免有它的局限性:若是区块链运行的足够长,那么运行在消费者硬件上的节点就会退出,网络将开始只能依赖于少数运行区块链的超级计算机,者可能致使极大的中心化风险。web
第三个是“合并挖矿”,这是一种多区块链共存的技术,但全部的区块链共享同一的挖矿激励(或者权益证实系统中的赌注)。目前,Namecoin经过这样的技术从比特币区块链中获取了很大一部分的安全性。若是全部的矿工参与进来,理论上能够将吞吐量提高N倍而不会影响安全性。然而,这也存在这样的问题:它将每一个矿工的计算和存储负载增长了N倍。因此,实际上这个方法仅仅是一个隐藏的区块大小限制提高方式。算法
即便这被认为能够接受的,依然存在这样的缺陷:这些区块链不是真正被“捆绑在一块儿"的;只须要少许的经济激励就能说服矿工放弃或妥协某个特定的区块链。这种可能性是很是真实的,而且有合并挖矿被攻击的[真实历史事件](actual historical incidents),以及明确提倡使用合并挖矿攻击做为一种“治理特性”的开发者,对于给定的联盟,破坏区块链并非有利可图的。数据库
若是每条链只有少数矿工参与合并挖矿,则集中化风险获得缓解,但合并挖矿的安全效益也大大下降。安全
这三难困境代表区块链系统最多只能拥有如下三个属性中的两个:网络
去中心化(定义为系统能够在每一个参与者只能访问O(c)资源的场景下运行,即普通笔记本电脑或小型VPS)架构
扩展性(定义为能够处理O(n) > O(c)交易)oracle
安全性(定义为最多使用O(n)资源就能够抵御安全攻击)app
在这个文档的其他部分,咱们继续使用c来指代每一个节点的可用计算资源大小(包括计算,带宽和存储),以及用n指代抽象意义上生态系统的大小;咱们假设交易负载,状态大小和加密货币市值都与n成正比。
不。
梅特卡夫法则认为,网络的价值与用户数量的平方成正比(n ^ 2),由于若是网络有n个用户,那么网络对每一个用户都有价值,可是每一个用户的价值是与用户数量成正比,由于若是一个网络有n个用户经过网络有n-1个潜在的链接,每一个用户均可以从中受益。
在实践中,实证研究代表,拥有n个用户的网络的价值”对于小的n值是与n ^ 2成比例且对于大的n值是与n×log n成比例“。这很容易理解,由于对于小的n值,这个论点是成立的,可是一旦这个系统变得很大,两个影响就会减缓增加。首先,实践中的增加一般发生在社区中,所以在中等规模的网络中,网络一般已经提供了每一个用户关心的大部分链接。其次,链接每每是能够互相替代的。你能够争论说人们从k个链接中只能得到~O(log(k))的价值-有23个品牌的除臭剂能够选择是好的,但并不不是说比有22个选择好多了,而一个选择和零个选择是很是重要的差别。
另外,即便加密货币的价值与k个用户的O(k * log(k))成正比,若是咱们接受上述解释做为这种状况的缘由,那这也意味着交易量也是O(k * log(k)),由于每一个用户的log(k)价值理论上来自于用户经过网络执行log(k)的链接,而且状态大小在许多状况下也应该随着O(k * log(k)) 一块儿增加,由于至少有某种类型的状态是特定关心而不是用户特定的。所以,假设n=O(k * log(k)) ,而且基于n(生态系统大小)和c(单节点的计算能力)是咱们使用的完美模型。
许多分片建议(好比国大的Loi Luu等人提出的这个早期的BFT分片方案,以及为比特币提议的this Merklix tree方案)都试图只分片交易或者只分片状态,而不考虑其余方面。这些努力是使人钦佩的,可能会带来效率上的提高,但他们遇到根本性的问题,他们只能解决其中一个瓶颈。咱们但愿可以每秒处理超过10000个交易,而即没必要强迫每一个节点成为超级计算机也不强迫每一个节点存储一兆字节的状态数据,而这须要一个全面的解决方案即状态存储工做量,交易处理甚至交易下载和广播都跨节点分散。
特别要注意的是,这要求在P2P级别作出变动,由于广播模型是不可扩展的,由于它要求每一个节点下载和重复广播O(n) 的数据(每一个被发送的交易),而咱们去中心化的标准假设是每一个节点只能访问各类O(c)资源。
Bitcoin-NG 能够经过另一种区块链设计来增长扩展性,即若是节点花费大量CPU时间验证区块来使得网络更安全。在简单的PoW区块链中,存在较高的中心化风险,而且若是阀值增加到节点的CPU时间超过5%用于验证块则共识安全就会被削弱;Bitcoin-NG的设计缓解了这个问题。然而,这仅仅使得交易扩展性提高了大约常量因子5-50x<sup>3,4</sup>,但并无提高状态扩展性。也就是说,Bitcoin-NG式的方法与分片并不互相排斥,二者固然能够同时实施。
基于通道的策略(闪电网络,雷电网络等)能够经过常量因子扩展交易容量,但不能扩展状态存储,而且还会带来他们本身独特的折衷和限制,特别是涉及到拒绝服务攻击;经过分片实现链上扩展(加上其余的技术)和经过通道实现链下扩展能够说是必要和互补的。
还有其余一些使用高级密码学的方法。如Mimblewimble 和基于ZK-SNARKs的策略来解决扩展性问题的特定部分。初始化全节点同步,而不是从创世块验证整个历史,节点能够验证一个密码学证实当前状态合法地遵循历史记录。这些方法确实解决了合法性问题,可是值得注意的是,能够依靠加密经济学用更简单的方式而不是纯粹密码学来解决一样的问题-参见以太坊当前快速同步和神同步的实现。这两种方法都没有缓解状态大小的增加或者在线交易处理的限制。
在Plasma子链发生较大攻击的时候,Plasma子链的全部用户须要提现回根链。若是Plasma有 O(N)用户,那么就须要 O(N)的交易,因此须要 O(N/C)的时间来处理全部的提现。若是提现延迟固定在某个D上(即天真的实现),那么只要N>C*D,区块链中就没有足够空间来及时处理全部的提现,这样系统将变得不安全。在这种模式下,Plasma应该被视为只经过一个(可能很大)常数因子来提高扩展性。若是提现延迟是灵活的,那么若是有不少的提现发生他们会自动延长,这意味着当N增加的愈来愈大,攻击者迫使全部人的资金被锁定的时间愈来愈长,系统的“安全性“级别在必定意义上进一步下降。由于扩展的拒绝访问能够被认为是安全上的失败,尽管比失去全部访问要折衷些。然而,这是与其余方案不一样的折衷方案,能够说是一个更温和的折衷,因此Plasma子链为何依然是现状的巨大改进。
把状态分红K = O(n / c) 分区,咱们称之为”分片“。例如,以太坊的分片方案可能会将全部0x00开头的全部地址放入一个分片,全部以0x01开头的地方hi放入另一个分片等等。在最简单的分片形式中,每一个分片都有本身的交易历史,且在某个分片k中的交易影响仅限于分片k的状态。一个简单的例子是多资产区块链,其中有k个分片,每一个分片存储余额和处理一个特定资产相关的交易。在更高级的分片形式中,包括了某些形式的跨分片通讯能力,其中一个分片上的交易能够出发其余分片上的事件。
一个简单的方法以下。存在一些称为协调者的节点,其接受在分片k上的交易(取决于协议,协调者能够选择哪一个k分片或者随机分配k)并建立排序规则。一个排序规则有一个排序头,一个形式为”这是在分片k上的交易排序“的短消息。它指望分片k的前状态根是0x12bc57,在当前排序的交易默克尔树根是0x3f98ea,而且交易被处理以后的状态根应当是0x5d0cc1。且协调者#1,2,4,5,8,11,13...98,99对其签名。
一个区块必须包括每一个分片的排序头,在如下状况下区块是有效的:
须要注意的是,在这样的系统中如今存在几个”层次“的节点:
而后,交易的结果取决于以前发生在其余分片中的事件;一个典型的例子是货币转帐,货币能够从分片i转移到分片j,首先在分片i中建立一个”借记“交易来销毁代币,而后在分片j中建立一个”贷记“交易来建立代币,并将借记交易的收据做为贷记证实是合法的。
CAP定理是于分布式共识有关的结果。一个简单的描述是:”在网络发生分区的状况下,你必须选择一致性或可用性,你不能同时拥有二者“。直观的论点很简单:若是网络分为两半,在一半网络中发送交易”发送10个代币给A",而在另外一半发送交易”发送10个代币给B“,而后系统是不可用的,由于其中一个或者两个交易将不被处理,或者变得不一致,由于一半的网络将看到第一个交易完成,另外一半将看到第二个交易完成。注意CAP定理与扩展性无关;它适用于多节点须要对某个值致使一致的任何状况,而无论它们所达成一致的数据量大小。全部现有的去中心化系统已在可用性和一致性之间找到一些折衷方法,在这方面分片并无从根本上形成困难。
最容易知足的一个场景是,有许多的应用程序没有太多独立用户,并且这些应用程序只是偶尔或者不多与彼此交互;在这种状况下,应用程序能够在单独的分片上生存,并经过使用收据来与其余分片进行通讯。
这一般涉及将每笔交易分解为”借记“和”贷记“。例如,假设咱们有一个交易,其中帐户A在分片M上,指望发送100个代币到分片N上的帐户B。这些步骤以下所示:
在分片M上发送一个交易(i)扣除帐户A的100个代币(ii) 建立一个收据。收据对象并不直接保存在状态中,但收据的生成能经过默克尔证实来验证。
等待第一个交易被包含进来(有时候须要等待终止化,这取决于系统)
在分片N上发送一个交易,包含来自(1)收据的默克尔证实。这个交易也检查分片N上的状态以确保收据是”未花费“;若是是的话,那么它将帐户B增长100个代币,而且保存在状态中表明收据已花费。
可选地,(3)中的交易也保存收据,而后能够在分片M中用来执行进一步的操做,这取决与原操做是否成功。
在更复杂的分片形式中,交易在某些场景下可能具备分散在不一样分片上的效果,而且能够从多个分片状态中同时请求数据。
有些应用程序彻底不须要跨分片交互;多资产区块链和不须要互操做性的彻底异构应用程序的区块链是最简单的案例。若是应用程序不须要彼此交互,若是能够异步交互,面临的挑战会更容易应对。也就是说,若是交互能够以分片A上的应用程序的形式完成,则生成收据,在分片B上的交易“消费”该收据并基于它执行一些操做,而且可能向分片A发送包含某些响应的“回调”。总的来讲这个模式是很简单的,而且不难将其整合入高级程序语言中。
须要注意的是,与可用于分片内通讯的机制相比,用于异步跨分片通讯的协议内置机制可能会有所不一样而且功能较弱。在不可扩展的区块链中的当前可用的一些功能在可扩展区块链中只能用于分区内通讯。
下面的例子是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%(这里请看细节 )。
所以,至少在诚实/不协调的大多数状况下,咱们有:
在Zamfir模型中(或者在“很是很是适应性的对手”模型中),事情并非那么容易,可是咱们稍后会作到这一点。 请注意,因为采样的不完善性,安全阈值确实从1/2下降到了⅓,但相对于多是100-1000倍的可扩展性收益而不会损失去中心化,这仍然是一个使人惊讶的低安全性损失。
在权益证实中,这很容易。 已经有一个“活动验证者集合”在状态中被跟踪,而且能够直接从这个集合中简单地抽样。 协议内算法运行并为每一个分片选择150个校验者,或者每一个校验者独立地运行一个算法,该算法使用一个共同的随机源来(可证明地)肯定它们在任何给定时间的分片。 请注意,抽样任务是“强制性的”是很是重要的。 验证者不能选择它们进入的碎片。 若是验证者能够选择,那么攻击者能够用小权益集中他们的权益到一个分片上并攻击它,从而消除系统的安全性。
在工做量证实中,这是比较困难的,就像“直接的”工做量证实计划同样,不能阻止矿工将工做量于某一特定的分片。 有可能使用proof-of-file-access forms工做量证实来将我的矿工锁定到单独的分片,可是很难确保矿工不能快速下载或生成可用于其余分片的数据并所以避开 这种机制。 最为人所知的方法是经过Dominic Williams发明的一种叫作“拼图塔”的技术,矿工首先在一个共同链上进行工做量证实,而后将这些证实导入到关于权益风格验证池的证实中,而后验证池就像在权益证实的状况下同样。
一个可能的中间路线可能以下所示。 矿工能够花费大量的(O(c)大小)工做来建立一个新的“密码身份”。 工做量证实方案的确切值,而后选择他们在哪一个分片上产生下一个块。他们能够花费O(1)大小的工做量在分片上建立一个块,而后工做量证实的价值决定了他们接下来能够继续产块的分片。注意的是,全部这些方法都以某种方式工做量证实“有状态”,这是必要的。
选择频率只影响如何自适应攻击者使得协议仍然安全防护他们; 例如,若是您认为适应性攻击(例如不诚实的验证者发现他们是同一个样本的一部分而且共同勾结)可能在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))开销并不像看起来那么糟糕,由于它确保了验证器老是能够简单地将状态数据保存在内存中, 它永远不须要处理访问硬盘驱动器的开销。 其次,若是交易访问的地址是静态的,那么它能够很容易地实施,可是若是所讨论的地址是动态的那么是很困难实施的,也就是说,若是交易执行的代码是read(f(read(x))),其中某些状态读取的地址取决于其余状态读取的执行结果。 在这种状况下,交易发送者认为交易将在发送交易时读取的地址可能与交易被打包在块中时实际读取的地址不一样,所以Merkle证实多是不充分的。
一种折中方法是容许交易发送者发送一个证实,该证实包含访问数据的最可能的可能性; 若是证实是充分的,则交易将被接受,若是状态意外地变化而且证实不足,则发送者必须从新发送或者网络中的一些帮助者节点从新发送交易并添加正确的证实。 那么开发者能够自由地进行具备动态行为的交易,可是行为越动态,交易实际上被打包在块中的可能性就越小。
注意验证者在这种方法下的交易包含策略须要很复杂,由于他们可能会花费数百万的gas处理一笔交易运行到最后一步才发现访问到他们没有的一些状态条目。 一个可能的妥协是验证者有一个策略,只接受(i)低gas成本的交易,例如<100k。 (ii)静态地指定一组容许访问的合约,并包含这些合约的整个状态的证实。 请注意,这只适用于最初广播交易时; 一旦交易被打包在一个块中,执行顺序是固定的,所以只能提供与实际须要访问的状态对应的最小Merkle证实。
若是验证者不当即从新重组,还有一个提升效率的机会。 咱们能够指望验证者存储来自已经处理的交易的证实的数据,以便该数据不须要被再次发送; 若是k交易是在一个重组周期内发送的,那么这就将Merkle证据的平均大小从log(n) 减小到log(n) -log(k)。
首先,重要的是要指出,即便随机数的产生是高度可利用的,这对协议来讲也不是一个致命的缺陷。 相反,它只是意味着有一个中等偏高的中心化激励。 缘由在于,因为随机性选取至关大的样本,所以很难将随机性误差超过必定数量。 https://github.com/vhf/free-programming-books/blob/master/free-programming-books-zh.md#%E5%9C%A8%E7%BA%BF%E6%95%99%E8%82%B2 如上所述,最简单的方法就是经过二项式分布。 若是但愿避免大小为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,任何给定的随机种子将致使有利于攻击者的样本的可能性确实很是小。 这就意味着从随机性的安全角度来看,攻击者须要在选择随机值的顺序上有很是大的自由度,以完全打破抽样过程。 大多数权益证实随机性的漏洞不容许攻击者简单地选择种子; 在最坏的状况下,他们给了攻击者许多机会从许多伪随机生成的选项中选出最有利的种子。 若是对此很是担忧,能够简单地将N设置为更大的值,而且在计算随机性的过程当中添加适度的硬key-derivation函数,从而须要超过2<sup>100</sup>计算步骤来找到足够随机性误差。
如今,咱们来看看为了获利而不是直接接管,试图更轻微影响随机性的攻击风险。 例如,假设有一个算法从一些很是大的集合中伪随机地选择了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)最为研究和倡导的肯定性门限签名方法是另外一种不被少数群体联盟利用的随机数生成方式。 这里的策略是使用肯定性的门限签名来从选择样本中生成随机种子。 肯定性阈值签名具备这样的属性,即无论给定的一组参与者中的哪个向算法提供其数据,只要至少1/3的参与者诚实地参与,值就保证相同。 这种方法显然不是经济上能够利用的,而且彻底抵抗各类形式的权益磨损,可是它有几个弱点:
有人可能会认为肯定性门限签名方法在一致性较好的状况下工做得更好,其余方法在可用性较好的状况下工做得更好。
在贿赂攻击者或协调选择模型中,验证者是随机抽样的事实并不重要:无论样本是什么,攻击者均可以贿赂绝大多数样本作攻击者喜欢的事情,或者攻击者直接控制大多数的样本,而且能够指挥样本以低成本(O(c) 成本)执行任意的动做。
在这一点上,攻击者有能力对该样本进行51%的攻击。 因为存在跨分片扩散风险,威胁进一步放大:若是攻击者破坏了分片的状态,攻击者就能够开始向其余分片发送无限量的资金,并执行其余跨分片的恶做剧。 总而言之,贿赂攻击者或协调选择模型的安全性并不比简单地创O(c) altcoins好得多。
基本上是经过全面解决欺诈检测问题。
解决这个问题的一个主要类别是使用挑战-响应机制。 挑战-响应机制一般依赖于一个升级原则:事实上X(例如,“在#54分片的排序#17293是有效的”)最初被接受为真,若是至少有k个验证人签署声明(背后有存款)为真。 可是,若是发生这种状况,那么在这个挑战期间,2k验证者能够签署声明,声明这是错误的。 若是发生这种状况,4k验证人能够签署一个声明,说明声明其实是真实的,等等,直到一方放弃或大多数验证人已经签署声明,此时每一个验证人和客户端本身检查X是否为真。 若是X被裁定为正确,那么全部提出这种声明的人都会获得奖励,每一个提出错误声明的人都会受到惩罚,反之亦然。
看看这个机制,你能够证实恶意行为者失去了必定数量的资金,与他们被迫查看给定数据的行为者数量成比例。 强迫全部用户查看数据须要大量的验证者签署错误的声明,这能够用来惩罚他们,因此迫使全部用户查看一段数据的成本是 O(n); 这防止了挑战-响应机制被用做拒绝服务向量。
See https://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)。
有一个微不足道的攻击,攻击者老是能够焚烧O(c)资金来暂时下降分片的质量:经过发送高交易费用的交易来制造垃圾,迫使正经常使用户没法进入。这种攻击是不可避免的;你能够用灵活的gas限制进行补偿,甚至能够尝试根据使用状况尝试自动从新分配节点到分片的“透明分片”方案,可是若是某个特定的应用程序是不可并行的,Amdahl法则保证你无能为力。在这里打开的攻击(提醒:它只适用于Zamfir模式,而不是诚实/不协调的大多数)能够说没有比垃圾交易攻击严重得多。所以,咱们已经达到了单个分片安全性的已知限制,而且试图走得更远是没有价值的。
有点。首先,值得注意的是,工做量证实和简单的权益证实,即便没有分片,在贿赂攻击者模型中都具备很是低的安全性;一个区块在通过O(n) 时间后才在经济意义上真正地“肯定”(好像只有几个区块已通过去了,那么替换区块的经济成本就是从区块有问题以前开始双花的成本)。Casper经过增长最终机制解决了这个问题,经济安全边际当即增长到最大。在一个分片链中,若是咱们想要经济最终性的话,那么咱们须要提出一个演绎链,为何一个验证人愿意在一个彻底基于随机样本的链上作出一个很是强有力的声明,当验证人自己相信贿赂攻击者和协调选择模型多是真实的,因此随机样本可能被破坏。
基本上,咱们并不直接向开发者提供“分片”的概念,也不会永久性地将状态对象分配给特定的分片。 相反,该协议有一个正在进行的内置负载均衡过程,能够在分片之间移动对象。 若是分片变得太大或者消耗太多的gas,能够分红两半。 若是两个分片变得过小,而且常常彼此交互,他们能够合并在一块儿; 若是全部分片过小,则能够删除一个分片并将其内容移动到各类其余分片等等。
想象一下,唐纳德·特朗普是否意识到人们在纽约和伦敦之间的旅行不少,可是有一个海洋的路,因此他能够拿出剪刀,剪掉海洋,把美国东海岸和西欧粘在一块儿, 大西洋旁边的南极 - 这就是这样的。
能够经过引入“顺序域”的概念来缓解共置问题,其中合约能够指定它们存在于相同的顺序域中,在这种状况下,它们之间的同步通讯将始终是可能的。 在这个模型中,一个分片能够被看做是一组被一块儿验证的顺序域,而且若是协议肯定这样作是有效的,那么顺序域能够在分片之间从新平衡。
若是您将历史交易记录视为已经结算,而且只是试图计算状态转换函数,则该过程变得更容易。有几种方法;一个至关简单的方法能够描述以下:
若是分片X上的客户端看到带有分片(X,Y)的交易,则请求分片Y中的Merkle证实,以验证(i)分片Y上存在该交易,以及(ii)分片上的前置状态Y表示交易须要访问的那些数据位。而后执行交易并提交执行结果。请注意,若是不少交易有许多不一样的“块对”,那么这个过程多是很是低效的;因为这个缘由,只须要简单的要求块来指定姐妹分片就多是最佳的,而后能够在每块级别更有效地进行计算。这是该方案如何运做的基础;人们能够想象更复杂的设计。可是,在进行新的设计时,确保低成本的拒绝服务攻击不能任意拖慢状态计算老是很是重要的。
Vlad Zamfir建立了一个方案,异步消息仍然能够解决“预订火车和旅馆”的问题。这工做以下。状态记录了最近所作的全部操做,以及任何给定操做(包括跨分片操做)触发哪些操做的图谱。若是操做被还原,则建立收据,而后可使用该收据来回滚该操做对其余分片的任何影响;这些回滚可能会触发他们本身的回滚之类。这个论点是,若是一个偏好系统使得回滚消息能够像其余类型的消息同样快地传播两次,那么一个在K个回合中完成执行的复杂跨分片交易能够在另外的K个回合中彻底回滚。
这个方案引入的开销能够说是没有获得充分的研究;可能存在触发二次执行漏洞的最坏状况。很显然,若是交易具备更加孤立的影响,这种机制的开销较低;也许能够经过有利的gas成本规则激励孤立执行。总而言之,这是高级分片更有前途的研究方向之一。
分片中的挑战之一是,在进行调用时,默认状况下没有硬协议提供,保证由该调用建立的任何异步操做都将在特定的时间范围内完成,甚至彻底没有;而是由某方在目的地分片中发送触发收据的交易。这对于许多应用程序来讲是能够的,可是在某些状况下,因为如下几个缘由可能会有问题:
人们能够试着想出一个系统,在某些分片中生成的异步消息在必定数量的块以后自动触发目标分片中的结果。然而,这要求每一个分片上的每一个客户端在计算状态转换函数的过程当中主动检查全部其余分片,这多是低效率的来源。最为人所知的折衷方法是:当高度为height_a的分片A的收据包含在高度为height_b的碎片B中时,若是块高度的差别超过MAX_HEIGHT,则碎片B中的全部验证人都从height_a + MAX_HEIGHT + 1建立块到height_b - 1是受到惩罚的,这个惩罚成倍增长。这些处罚的一部分给予最终包括该块做为奖励的确认者。这使状态转换功能保持简单,同时仍强烈激励正确的行为。
正确;这是个问题。这是一个建议的解决方案。为了从分片A到分片B进行跨分片调用,调用者必须预先购买“冻结分片B的gas”(这是经过分片B中的交易完成的,并记录在分片B中)。冻结分片B的gas具备快速滞期费率:一旦排序,每块失去1 / k的剩余效能。分片A上的交易随后能够将冻结的分片B gas与其建立的收据一块儿发送,而且能够在分片B上无偿使用。分片B的块专门为这些交易分配额外的gas空间。请注意,因为滞期规则,对于给定的分片,在任什么时候候均可以得到最多GAS_LIMIT * k的冻结gas,固然能够在k个块内填充(事实上,因为滞期形成的速度更快,可是咱们可能因为恶意验证人须要这个松散的空间)。假如太多的验证人恶意地不包括收据,咱们能够经过免除验证者来公平惩罚,尽量多地从最旧的收据开始填充更多收据到“收据空间”。
在此预购机制下,想要进行跨分片操做的用户将首先预先购买全部将要进行操做的分片的gas,过分购买以考虑滞期费用。 若是操做会建立一个收据,触发在B分片中消耗100000gas的操做,那么用户将预先购买100000 * e(如271818)分片B冻结的gas。 若是该操做反过来在分片C中花费100000gas(即,两个间接级别),则用户将须要预先购买100000 * e^2(如738906)分片C冻结的gas。 注意,一旦购买被确认,而且用户开始主要操做,用户能够确信他们将与gas价格市场的变化隔离,除非验证者自愿地从收据不包含惩罚中失去大量的资金。
确实; 您能够购买分片A中的冻结分片A gas,并从分片A向其自身发送保证的跨链分片调用。 虽然注意到这个方案只支持在很短的时间间隔内进行调度,而且调度对于这个块是不许确的; 只能保证在一段时间内发生。
是。 若是用户未能得到交易,由于共谋验证者正在过滤交易而且不接受任何包含该交易的块,则用户能够发送一系列消息来触发一系列有保证的预约消息,最后一个消息在EVM内部重建交易并执行它。 若是不完全关闭有保证的调度功能,并严重限制整个协议,防止这种规避技术其实是不可能的,所以恶意的验证者将没法轻易作到。
本文档中描述的方案不会改进非分片区块链; 实际上,每一个分区最终都会在分区两侧有一些节点。 有人(例如来自IPFS的Juan Benet)创建了可扩展的网络,其具体目标是网络能够根据须要切分红分片,从而在网络划分的条件下尽量地继续运行,可是存在不寻常的加密经济挑战来作好这项工做。
一个主要的挑战是,若是咱们想要基于位置的分片,那么地理网络划分最低限度地阻碍了分片内聚合(具备很是低的分片内延迟和所以很是快的分片内块时间的反作用),那么 咱们须要有一种方法让验证者选择他们正在参与的分片。这是很危险的,由于它容许在诚实/不协调的多数模型中有更多类别的攻击,和Zamfir模型中更高做恶因子更低成本的攻击。 地理切分分片的安全性和经过随机抽样来分片效率是两个彻底不一样的事情。
其次,如何组织应用程序须要更多的思考。 上面描述的分片区块链中的一个可能的模型是每一个“app”在某个分片上(至少对于小规模的应用程序)。 可是,若是咱们但愿应用程序自己具备分区防御功能,则意味着全部应用程序都须要在某种程度上进行跨分片。
解决这个问题的一个可能途径是建立一个提供两种分片的平台 - 一些分片是随机抽样的高安全性“全局”分片,而其余碎片则是较低安全“本地”分片,可能具备属性的如超快的块时间和更便宜的交易费用。 很是低的安全性碎片甚至能够用于数据发布和消息传递。
有几个考虑因素。首先,须要将算法从双层算法转换为可堆叠的n层算法;这是可能的,可是很复杂。其次,n / c(即网络的总计算负荷与一个节点的容量之间的比率)刚好是接近两个常数的值:首先,若是以块为单位测量,则几个小时的时间跨度,这是一个能够接受的“最大安全确认时间”,其次是奖励和存款之间的比率(早期计算代表Casper的存款大小为32ETH,块奖励为0.05ETH)。后者的后果是,若是一个分片上的奖励和惩罚升级到验证者存款的规模,持续攻击分片的成本将是O(n)大小。
高于c^2可能会致使进一步削弱系统所能提供的安全保障类别,并容许攻击者以中等成本长时间周期以某种方式攻击某个碎片,尽管仍有可能防止无效状态被最终肯定,并防止最终状态被回滚,除非攻击者愿意支付O(n)的成本。然而,回报是巨大的 - 一个超级分割的区块链能够用做几乎全部去中心化应用程序的通用工具,而且能够承担交易费用,使其几乎免费。
原文:https://github.com/toxotguo/thinking/edit/master/Sharding FAQ.md
安利一个以太坊教程,对入门学习颇有帮助。