跳到正文

研究指南

加密现货研究

比特币包含证明:已确认转账也可能早已花费

一笔比特币交易创建的全部输出都已花费后,它的历史包含证明仍可能完全有效。包含回答“交易是否被指定区块承诺”,现有储备回答“在选定链和观察口径下,哪些具体输出仍未花费”。前者不能直接代替后者。

为此建立三栏记录:交易包含、区块链归属、输出当前状态。身份和控制权证据放在另一层。即使三个技术检查都通过,也不能单独确定客户负债、谁掌握私钥,或资产是否受链下安排限制。

先确定输出,而非付款截图

从网络、交易标识、输出索引、数量和锁定脚本开始。一个outpoint由交易标识与输出索引共同组成。证明交易T包含于区块,并没有说明T的多个输出中,哪一个属于所研究的数量。

取得完整交易,独立定位输出,保留原始单位和脚本字节。浏览器展示的地址只是受支持脚本类型的一种呈现,不能替代输出本身。总输入可能同时形成付款、找零和其他输出,不能整笔归给一个接收者。

为当前状态问题指定截止区块哈希与高度,并写明是否把内存池中未确认的花费算作暂不可用。这个选择会改变观察结果,应随金额一起显示,不能藏在工具默认参数里。

gettxoutproof参考文档说明该方法提供交易被区块包含的证明,并提示交易索引或明确区块哈希可能影响取回。一条查询路径找不到交易,不等于交易从未确认。

把路径、链与未花费状态分开

Bitcoin Core三十版的verifytxoutproof说明还列出节点最佳链的要求。记录验证结果时,也保存节点所处链上下文。通向旧分支区块根的数学路径,与节点当前最佳链接受该区块,不是同一层判断。

再用同版本的gettxout文档核对指定输出。其include_mempool参数会影响未确认花费是否使输出不再出现。空值需要结合参数解释,不是关于资产去向的完整故事。

这些检查都是只读证据操作。重做者应能看到确切请求、参数、节点版本和截止点,明白为什么另一次查询不同。研究结论无需连接钱包、签名或广播交易。

假设主例:收到后又花费

设一段虚构、兼容比特币规则的历史,以下均为普通交易,不涉及coinbase成熟限制。高度一百时,交易T消费三个BTC,创建T的零号输出两个BTC,另建零点九九九九BTC输出,并支付零点零零零一BTC费用。

输入输出桥为:三等于二加零点九九九九加零点零零零一。因此,三个BTC输入的截图不能证明研究脚本收到三个BTC。需要核对的是特定两个BTC输出及其脚本。

高度一百一十时,交易U花费这个零号输出,生成一点五BTC给另一个接收脚本、零点四九九八BTC给找零脚本,并支付零点零零零二BTC费用。复算二等于一点五加零点四九九八加零点零零零二,旧输出已被完整消费。

观察点T在高度一百被包含零号输出链上未花费该旧输出当前代表数量
截止高度一百零五是是两个BTC
截止高度一百一十五是否零
截止高度一百二十是否零

到高度一百二十,证明仍可以正确描述这段历史中的包含事实,但不会让被消费输出重新出现。若仅因旧证明有效就报告当前有两个BTC储备,就把历史收款变成了现时库存。

表格也没有证明受研究者所有地址的总余额为零。新找零可能仍归其控制,也可能不归,假设尚未给出身份材料。若要纳入零点四九九八BTC,应另行确认新outpoint的归属和未花费状态,不能从金额相近直接推断。

沿消费关系对账,避免祖先后代双算

一个截止点的库存应列出被覆盖的不同未花费输出,各计一次。不能把T原先两个BTC加上U的新找零,因为旧输出正是生成新输出的来源。历史活动清单与截止库存清单需要分开。

反过来,一个输出已花费也不能让整笔交易中其他输出消失。如果T还创建另一个有独立归属证据的未花费输出,必须按其索引单独检查。交易级“已花费”标签过粗,不能替代输出级储备表。

