织梦CMS - 轻松建站从此开始!

我的网站

当前位置: 主页 > 竞争币 > 以太坊

深入解析明星公链 NEAR 分片设计 (2)

时间:2020-08-12 17:48来源:未知 作者:admin 点击:
在正常情况下,随着负载均衡,这个过程的结果是所有收据都被执行(因此每个段中记录的都是最后一个块的最后一个分片)。然而,当负载不均衡时,如

在正常情况下,随着负载均衡,这个过程的结果是所有收据都被执行(因此每个段中记录的都是最后一个块的最后一个分片)。然而,当负载不均衡时,如果一个特定的分片收到了过多的收据,该技术也能允许这些收据在段中交易条数有限制的前提下被处理。

需要注意的是,如果这种负载不均衡持续了很长时间,则收据从创建到执行之间的延迟可能持续地无限增长。一种解决方式是,当收据指向的是处理延迟超过了某个常数(例如,一个周期)的分片时,该收据产生的交易会被丢弃。

考虑图 20 的情况。直到区块 B 时,分片 4 还没有处理完所有收据。它仅处理到来自区块 A 中分片 3 所产生的收据,并记录了下来。在区块 C 时,收据处理跟进到区块 B 的分片 5,最后在区块 D 时,该分片赶上了进度,处理了区块 B 里所有遗留的收据和区块 C 里的全部收据。

分片段有效性

一个特定分片的段(或在分片链模型中一个特定分片链的分片块)只能由那些维护其状态的参与者验证。他们可以是出块人、验证节点或仅仅是那些下载状态并对存有他们资产的分片进行验证的外部见证人。

本文中,我们假设大部分验证节点不会存储绝大部分分片的状态。然而值得一提的是,确实有一些分片链,是基于这样的假设设计的:大部分参与者都有能力存储和验证大部分分片的状态,例如 QuarkChain。

因为仅有一部分参与者拥有能够验证分片段的状态,这就有可能对那些有状态的参与者进行自适应攻击,执行一个无效的状态转换。

在多个分片设计方案中,每隔几天就对验证节点采样。一天内,分片链中的任何块,只要获得了超过 2/3 的验证节点对该分片的签名,就立刻视为确定的块。通过这种方法,一个采用自适应攻击的对手只需贿赂一个分片链中 2n/3 + 1 的验证节点,就能执行一个无效的状态转换。尽管这种攻击很难实现,但对于一条公链来说,这种等级的安全性还不够。

正如 2.3 节所讨论的,常见的方案是在出块后留出一个时间窗口,让任何持有状态的参与者(无论是出块人、验证节点还是外部观察者)质疑其有效性。这类参与者被称为渔夫。为了让渔夫能够质疑一个无效区块,必须确保区块对渔夫来说是可用的。夜影中数据可用性的讨论在 3.4 节。

夜影中,一个块产生后,(其中的)分片段除了实际的出段人,没人可以验证。特别是,发布区块的出块人自然不持有大部分分片的状态,并且无法验证分片段。当下一个区块创建时,会包含多个出块人和验证节点的证词(参见 3.2 节),但既然大部分出块人和验证节点都不持有大部分分片的状态,所以仅包含一个无效分片段的区块也能收集到超过半数的证词,并继续存在于最重的链上。

为了解决该问题,我们允许任何维持分片状态的参与者,对该分片产生的任何一个无效分片段,提交一个链上质疑。

状态有效性质疑

一旦参与者检测到一个特定的分片段是无效的,他们需要提供一个证实该段无效的证明。因为大部分网络参与者并不维护无效段所在分片的状态,证明中需要包含足够的信息证明无需持有状态即可确认该块无效。

我们设了一个门限 Ls,代表单一交易所能累积读取或写入的状态数量上限(以字节为单位)。任何访问超过 Ls 个状态量的交易都被视为无效。3.5 节中说过,特定区块 B 中的段只包括将被执行的交易,不包括新的状态根。区块 B 中该段包括的状态根是执行这些交易之前的状态根,是执行了区块 B 之前区块中同一个分片的最后一个段中交易的结果。一个作恶人想要执行一个无效状态转换,就要把一个错误的状态根放到区块 B 中,这个状态根与执行前段中交易的结果状态并不对应。

