Skip to content

合约导出 ​

合约导出、供 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 回调。