# 钱包

> NeuroChain 钱包——24 词恢复短语、在浏览器中派生的后量子 ML-DSA-65 密钥、加密密钥库、发送 NRO、已签名操作、交易状态以及测试网络水龙头。

Source: https://docs.nro.world/zh/learn/wallet

NeuroChain 钱包就是一个 **24 词恢复短语**。其余一切——签名密钥和 `.human` 地址——都在你的浏览器中由它计算得出，并且永远不会离开浏览器。

## 使用钱包的方式

以下方式都使用相同的密钥和相同的 `.human` 地址；区别在于密钥存放在哪里以及由谁签名。

| 方式 | 密钥存放位置 | 签名者 | 适用场景 | 页面 |
|--------|--------------------|-----------|----------|------|
| **Web 钱包** | 你的浏览器，用你的密码加密 | 你，在应用中 | 日常使用：发送、质押、投票、注册名称、管理代理 | 本页 |
| **签名弹窗** | 你的浏览器（Web 钱包） | 你，在弹窗中批准 | 在其他网站上使用 dApp，而无需把短语交给它 | [Signer SDK](/zh/build/sdk#signer-sdk) |
| **JavaScript SDK** | 你自己的页面或脚本 | 你的代码，使用你提供给它的短语 | 构建自带钱包的 dApp 或自动化程序 | [JavaScript SDK](/zh/build/sdk) |
| **会话密钥（AI 代理）** | 代理所在的机器——一个独立的、受限的密钥 | 代理，在你设定的范围、支出上限和有效期内 | 让 AI 助手通过 MCP 代你操作 | [AI 代理（MCP）](/zh/build/mcp) |
| **付费名称**（`.node`、`.vault`、`.agent`……） | 没有自己的密钥 | 拥有它们的 `.human` 钱包 | 验证者、共享金库、代理账户 | [地址](./addresses) |

`.vault` 由多个成员共同控制：一笔支出需要达到阈值数量的成员签名。

## 创建或导入

| | 会发生什么 |
|---|---|
| **创建** | 浏览器从 256 位随机熵生成 24 个单词（带校验和的 BIP-39 词表）。请把它们抄写下来；它们只显示一次。 |
| **导入** | 输入已有的 24 词短语。在做任何其他事情之前会先验证校验和。 |

浏览器根据这些单词派生出 ML-DSA-65 密钥对和地址，过程如[地址](./addresses#your-wallet-address-human)中所述。同一个短语在任何设备上都会得到同一个地址。

## 密钥存放在哪里

| 项目 | 位置 | 保护 |
|------|-------|-----------|
| 恢复短语 | 浏览器 `localStorage`，键 `nc_ks_<address>` | 用你的密码加密：PBKDF2-SHA256（100 000 次迭代，随机 16 字节盐）→ AES-256-GCM |
| 签名密钥 | 仅存在于已打开标签页的内存中 | 解锁后从短语重新派生 |
| 密码 | 不存放在任何地方 | 仅用于加密和解密短语 |

同一个浏览器中可以并存多个钱包；你可以在应用中切换。

::: warning 保管好短语，而不是密码
密码只能解锁存放在此浏览器中的副本。如果你丢失了短语和浏览器数据，钱包就没了——谁也无法恢复。如果短语泄露，任何人都能以你的身份签名；请通过[身份](/zh/ai/identity)轮换到新密钥。
:::

## 发送 NRO

1. 应用读取你的下一个 nonce 和当前基础费用。
2. 将 gas 价格设为 **1.5 × 基础费用**（向上取整），这样即使基础费用在交易被打包前上涨，交易仍然有效。
3. 浏览器在本地（WASM）检查余额、nonce 和手续费，并在发送前显示任何错误。
4. 用你的密钥签名 `nc-tx-v2|from|to|value|nonce`，并把交易连同你的公钥一起发送。
5. 节点验证签名，以及你的公钥能派生出你的地址，然后将交易排入队列。

转给自己的转账只收手续费；应用也会这样显示。

## 交易状态

| 状态 | 含义 |
|--------|---------|
| `pending` | 已被节点接受，在 mempool 中等待。若 60 秒内未被打包则丢弃。 |
| `confirmed` | 已进入最终确定的区块并已执行。 |
| `failed` | 已进入最终确定的区块，但合约调用触发 trap 或耗尽 fuel。转账金额和存储变更被回滚；手续费和 nonce 被消耗。 |
| `held` | 已接受，但被 [Sentinel 策略层](/zh/ai/sentinel) <Badge type="warning" text="默认关闭" /> 延迟：金额会在一段延迟后自动放行，或等待你的确认。 |
| `cancelled` | 你取消的暂扣交易；金额已退回。 |
| `refunded` | 金额已退还给你——未经确认而过期的暂扣交易，或超时的跨分片转账。 |

## 已签名操作 {#signed-operations}

质押、注册名称、投票等操作不是转账，但签名方式相同。钱包签名 `nc-tx-v2|<you>|<system target>|<value>|<nonce>`，其中目标指明操作（`neuro:system.stake`、`neuro:system.node`、`neuro:system.name`、`neuro:system.governance`……）。

对于这类操作，nonce 是一个毫秒级时间戳，节点只接受比它从你的地址见过的最后一个 nonce 更大的值——截获的请求无法被重放。

## 水龙头 <Badge type="warning" text="仅限测试网络" />

在以 `CHAIN_ENV=testnet` 启动的节点上，`POST /api/v1/faucet` 会发放测试 NRO。在 `CHAIN_ENV=mainnet`（默认）下，该功能被禁用。

| 设置 | 默认值 | 变量 |
|---------|---------|----------|
| 每次请求金额 | 50 NRO | 请求字段 `amount` |
| 每次请求上限 | 100 NRO | `NEUROCHAIN_FAUCET_MAX_NRO` |
| 每个地址的冷却时间 | 24 小时 | `NEUROCHAIN_FAUCET_COOLDOWN_SECS`（0 表示关闭） |

```bash
curl -s -X POST "$NODE_RPC/api/v1/faucet" \
  -H 'Content-Type: application/json' \
  -d '{"address":"neuro:<你的地址>.human","public_key":"<你的 ML-DSA-65 公钥，hex>"}'
```

水龙头在首次为某地址注资时，会把你发送的公钥绑定到该地址。

## 命令行钱包

节点仓库中仍保留一个旧的命令行钱包 `neurowallet`。它早于当前的地址方案（`NC_KDF_v3`），也不使用 ML-DSA-65 签名，因此当前网络不接受它的地址和交易。请使用 Web 钱包或 [JavaScript SDK](/zh/build/sdk)。
