身份
.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 地址。
恢复
- 请求——在新设备上调用
POST /api/v1/identity/recovery/request,携带target(你的地址)和new_key,由新密钥签名。状态为pending。 - 批准——每位守护人调用
POST /api/v1/identity/recovery/approve(target、guardian)。批准数达到阈值时,请求变为armed,并设定executes_at = now + timelock。 - 执行——到达
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(由某把新密钥发起的请求)。
谨慎选择时间锁
时间锁是你发现一笔并非由你发起的恢复的时间窗口。太短,合谋的守护人可能在你反应过来之前夺走地址;太长,真正的恢复也要等那么久。
计划中
身份记录的用途不止于承载密钥:还包括基于链上行为建立的信誉、对该信誉的零知识证明,以及让其他链读取它的 IBC v2 数据包。这些目前都尚未实现。