– 注意:我之前曾把这个约长一年的状态保质期周期称为 “epoch”,现在都称为 “period”,以免与信标链的术语相混淆 –
两个关键原则是:
只能修改最新的那棵树(也即对应于当前周期的树)。所有更老的树都不能再修改;更老的树上的对象只能在更新的树上创建副本,而且这些副本会取代更老的副本。可以预期全节点(包括区块提议者)只会保存最近的两棵树,所以只有最近的两棵树上的对象才能不需要 witness 就能读取。读取更老的对象就需要提供见证数据了。
“见证数据” 就是一个简短的证据,证明某个值(或者某一组值)存在于某棵树的某个位置上,而且验证的一方只需具有树根即可。举个例子,可以制作 一个 witness 来证明账户 0x124f…89ab 的存储空档 123 处在某时的状态下,包含的值为 50;任何人都只需要这棵状态树的根值就可以验证这个证据。
状态保质期产生了一种混合的状态机制:共识节点需要保存最近被人访问和修改过的状态,但可以使用基于见证消息的无状态客户端方法来验证更老的状态。也就是说,也可以维护一个 “归档节点”,存储所有历史状态树,或者 一个完全无状态的节点,使用见证数据来验证哪怕是最新的状态。不过,gas 消耗量的结构和默认的网络格式,都要围绕 “节点会存储最近的两棵状态树” 来开发。
路线图
迁移将按阶段来实现:
周期 1 硬分叉:需要一个硬分叉来开启第一个周期(此前的则都算是第 0 个周期)。分叉之后,就会出现两棵状态树:十六叉的帕特里夏树(已冻结,不可再编辑)以及一棵新的 Verkle 树(包含所有新的状态 编辑/增加,还有旧状态的副本)EIP 草案:https://notes.ethereum.org/@vbuterin/verkle_tree_eip地址扩张周期:地址从 20 字节扩充到 32 字节,而新地址的格式包含一个 “地址周期” 的概念(曾用名 “地址空间(address space)”)。这样新合约就可以无需提供见证数据而直接写入新的存储空档。这一步什么时候做都可以,只需要在最终状态保质期转型完成之前就可以了,在周期 1 分叉之前或之后都可以。VB 的方案 :https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485Ipsilon 团队的方案:https://notes.ethereum.org/@ipsilon/address-space-extension-exploration周期 2 硬分叉:需要一个硬分叉来开启周期 2,并安排未来周期的时点。周期 0 的十六叉的帕特里夏树将被一棵 Verkle 树替换,客户端仅存储其状态根。从这时开始,周期 0 的状态将需要见证数据来访问。并且,状态保质期方案也算是完整实现了。EIP 草案:https://notes.ethereum.org/@vbuterin/state_expiry_eip
(完)
(文内有许多超链接,可点击左下 ”阅读原文“ 从 EthFans 网站上获取)
原文链接:
https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal
作者: Vitalik
翻译: 阿剑