# 身份

> NeuroChain 身份——一个控制密钥可以轮换的稳定地址，以及带有守护人、阈值和可由所有者否决的时间锁的社交恢复，全部在共识中执行。

Source: https://docs.nro.world/zh/ai/identity

`.human` 地址最初是单个公钥的纯函数。**身份**让地址的生命周期超越这把密钥：控制该地址的密钥集合保存在链上状态中，因此密钥可以**轮换**，丢失后可以**恢复**——而地址、余额、名称和历史都保持不变。

## 首次轮换前后

| 状态 | 谁控制该地址 |
|------|--------------|
| 从未轮换，也未设置恢复 | 派生出该地址的那把密钥（`address = f(公钥)`） |
| 身份记录已存在 | **仅限**记录中的密钥。原始密钥一旦被移除就不再有效 |

身份记录在你第一次轮换密钥或设置恢复时创建。付费名称（`.node`、`.app`、`.vault`、`.agent`）跟随拥有它们的 `.human` 钱包的身份。

```bash
curl -s "$GATEWAY/api/v1/identity/neuro:<15 hex>.human"
# { "address": "…", "keys": ["<pk1>", "<pk2>"], "version": 2, "rotated_at": 4210, "recovery": { … } }
```

## 轮换密钥

`POST /api/v1/identity/rotate`，携带 `owner`、`add`（要添加的公钥，或留空）、`remove`（要移除的公钥，或留空），由一把**当前有效**的密钥对以下内容签名：

```
nc-rotate|<owner>|<add>|<remove>|<nonce>
```

- 最后剩下的一把密钥不能被移除。
- 签名覆盖了确切的变更内容，因此任何人都无法在传输途中篡改。
- 在每个验证者上于共识中执行。

迁移到新设备的典型做法：先在旧设备上添加新密钥，再用新密钥移除旧密钥。

## 社交恢复

如果所有密钥都丢失了，**守护人**可以恢复访问权限。

### 设置

`POST /api/v1/identity/recovery/setup`——由一把有效密钥签名：

| 字段 | 规则 |
|------|------|
| `guardians` | 一个或多个 `.human` 地址，不能是你自己的 |
| `threshold` | 需要多少位守护人批准：从 1 到守护人数量 |
| `timelock` | 达到阈值后需要等待的区块数，留给你否决的时间 |

恢复仅适用于 `.human` 地址。

### 恢复

1. **请求**——在新设备上调用 `POST /api/v1/identity/recovery/request`，携带 `target`（你的地址）和 `new_key`，由新密钥签名。状态为 `pending`。
2. **批准**——每位守护人调用 `POST /api/v1/identity/recovery/approve`（`target`、`guardian`）。批准数达到阈值时，请求变为 `armed`，并设定 `executes_at = now + timelock`。
3. **执行**——到达 `executes_at` 时，每个验证者自动把该身份的密钥替换为 `new_key`。

在执行之前的任何时刻：

| 谁 | 可以 | 端点 |
|----|------|------|
| 你，使用任意有效密钥 | 否决 | `POST /api/v1/identity/recovery/cancel` |
| 守护人 | 拒绝 | `POST /api/v1/identity/recovery/reject` |
| 请求发起者 | 撤回 | `POST /api/v1/identity/recovery/withdraw` |

读取：`GET /api/v1/identity/recovery/:addr`（配置和未完成的请求）、`GET /api/v1/identity/guardian-of/:addr`（你在守护谁）、`GET /api/v1/identity/recovery/initiated/:pk`（由某把新密钥发起的请求）。

::: tip 谨慎选择时间锁
时间锁是你发现一笔并非由你发起的恢复的时间窗口。太短，合谋的守护人可能在你反应过来之前夺走地址；太长，真正的恢复也要等那么久。
:::

## 计划中

身份记录的用途不止于承载密钥：还包括基于链上行为建立的信誉、对该信誉的零知识证明，以及让其他链读取它的 IBC v2 数据包。这些目前都尚未实现。
