Descriptor 不是地址、seed 或钱包文件。wpkh(...) 等表达式规定 scriptPubKey 类型、密钥来源、derivation 和可选 range;最后使用的索引与扫描起始时间必须另外备份。
Output Descriptor 描述一组 scriptPubKey,以及派生或花费它们所需的信息。wpkh(KEY) 表示由该密钥生成的原生 SegWit 输出。它本身不是 Bitcoin 地址、seed,也不是完整钱包备份。
pk()、pkh()、wpkh()、sh()、wsh()、addr() 和 raw() 精确规定输出脚本。sh(wpkh(KEY)) 这样的嵌套会改变 scriptPubKey 与地址,因此同一 xpub 使用不同包装就代表不同钱包。
密钥可带有 [fingerprint/path] 来源,后接 xpub 和进一步 derivation。Key origin 帮助 signer 匹配路径,但 fingerprint 不是加密身份或设备认证;导出内容仍须通过可信渠道核验。
Wildcard /* 会生成 ranged descriptor,派生时必须提供 range。<0;1> 等 multipath 写法可合并 receive 与 change 分支。Descriptor 本身不保存 next index、已用地址、gap limit 或 scan birthday。
# 后八个字符是 BIP 380 descriptor checksum,可发现许多输入、替换和换位错误;但它不是签名、加密或来源证明。攻击者修改表达式后也能重新计算有效 checksum。
含 xpub 的公开 descriptor 可观察和派生,但不能签名。若含 xprv、WIF 或其他私密材料,则可能允许花费,必须像 seed 一样保护。getdescriptorinfo 返回规范公开形式和 hasprivatekeys。
multi(k,...) 保留列出的密钥顺序,调序会改变脚本和地址;sortedmulti(k,...) 每次派生都按字典序排序。备份必须保留 threshold、全部 cosigners、key origins 与包装,单个 seed 不够。
tr(KEY) 描述 Taproot key path,tr(KEY,TREE) 还包含 script path 树。树形结构会改变 Merkle root 与地址,只有无序脚本列表不够。Miniscript 或 multi_a 可表达条件,但不能替代完整 descriptor。
importdescriptors 接收带 checksum 的 descriptor 及 timestamp、active、internal、range、next_index 等 metadata。timestamp 控制扫描起点;过晚的 birthday 会隐藏旧历史,直至正确 rescan。并非所有状态都在表达式内。
收款前运行 getdescriptorinfo,检查 checksum、isrange、issolvable 与 hasprivatekeys。用 deriveaddresses 派生多个外部和 change 地址,并同来源钱包或 hardware wallet 屏幕比对。依赖备份前先测试完整恢复。 资料来源: BIP 380 — Generic Output Script Descriptors; BIP 383 — multi() and sortedmulti() Descriptors; BIP 386 — tr() Output Script Descriptors; Bitcoin Core — Output Descriptors; Bitcoin Core RPC — importdescriptors.
要获得更完整的理解,请将本词条与以下词条结合阅读: 钱包, Watch-only Wallet, Multisig, PSBT, Miniscript, Bitcoin. 反向关联还来自: Watch-only Wallet, Extended Public Key (xpub), PSBT, Miniscript.