Nightshade通过隐藏具体的验证者来进一步降低验证者被腐化的可能性。 这个想法类似于Algorand的方案,但需要注意的是,即使隐藏了验证者,一个攻击者仍能通过广播来倡议验证者进行合谋。 当诚实的验证者发现倡议合谋的广播消息时,可以下载攻击者想要攻击的分片并进行监控,这样即使合谋成功,诚实的验证者也可以立刻发送挑战来惩罚攻击者。 Nightshade用以下方法来隐藏验证者: 1.在每个Epoch开始前,验证者使用VRF(可验证随机方法)确定被分配到的分片,并在Epoch中负责验证这些分片。 2.所有的验证者都在区块上签名,而非在chunk上签名。 验证者有可能不去真正下载分片状态并执行验证,而是通过从网络中观察其他验证者的消息并进行重复来获利。 采用这种策略的验证者没有给网络带来任何额外的安全性。 为了防止这种行为,我们要求验证者首先提交一个承诺,承诺中要么包含一条消息确定chunk的交易都是合法的,要么包含对某个非法状态的挑战。 验证者需要等待一定的时间后再去揭露实际提交内容,任何提交错误的验证结果,以及无法揭露承诺内容的验证者都会被惩罚。 数据可见性 数据可见性是区块链分片设计的另一个难题。即使有了复杂的验证和挑战机制,攻击者仍然有作恶空间。 同一个分片上的验证者还可以共谋作恶,只发布chunk header而不发布完整的chunk内容。 因为主链只会对chunk做确认而不会对其验证(如果验证每个chunk,分片就没有意义了)。 所以主链的验证者无法判断chunk的内容是否被发布,出块者仍会把chunk包含在块中。 如果这些chunk包含了非法的状态,即使有诚实的节点对其产生怀疑,因为chunk的内容没有发布,节点也无法生成挑战证明。 NightShade的解决方案是选择引入了擦除码(Erasure Codes, 方案与PolkaDot和以太坊 2.0类似),擦除码允许我们在一部分数据不可见时仍能恢复整个区块。 我们对协议进行修改。当一个出块者生成了新的 chunk时,同时也要对chunk的内容生成擦除码。 Chunk的出块者把擦除码分割成w份(系统中出块者的数量),并用merkle tree计算每一个碎片,然后把merkle root保存在chunk header里。 Chunk的出块者随后通过onepart消息(用来发送擦除码的碎片)把擦除码碎片按照每人一份发送给所有出块者,消息包含: chunk header、擦除码碎片的编号、擦除码碎片的内容、擦除码碎片的merkle proof以及出块者对这条消息的签名。 (责任编辑:admin) |