约束
在 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 模拟器链下执行
特定网络约束
本地
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 上会回滚
解析器偏移量
已通过实证验证——在重新部署前必须重新验证
设计建议
保持 CPI 深度较浅。 设计合约时尽量减少嵌套。如果你调用 Jupiter,而它又调用 Raydium,再调用 SPL Token,那么你已经到了第 3 层——距离限制非常危险。
优先采用原子模式。 将操作设计为适配约 140 万 CU。迭代模式会增加延迟(3-4 秒锁定)和复杂度。
预先声明账户。 CPI 涉及的所有 Solana 账户都必须在交易创建时已知。在 CPI 调用期间无法动态发现账户。
使用
transfer_checked. 如果你正在构建任何会接触 Token-2022 代币的功能,请始终使用transfer_checked以确保钩子被触发。测试 CU 消耗。 使用
eth_estimateGas在开发期间。使用 Yul 优化关键路径。参见 CU 优化.
下一步
最后更新于
这有帮助吗?