区块链(08):钱包、描述符与 PSBT 的签名边界
有地址列表但没有私钥的钱包能观察合成订单收款,不能签署支出。相反,仅有一组私钥却不知道派生路径、脚本类型和扫描范围,恢复者也可能找不到过去的找零。钱包管理密钥、构造支出、跟踪属于自己的输出;全节点验证所有有效规则,钱包既不是全网共识者,也不替对方证明实际交付。
先修区块链(07):Script、时间锁和见证不是一件事的可花费条件。HD(分层确定性)派生把种子、路径、子密钥联系起来;watch-only 允许观察一组预期脚本,却不意味着远程观察端拥有花费权限。描述符则显式表达如何由密钥材料与脚本规则导出被观察的输出,恢复时要核对校验和、来源与派生范围。私钥备份不能放在博客附件,合成临时密钥清除并不等于可恢复钱包演练。
sequenceDiagram
participant O as 观察钱包/watch-only
participant F as 出资协调端
participant S as 隔离签名方
O->>F: 输出、金额、脚本信息
F->>S: PSBT: 待签交易及输入上下文
S->>S: 核对输入、收款、找零与费用
S-->>F: 部分签名
F->>F: 合并并最终化(前提满足)
F-->>O: 广播标识;仍须跟踪确认
PSBT(部分签名 Bitcoin 交易)解决构造者和签名者分离时交换输入元数据及签名的问题;它不是“谁能发送 PSBT 谁就有钱”,也不证明各参与者正确地核对过输出。防止签错目的地须在签名端独立显示收款金额、手续费和找零;防止丢币须知道实际锁定脚本及派生路径。若观察端把远程节点报告的余额当成可信最终状态,则 watch-only 只减少密钥暴露,没解决信任历史的问题。
协调端换掉找零地址怎么办
假设 watch-only 钱包报告 100 面额输入,协调端拟付卖家 70、返还找零 29。PSBT 能传递待签输入、输出及部分签名,但签名方仍须核对旧输出的金额与脚本,并在独立界面检查卖家收款脚本、找零是否归本钱包策略、输入减输出所得的费用。攻击者把找零改为自己控制的脚本,这笔交易仍可能符合全节点共识:丢钱的原因是用户意图没有被签名端完整审核,而非节点失守。
HD 种子可以派生一族密钥,不自动保存钱包原先的脚本类型、派生路径、账户范围和联合签名者的全部策略。描述符说明应扫描的脚本,watch-only 恢复的是观察范围而非签名权。恢复演练应分别在隔离环境导入观察配置与私钥配置,并从过去的合成输出重新识别卖家支付与找零。拿到 PSBT、签名完成、广播和最终确认依次属于不同责任边界。
练习一:只有 extended public key 和脚本描述时能做哪两种事,不能做什么?答案:在允许的派生路径范围内导出观察对象并检测匹配输出;没有对应签名密钥不能签出有效花费。练习二:把 PSBT 的卖家输出改成攻击者地址而保持其余字段,隔离签名方必须怎么做?答案:重新显示并核对完整输出、找零及手续费,拒绝未经授权的目的地;不能只验输入和签名标识。具体 PSBT 解析与最终化在当前无 Core 环境下 NOT_RUN。
可迁移原则:观察权限、发起权限和签名权限分离后,仍要核对签名者看到的全部上下文。参考入口:BIP 32、BIP 380、BIP 174(原文待核);Core 钱包版本、源码 SHA、watch-only/PSBT 正反例均 NOT_FROZEN / NOT_RUN。导航:区块链(07):Script、时间锁和见证不是一件事 · 08 · 区块链(09):为何最长链未必有最多累计工作。






