06 篇解释输入引用哪个输出,尚未回答“拿什么条件花它”。锁定条件与花费时提供的材料一起由验证规则求值;支付给同一控制者的两笔输出也可能使用不同脚本版本。对教学托管订单,不能把业务里的“超时自动退款”写成“到时间节点主动替用户广播”:时间锁只限制过早花费,不提供自动执行器。

先修区块链(06):Bitcoin 原始交易如何花费、找零和付费。脚本验证依赖被花费输出、交易上下文、版本和激活规则;不可信网络节点可以传任意待验字节,但不能让校验方接受一条未满足锁定条件的有效花费。Script 的限制与策略接收又是两层:一种交易即便按共识可进入区块,也可能未满足某节点交易池的中继策略。

flowchart TD
  O[旧输出: 金额 + 锁定条件] --> V{花费时验证}
  I[新交易: 引用、序号、解锁材料] --> V
  H[当前高度/时间与脚本规则] --> V
  V -->|满足| S[更新未花费集合]
  V -->|不满足或未到期| X[拒绝当前花费]

绝对锁定时间限制交易最早可纳入的条件,相对锁定时间围绕输入所引用的历史状态约束成熟期;在真实协议里具体字段解释还要考虑序号与交易版本,不能把“时间戳大于阈值”当作完整判定。见证让证明花费条件的部分字节与基础交易标识分开:对涉及见证的交易,txid 与 wtxid 分别承诺不同的序列化范围。它们可能不同,不可在索引键或业务去重键中混用;无见证情况下的关系需按版本核对,不能一概声称必不同。

反例是创建一份签名格式正确但没有满足所花费脚本的消息,或在到期前广播依赖锁定时间的交易:单独验签不足以证明可花费;广播返回哈希更不意味着已入块。examples/blockchain 目前只有独立 ECDSA 演示,没有真实 Script、CSV/CLTV、见证序列化或 regtest 交易。允许/拒绝脚本与到期前后对照均 NOT_RUN,相关交易 ID 字段也没有实测。

签名有效,但当前花费仍被拒绝

锁定条件属于旧输出;新输入提供的签名和解锁材料要与交易上下文一起验证。若签名覆盖的是另一笔交易的预映像,即使同一公钥能验过该消息,也不授权当前支出。再设退款路径必须到期后才能用:到期前,密钥、金额都正确仍须拒绝;到期后,时间锁也不会代替持钥者发起交易。绝对锁定时间、相对锁定时间依赖不同的输入字段及历史位置,不是统一的 now >= deadline。

本地交易池按费用、依赖和中继策略拒绝,不能直接推出一个块内的交易违反共识。见证分别改变标识所承诺的序列化范围:只调整见证而保持基础字节时,txid 不随见证变化,wtxid 则须重算;两份不同见证还必须各自满足被花输出条件。只保存 txid 无法重建完整交易、确认具体支出条件或定位规范块。当前只能给出需实测的成对用例:脚本成功/拒绝,到期前/到期后,保留基础字段但改变见证;每组必须记录旧输出、网络、区块上下文和原始拒绝信息。

练习一:为何“签名正确”仍可能拒绝?答案:签名预映像、被花输出类型、时间锁和完整脚本条件任一不满足都可能失败。练习二:应用按 txid 去重,但只保存见证字节,是否足以重构所有链上标识?答案:不能仅凭见证恢复交易基础字段,必须保存或重新取得冻结规则要求的原始交易及上下文;用 wtxid 替换数据库主键也需明确所指序列化域。

可迁移原则:验证一个凭证须连同规则版本和被验证对象一起固定。参考入口:BIP 65、BIP 68、BIP 141,原文与 Core 源码 SHA 均待核,不可作为已核对的网络激活证据。导航:区块链(06):Bitcoin 原始交易如何花费、找零和付费 · 07 · 区块链(08):钱包、描述符与 PSBT 的签名边界。