设置明确过渡状态:已创建、已观察未花费、观察到待确认花费、确认花费、原因未明。若找到了花费交易,保存其输入对旧outpoint的显式引用;这比匹配相同金额、熟悉地址或交易时间接近更直接。

对于长期记录,应保留每次状态检查,而非覆盖旧列。比如高度一百零五时的两个BTC与高度一百二十时的零,都可能是当时正确观察。更新应写出消费事件,而不是把早期结果标成“错误余额”。

边界例:尚未确认的花费

回到U确认之前。假设该节点已在内存池看到U。排除内存池影响的查询仍可显示旧输出在链上未花费;包含内存池影响的查询则可能不再返回它。这两次响应可以同时正确,因为参数不同。

报告应写“在所选链上未花费,但本节点观察到待确认消费”,而非强行给一个没有口径的可用金额。未确认交易后来从内存池消失,也不单独证明已经撤销:它可能确认、被替换、被驱逐,或在节点重启后未再次出现。

另一个节点可能没有看到同样的待确认交易。因此保存节点身份、软件版本与观察时间;内存池是局部证据,不是全网首次广播证明,也不揭示持有人卖出或转移的意图。确认后,再用区块输入建立实际消费关系。

如果研究表同时保留“链库存”和“待确认花费覆盖”,两列可能出现重叠。不要将其相加,也不要把重叠当成重复资产;它们描述同一输出在不同结算阶段的状态。

边界例:旧分支与取回限制

若包含T的区块离开节点最佳链,保留其旧哈希与早期验证结果。证明字节可以没有变化,但与当前链的关系已改变。更新库存前,检查T是否又被新分支包含,或相关输出是否在新历史中存在。

裁剪节点、缺少索引、输出索引写错及网络选错,也都可能造成无可用响应。先分类取回失败,再判定是否花费。可以用适当配置的另一来源复查一个具体对象,却不能把每次冲突都简单替换成金额最大的那个结果。

查询实际链尖须匹配截止点

所读gettxout接口针对当前节点,不是任意历史区块余额查询。今天调用后贴上高度一百零五的旧日期,无法重建当时状态。应使用当时留存观察、适当重建的历史链状态,或另有明确依据的历史方法,并将取数方式写出来。

当前查询也可能在步骤之间跨过新区块。保存可用的响应bestblock和前后链尖观察;证明与未花费检查若指向不同状态,应对齐或标差距。空结果本身不含bestblock时,需额外保存周围节点上下文,不能凭一条null虚构精确快照身份。对严格截止库存,未能消除的跨块差距应保留为观察限制,而不是默默统一到较早时间。

合计存续清单前,统一原始单位。BTC显示和聪整数可能描述同一个输出,不能因此增加库存行;保留来源表示与换算值,让单位检查和outpoint去重都可重做。

可以逐项执行的核验表

操作必留材料支持的结论
解码T原始交易、输出索引指定数量与脚本的输出被创建
核包含证明、目标区块、验证结果T在规定条件下属于该区块
核链归属截止哈希、高度、节点状态区块属于选定最佳链视图
核零号输出明示内存池参数和响应指定口径下是否未花费
找消费U输入对旧outpoint的引用确切消费关系
合计库存不同存续outpoint清单被覆盖且带归属假设的未花费数量

链重组、新花费确认、脚本归属更正或索引缺口发现,都会触发重核。发布带日期的库存,并将未解决输出保留为可追踪项目。包含证明即使不再支持当前余额,仍是有用历史材料,不必删除。

常见问题

gettxoutproof的名字是否意味着证明输出未花费?

不是。该方法说明的是交易包含;当前输出状态需要另查。

gettxout为空能否证明整个钱包已空?

不能。它只针对指定outpoint和参数,应解释缺失原因,并另查其他有归属证据的输出。

相关阅读