# Gas 与限制

> NeuroWASM 的限制和 fuel 价格——每次调用的 fuel 预算、字节码大小、调用深度、存储增长，以及 fuel 如何换算为交易 gas。

Source: https://docs.nro.world/zh/neurowasm/gas-limits

合约调用适用两套独立的计量：

- VM 内部的 **fuel**——每条 WASM 指令和每个宿主函数都会消耗 fuel；每次调用有一个预算。
- 交易层面的 **gas**——发送方支付的费用，单位 uNRO。参见 [Gas 与手续费](/zh/learn/gas)。

调用结束后，消耗的 fuel 换算为 gas 单位：`ceil(fuel / NEUROCHAIN_FUEL_PER_GAS_UNIT)`，至少为 1，默认比率为每 gas 单位 20 000 fuel。随后，为合约调用预付的 50 个单位（`GAS_CONTRACT_CALL`）会按实际用量退还或补扣。

## 限制

| 常量 | 值 | 达到限制时 |
|------|----|------------|
| `MAX_CONTRACT_GAS` | 每次顶层调用 1 000 000 fuel | fuel 耗尽 → 调用 trap，全部回滚，手续费和 nonce 照常消耗 |
| `MAX_BYTECODE_SIZE` | 512 KiB | 部署被拒绝 |
| `MAX_CALL_DEPTH` | 8 层嵌套 `call_contract` | `call_contract` 返回 `-1` |
| `MAX_STATE_GROWTH_BYTES_PER_TX` | 每次调用 64 KiB 新增存储 | `set_storage` 不写入任何内容 |
| 单次 `allocate` 请求 | 1 MiB | 请求被截断 |

## 宿主函数的 fuel 价格

| 宿主函数 | Fuel | 常量 |
|----------|------|------|
| `get_storage` | 800 + 5 × 值长度 | `FUEL_STORAGE_READ_BASE`、`FUEL_STORAGE_READ_PER_BYTE` |
| `set_storage` | 5 000 + 50 × （键 + 值长度） | `FUEL_STORAGE_WRITE_BASE`、`FUEL_STORAGE_WRITE_PER_BYTE` |

其他宿主函数和普通 WASM 指令按解释器的默认 fuel 开销计量。计划中的 AI 宿主函数将各自拥有一个命名的 fuel 价格。

这些是协议常量；合约和客户端不应依赖其确切值保持不变。
