For the complete documentation index, see llms.txt. This page is also available as Markdown.

约束

在 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 模拟器在链下执行

特定网络约束

环境
链 ID
rome-evm 程序 ID

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 上会回退

解析器偏移量

已通过实证验证——在重新部署前必须重新验证

设计建议

  1. 保持 CPI 深度较浅。 设计合约时应尽量减少嵌套。如果您调用 Jupiter,而它又调用 Raydium,而后者再调用 SPL Token,那么您已经到了 3 层——非常接近上限。

  2. 优先使用原子模式。 设计操作时应控制在约 140 万 CU 以内。迭代模式会增加延迟(3–4 秒锁定)和复杂性。

  3. 预先声明账户。 CPI 触及的所有 Solana 账户都必须在交易创建时已知(代理的仿真会发现它们)。CPI 调用中无法动态发现账户,并且总数必须符合 64 地址上限。

  4. 每个合约选择一条预编译轨道。 调用自定义 Solana 程序(invoke_signed)属于传统轨道且仅支持原子模式;请参见 集成 Solana 程序.

  5. 使用 transfer_checked. 如果您正在构建任何会接触 Token-2022 代币的内容,请始终使用 transfer_checked 以确保 hook 触发。

  6. 测试 CU 消耗。 从交易回执中测量真实的 Solana 计算单元(computeUnitsConsumed)——EVM gasUsed 并不能准确代表 Solana CU。对热点路径使用 Yul 进行优化。

下一步

最后更新于

这有帮助吗?