L2(OPR+ZKR) L1 (EVM)
常用工具:
L2BEAT – The state of the layer two ecosystem
EVM 是一个基于 256 位堆栈的图灵机。
由于 EVM 是「图灵完备」的,它会受到「停机问题」的困扰。
简而言之,在程序执行之前,没有办法确定它未来是否会终止。EVM 解决这个问题的方法是通过「Gas」计量计算单位,一般来说,这与执行指令所需的物理资源成比例。
每个交易的 Gas 量是有限制的,交易的发起者必须支付与交易消耗的 Gas 成比例的 ETH。
这个策略的影响之一是,如果有两个功能上相同的智能合约,消耗更少 Gas 的合约将被更多采用。这导致协议竞争极端的 Gas 效率,工程师努力最小化特定任务的 Gas 消耗。
此外,当调用一个合约时,它会创建一个执行上下文。在这个上下文中,合约有一个堆栈用于操作和处理,一个线性内存实例用于读写,一个本地持久性存储用于合约读写,并且附加到调用的数据「calldata」可以被读取但不能被写入。
关于内存的一个重要说明是,虽然它的大小没有确定的「上限」,但仍然是有限的。
扩展内存的 Gas 成本是动态:一旦达到阈值,扩展内存的成本将呈二次方增长,也就是说 Gas 成本与额外内存分配的平方成正比。
合约也可以使用一些不同的指令来调用其他合约。
「call」指令将数据和可选的 ETH 发送到目标合约,然后创建自己的执行上下文,直到目标合约的执行停止。
「staticcall」指令与 「call」相同,但增加了一个检查,即在静态调用完成之前,断言全局状态的任何部分都未被更新。
最后, 「delegatecall」指令的行为类似于 「call」,只是它会保留先前上下文的一些环境信息。这通常用于外部库和代理合约。