[]通过 EVM 代码默克尔化缩减见证数据大小( 二 )
本文插图
- 代码默克尔化之后 , 会成为状态树(state trie)的子树( sub-tree ) 。 为了简化 , 上图我用了二进制树 (而非以太坊使用的默克尔-帕特里夏树) , 同时树的路径也不准确 , 不能完整表示真实的 key -
为了测试部署的合约 , 我们试着发起一笔调用该合约的交易 。 矿工会执行这笔交易 , 并标记执行过程中触及的每个 chunk(例子里假设触及 chunk#1 和 chunk#3 ) 。 当要发布区块的时候 , 矿工会将合约状态的证明 , 以及触及哪些代码 chunk 的 turboproof 证明 , 一起打包在区块内 。
本文插图
- 交易所触及的所有 chunk 和验证 codeRoot 所需的哈希值 ,都会以 turboproof 证明的形式发送出去-
收到这个区块后 , 无状态客户端就能验证合约是否属于区块状态的一部分 , 也能验证合约的余额、nonce 、状态根、 codeRoot 等其他参数 。 这些信息足以让客户端从 chunk 中重构部分字节码 , 同时清空其他不需要的 chunk。 因为 chunk 算法的设计 , 所以客户端知道所有的 chunk(除了首个 chunk )都是从 JUMPDEST 开始 , 因此能够安全地进行jump操作 。
本文插图
- 我们可以通过 turboproof 重构字节码;对于交易不需要的 chunk 则设为 0 -
实验
为了验证 , 我们编写了一份测试原型 , 该原型可以从 Geth 客户端的 RPC 端口获取主网的区块和过去的状态 , 然后模拟执行交易 。 每当执行过程中遇到新的合约 , 就将合约拆分为多个 chunk , 并标记执行交易时触及的 chunk。 当区块中的交易全部执行完毕后 , 会为所触及的 chunk 生成证明 —— turboproof。
接着重置状态 , 用 turboproof 重构出来的代码 , 替换掉原本的合约代码 , 然后再次执行刚才的交易 。 为了检查执行的正确性 , 我们比较前后两次消耗的 gas 量和区块的 bloom 过滤器 。
对最近的 50 个区块执行此过程 , 我们可以看到合约代码量减少了40% ~ 60% 。
本文插图
提醒:上图的数据结果似乎令人充满希望 , 但请记住 , 我们还需要成千上万个区块中的数据 , 才能得出令人信服的实验结论;目前原型处于早期阶段 , 一切结论都还为时尚早!
后续发展
你应该还记得 , 每个代码块的最小长度是可设置的参数(文中取的是 128 字节) , 修改这个参数会在截然不同的两个方面影响见证的大小 。 假设我们将参数设为 32 字节 , 则 chunk 的粒度变得更小 , 要传递的代码量也就变得更少 。 但是这样一来 ,Trie 的深度就必须增加;换句话说 , 为了生成 chunks 的证明 , 我们需要进行更多次哈希运算 。
所以下一步 , 我们将会深入分析——究竟要将区块最小长度设为多少 , 才能获得最优解 。 当然不论如何 , 只要将 hexary 字典树结构二进制 Trie, 我们就能减少 3/4 的哈希运算(详见此处) , 从而降低见证数据的大小 。
推荐阅读
- 人群中国科学家通过古人基因组数据探寻中国文明源流
- 右手网|Android 手机将通过 Google Clock 更新获得 “就寝模式” 等新功能
- SD-WAN观脉科技AllWAN 和Linker通过中国“SD-WAN Ready”测试,助力SD-WAN行业标准化
- 网易|网易预计6月11日赴港上市:募资215亿港元 代码9999
- 美好,一直在身边|科普中国回应:美国并不能通过根服务器让中国网络“瘫痪”
- 评估研发管理能力再上新台阶 赞同科技正式通过CMMI5认证
- So财富|特斯拉首席执行官埃隆·马斯克通过SpaceX创造历史。
- |继官方官宣小米手环5之后,小米手环5代码再爆料
- 马斯克|马斯克反对花钱为特斯拉打广告,更愿意通过社交平台来宣传
- 晨湘潭|湘潭市环境空气自动监测设备 项目顺利通过验收
