老地址也有一种写法:BIP-381 的 pk()、pkh() 与 sh() 描述符怎么描述非隔离见证输出 图 1
老地址也有一种写法:BIP-381 的 pk()、pkh() 与 sh() 描述符怎么描述非隔离见证输出 · 图 1

隔离见证落地之前,比特币链上最常见的收钱脚本其实只有三种长相:直接把公钥写进去的 P2PK、先对公钥做哈希再校验的 P2PKH,以及把一段脚本压成二十字节哈希的 P2SH。钱包描述符语言把一整套输出脚本压成一行可读文本,比特币钱包描述符是什么? 讲过这套语言的通用结构,一把钥匙四种地址:combo() 描述符为什么是扫描老钱包的默认答案 讲过 combo() 怎么用一行同时覆盖四种历史格式。专门给这三种老脚本一个标准写法的,是 BIP-381 定义的 pk()、pkh() 和 sh() 三个表达式,状态 Deployed,比特币核心自 0.17 版起支持。

pk():把公钥原样放进输出脚本

pk(KEY) 接受一个键表达式,产出一条 P2PK 输出脚本,脚本内容就是一行 <KEY> OP_CHECKSIG——把公钥明明白白写在链上,谁花钱谁出示对应的签名。它可以出现在描述符的任何层级、任何位置,但作为最内层的裸脚本,它对公钥的形态没有额外要求,能不能塞进去由更外层的包装脚本决定。P2PK 是比特币最早期、也是今天最少见的一种输出:它比 P2PKH 少一层哈希,脚本更短,却因为把公钥直接暴露在链上而在量子层面被部分人介意,如今它很少作为日常收款地址出现,更多留在历史早期区块与一些测试脚本里。

pkh():最经典的一种地址

pkh(KEY) 产出 P2PKH 输出,脚本展开成 OP_DUP OP_HASH160 <KEY 的 hash160> OP_EQUALVERIFY OP_CHECKSIG,对应你熟悉的以 1 开头那串地址。它和 pk() 的关键区别在于链上露出的不是完整公钥,而是公钥经过一次 SHA-256 加一次 RIPEMD-160 得到的 20 字节摘要,真正的公钥要等到花钱时才在解锁脚本里补上。pkh() 可以作为顶层表达式,也可以塞进 sh() 或 wsh() 里面。它只接受键表达式,写成 pkh(pk(公钥)) 这种把 pk() 再套一层的写法会被判非法,因为 pk() 产出的已经是一段脚本而不是一个键。

sh():把一个脚本哈希成地址

sh(SCRIPT) 和上面两个不是一类:它接受的不是键,而是一整段脚本表达式,产出的 P2SH 输出脚本形如 OP_HASH160 <SCRIPT 的 hash160> OP_EQUAL。P2SH 的花费需要一段叫 redeemScript 的东西,而这段 redeemScript 恰恰就是 sh() 里那个 SCRIPT 参数展开后的脚本本身——这就是为什么 sh() 比 pk()、pkh() 多背了一份”脚本内容”。位置约束也最严:sh() 只能出现在顶层,不能再往 sh() 里套 sh(),写成 sh(sh(pkh(公钥))) 会直接报错;同理它只接受脚本表达式,光塞一个裸公钥 sh(公钥) 也非法。

迁移到描述符时容易忽略的三点

第一,产出脚本是老脚本、描述符文本是新格式,两者不是一回事:描述符只是把这些老脚本规范地写出来的一种记账方式,链上花的钱仍是标准脚本,所以老软件多半认得产出结果,却不认得描述符文本本身。BIP-381 在兼容性一节明说这三种描述符是全新的、不兼容任何既有实现,只是因为产出脚本都是标准脚本才容易对接。第二,sh() 里放什么脚本、和最终地址是否吻合,只能靠完整描述符文本自证;如果备份里只留了地址没留描述符,将来恢复时得从链上历史反推那段 redeemScript,工作量陡增。第三,如果你手上是一个既有 P2PKH 又有 P2SH 的老钱包,逐条写 pkh()、sh() 会写很多行,这时 一把钥匙四种地址:combo() 描述符为什么是扫描老钱包的默认答案 讲的 combo() 往往更省事——它就是为”一句密钥导出四种历史长相”而设计的。真正需要单写这三种表达式的场景,通常是要精确复现某个只有单一脚本类型的旧账户,或是在自建工具链里逐条验证派生是否对得上。

上手自查的最小动作

把一段老钱包脚本翻译成描述符之前,先跑一个反向核验会更稳。比特币核心提供 getdescriptorinfo 这个 RPC,把一行描述符喂进去,它会回给你校验和补齐后的规范形式、脚本类型和所需签名数;getdescriptorinfo如何检查描述符? 讲过它作为检查器的用法。实操顺序是:先手写一行 pkh(公钥) 或 sh(pkh(公钥)),用 getdescriptorinfo 看它认不认、类型对不对,再用派生出的地址和链上历史比对;老钱包里的地址如果能被你写的这一行完整覆盖,翻译才算完成。这个顺序的好处是把”语法合法、类型正确、地址吻合”三层校验拆成了三道各自独立、失败即回头的闸门,避免一上来就整库扫描、最后扫出半套地址再回头找原因。

风险提示:本文描述脚本与描述符机制,不构成投资建议;涉及历史地址资产处置前,请以所用软件版本的实测结果为准,并完整备份描述符与全部密钥材料。