当主链的出块者收到块时,会检查是否已经收到了块中所有chunks的onepart消息,如果没有则需要等待全部消息接受完成后再继续处理。 等到主链出块者确定每个chunks都收到了对应的onepart消息之后,就会向peers请求每个chunks其余的擦除码碎片,并重新构建chunks。 如果出块者无法成功构建chunks, 或者无法获取某个chunk的onepart消息的话,就会停止处理该块。 反之,如果出块者能够成功的构建出完整的chunks的话,则可以确定chunks的完整内容的确被发布了,Chunk header如果包含了非法状态,那么任何节点都可以对其生成挑战证明。 但是当前的协议仍有一个问题,主链出块者有可能在收集完所有的onepart消息之前就进行了签名。 这样出块者仍会收到出块奖励,但不会受到任何惩罚,当大多数节点采取了这种策略时,数据可见性就无法得到保证了。 为了解决这个问题,chunk出块者需要对每个擦除码碎片分配颜色(红色或蓝色),并且将颜色保存为bitmask与chunk的内容一起编码成擦除码。 当chunk出块者发送onepart消息时同时也会附上碎片的颜色,并且擦除码碎片的merkle root也会同颜色一起计算。 主链出块者对块签名时,需要在签名中包含所有红色的chunks碎片组成的bitmask。 因为完整的bitmask只存在于擦除码中,主链的出块者只有通过擦除码重新构造chunk内容和bitmask才能获取正确的颜色。 因此,主链出块者必须确保自己接收到了所有的onepart消息,且能正确构造所有chunks内容,才可以确保签名是正确的。 如果出块者没有收到某个onepart消息却仍然签名,则有50%的概率猜错颜色从而被惩罚。 (责任编辑:admin) |