当前以太坊设计中的向后兼容性所面临的挑战之一是区块链历史记录的访问需要对 Merkle 证明进行 EVM验证,这还假设区块链将永远使用相同的格式和相同的密码技术。 未来的分片(Sharding)设计更是增加了这一点的重要性,因为Rollup的欺诈证明和有效性证明将需要指向分片数据的指针。
这篇文章提出了一种更加面向未来的方法:我们可以添加执行验证特定类型证明的抽象任务的预编译,而不是要求在 EVM 中验证历史和分片的证明。 如果将来更改格式,预编译逻辑将自动更改。 预编译甚至可以具有条件逻辑,用于验证过渡前插槽(slot)的一种证明和转换后插槽的另一种证明。
def verifyHistoricalBlockRoot( slot: uint256, value: bytes32, proof: bytes )这种预编译将尝试以两种方式之一解释该proof:
加密金融服务公司Blofin完成5000万美元B轮融资,KuCoin领投:3月2日消息,加密金融服务公司 Blofin 完成 5000 万美元 B 轮融资,KuCoin 领投,SIG 和经纬创投参投。通过新一轮融资,Blofin 将招募更多的交易、技术、产品、运营、营销和合规人才。当前 Blofin 的全球管理资产(AUM)已达 3 亿美元。2021 年,Blofin 的交易量达到了超过 1000 亿美元。公司将专注于改善交易基础设施,创造新的融资产品和服务,开发和推出其移动应用程序,在多个国家扩张,并在全球获得更多牌照。(newsfilecorp)[2022/3/2 13:31:46]
如果这个proof为空,则直接检查该value是否为保存在正确位置的历史区块根。 如果slot太旧,它将失败。
如果这个proof是一个Merkle 分支,它会根据 history_roots 中的正确条目将其验证为 Merkle 分支
温哥华发布有关加密货币局增加的警告:据Live Bitcoin News 3月28日消息,近日,温哥华已发出警告,称在当地受害者在一周内损失近200万加元(约合158.61万美元)后,加密货币局激增。温哥华发言人Const. Tania Visintin表示,加密货币欺诈非常难以调查,定位和识别嫌疑人的机会很低,因为嫌疑人通常在海外,通过复杂的、不可追踪的vpn掩盖他们的身份。[2021/3/28 19:23:45]
def verifyHistoricalStateRoot( slot: uint256, value: bytes32, proof: bytes )验证状态根,使用与该区块根相同的逻辑。
def verifyHistoricalStateValue( slot: uint256, key: bytes32, value: bytes32, proof: bytes ) 验证历史状态中的值。 这个proof包括三个要素:
印度加密交易所注册用户数量创新高,交易量大幅飙升:在印度加密货币交易注册的新用户数量创下新纪录,同时交易量也大幅飙升。Unicoin首席执行官Sathvik Vishwanath表示:“目前平台注册用户数量是9月份的2.5倍。”在Wazirx,“新用户注册量增长了125%,每月交易量增长了225%,”首席执行官Nischal Shetty透露。
Bitbns首席执行官Gaurav Dahake也看到了类似的趋势,称其交易所交易量在上个季度增加了200%。此外,自印度最高法院3月取消加密禁令以来,“每日用户注册量上升了800%”。与此同时,Coindcx首席执行官Sumit Gupta表示,与前一年相比,交易所的注册用户今年增长了235.82%。在第三季度,该平台“每日活跃用户增长了4倍”。(Bitcoin.com)[2020/12/10 14:49:46]
表明状态根正确性的证明
Patricia 或 Verkle 或其他证明该value实际上位于状态树中的位置key中的证明(这假设将所有帐户内容映射到 32 字节key的提议方案已永久保存)
def verifyHistoricalTransaction( slot: uint256, txindex: uint256, tx: bytes, proof: bytes ) 验证 tx 实际上是否在给定slot的区块的 txindex 中。 证明内容如下:
表明区块根正确性的证明
证明给定的tx实际上是给定位置的交易
def verifyHistoricalReceipt( slot: uint256, txindex: uint256, receipt: bytes, proof: bytes ) 验证receipt实际上是给定slot的 txindex 处的交易接收。 证明内容如下:
证明区块根正确性的证明
证明给定收据实际上是给定位置的receipt
def verifyShardBlockBody( slot: uint256, shard: uint256, startChunk: uint256, chunks: uint256, data: bytes, proof: bytes ) 验证 data = body[32 * startChunk: 32 * (startChunk + chunks)] ,其中 body 是给定slot中给定分片的主体。 该证明将包括:
证明区块子集的 Kate 证明
如果slot太旧(超过 128 个 epoch?),则在slot + 96 处的区块根的 Merkle 证明,然后是从该slot到分片承诺数组中的位置的 Merkle 证明,显示一个最终性承诺
当我们使用 BLS-12-381 Kate 承诺时,预编译还将验证数据是 32 字节chunk的列表,其中每个chunk都小于曲线子组顺序。 如果没有在给定位置保存分片区块,则预编译就像在该位置保存了对零长度数据的承诺一样。 如果给定位置的value未确认,则预编译总是失败。
def verifyShardPolynomialEvaluation( slot: uint256, shard: uint256, x: uint256, y: uint256, proof: bytes ) 如果我们将给定 (slot, shard) 处的分片区块视为多项式 P,其中字节 i*32 ... i*32+31 是 w**i 处的评估,这将验证 P(x) = y。该proof与数据子集proof相同,除了 Kate 证明正在证明某个点(可能在域外)的评估而不是在证明一个位置子集的数据。
如果我们将来不再使用 BLS-12-381(例如,使用 32 字节二进制字段证明),则预编译会将 SNARK 作为输入,验证数据完全由小于该曲线阶数的值组成,并验证对当前字段数据的评估。
这种预编译对于等价协议的跨多项式承诺方案证明很有用,可用于允许 ZK Rollup直接对分片数据进行操作。
作者:Vitalik Buterin
原文:https://ethresear.ch/t/future-proof-shard-and-history-access-precompiles/9781
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。