Ewasm合约接口(ECI)
https://ewasm.readthedocs.io/en/mkdocs/contract_interface/
ECI指定合约模块的结构。
线格式
每个合约都必须以Webassembly二进制编码格式存储(简而言之,是WASM字节码)。
导入
合约只能导入在以太坊环境接口或EEI中指定的符号。
在实践中,这意味着一个ewasm模块指定的所有导入必须来自以太坊命名空间,并且具有与EEI中指定的函数直接对应的函数签名和名称。
正如下面提到的,也有一个调试命名空间,但在生产系统中不允许这样做。
调试模式
调试模式是一个特殊的VM选项,在该模式下,合约可以使用一组额外的调试接口。在活动的虚拟机上,任何试图导入这些调试符号的字节码都应该被拒绝。
可以在调试命名空间下使用导入:print32(值:i32)-打印值-print64(值:i64)-打印值-printmem(偏移量:i32,长度:i32)-将内存段打印为可打印字符-printmem hex(偏移量:i32,长度:i32)-将内存段打印为十六进制-print storage(路径偏移量:i32)-将存储值打印为可打印字符s-print storage hex(pathoffset:i32)-将存储值打印为hex
导出
一个合约必须有两个完全导出的符号:内存:可供EEI写入的共享内存空间。-main:没有参数和结果值的函数。
入口点
导出为main的方法将由VM执行。
成功执行后,代码应通过正常代码路径返回。
如果由于失败而需要中止,则应执行无法访问的指令。
启动函数
不允许使用start函数。
原因是ewasm虚拟机需要访问合约的内存空间,并且必须在执行之前获取该空间。然而,在Webassembly的JavaScriptAPI中,start函数是在实例化期间执行的,这样客户机就没有时间获取内存区域。
注意:此决定是在Webassembly版本0xB(版本1之前)上做出的,应重新访问。
陷阱
如果执行WASM代码触发了WASM陷阱,则合同执行将失败终止,并消耗所有剩余气体(OOG类异常)。这包括执行unreachable指令。