一笔密钥分四种角色?SLIP-0048 与 Graphene 系链的角色派生路径 图 1
一笔密钥分四种角色?SLIP-0048 与 Graphene 系链的角色派生路径 · 图 1

不是 UTXO 的账户模型,派生路径也要变

比特币钱包管的是”一堆未花费输出”,BIP-44 的 m/44’/coin’/account’/change/index 足够表达。Graphene 技术栈的链(BitShares、Steem、PeerPlays、EOS 等)是另一种模型:链上注册的是”账户”,每个账户挂一组可修改的角色方案,常见角色是 owner 与 active——owner 能改 owner 本身,等于冷钱包级的超级管理员;active 不能,代表日常操作权。角色还可以由多个带权重的密钥甚至其它账户构成。2016 年 10 月发布的 SLIP-0048(状态 Active)就是给这种模型定制的派生层级,它明确声明是对 BIP-0044 的扩展,要求先读懂 BIP-44(BIP-44钱包派生路径怎么读?)再读它。

一笔密钥分四种角色?SLIP-0048 与 Graphene 系链的角色派生路径 图 2
一笔密钥分四种角色?SLIP-0048 与 Graphene 系链的角色派生路径 · 图 2

五层路径:role 排在 account 之前

SLIP-0048 的路径是 m/48’/network’/role’/account-index’/key-index’,全层硬化。purpose 固定 48’,沿袭 BIP-43 的”用途号即提案号”惯例。network 层给每条链一个常量子树,避免同一颗种子在不同链上撞地址。role 层是新增的关键:角色编号由各链自行定义,例如 owner 是 0x0、active 是 0x1、memo 是 0x3、posting 是 0x4。规范特别解释了为什么 role 要排在 account-index 之前:这样能先派生出”角色专属的父节点”,再往下的密钥天然与其它角色隔离——规范的用例是手机钱包只从 m/48’/network’/[active] 往下走,整棵 owner 子树在该设备上根本不会被展开。memo 则是角色之外的异类:它不是链上角色而是账户绑定的单个密钥,专门用于加密私信时协商共享密钥。

注册表:哪些链占了哪个号

规范附注册网络表。Steem 是 0x00000000,角色含 owner、active、memo、posting;BitShares 是 0x00000001;PeerPlays、Muse 依次 0x00000002、0x00000003;EOS 是 0x00000004,只注册了 owner 与 active 两角色;FIBOS、ONE、SBC、YOYOW、BOS、ONEGRAM、BRAVO、DECENT 占 0x05 到 0x0c;Hive 用 0x00000bee(十进制 3054);Vet The Vote 占 0x1388(十进制 5000)且多一个 comms 角色。示例路径表可以直接抄作业:Steem 首个账户的 active 密钥是 m/48’/0’/1’/0’/0’,BitShares 第四个账户的 owner 是 m/48’/1’/0’/3’/3’,EOS 首个 owner 是 m/48’/4’/0’/0’/0’,Hive 首个 active 是 m/48’/3054’/1’/0’/0’。

账户发现与 gap limit 5

导入种子后钱包要反查账户。规范给的算法是:从 account-index 0 开始,对指定角色(如 active)派生账户节点及其子密钥,拿公钥去链上 API 查有无关联账户;查到就把索引加一继续,查不到就停止。为防止中间空洞导致漏扫,公钥缺口上限(gap limit,比特币侧同类机制见收款地址一直在变?钱包地址序列与扫描间隔机制)定为 5:连续遇到 5 个未使用公钥才认定后面没有账户,高级用户可手动超出扫描。规范还算了一笔账:账户维度缺口 5 乘密钥维度缺口 5,一轮要探测 25 个公钥,配合布隆过滤可以摊薄成近似单次查询。key-index 层的动机也写得很具体:账户的当前角色密钥泄露时,更安全的设备能不动其它角色、只沿 key-index 往下生成换代密钥,同种子的其它钱包照样能派生新密钥继续访问账户。

冷热水模型的新写法与适用现状

传统”热钱包签小额、冷钱包守大额”在角色模型下有了协议层对应:规范的 onboard 流程用两笔交易把既有账户迁进标准——先取一个标准路径公钥以满权重加进 owner 角色,再用它签一次 account_update 把角色整体换成按本规范派生的密钥。优势清单里明确写着:钱包可以只当 owner 冷存储,active 放在钱包之外。2017 年 9 月的更新记录还留了一条考古线索——角色层与账户层曾经互换过位置,老工具若按旧序派生,得到的密钥与现在完全不同。现实使用要先核对三件事:你的链在不在注册表里(未注册的链要先向维护方申请编号,凭空自编 network 号属于私有约定,换钱包即失联);钱包实现是否跟上 2017 年交换后的层级顺序;以及发现算法扫到的账户数与你预期是否一致——gap limit 只保证”没有更远的”,不保证”中间没漏”,对长期不活跃地址较多的账户建议手动扩扫并逐一核对。

换设备与换角色的两件操作纪律

日常最容易踩的是两类动作。换设备恢复时:先只导入种子、按注册表逐个网络扫描角色子树,把发现的每个公钥与链上账户当前角色表逐一比对,对不上的先停下来核对钱包实现的层级顺序是否为 2017 年交换后的版本,不要急着在链上改角色——用错路径派生的新密钥一旦顶替了 owner,恢复成本极高。轮换泄露密钥时:沿 key-index 只换代受影响角色的密钥,其余角色子树不动,换代完成后旧密钥对应的链上授权要在角色表里显式移除权重,仅靠”派生新密钥”并不会让旧密钥失效,Graphene 账户的权限永远以链上角色表为准,钱包里那棵树只是钥匙串。这两条的共同点是:路径树解决”密钥从哪来”,链上角色表解决”谁现在有权”,两边各核一遍才算完整的交接。