约束

在 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 层。

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 优化arrow-up-right.

下一步

最后更新于

这有帮助吗?