# 合约导出

> NeuroWASM 合约导出的入口点——call、init 以及计划中的 query、migrate、sudo 和 reply——VM 如何调用它们，以及调用输入在内存中的位置。

Source: https://docs.nro.world/zh/neurowasm/exports

合约**导出**、供 VM 调用的函数。（合约从宿主*导入*的函数见本节的其他页面。）

每个合约还必须导出它的线性 **`memory`**。

## `call` <Badge type="tip" text="已上线" /> {#call}

```text
call(input_ptr: i32, input_len: i32)
```

每次合约调用（无论读或写）的入口点。

- VM 把调用数据（JSON 载荷，参见 [ABI 与调用数据](/zh/build/abi)）写入合约内存的**偏移量 64** 处，然后调用 `call(64, len)`。
- 也接受无参数的合约 `call()`；此时它无法读取输入。
- 结果是合约最后一次传给 `set_return` 的内容。
- 只有在没有任何 trap 的情况下，整个调用树才会提交。

::: warning 保持偏移量 64 空闲
由于输入会被复制到 `memory[64 .. 64 + len]`，合约不得在那里保存它需要的数据。按照 Rust 工具链的默认布局（栈在前，从第一个兆字节的顶端向下增长），对于正常大小的输入，这一点是成立的。
:::

**类比：** CosmWasm `execute` 和 `query`，NEAR `@call` / `@view`。

## `init` <Badge type="tip" text="已上线" />

```text
init()
```

构造函数，在合约部署时运行一次——前提是模块导出了它；缺少 `init` 不算错误。它可以写入存储并发出事件。

`init` 不接收任何输入，而且**在其中 `get_caller()` 什么也不返回**。如需记录所有者或接收参数，请改为在 `call` 中处理 `initialize` 函数：当给出 `init_args` 时，部署交易会以部署者为调用者调用它（参见[部署](/zh/build/deploy#_4-what-every-validator-does)）。请加以保护，确保它只运行一次。

**类比：** CosmWasm `instantiate`，NEAR `#[init]`。

## `query` <Badge type="info" text="计划中" />

一个只读入口点，运行时会禁止它写入。在此之前，请通过带 `dry_run: true` 的 `call` 读取（`POST /api/v1/contracts/:address/call`）。

## `migrate` <Badge type="info" text="计划中" />

在同一 `.app` 地址上替换字节码后运行，需由所有者或治理授权。

## `sudo` <Badge type="info" text="计划中" />

仅用于协议和治理操作（暂停、注入参数）——用户交易永远无法触达。

## `reply` <Badge type="info" text="计划中" />

接收异步子消息的结果 `(id, result)`。需要异步跨合约调用，目前尚未实现。

**类比：** CosmWasm `reply`，NEAR promise 回调。
