V神设计理念公布 细数以太坊潜在的优缺点(13)
时间:2021-07-13 10:43来源:未知 作者:admin 点击:
次
优化友好:应该易于优化,以便即时编译(JIT)和 VM 的加速版本能够构建出来。 同时 EVM 也有如下特殊设计: 临时/永久存储的区别:我们先来看看什么是
优化友好:应该易于优化,以便即时编译(JIT)和 VM 的加速版本能够构建出来。
同时 EVM 也有如下特殊设计:
临时/永久存储的区别:我们先来看看什么是临时存储和永久存储。临时存储:存在于 VM 的每个实例中,并在 VM 执行结束后消失。永久存储:存在于区块链状态层。假设执行下面的树(S 代表永久存储,M 代表临时存储):
A调用 B;
B 设置 B.S[0]=5,B.M[0]=9 ;
B 调用 C;
C 调用 B。
此时,如果B试图读取 B.S[0] ,它将得到B前面存入的数据,也就是 5;但如果 B 试图读取 B.M[0] ,它将得到 0,因为 B.M 是临时存储,读取它的时候是虚拟机的一个新的实例。在一个内部调用(inner call)中,如果设置 B.M[0] = 13 和 B.S[0] = 17 ,然后内部调用和 C 的调用都终止、回到了 B 的外部调用(outer call),此时读取 M,将会看到 B.M[0] = 9 (此值是在上一次同一 VM 执行实例中设置的), B.S[0] = 17 。如果 B 的外部调用结束,然后 A 再次调用 B,将看到 B.M[0] = 0,B.S[0] = 17 。这个区别的目的是:1.每个执行实例都分配有内存空间,不会因为循环调用而减损,这让安全编程更加容易。2.提供一个能够快速操作的内存形式:因为需要修改树,所以存储更新必然很慢。
栈/memory 模式:早期,计算状态(除了指向下一个指令的程序计数器)有三种:栈(stack,一个 32 字节标准的 LIFO 栈),内存(memory,可无限延长的临时字节数组),存储项(storage,永久存储)。在临时存储端,栈和内存的替代方案是 memory-only 范式,或者是寄存器和内存的混合体(两者区别不大,寄存器本质上也是一种内存)。在这种情况下,每个指令都有三个参数,例如: ADD R1 R2 R3: M[R1] = M[R2] + M[R3] 。选择栈范式的原因很明显,它使代码缩小了 4 倍。
单词大小 32 字节:在大多数结构中,如比特币,单词大小是 4 或 8 字节。4 或 8 字节对存储地址和加密计算来说局限性太大了。而不对大小作限制又很难建立相应安全的 gas 模型。32 字节是一个理想大小,因为它足够存储下许多密码算法所需要的大数值以及地址,又不会因为太大而导致效率低下。
我们有自己的虚拟机:我们的虚拟机使用 java、Lisp 和 Lua 等语言开发。我们认为开发一款专业的虚拟机是值得的,因为:1)我们的 VM 规范比其他许多虚拟机简单的多,因为其他虚拟机为复杂性付出的代价更小,也就是说它们更容易变得复杂;然而,在我们的方案中每额外增加一点复杂性,都会给集约化发展带来障碍,并带来潜在的安全缺陷,比如共识错误,这就让我们的复杂性成本很高;2)我们的 VM 更加专业化,如支持 32 字节;3)我们不会有复杂的外部依赖,复杂的外部依赖会导致我们安装失败;4)完善的审查机制,可以具体到特殊的安全需求;即使使用外部 VM,也无法节省太多工作量。
(责任编辑:admin) |
织梦二维码生成器
------分隔线----------------------------