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 上的加密 transfer | 500_000n |
| 密封拍卖提交(状态 + 随机数) | 500_000n |
| 合约签 200 字节消息 | 800_000n |
| 加密密钥派生 + 加密来回 | 500_000n |
| 复杂组合调用 | 1_000_000n |
未消耗的 gas 会退还,多给一些是安全的。