我们可以通过 turboproof 重构字节码;对付生意业务不需要的 chunk 则设为 0
为了更好地领略,想象我们正在陈设一份新的合约,我们需要通报代码和并确定 basic block (详见此处算法)。请留意,为了举办 JUMPDEST 阐明,客户端已经通报过一次代码,因此这次通报不会增加开销。这些 basic block(译者注:指只有一个进口且只有一个出口的代码块,没有跳转进入,也没有跳转退出)有两种特性:
本文着重接头如何默克尔化 EVM 字节码,但总体思路并不范围于 EVM 。实际上, Ewasm 团队的其他成员也在实验默克尔化 Wasm 代码,也碰着了相应的挑战。这些挑战主要是因为 Wasm 代码由多个部门构成,而且在执行之前需要颠末严格的验证——这意味着重构的字节码也必需通过验证。
为了测试陈设的合约,,我们试着提倡一笔挪用该合约的生意业务。矿工会执行这笔生意业务,并标志执行进程中触及的每个 chunk(例子里假设触及 chunk#1 和 chunk#3 )。当要宣布区块的时候,矿工会将合约状态的证明,以及触及哪些代码 chunk 的 turboproof 证明,一起打包在区块内。
字节码的 basic blocks(假想的)
收到这个区块后,无状态客户端就能验证合约是否属于区块状态的一部门,也能验证合约的余额、nonce 、状态根、 codeRoot 等其他参数。这些信息足以让客户端从 chunk 中重构部门字节码,同时清空其他不需要的 chunk 。因为 chunk 算法的设计,所以客户端知道所有的 chunk(除了首个 chunk )都是从 JUMPDEST 开始,因此可以或许安详地举办 jump 操纵。
尝试
代码默克尔化之后,会成为状态树(state trie)的子树( sub-tree )。为了简化,上图我用了二进制树 (而非
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。