以太坊环境接口将核心以太坊API暴露给ewasm。以太坊模块将以以太坊客户端的本地语言实现。所有参数和返回都被限制为32或64位整数。不允许使用浮点数。(注:返回值被限制为32和64,这是由于WebAssembly限制的)
数据类型
我们定义了以下以太坊数据类型:
- bytes:长度不受限制的字节数组
- address:一个160位的数字,在内存中表示为20字节长的小endian无符号整数
- u128:一个128位的数字,在内存中表示为16字节长的小endian无符号整数
- u256:一个256位的数字,在内存中表示为32字节长的小endian无符号整数
我们还定义了以下WebAssembly数据类型:
- i32:与WebAssembly的i32相同
- i32ptr:与WebAssembly的i32相同,但被视为WebAssembly内存偏移的指针
- i64:与WebAssembly的i64相同
API
useGas
在gas计数器中减去一个数额
参数
amount i64 要减去气体计数器的金额。
返回结果
无
getAddress
获取当前执行账户的地址,并将其存储在内存中的给定偏移量处。
参数
resultOffset i32ptr 要存储地址的内存偏移(地址)。
返回结果
无
getExternalBalance
获取给定账户的余额,并将其加载到给定偏移量的内存中。
参数
addressOffset i32ptr 要加载地址的内存偏移量(地址)
resultOffset i32ptr 要加载余额的内存偏移量(u128)
返回
无
getBlockHash
获取区块的哈希值,只能从最近256个块中获取。
参数
number i64 要加载的块
resultOffset i32ptr 要加载哈希值的内存偏移量(u256)
返回结果
result i32 成功时返回0,失败时返回1
注意:在失败的情况下,resultOffset所指向的输出内存是不变的。
call
向一个给定的地址路径发送一个带有任意数据的消息
参数
gas i64 gas限制
addressOffset i32ptr 要加载地址的内存偏移量(地址)
valueOffset i32ptr 加载数值的内存偏移量(u128)
dataOffset i32ptr 加载数据的内存偏移量(bytes)
dataLength i32 数据的长度
返回结果
result i32 成功时返回0,失败时返回1,恢复时返回2。
CallDataCopy
将当前环境中的输入数据复制到内存中。这涉及到与消息调用指令或交易一起传递的输入数据。
参数
resultOffset i32ptr 要载入数据的内存偏移量(bytes)
dataOffset i32 输入数据的偏移量
length i32 要复制的数据的长度
返回
无
getCallDataSize
获取当前环境中输入数据的大小。这涉及到与消息调用指令或交易一起传递的输入数据。
参数
无
返回
callDataSize i32
callCode
用另一个账户的代码对该账户进行消息调用。
参数
gas i64 gas限制
addressOffset i32ptr 要加载地址的内存偏移量(地址)
valueOffset i32ptr 加载值的内存偏移量(u128)
dataOffset i32ptr 加载数据的内存偏移量(字节数)
dataLength i32 数据的长度
返回结果
result i32 成功时返回0,失败时返回1,恢复时返回2。
CallDelegate
用另一个账户的代码对这个账户进行消息调用,但保持当前的发送者和值。
参数
gas i64 gas限制
addressOffset i32ptr 用于加载地址的内存偏移量(地址)。
dataOffset i32ptr 加载数据的内存偏移量(字节数)
dataLength i32 数据的长度
返回结果
result i32 成功时返回0,失败时返回1,恢复时返回2。
callStatic
向一个给定的地址路径发送一个带有任意数据的消息,但不允许修改状态。这包括日志、创建、自毁和非零值的调用。
参数
gas i64 gas限制
addressOffset i32ptr 要加载地址的内存偏移量(地址)
dataOffset i32ptr 加载数据的内存偏移量(字节数)
dataLength i32 数据的长度
返回结果
result i32 成功时返回0,失败时返回1,恢复时返回2。
storageStore
将内存中的256-bit存储到持久性存储中
参数
pathOffset i32ptr 加载路径的内存偏移(u256)。
valueOffset i32ptr 要加载值的内存偏移量(u256)
返回结果
无
storageLoad
从持久性存储中加载一个256-bit到内存。
参数
pathOffset i32ptr 要加载路径的内存偏移量(u256)
resultOffset i32ptr 用于存储结果的内存偏移量(u256)
返回结果
无
getCaller
获取调用者地址,并在给定的偏移量处将其加载到内存中。这是直接负责此次执行的账户的地址。
参数
resultOffset i32ptr 要加载地址的内存偏移量(地址)。
返回
无
getCallValue
获取负责此次执行的指令/交易的存入值,并将其加载到内存的给定位置。
参数
resultOffset i32ptr 要加载的内存偏移量
返回
无
codeCopy
将当前环境中运行的代码复制到内存中。
参数
resultOffset i32ptr 要载入结果的内存偏移量(字节)。
codeOffset i32 代码中的偏移量
length i32 要复制的代码的长度
返回
无
getCodeSize
获取在当前环境中运行的代码的大小。
参数
无
返回
codeSize i32
getBlockCoinbase
获取该区块的旷工地址并加载到内存中。
参数
resultOffset i32ptr 要载入coinbase地址的内存偏移量(地址)。
返回
无
create
创建一个具有给定值的新合约。
参数
valueOffset i32ptr 从内存中加载值的偏移量(u128)
dataOffset i32ptr 从内存中加载新合同的代码的偏移量(字节)
length i32 数据长度
resultOffset i32ptr 写入新合同地址的内存偏移量(地址)
注意:在成功的情况下,create将清除返回缓冲区,或者用来自revert的数据填充它。
返回
result i32 成功时返回0,失败时返回1,恢复时返回2。
getBlockDifficulty
获取区块的难度。
参数
resultOffset i32ptr 用于加载难度的内存偏移(u256)。
返回结果
无
externalCodeCopy
将一个账户的代码复制到内存中。
参数
addressOffset i32ptr 要加载地址的内存偏移量(地址)
resultOffset i32ptr 要载入结果的内存偏移量(字节)
codeOffset i32 代码中的偏移量
length i32 要复制的代码的长度
返回
无
getExternalCodeSize
获取一个账户的代码大小。
参数
addressOffset i32ptr 要加载地址的内存偏移量(地址)
返回
extCodeSize i32
getGasLeft
返回当前的gasCounter。
参数
无
返回
gasLeft i64
getBlockGasLimit
获取区块的gas限制。
参数
无
返回
blockGasLimit i64
getTxGasPrice
获取当前环境中的gas价格
参数
valueOffset i32ptr 写入数值的内存偏移(u128)。
返回
无
log
在当前环境中创建一个新的日志
参数
dataOffset i32ptr 要加载数据的内存偏移量(字节)。
length i32 数据长度
numberOfTopics i32 下面的主题数量(0到4)。
topic1 i32ptr 加载topic1的内存偏移量(u256)
topic2 i32ptr 加载topic2的内存偏移量(u256)
topic3 i32ptr 加载topic3的内存偏移量(u256)
topic4 i32ptr 加载topic4的内存偏移量(u256)
返回
无
getBlockNumber
获取块的编号。
参数
无
返回
blockNumber i64
getTxOrigin
获取执行的起始地址,并按给定的偏移量将其加载到内存中。这是原始交易的发送者;它绝不是一个具有非空关联代码的账户。
参数
resultOffset i32ptr 要加载起始地址的内存偏移量(地址)
返回
无
finish
设置返回输出数据。这将引起一个trap,立即中止执行。
参数
dataOffset i32ptr 输出数据的内存偏移(字节数)
length i32 输出数据的长度
返回
无
revert
设置返回输出数据。这将引起一个trap,立即中止执行。
参数
dataOffset i32ptr 输出数据的内存偏移(字节数)
length i32 输出数据的长度
返回
无
getReturnDataSize
获取当前返回数据缓冲区到内存的大小。这包含最后执行的调用、callCode、callDelegate、callStatic或create的返回数据。
注意:创建只在失败的情况下填充返回数据缓冲区。
参数
无
返回数据
dataSize i32
returnDataCopy
将当前的返回数据缓冲区复制到内存中。这包含了最后执行的调用、callCode、callDelegate、callStatic或create的返回数据。
注意:创建只在失败的情况下填充返回数据缓冲区。
参数
resultOffset i32ptr 要加载数据的内存偏移(字节数)
dataOffset i32 返回数据中的偏移量
length i32 要复制的数据的长度
返回结果
无
selfDestruct
标记账户以便以后删除,并将剩余的余额交给指定的受益人地址。这将引起一个trap,立即中止执行。
参数
addressOffset i32ptr 要加载地址的内存偏移量(地址)。
返回
无
getBlockTimestamp
获取该块的时间戳。
参数
无
返回
blockTimestamp i64