WebAssembly资源消耗统计方案调研及资源消耗统计指令设计

Tags
Published
Last Updated
修改:2023-12-25

已有WebAssembly程序资源消耗统计方案

针对WebAssembly程序,尤其是WASM格式的智能合约程序需在其执行过程中动态统计并限制其执行资源消耗量如计算资源及内存资源消耗量,以达到防DoS攻击的效果,调研已有解决方案。

ewasm

ewasm项目旨在向Ethereum区块链中引入对WASM格式智能合约的支持,针对其运行过程中的资源消耗,设计了基于指令插桩的方式来粗略计算资源gas消耗。
 
主要思路为:
  1. 为WebAssembly标准指令集中的每一条相关指令设计其对应的资源消耗量,并且将WebAssembly指令操作与Intel IA-32 (x86)指令操作进行粗略的等价关联,使用Haswell CPU(family: 06, model 3C)2.2 Ghz 来代表Ethereum区块链网络中的节点的平均计算能力。将其执行消耗定为10 million gas / second,换算为时钟周期即为0.0045 gas / cycle。已知与某个具体WebAssembly指令操作等价的IA-32指令操作所消耗的时钟周期,即可换算出该WebAssembly指令对应的资源gas消耗。
    1.  
      如:
      notion image
      notion image
  1. 以WASM格式的智能合约为输入,进行插桩处理,在相应的指令语句前插入语句
    1. i64.const <cost> call $meter
      其中<cost>为指令对应的gas消耗,$meter为执行资源统计的具体方法,即是以<cost>为参数调用$meter方法,该方法的实现可以直接内置在WSAM程序中,也可以作为外部方法导入,在外部实现其逻辑。
  1. 在1中描述的方法定义了指令资源消耗量的默认值,此外还支持通过指令资源消耗定义接口,由使用者自行定义具体指令的资源消耗量。

Wasmer

 

参考链接

  1. Metering https://ewasm.readthedocs.io/en/mkdocs/metering/
  1. Determining ewasm gas costs https://github.com/ewasm/design/blob/master/determining_wasm_gas_costs.md
  1. https://github.com/wasmerio/wasmer/issues/999
  1. https://github.com/wasmerio/wasmer/pull/1041