跳到主要内容

Gas 成本参考

每个机密预编译有一个基础 gas 成本;大多数情况下还有一个随输入大小缩放的按字节成本。本页提供当前值,用于预算。

数值可能变化

Gas 成本在运行时升级中可能改变。下面的数值是当前的最佳估计;关键预算请参考运行时源码或做经验测量。

成本表

函数基础 gas(约)按字节输入类比 EVM 操作
Sapphire.randomBytes~10,000+~50/字节~2 倍 sha256
Sapphire.encrypt~15,000+~10/字节~5 倍 sha256
Sapphire.decrypt~15,000+~10/字节~5 倍 sha256
Sapphire.deriveSymmetricKey~20,000~7 倍 ecrecover
Sapphire.generateSigningKeyPair~50,000~15 倍 ecrecover
Sapphire.sign(Ed25519)~30,000+~20/字节~10 倍 ecrecover
Sapphire.sign(Secp256k1)~30,000+~20/字节~10 倍 ecrecover
Sapphire.verify(Ed25519)~30,000+~20/字节~10 倍 ecrecover
Sapphire.verify(Secp256k1)~30,000+~20/字节~10 倍 ecrecover

这些数字是近似的——发布 gas 敏感代码前在测试环境实测你的实际用法。

情境成本对比

机密 ERC-20 transfer

  • 以太坊基础 ERC-20 transfer 成本:约 50,000 gas
  • OXN 额外:calldata 加密(约 5,000)+ 返回数据加密 + 加密事件 emit(约 10,000)
  • 合计:约 65,000–70,000 gas

有轻微额外开销,但日常用可忽略。

密封拍卖提交:

  • 1x 加密出价 SSTORE:约 22,000 gas(标准 SSTORE,透明加密)
  • 1x nonce 的 Sapphire.randomBytes:约 11,600
  • 合计:约 40,000 gas

签名 attestation(合约签一份声明):

  • 对 100 字节声明的 Sapphire.sign:约 32,000 gas
  • 1x 记录用 SSTORE:约 22,000 gas
  • 合计:约 55,000 gas

预算经验法则

  • 机密合约调用比同等明文调用大约多 20–50k gas。
  • 单次预编译调用便宜——几次 sha256 的成本级别。
  • 重度使用签名操作会成为主导——sign / verify 是每次调用最贵的预编译。
  • 能批处理就批。 多次 Sapphire.encrypt 用同一 key 比多次不同 key 便宜——一次性成本里 key setup 占主导。

测量精确成本

针对具体用例直接测:

const receipt = await tx.wait();
console.log("Gas used:", receipt.gasUsed.toString());

用同一调用带 / 不带预编译各跑一次,隔离出预编译的贡献。在 OXN 测试网上做——本地 Hardhat network 不建模预编译成本。

设置 gasLimit

考虑额外开销,gasLimit 设得宽松:

调用类型推荐 gasLimit
机密 ERC-20 上的加密 transfer500_000n
密封拍卖提交(状态 + 随机数)500_000n
合约签 200 字节消息800_000n
加密密钥派生 + 加密来回500_000n
复杂组合调用1_000_000n

未消耗的 gas 会退还,多给一些是安全的。

下一步