一句话先说清
一笔比特币交易是一句话:“把前面某些交易的某些输出,用解锁证据打开,重新锁定给新的条件。”整条消息只有四类字段:版本、输入列表、输出列表、锁时间。没有付款人、没有收款人、甚至没有金额——金额由被引用的旧输出决定,手续费则用“输入总额减输出总额”的差额隐式结算。
版本
第一个字段是版本号(4 字节)。它还兼做扩展标记:见证数据的有无通过标志位体现在这条交易的序列化格式里。版本本身基本不动,多年不变。
输入列表:旧输出的收货单
每个输入包含四项。前一交易哈希(32 字节)加输出序号(4 字节):这是全部重点——比特币没有“账户余额”概念,你花的每一分钱都必须指名道姓引用“哪笔交易第几个输出还没被花”。“脚本签名字段”装解锁证据:通常是签名和公钥,SegWit 之后见证数据搬到了单独区域,这个字段对常见类型只剩近乎空的占位。序号(sequence):当年为“可替换交易”预留,今天它的主要职业是配合 RBF 信号和相对时间锁;一笔交易所有输入序号都取最大值时,才意味着不可替换的默认约定(具体信号规则各家钱包默认不同,配置前查文档)。
输出列表:钱真正住的地方
每个输出只有两项:金额(8 字节,单位聪)和锁定脚本。锁定脚本写的是“谁能怎么取走这笔钱”——最常见的模板是“给能拿出某公钥对应签名的人”,也可以是多签门限、时间锁组合或更复杂的条件。注意输出不是“记录了一次转账”,而是一个独立的、可被未来交易引用的对象。所谓“余额”,是钱包扫描全链后把所有还归属你的未花输出加总的幻觉;一笔两输出的交易里,哪个是给你的找零、哪个是给对方的货款,链上没有任何字段说明——这个歧义正是当年“找零归属猜测”隐私问题的来源。
锁时间与手续费
锁时间(locktime,4 字节)设定“早于某个区块高度或时间戳,本交易无效”。设为零是立即有效;非零时它既能做定时支付,也能做费用狙击等链上博弈的道具——具体攻防案例已有专文,此处不展开。手续费 = 输入引用的金额总和 − 输出金额总和,矿工会在打包时顺手收走。也正因为手续费是减法算出来的,钱包挑币(coin selection)策略影响费率与隐私:挑多了输入膨胀,挑少了留下碎找零。
对照区块浏览器
把浏览器页面对回字段:TxID 是整条交易序列化后的哈希;Inputs 区每行显示“引用交易:序号 → 解锁证据”;Outputs 区每行显示“金额 + 锁定脚本类型(P2PKH/P2WPKH/P2WSH 等)”;确认数与高度不是交易字段,是链对它做了什么。看懂这页,你就从“我转了一笔币”升级为“我声明了哪些币的归属变更”。
一个自查练习
打开任意区块浏览器,随便挑一笔多输入交易,数一数输入里引用的旧交易有几笔、输出里有没有金额“看起来不像货款”的那一项——那大概率是找零。再点开它的“原始数据”标签,对照本文顺序找出版本、计数、序号与 locktime。五分钟做完一次,你对“钱在链上如何流动”的理解就不再依赖任何人的比喻。
快速问答
问:为什么改不了交易金额?答:金额在引用的旧输出里,旧交易已被埋进链里;想改变金额只能重做交易本身——换找零、换输入、换手续费,换完 TxID 就变了。
问:见证数据去哪了?答:SegWit 把签名等见证内容移出原始序列化,单独计入隔离见证数据区,老软件计算哈希时看不到它们——这也顺带修掉了一类交易延展性。
常见误区
一是把交易想成“发送指令”,它是归属声明,不指向任何人;二是以为输入里写金额,其实输入只是指针;三是把序号当“有效期”,它是可替换信号与相对时间锁的载体,和 locktime 的绝对时间语义不同。
风险提示:本文为协议机制科普,不构成任何投资建议;钱包签名策略请以所用钱包文档为准。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。