EWASM Contract Interface (ECI) ——合约接口

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指令。

猜你喜欢

转载自blog.csdn.net/xq723310/article/details/86614091
今日推荐