术语表 /地址与密钥
派生路径
- 派生路径是什么?
- 派生路径是 HD 钱包密钥树中的一条路线,写作 m/84h/0h/0h/0/0这样的形式,用于告知软件应从您的种子重建数十亿个密钥中的哪一个。
规定于 BIP-44。
路径是一个坐标,而不是秘密。靠前的两个数字决定了您的助记词能否重建以1、3、bc1q 或 bc1p 开头的地址,因为 BIP-44、BIP-49、BIP-84和 BIP-86对同一组词的解读各不相同。把路径和备份记录在一起,决定了恢复钱包时是找到您的比特币,还是显示余额为零。
运作方式
路径从左到右读取,每个斜杠对应一个层级,每一层都会缩小搜索范围。开头的 m 是由您的种子生成的主密钥。其后的每一项都是索引,撇号或字母 h 表示该索引为强化派生。
第一层是用途,它决定了您的地址是什么样子。
| 标准 | 账户路径 | 生成的地址 |
|---|---|---|
| BIP-44 | m/44h/0h/0h | 传统地址,以1开头 |
| BIP-49 | m/49h/0h/0h | 嵌套 SegWit,以3开头 |
| BIP-84 | m/84h/0h/0h | 原生 SegWit,以 bc1q 开头 |
| BIP-86 | m/86h/0h/0h | Taproot,以 bc1p 开头 |
第二层是币种类型,取自 SLIP-0044注册表,其中比特币为0,所有测试网均为1。第三层是账户编号,同一个种子可以据此在0h 下放一个个人钱包,在1h 下放一个企业钱包,两者没有共同的历史记录。此后不再使用强化派生:第四层是链,0用于对外提供的地址,1用于找零,第五层是地址索引,随着您收到付款而递增。
强化层级与普通层级的这种划分是有意为之。由于账户层级是强化派生的,m/84h/0h/0h 的扩展公钥可以导出到手机或交给会计,对方可以据此派生其下所有的收款地址和找零地址,但无法横向进入其他账户,也无法向上推导出主密钥。
多重签名使用独立的分支。BIP-48将共同签名方的密钥放在原生 SegWit 的 m/48h/0h/0h/2h 下,最后一个强化层级用于指明脚本类型,因此设备在签名之前就能区分单签账户和多重签名账户。
购买比特币时为何重要
路径从不涉及您的安全。它丝毫不改变您的比特币被盗的难度,却完全决定了眼前的软件能否找到它们。
由此造成的故障很常见,而且总是令人惊慌。您在交易所购买后提币到某台设备,比特币到达 m/84h/0h/0h 下的 bc1q 地址。一年后,您把同样的24个助记词恢复到另一个默认使用传统地址的应用中,余额显示为0.00000000,而区块浏览器仍显示您的资金原封不动地存放在旧地址上。没有任何损失。该应用只是在一棵每层有四十亿个子节点的树上找错了分支。
本站评测的各款钱包默认设置并不相同。Trezor Suite 和 Ledger Live 都按地址类型显示账户,并在后台为您选定用途。Electrum 会在恢复时询问您想要哪种脚本类型,并把自由输入路径的文本框藏在高级选项之后。Sparrow 会同时扫描多条标准路径,并显示哪一条有历史记录。它们都没有错,但谁也无法猜到另一款软件做了什么。
两个习惯就能彻底消除这个问题。把账户路径和地址类型与钱包名称写在同一张便条上,并把便条保存在无需种子即可取得的地方,例如密码管理器,因为它本身不会泄露任何信息。然后,在信任某次恢复之前,把它显示的第一个收款地址与原设备显示的地址进行比较。如果这两串字符一致,其下的所有地址也都会一致。
将24个助记词恢复到 Electrum 后显示为零
在错误的路径上恢复,过程大致如下。一台 Trezor Model T 用24个助记词完成设置,一笔交易所提币发送到其第一个原生 SegWit 地址,此后该设备一直放在抽屉里。几个月后,这组助记词被输入到笔记本电脑上的 Electrum。
Electrum 在扫描之前会询问脚本类型。选择传统 p2pkh 后,它会派生 m/44h/0h/0h,显示以1开头的地址,什么也没找到,并报告钱包为空。比特币仍在 bc1q 地址上,仍已确认,任何持有交易 ID 的人仍可看到。
解决办法只需一分钟。重新恢复并选择原生 SegWit,或者打开高级派生字段,手动输入 m/84'/0'/0'。Electrum 重新扫描后,余额随即出现,地址列表也以与 Trezor 接收页面所显示的相同字符串开头。如果仍显示为零,而您确定付款发生在该分支更靠后的位置,请先把地址间隔上限从默认的20调高,再判断是否有资金丢失。
整个过程不涉及任何资金风险,因为恢复属于读取操作。您可以依次尝试每一种用途,唯一的代价是每次重新扫描所花的时间。
派生路径 vs 输出描述符
路径只说明位置;描述符则说明位置、类型,以及从哪个密钥开始。描述符 wpkh([fingerprint/84h/0h/0h]xpub/0/*) 包含同样的路径,外加作为包装函数的脚本类型、扩展密钥本身,以及用于发现输错字符的校验和。把路径交给别人,并不会透露您钱包的任何信息。把描述符交给别人,则等于交出您的全部地址历史以及该分支上的每一个未来地址,所以前者可以放心通过电子邮件发送,后者则不能。