将钱包集成到 OXN
如果你做钱包想加 OXN 支持,本指南覆盖钱包除了标准以太坊集成之外需要做的具体事。
基础:OXN 作为 EVM 链
从钱包角度看,OXN 是标准 EVM 兼容链。加到你支持的网络列表:
- Chain ID:
186 - RPC:
https://rpc.bout.network - 货币符号:
TBLUAI,18 位小数 - 浏览器:
https://explorer.bout.network
程序化配置的完整 JSON 见测试网参数。
OXN 对钱包的不同之处
标准 EVM 钱包签交易并显示 calldata 供用户审查。OXN 上:
- Calldata 在客户端签名前加密。
- 机密代币的余额只有通过签名查询才可见。
- 事件日志按调用者加密。
如果钱包只签 dApp 传的数据,严格说不需要任何改动。但要给用户好体验,钱包需要知道 OXN 的加密。
签加密交易
dApp 构造加密信封。钱包的工作是把加密 data 原样签外层交易:
{
to: "0xContractAddress",
data: "0xa3...", // 来自 dApp 的 CBOR 信封
value: 0,
gas: 500_000,
gasPrice: 100_000_000,
nonce: ...
}
钱包按签任何以太坊交易的方式签它。不需要解码加密 data。
显示加密交易
用户看到外层交易——to、value、gas——但 data 字段是一大段人类不可读的 hex。改善 UX:
- 检测 CBOR 信封前缀(
0xa0–0xbf),把交易标记为"Encrypted"。 - 鼓励 dApp 在发起请求前显示明文摘要。
- 不要试图解码加密数据——钱包没有 enclave 密钥无法解密。
显示机密代币余额
机密 ERC-20(见构建机密 ERC-20)通过明文 eth_call 调 balanceOf(user) 返回 0。想显示真实余额,钱包必须:
- 检测代币是机密的(通过某个约定方法或 dApp 提示)。
- 构造签名查询:用用户私钥签
eth_callpayload。 - 发送签名查询。
- 用会话密钥解密响应。
- 显示返回的余额。
这要求钱包持私钥(本来就有)并在客户端实现 OXN 加密协议。
不想自己实现加密的钱包可以委托给 OXN SDK:
import { wrapEthersSigner } from "@oasisprotocol/sapphire-ethers-v6";
const wallet = new ethers.Wallet(privateKey, provider);
const wrapped = wrapEthersSigner(wallet);
// 用 wrapped 发签名查询
Deposit 与 Withdraw
OXN 有两种地址格式(见账户与地址)。用户在两者间移动价值:
- Deposit:共识层
oxn1…→ EVM0x… - Withdraw:EVM
0x…→ 共识层oxn1…
大部分钱包可以跳过这部分——绝大多数 dApp 交互在 EVM 侧。用户需要时 OXN 网页钱包处理这个流程。
如果你的钱包目标是验证人质押(主网),你需要支持两种地址格式和 deposit / withdraw 操作。
移动钱包中的网络
iOS / Android 钱包用 WalletConnect 或直连 RPC 就能连 OXN 测试网。机密交易加密要么在 dApp(浏览器端)做、要么在钱包想一等支持时的原生 SDK 里做。
移动钱包想让机密特性工作:
- 包含 OXN SDK 的原生等价物(Go / Rust 封装 X25519 + Deoxys-II),或
- 从 TypeScript SDK 编 WASM 版本的加密库。
测试你的集成
- 把 OXN 测试网加进你的钱包。
- 从水龙头资助测试地址。
- 对另一个地址做简单转账。
- 部署或与机密合约交互。
- 通过签名查询确认余额正确显示。
- 测试错误处理:交易被拒、网络错误、错链。
下一步
- 测试网参数
- 钱包集成——SDK 层集成
- TypeScript SDK