Nightshade中则采用了收据交易的概念。发起跨链交易时首先在一个分片上执行交易,这个交易随后被打包在分片的chunk里,当chunk被打包到块中时,会生成一个收据交易。 验证者将这个收据交易发送到下一个需要更新的分片上执行。如果这笔交易需要更新更多的分片上的状态,则会重复以上过程。 这个方案有可能会导致某个特定的分片成为热点,大量的收据交易需要发送到这个分片上,导致分片的处理能力不够。 为了解决这个问题Nightshade会在chunk中记录最后处理的跨链交易的进度: 块和分片以及处理到了哪个收据交易,下一个块的chunk就会继续处理接下来的收据交易。 如果待处理的收据交易数量实在太多,超过了一定限制的话,系统会禁止再发送新的跨链交易。 状态验证 分片的核心思想是验证者不用去下载和验证所有的状态。当节点与分片交互时,如何在不下载分片的情况下确定其状态是一个难题。 有个简单的方案: 假设整个系统总共有1000个验证节点,如果其中恶意节点不超过20%,那么当我们从中随机挑选200个节点组成分片时,恶意节点占比在1/3以上的可能性就几乎可以忽略。(恶意节点在1/3以下保证了分片可以使用BFT类共识)。 在这个简单的假设中,每个Epoch的验证者都会去询问之前的一组验证者,并获取到主链的信息。 而BFT类共识保证恶意节点在1/3以下时,块是合法的,且不会产生分叉。 因此我们只需从最初的状态去检查验证者的签名,就可以确定这条链的合法性。 简单方案只考虑了系统初始时有固定数量的恶意节点,但如果我们引入一个新的假设: 在系统运行时,诚实的验证者也可以被腐化为恶意节点,这个简单方案就无法正常工作了。 攻击者仅需腐化一个分片中2/3n+1的验证者就可以生成非法的状态。这种安全性对于区块链来说显然太弱了。 Nightshade在BFT共识之上增加了挑战机制来提升安全性。任何的参与者检测到一个chunk包含非法状态时,都可以提供一个证明对chunk的出块者进行惩罚,同时获取奖励。 因为系统中大多数节点是没有非法chunk的分片状态的,所以证明中必须要包含足够的信息。 Nightshade要求在chunk中保存每一个交易执行后分片状态的merkle root,这样挑战者只需要找到第一个非法的状态,并从前一个状态进行验证就可以证明chunk是非法的。 (责任编辑:admin) |