从包含无效段的块开始,直到包含质疑展示的块为止,期间发生的所有状态转换都失效。包含质疑展示的块之前的状态回到包含无效段的块之前的状态。 在一段时间内,每个验证节点必须展示自己负责验证的区块的掩码。因为掩码通过 VRF 创建,如果他们被指派到发生了无效状态转换的分片,就无法绕过这个展示。任何没有成功展示掩码的验证节点都被认为是被指派到这个(含有无效状态转换的)分片的。 经过掩码展示阶段后,任何一个被指派到该分片的验证节点,如果当时提交的不是该区块包含无效的段,或者没有展示匹配他们提交的无效状态转换的证明,就被惩罚。每个验证节点重新指派分片,在一段足够验证节点下载对应状态的时间后,新的周期开启,参见图 26。 要注意的是,因为验证节点的分片分派情况已公开,从验证节点公开他们所分派的分片开始,直到新周期开启,这段时间系统的安全性降低了。网络的参与者在该期间使用网络时,需要牢记这一点。 签名聚合为了让一个拥有上千分片的系统安全运行,我们需要有上万级或更多的验证节点。如 3.7 节所述,我们想要每个验证节点在每个块都承诺某条消息并签名。即使承诺的消息是一样的,聚合出一个 BLS 签名并对其进行验证都是极度昂贵的。更不用说承诺和展示的消息在验证节点之间通常是不同的,所以我们需要某种别的方法来聚合这些消息和签名,以支持后面对它的快速验证。 我们使用的方法如下:验证节点关联出块人。因为周期开始前要留出下载状态的时间,所以在周期开始前的某个时刻,出块人就确定了。而且与验证节点不同,出块人不是隐藏的。每个出块人有 v 个验证节点槽位。验证节点提交链下请求给出块人,让自己成为其 v 个(关联)验证节点之一。如果出块人愿意关联该验证节点,就提交一笔交易,包括最初来自验证节点的链下请求和出块人同意其加入的签名。要注意,被指派给出块人的验证节点所验证的分片无需和其关联的出块人负责出段的分片一致。如果一个验证节点申请加入多个出块人,只有来自第一个出块人的交易会成功。 出块人收集提交信息。出块人始终收集来自验证节点提交和展示的消息。只要积累了一定数量的这些消息,出块人就计算这些消息的默克尔树,给每个验证节点发送默克尔根和各自的默克尔路径。验证节点验证路径并在默克尔根上签名。接着,出块人就在验证节点给的默克尔根(译者注:含有验证节点签名)上累积一个 BLS 签名,然后仅仅发布默克尔根和累积签名。 出块人也使用廉价 ECDSA 签名方式,签名保证前面那个多签的有效性。如果多签与提交的默克尔根不匹配,或者与验证节点的掩码不匹配,就是需要惩罚的行为。同步链时,参与者可以选择验证来自于验证节点的所有 BLS 签名(这个开销将极度昂贵,因为牵涉到聚合验证节点的公钥),或仅验证出块人的 ECDMA 签名,并且该出块人没有被质疑和惩罚。 使用链上交易和默克尔证明进行质疑。你会注意到,没有检测到无效状态转换时,展示验证节点的消息是没有价值的。只有那些包含无效状态转换实际证明的消息需要展示,也仅仅只有这些消息需要表现出自己与之前的承诺相匹配。展示消息有两个目的:
对于这两条,我们需要解决两个问题:链上并不包括承诺本身,有的只是它与其它消息聚合出的默克尔树根。验证节点需要使用出块人提供的默克尔路径和原始承诺来证明他确实进行了质疑。 有可能出现无效状态转换的分片的所有验证节点都正好被指派给审查他们的受贿的出块人。为了解决这个问题,我们允许验证节点提交自己的展示信息作为链上常规交易,并绕过聚合。 后一种机制仅允许用来证明无效状态转换。这种情况极其罕见,因此不会导致区块中的垃圾交易问题。最后一个要解决的问题是,出块人可以选择不参与消息聚合,或故意审查特定的验证节点。我们通过将出块人的奖励与关联的验证节点数量挂钩,使那种行为在经济上不可取。我们也注意到,因为周期之间的出块人有很大的交集(因为总是权益抵押最多的前 w 个参与者入选),验证节点可以很大程度上坚持与相同的出块人合作,也就降低了将其指派给曾对其进行审查的出块人的风险。 快照链因为主链上出块非常频繁,下载全历史可能很快就变得昂贵。而且,因为每个块包含一个大批参与者的 BLS 签名,仅仅是聚合公钥来检查签名的开销就会变得过高。 最后,因为在可以预见的未来,以太坊 1.0 很可能依旧是最常用的区块链之一,需要一条重要的渠道能从 NEAR 往以太坊转移资产。而目前,通过验证 BLS 签名来确保 NEAR 区块在以太坊那一侧的有效性是暂时行不通的。 夜影主链上的每个块可选择是否在上一个包含 Schnorr 多签的区块的头部上包含一个 Schnorr 多签。我们称这样的块为快照块(snapshot block)。每个周期的头一个块必定是快照块。当处理这样一个多签时,出块人也必须积累上一个快照块上验证节点的 BLS 签名,并以 3.8 节描述的方法聚合他们。 (责任编辑:admin1) |