# 约束

在 Rome EVM 上构建时的重要限制与边界。理解这些约束有助于你设计出可靠运行的合约。

## Solana 交易限制

| 约束              | 值          | 影响                             |
| --------------- | ---------- | ------------------------------ |
| 交易大小            | 1,232 字节   | 大型 EVM 交易会拆分到 holder 账户中（透明处理） |
| 每笔交易计算单元        | 约 140 万 CU | 超过此量的操作将使用迭代模式                 |
| 每笔交易账户数（无 ALT）  | 28         | 如需更多账户，请使用地址查找表                |
| 每笔交易账户数（使用 ALT） | 64+        | 当账户数 > 28 时会自动使用 ALT           |
| 最大 holder 大小    | 80 KB      | 单个 EVM 交易的最大 RLP 大小            |

## EVM 执行限制

| 约束        | 值            | 说明                         |
| --------- | ------------ | -------------------------- |
| 合约存储槽     | 每个存储账户 256 个 | 每个合约可创建多个存储账户              |
| 每次迭代的操作码数 | \~500        | 适用于迭代（VmIt）模式              |
| 账户锁定 TTL  | 3-4 秒        | 在迭代执行期间                    |
| 国库钱包      | 64           | 费用池钱包                      |
| 合约大小限制    | 480 KB       | 较以太坊的 24 KB 提升（OP-Geth 模式） |

## CPI 约束

| 约束            | 值               | 说明                      |
| ------------- | --------------- | ----------------------- |
| CPI 深度        | 最多 4 层          | Solana 的 CPI 深度限制       |
| 每次 CPI 调用的账户数 | 受 Solana 交易大小限制 | 实际上每次 CPI 约 20 个账户      |
| CPI + 转账钩子深度  | 使用 CPI 层级       | 来自 CPI 内部的转账钩子可能会超出深度限制 |

**CPI 深度是最关键的约束。** 当 Solana 调用 Rome 程序时，Rome EVM 会消耗一层 CPI 深度。如果你的 Solidity 合约随后通过 CPI 调用另一个 Solana 程序，那就是第 2 层。如果该程序再调用另一个程序，那就是第 3 层。总共最多只有 4 层。

```
第 0 层：Solana 运行时 → Rome EVM 程序
第 1 层：Rome EVM 程序 → 你的 CPI 目标（例如 Jupiter）
第 2 层：Jupiter → 另一个程序（例如 Raydium）
第 3 层：Raydium → SPL Token（最大深度）
```

## Token-2022 转账钩子约束

| 约束                   | 影响                                                  |
| -------------------- | --------------------------------------------------- |
| 每个 mint 一个钩子         | Meta-Hook Router 解决了这一问题（最多支持 8 个子钩子）               |
| `transfer_checked` 仅 | 普通的 `transfer`不会触发钩子。Rome 桥接必须使用 `transfer_checked` |
| mint/burn 不受钩子影响     | 通过 mint 权限控制，而不是通过钩子                                |
| 仅单状态模式               | 无法从 Solana 交易内部触达 OP-Geth                           |
| 代币包装规避               | 用户可以通过包装代币绕过钩子。可通过包装器黑名单 + PermanentDelegate 缓解     |

## Gas 与定价约束

| 约束        | 说明                            |
| --------- | ----------------------------- |
| Gas 定价来源  | Meteora DAMM V1 池（SPL gas 代币） |
| Gas 价格倍率  | 每个代理可配置（`gas_price_mul`)      |
| 最低 gas 价格 | 由代理配置设定                       |
| Gas 估算    | 在提交前通过 Mollusk 模拟器链下执行        |

## 特定网络约束

| 环境               | 链 ID   | 程序 ID                                         |
| ---------------- | ------ | --------------------------------------------- |
| 本地               | 1001   | 设置于 `rome-setup` 配置                           |
| Devnet（montispl） | 200002 | `RD2Gg7Lcnv62XmRHAzxh6fQQfMRzHtN5LeKPVBhYU5S` |
| Testnet（Martius） | 121214 | 检查部署配置                                        |
| Testnet（Caelian） | 121215 | 检查部署配置                                        |

## 预编译约束

| 预编译                   | 约束                           |
| --------------------- | ---------------------------- |
| Modexp（0x05）          | **已禁用** — 可通过功能开关启用          |
| BN254 ecPairing（0x08） | CU 消耗较高——通常需要迭代模式（约 20 万 CU） |
| CPI 预编译（0xFF...08）    | 必须在 Solana 交易中预先声明所有账户       |

## 预言机约束

| 约束              | 值                                            |
| --------------- | -------------------------------------------- |
| 默认最大陈旧时间        | 60 秒                                         |
| 历史轮次数据          | 不支持—— `getRoundData(roundId)` 会回滚            |
| Switchboard EMA | 不支持—— `latestEMAData()` 在 SwitchboardV3 上会回滚 |
| 解析器偏移量          | 已通过实证验证——在重新部署前必须重新验证                        |

## 设计建议

1. **保持 CPI 深度较浅。** 设计合约时尽量减少嵌套。如果你调用 Jupiter，而它又调用 Raydium，再调用 SPL Token，那么你已经到了第 3 层——距离限制非常危险。
2. **优先采用原子模式。** 将操作设计为适配约 140 万 CU。迭代模式会增加延迟（3-4 秒锁定）和复杂度。
3. **预先声明账户。** CPI 涉及的所有 Solana 账户都必须在交易创建时已知。在 CPI 调用期间无法动态发现账户。
4. **使用 `transfer_checked`.** 如果你正在构建任何会接触 Token-2022 代币的功能，请始终使用 `transfer_checked` 以确保钩子被触发。
5. **测试 CU 消耗。** 使用 `eth_estimateGas` 在开发期间。使用 Yul 优化关键路径。参见 [CU 优化](https://github.com/rome-protocol/docs/blob/main/developer-guides/cu-optimization.md).

## 下一步

* [计算预算](/zh/he-xin-gai-nian/compute-budget.md) — 每项操作的详细 CU 成本
* [代币互操作](/zh/he-xin-gai-nian/token-interop.md) — ERC-20 ↔ SPL 桥接模型
* [CU 优化指南](https://github.com/rome-protocol/docs/blob/main/developer-guides/cu-optimization.md) — 实用优化技术


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.rome.builders/zh/he-xin-gai-nian/constraints.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
