为分片使用扫清障碍,V神提出新的ETH向后兼容办法业界

/ 发布时间 / 2021-08-14
目前ETH设计中的向后兼容性所面临的挑战之一是区块链历史记录的访问需要对Merkle证明进行EVM验证,这还假设区块链将永远用相同的格式和相同的密码技术。...

区块根

表明状况根正确性的证明

Patricia 或 Verkle 或其他证明该value事实上坐落于状况树中的地方key中的证明(这假设将所有帐户内容映射到 32 字节key的建议策略已永久保存)

def verifyHistoricalTransaction 

验证 tx 事实上是不是在给定slot的区块的 txindex 中。 证明内容如下:

证明区块子集的 Kate 证明

假如slot太旧(超越 128 个 epoch?),则在slot + 96 处的区块根的 Merkle 证明,然后是从该slot到分片承诺数组中的地方的 Merkle 证明,显示一个最后性承诺

当大家用 BLS-12-381 Kate 承诺时,预编译还将验证数据是 32 字节chunk的列表,其中每一个chunk都小于曲线子组顺序。 假如没在给定地方保存分片区块,则预编译就像在该地方保存了对零长度数据的承诺一样。 假如给定地方的value未确认,则预编译一直失败。

def verifyShardPolynomialEvaluation 

假如大家将给定 处的分片区块视为多项式 P,其中字节 i*32 ... i*32+31 是 w**i 处的评估,这将验证 P = y。该proof与数据子集proof相同,除去 Kate 证明正在证明某个点(可能在域外)的评估而不是在证明一个地方子集的数据。

假如大家以后不再用 BLS-12-381(比如,用 32 字节二进制字段证明),则预编译会将 SNARK 作为输入,验证数据完全由小于该曲线阶数的值组成,并验证对目前字段数据的评估。

这种预编译对于等价协议的跨多项式承诺策略证明‌非常有用,可用于允许 ZK Rollup直接对分片数据进行操作。

证明区块根正确性的证明

证明给定收据事实上是给定地方的receipt

def verifyShardBlockBody 

验证 data = body[32 * startChunk: 32 * ] ,其中 body 是给定slot中给定分片的主体。 该证明将包括:

表明区块根正确性的证明

证明给定的tx事实上是给定地方的买卖

def verifyHistoricalReceipt 

验证receipt事实上是给定slot的 txindex 处的买卖接收。 证明内容如下:

目前ETH设计中的向后兼容性所面临的挑战之一是区块链历史记录的访问需要对 Merkle 证明进行 EVM验证,这还假设区块链将永远用相同的格式和相同的密码技术。 将来的分片(Sharding)设计更是增加了这一点的重要程度,由于Rollup的欺诈证明和有效性证明将需要指向分片数据的指针。

这篇文章提出了一种愈加面向将来的办法:大家可以添加实行验证特定种类证明的抽象任务的预编译,而不是需要在 EVM 中验证历史和分片的证明。 假如以后更改格式,预编译逻辑将自动更改。 预编译甚至可以具备条件逻辑,用于验证过渡前插槽(slot)的一种证明和转换后插槽的另一种证明。

def verifyHistoricalBlockRoot

这种预编译将尝试以两种方法之一讲解该proof:

假如这个proof为空,则直接检查该value是不是为保存在正确地方的历史区块根。 假如slot太旧,它将失败。

假如这个proof是一个Merkle 分支,它会依据 history_roots 中的正确条目将其验证为 Merkle 分支

def verifyHistoricalStateRoot

验证状况根,用与该区块根相同的逻辑。

def verifyHistoricalStateValue 

验证历史状况中的值。 这个proof包括三个要点:

状况根

区块根

1