合约导出
合约导出、供 VM 调用的函数。(合约从宿主导入的函数见本节的其他页面。)
每个合约还必须导出它的线性 memory。
call 已上线
text
call(input_ptr: i32, input_len: i32)每次合约调用(无论读或写)的入口点。
- VM 把调用数据(JSON 载荷,参见 ABI 与调用数据)写入合约内存的偏移量 64 处,然后调用
call(64, len)。 - 也接受无参数的合约
call();此时它无法读取输入。 - 结果是合约最后一次传给
set_return的内容。 - 只有在没有任何 trap 的情况下,整个调用树才会提交。
保持偏移量 64 空闲
由于输入会被复制到 memory[64 .. 64 + len],合约不得在那里保存它需要的数据。按照 Rust 工具链的默认布局(栈在前,从第一个兆字节的顶端向下增长),对于正常大小的输入,这一点是成立的。
类比: CosmWasm execute 和 query,NEAR @call / @view。
init 已上线
text
init()构造函数,在合约部署时运行一次——前提是模块导出了它;缺少 init 不算错误。它可以写入存储并发出事件。
init 不接收任何输入,而且在其中 get_caller() 什么也不返回。如需记录所有者或接收参数,请改为在 call 中处理 initialize 函数:当给出 init_args 时,部署交易会以部署者为调用者调用它(参见部署)。请加以保护,确保它只运行一次。
类比: CosmWasm instantiate,NEAR #[init]。
query 计划中
一个只读入口点,运行时会禁止它写入。在此之前,请通过带 dry_run: true 的 call 读取(POST /api/v1/contracts/:address/call)。
migrate 计划中
在同一 .app 地址上替换字节码后运行,需由所有者或治理授权。
sudo 计划中
仅用于协议和治理操作(暂停、注入参数)——用户交易永远无法触达。
reply 计划中
接收异步子消息的结果 (id, result)。需要异步跨合约调用,目前尚未实现。
类比: CosmWasm reply,NEAR promise 回调。