一笔合法但费用不足以符合某节点转发策略的交易,可以不出现在它的交易池里;另一节点可能有不同策略或不同视角。区块有效性与交易池接纳不是同一个谓词。区块链(09):为何最长链未必有最多累计工作选候选链时必须先检查区块有效,不能把“曾出现在某个节点的池里”当作验证证据。

P2P 节点发现、连接、传输清单或请求原始字节以后,本地检查区分语法/共识约束、已经花费的输入、节点政策和依赖未确认祖先的交易。网络可以延迟、隔离、重复或丢弃消息,诚实节点之间的交易池也不要求逐秒一致。广播 RPC 返还交易标识只能说明受请求节点的当时处理结果;其他节点能否接收、矿工是否选入候选块、候选块能否成为规范链,都需要额外检查。

sequenceDiagram
  participant W as 钱包
  participant N1 as 节点 A
  participant N2 as 节点 B
  participant M as 候选区块生产者
  W->>N1: 原始交易
  N1->>N1: 共识前置与本地池策略
  N1-->>W: 接收标识或拒绝
  N1--xN2: 可能尚未传播/被拒绝
  N2-->>M: 自己的交易池视图
  M->>M: 构建候选块,仍须共识验证

如果输入是未确认找零,接收节点还可能要求相关祖先存在、满足本地限制;即便一份交易不能直接转发,也不表示将它放进一个满足共识规则的区块就必定无效。反过来,在某个池里被接受,不保证日后没有冲突交易或重组。应用要保存广播结果与查询时间,不能用“200 OK”把订单直接划为交付完成。

同一笔交易在两台节点的不同命运

假设钱包同时发送子交易 C(花费尚未确认的找零)与其父交易 P。节点 A 先拿到 P,再拿到 C,知道旧输出由 P 创建,因此能在自己的候选池中按依赖关系检查 C。节点 B 先拿到 C,未得到 P,不能从 C 的签名推断 P 的金额和脚本,它可能等待、请求、丢弃或按版本策略拒绝该候选。节点池状态的差异不代表底层共识分裂;一旦从有效块获得完整且合法的上下文,各节点仍须按同一共识规则核对交易序列。

另一个反例是卖家看到了交易池中的 T 并发货,却有冲突交易在某个有效分支上先消费同一输入。A 池曾接纳 T,不能给卖家追加一笔链上债权;重组后 T 也不一定还可入池。订单服务应记录广播目标、节点响应、查询块哈希与时间,再按业务风险策略处理未知和冲突状态。实际版本的接受门槛、替换与祖先/后代限制尚未冻结,不能写死成普遍规则。

练习一:A 池有 T,B 池没有 T,可否断言 B 不诚实?答案:不能;传播滞后、输入视图和本地策略都可能造成差异。练习二:构造一笔签名有效却重复使用已确认输入的交易,节点是否应该“因为高费就先入池”?答案:相对于当前链状态输入已消费,先过有效性检查;费用不能把无效输入变有效。

bitcoind 未就绪,双节点策略对照、RPC 原始输出和区块纳入证据均 NOT_RUN。可迁移原则:把“临时接受以便传播”与“全体必须承认的状态迁移”隔开。参考入口:Bitcoin Core P2P 开发指南、Core 交易池实现入口(需按冻结 SHA 查真实路径与版本;尚未访问);导航:区块链(09):为何最长链未必有最多累计工作 · 10 · 区块链(11):重组时撤销的不是一个确认数字。