https://ewasm.readthedocs.io/en/mkdocs/determining_wasm_gas_costs/
本文件目的是描述如何确定ewasm指令的gas成本。
每个WASM操作码都分配一个适当的Intel IA-32(x86)操作码(或者是一系列操作码)。这些操作码具有固定的周期计数(Intel称为latency)。我们正在从Haswell架构(家族:06,型号3C)中选择一个特定的CPU模型。这相当于2014年生产的CPU。
- 假设1:这个特定的haswell机构 CPU代表了以太坊节点计算能力的平均值。我们假设2.2 GHz是平均值。
据英特尔公司称,2.2GHz的时钟频率大致相当于每秒2 200 000 000个周期。
- 假设2: CPU 1秒钟执行相当于消耗1000万gas(即1gas相当于0.1 US)。
相当于每个周期消耗0.0045gas。(10 000 000/2 200 000 000)
从这个角度来看,截至2016年8月,平均每区块gas的限制约为470万。基于这一假设,我们允许智能合约执行时,在15秒阻塞时间中最高占用0.5秒,这也必须包括其他处理,例如POW和网络往返时间。
- 假设3:gas定价是定期调整的,至少每3年调整一次。
我们假设CPU在不断改进,以太坊节点的硬件每3年升级一次(与通常的更新频率相匹配)。
虽然本文档不提供升级程序,但是未来会有一个专门用于gas 定价的oracle智能合约,它可以用于计量智能合约。
Gas vs. Particles
目前的gas匹配算力方面没有提供准备的精度,而是假设运行的WASM操作码与EVM1操作码相比,处理能力显著降低。
理由:EVM1操作码操作256位数据,而WASM操作码被限制为64位,这将导致即使WASM在最佳情况下也需要执行四条指令才可以匹配EVM1。EVM1中的大多数算术指令花费3个GAS,而对于大多数64位WASM指令,这相当于0.75个GAS。
在内部,Ewasm 的gas测量值应记录在精度为4位小数的64位的变量中,。我们称之为particles。这只是一个小的实现细节,实际上我们使用整数,将其转为适当的gas。
当把particles数转换成以太坊 gas时,它必须除以10000,并且必须四舍五入。如果结果小于0,则应等于1。
Gas costs of individual instructions
Gas 消耗的公式为:<cycle count> * <gas per cycle>
Registers
Memory
Flow Control
Calls
Constants
32-bit Integer operators
64-bit Integer operators
Datatype conversions, truncations, reinterpretations, promotions, and demotions
Type-parametric operators.
Other
Notes about complex instructions
上面的一些指复杂的令很,不能一一映射到机器指令。对于它们,我们假设下面的算法,并根据组件成本计算气体。
i32.clz
32bit数,前n bit置0。
如果计算clz函数中单个指令的周期,则-6 if -6 then-2 return-5 and-5 eqz,-11 get_local,-11 set_local,-5 add,-5 shl
在最坏的情况下,总共有104.5个周期。
注意:CLZ是最常见的CPU上固有的命令,像Intel和ARM CPU。我们可以将其视为以太坊的固有命令,属于一个经济型的命令。
i32.ctz
32bit数,后n bit清零。
他和i32.clz相同的步骤,所以消耗是一样的。
注意:CTZ并不存在于ARM CPU上。ARM应被视为以太坊轻客户机的重要平台,因此在把他归属于基于复杂的类型的gas 消耗是明智的。
i32.popcnt
32bit数总1的个数。
i64.clz
同i32.clz
i64.ctz
同i32.ctz
i64.popcnt
同i32.popcnt
i64.extend_s/i32
把32bit扩大到64
select
三元运算符。
breaking out of the VM
任意暂停虚拟机并在ewasm合约和主机之间传输数据的指令都会暂时脱离虚拟机。
这些指令包括:- current_memory - grow_memory - call_indirect - call_import