账户与地址
OXN 有两种地址格式:共识层使用的原生 oxn1… bech32 格式,以及执行层使用的标准 EVM 0x… 十六进制格式。两者从同一把底层密钥派生,指向同一个账户——但住在不同层,各自有独立的余额。
绝大多数情况下你不需要考虑这个——钱包会帮你处理。但当它变得重要时——水龙头拒绝你的地址、deposit 走了意料之外的路径、你要构建桥——本页解释背后到底发生了什么。
两种格式
原生地址(oxn1…)。
Bech32 编码,40 个以上字符,oxn1 开头。示例:
oxn1qz9p73d5eytrrjvc3w0w0cwf7ural96dnsewrhpw
这是共识层使用的格式。原生代币余额、验证人质押、共识层交易都引用 oxn1… 地址。
EVM 地址(0x…)。
标准以太坊十六进制格式,42 个字符,0x 开头。示例:
0x1234567890abcdef1234567890abcdef12345678
这是执行层使用的格式。所有 EVM 合约余额、MetaMask、ethers.js、viem、Hardhat、Foundry、区块浏览器都显示 0x… 地址。
同一把密钥,两个地址
两种地址格式都从同一对 secp256k1 密钥派生,只是编码方式不同:
- EVM 地址 是
keccak256(publicKey)[12:]——标准以太坊派生。 - 原生地址 是从同一公钥派生的 bech32 编码,使用 OXN 的人类可读前缀(HRP)
oxn。
也就是说:你的助记词、私钥、mnemonic 在两种地址格式下代表同一个账户。 MetaMask 和 OXN 网页钱包默认在 EVM 侧操作;只有你与共识层操作交互时原生格式才可见。
什么场景用什么地址
| 场景 | 格式 |
|---|---|
| MetaMask、OXN 网页钱包 | 0x…(EVM) |
| 区块浏览器地址搜索 | 0x…(EVM) |
| 水龙头输入 | 0x…(EVM) |
| ethers.js / viem / Hardhat / Foundry | 0x…(EVM) |
Solidity 合约 msg.sender | 0x…(EVM) |
| 共识层交易 | oxn1…(原生) |
| 验证人质押(主网) | oxn1…(原生) |
| Deposit / withdraw 操作 | 两种都需要 |
对 99% 的 dApp 开发,你只碰 0x…。
余额住在不同层
这里有个微妙的点:oxn1abc…(原生)上的余额,与 0x1234…(EVM)上的余额,即便二者都从你的密钥派生,也是独立的。
一个账户可以有:
- 只有原生余额。 新创建的账户,或只从共识层来源收款的账户。
- 只有 EVM 余额。 通过水龙头或其他 EVM 地址得到资金的账户。
- 两层都有余额。 deposit 或 withdraw 之后。
要在智能合约里花 原生侧的钱,必须deposit到 EVM 侧。要把资金移回原生侧(例如做质押),必须withdraw。
Deposit 与 Withdraw
Deposit(原生 → EVM)
把 oxn1… 余额移到 0x… 余额。通过一笔带"deposit to EVM"类型的共识层交易执行。Deposit 终结后,资金对 EVM 合约可用。
网页钱包的 "Deposit to ParaTime" 流程会处理这个。程序化上,大多数 SDK 屏蔽了细节。
Withdraw(EVM → 原生)
反过来。把 0x… 余额移回一个 oxn1… 地址。使用一笔 EVM 层的交易,在 EVM 侧销毁、在原生侧增记。
Gas 成本
两种操作都是完全的链上状态改动,都消耗 gas。典型金额见 Gas 与手续费。
常见陷阱
"水龙头说我的地址无效。"
OXN 上的水龙头只接受 0x…(EVM)地址。如果你粘贴 oxn1…,水龙头无法用它给 EVM 合约打钱。从钱包复制 EVM 地址。
"钱包里明明有 TBLUAI,可我的合约看到我余额是 0。" 你的余额很可能在错误的层。如果 MetaMask 显示有余额但 EVM 合约看不到,它可能停在原生侧。实际很少发生——水龙头直接资助 EVM 侧——但如果你从共识层来源收到过转账就可能。用网页钱包的 deposit UI 把它移过来。
"我复制的地址在哪儿都用不了。"
检查前缀。oxn1… 不能粘到 MetaMask 里(它要 0x…);0x… 无法签共识层交易。
"我的两笔交易在浏览器上显示在不同地址下。" 共识层交易与 EVM 交易即便属于同一账户也是分开记录的。区块浏览器在你输入任一格式时都会把两边都列出来。