我们把出段人放在分片段中的信息扩展一下。不再放置执行所有交易之后的状态,而是将交易分割成相邻集合,每个集合都总计读写了 Ls 字节的状态。然后逐个集合的执行这些交易,存储这些连续交易集合的状态跟。有了这些信息,渔夫就可以创建一个错误状态转换的质疑挑战,找到第一个无效的状态根,在上一个带有默克尔证明的状态根(有效的)和当前带有默克尔证明的状态根之间发生的交易所影响到的 Ls 字节状态放入。这样,任何参与者都可以验证这批交易,确认该分片段是无效的。

类似的,如果出段人试图把一个读写超过 Ls 字节状态的交易包含进来,对质疑来说,只要包括带有默克尔证明的、该交易访问的前 Ls 个字节即可。这已足够执行交易并证明在某个时刻,有过尝试读写超过 Ls 字节内容的情况发生。

渔夫和快速跨分片交易

正如 2.3 节中讨论的,一旦我们假设分片的段(在分片链模型中的分片区块)可能无效,并引入了质疑时间,就会对确定性以及跨分片通信有负面影响。尤其是在质疑结束前,任何跨分片交易的目的分片无法确认源分片的段或块是否确定(参见图 21)。

解决办法是,用某种方式让跨分片交易立即完成:对目的地分片,不等原分片交易发布后挑战结束,立即执行收据交易。如果后面发现源段或块无效,就目的分片和源分片一起回滚(参见图 22)。对于夜影的设计来说,应用该方案很自然。因为分片链不是独立的,而是由分片的段一起,发布在同一个主链区块中。如果发现任何段是无效的,包含这个段的整个块、以及构建在其上的块都被视为无效。参见图 23。

假设整个质疑过程足够长,上面的方案就都具有原子性。我们采用后一种方案,因为在普通情况下提供快速的跨分片交易,相比目的分片回滚带来的不便,前者更重要。这种因某个源分片上无效的状态转换所导致的目的分片回滚,是极度罕见的事件。

潜伏的验证节点

质疑机制的存在已经显著降低了自适应攻击的可能性。因为确定一个含有无效状态转换的段并通过挑战时间,采用自适应攻击的对手需要贿赂所有维护该分片状态的参与者,包括所有(该分片的)验证节点。

预测发生这种事情的可能性是极端复杂的,因为当今活动的分片链都没有经历足够长的时间,让人尝试这种攻击。我们认为这种风险,尽管可能性很低,但对于一个预期要执行数百万笔交易和执行世界级金融操作的系统来说,还是足够高了。

这个判断来自两个主要原因:大部分 POS 链的验证节点和 POW 链的矿工主要受经济方面的激励。如果一个自适应攻击的对手提供的金钱超过诚实操作的预期回报时,可以预计许多验证节点会接受贿赂。许多做 POS 链验证的都是专业的实体,预计任何链上大部分权益抵押来自这种实体。这种实体的个数对一个自适应攻击的对手来说足够小,对手可以了解大多数实体,了解他们被贿赂的意向。

通过隐藏验证节点分配到分片的信息,我们进一步减少了自适应攻击的可能性。这个思想与 Algorand[5] 隐藏验证节点的方法有些类似。

有一点需要重要指出的是,即使是 Algorand 或下文描述的方法,把验证节点隐藏了,自适应攻击还是存在理论上的可能性。尽管自适应攻击的对手不知道参与者会创建或验证一个区块或分片段,参与者自己却是知道他们将要做的任务,并有一个相关的密码学证明。

因此,作恶者可以广播他们贿赂的意图,并支付给愿意提供那个密码学证明的参与者。但是,我们注意到,因为作恶者不知道他们将要贿赂的分片上的验证节点,除了在整个社区里广播他们贿赂特定分片的意图外,别无他法。这是让任何诚实参与者都可以开启全节点去验证那个分片来获得经济利益的时机。因为在那个分片上出现无效区块的几率变大了,这就是创建质疑、获得相关奖励的机会。

为了不暴露特定分片的验证节点,做如下处理(参见图 24):

使用 VRF 进行分派。每个周期开始时,每个验证节点使用 VRF 得到指定分片的掩码。每个验证节点的掩码都将含有 (责任编辑:admin1)

织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容