约束
在 Rome EVM 上构建时的限制——Solana 交易大小、约 140 万 CU 预算、账户上限、存储布局,以及 Rome 如何逐一规避这些限制。
在 Rome EVM 上构建时的重要限制和边界。理解这些约束有助于您设计能够可靠运行的合约。
Solana 交易限制
交易大小
4 KB(4,096 字节)
Rome 发送 Solana v1 交易;更大的 EVM 交易会透明地暂存到持有账户中
每笔交易的计算单元
约 140 万 CU
超过此限的操作将使用迭代模式
每笔交易的账户数
64 个地址
v1 交易上限;EVM 交易及其 CPI 所触及的一切都计入其中,包括 Rome 自身账户
最大持有账户大小
80 KB
单笔 EVM 交易的最大 RLP 大小
EVM 执行限制
合约存储槽
每个存储账户 256 个
每个合约可创建多个存储账户
每次迭代的操作码数量
自适应
按每笔 Solana 交易的 CU 预算打包(VmIt)
账户锁定 TTL
3 秒(当会话触及超过 28 个账户时为 4 秒)
在迭代执行期间;每一步都会续期
迭代会话长度
160 步
超过上限后,下一步会释放会话锁并结束执行,不提交任何内容
金库钱包
64
费用池钱包
合约大小限制
24 KB
与 Ethereum 相同(EIP-170,24,576 字节)
CPI 约束
CPI 深度
最多 4 层
Solana 的 CPI 深度限制
每次 CPI 调用的账户数
受 64 地址交易上限限制
与交易触及的其他所有账户共享
CPI + Transfer Hook 深度
使用 CPI 层级
在 CPI 内部触发的 transfer hook 可能会超出深度限制
每个合约一个轨道
传统(0xff…07/08/09, 0x42…16) 或 缓存(0xff…04/05/06/0b)
在同一笔交易中混合两者的变更调用将被拒绝
迭代模式中的传统 CPI
不允许
迭代交易中的传统轨道 CPI 会失败,错误为 CpiProhibitedInIterativeTx;允许缓存轨道的效果
CPI 深度是最关键的约束。 当 Solana 调用 Rome 程序时,Rome EVM 会消耗一个 CPI 层级。如果您的 Solidity 合约随后通过 CPI 调用另一个 Solana 程序,那就是第 2 层。如果该程序再调用另一个程序,那就是第 3 层。总共最多只有 4 层。
Token-2022 Transfer Hook 约束
每个 mint 一个 hook
一个 Token-2022 mint 只有一个 transfer-hook 槽位
transfer_checked 仅
hook 不会在普通的 transfer上触发。Rome 桥接操作使用 transfer_checked
mint/burn 不受 hook 影响
通过 mint authority 控制,而非通过 hook
Gas 与定价约束
Gas 定价来源
Meteora DAMM 池,v1 或 v2(SPL gas 代币)
Gas 价格乘数
可按代理配置(gas_price_mul)
最低 gas 价格
由代理配置设定
Gas 估算
在提交前通过 Mollusk 模拟器在链下执行
特定网络约束
Hadrian(devnet)
200010
RPTWwELXAY4KC9ZPHhaxp7Sq1hHtU3HNEgLbSegCcWf
Martius(testnet)
121214
RomeTaTNPJNBxtB3Wong9geVTtkEFJfUqgktQVq3iSX
Rubicon(mainnet)
7531
RomePq9X3iAoTr813HR7uRarafFDUJty6GdiEceYpzX
预编译约束
Modexp(0x05)
已禁用 — 调用将回退并报错 big_mod_exp 调用已禁用 ,直到 Solana 激活 big_mod_exp 系统调用
BN254 ecPairing(0x08)
CU 成本较高——通常需要迭代模式(约 20 万 CU)
CPI 预编译(0xFF...08)
账户必须在 Solana 交易中预先声明
交易验证
签名可塑性(EIP-2)
已签名交易,其 s 值 高于曲线阶一半的部分将被拒绝
RLP 结构
其 RLP 列表在最后一项之后还带有尾随字节的交易将被拒绝
未实现的操作码
会中止整笔交易(IncompatibleVersionEVM(opcode));不会提交任何内容,且调用合约无法吞掉该错误
Gas 计量
Rome 没有按操作码划分的 gas 计费表:传递给 CALL/CREATE 的 gas 不会被强制执行,并且没有 2300 gas 预付额——不要依赖基于预付额的重入保护
预言机约束
默认最大陈旧时间
60 秒
历史轮次数据
不支持—— getRoundData(roundId) 回退
Switchboard EMA
不支持—— latestEMAData() 在 SwitchboardV3 上会回退
解析器偏移量
已通过实证验证——在重新部署前必须重新验证
设计建议
保持 CPI 深度较浅。 设计合约时应尽量减少嵌套。如果您调用 Jupiter,而它又调用 Raydium,而后者再调用 SPL Token,那么您已经到了 3 层——非常接近上限。
优先使用原子模式。 设计操作时应控制在约 140 万 CU 以内。迭代模式会增加延迟(3–4 秒锁定)和复杂性。
预先声明账户。 CPI 触及的所有 Solana 账户都必须在交易创建时已知(代理的仿真会发现它们)。CPI 调用中无法动态发现账户,并且总数必须符合 64 地址上限。
每个合约选择一条预编译轨道。 调用自定义 Solana 程序(
invoke_signed)属于传统轨道且仅支持原子模式;请参见 集成 Solana 程序.使用
transfer_checked. 如果您正在构建任何会接触 Token-2022 代币的内容,请始终使用transfer_checked以确保 hook 触发。测试 CU 消耗。 从交易回执中测量真实的 Solana 计算单元(
computeUnitsConsumed)——EVMgasUsed并不能准确代表 Solana CU。对热点路径使用 Yul 进行优化。
下一步
最后更新于
这有帮助吗?