跳到主要内容

预编译合约概览

OXN 提供两族预编译:

  • 标准 EVM 预编译——与以太坊一致,在地址 0x010x0a。用于 ecrecoversha256、椭圆曲线数学等常用原语。
  • OXN 机密预编译——加密、随机数、密钥派生、签名等额外内建。它们使机密智能合约实用可行。

所有机密预编译都由 Sapphire Solidity 库封装。import 后调用即可——永远不需要自己写原始 staticcall

机密预编译目录

函数用途类别
Sapphire.randomBytes(uint, bytes)TEE 认证的随机字节随机数
Sapphire.encrypt(...)Deoxys-II 对称加密对称加密
Sapphire.decrypt(...)Deoxys-II 对称解密对称加密
Sapphire.deriveSymmetricKey(pub, priv)X25519 共享密钥派生密钥派生
Sapphire.generateSigningKeyPair(alg, seed)Ed25519 / secp256k1 / sr25519 密钥对生成签名
Sapphire.sign(alg, sk, ctx, msg)用合约持有的私钥签名签名
Sapphire.verify(alg, pk, ctx, msg, sig)验证签名签名

完整参数细节在每个链接的参考页。

安装 Sapphire 库

Solidity wrapper 在 @oasisprotocol/sapphire-contracts

npm install @oasisprotocol/sapphire-contracts

在合约中 import:

import "@oasisprotocol/sapphire-contracts/contracts/Sapphire.sol";

contract MyContract {
function makeRandom() external view returns (bytes memory) {
return Sapphire.randomBytes(32, "");
}
}

标准 EVM 预编译支持

0x010x09 上的每一个以太坊预编译都支持。0x0apointEvaluation,EIP-4844 KZG)不支持——OXN 没有 blob 交易。

完整支持矩阵见标准 EVM 预编译

常见模式

抽奖用的链上随机数:

function pickWinner() external view returns (address) {
bytes memory r = Sapphire.randomBytes(32, "");
uint256 idx = uint256(bytes32(r)) % participants.length;
return participants[idx];
}

合约控制的链下签名:

bytes private signingKey; // 加密存储

function initialize() external onlyOwner {
(bytes memory pk, bytes memory sk) = Sapphire.generateSigningKeyPair(
Sapphire.SigningAlg.Ed25519_Pure, "seed"
);
signingKey = sk;
// 公开 pk 供验证方使用
}

function signMessage(bytes calldata msg_) external returns (bytes memory) {
require(canSign(msg.sender, msg_), "not authorized");
return Sapphire.sign(
Sapphire.SigningAlg.Ed25519_Pure,
signingKey,
"context",
msg_
);
}

用户间加密消息传递:

// Alice 通过 X25519 派生把对称密钥送给 Bob
bytes32 shared = Sapphire.deriveSymmetricKey(bobsPublicKey, alicesPrivateKey);
bytes memory ciphertext = Sapphire.encrypt(shared, nonce, plaintext, "");

完整应用示例见指南

Gas 成本

每个预编译有一个基础 gas 成本加上按 payload 大小的按字节成本。精确数字见 Gas 成本参考

下一步