比特币交易的原始字节长什么样:序列化格式逐段解剖 图 1
比特币交易的原始字节长什么样:序列化格式逐段解剖 · 图 1

一、被哈希的那串字节

每笔交易的 txid 都是对它做序列化后连续两次 SHA-256 的产物。换句话说,理解 txid 的唯一路径是理解序列化:节点之间传递的并不是某个抽象对象,而是一段有严格字段的字节流,任何一个字节的歧义都会把全网劈成两条对同一笔交易各执一词的链。下面按读取顺序走一遍这趟字节流水线。

比特币交易的原始字节长什么样:序列化格式逐段解剖 图 2
比特币交易的原始字节长什么样:序列化格式逐段解剖 · 图 2

二、头部与清单计数

交易以 4 字节版本数开头(小端序),它的含义是共识规则的”使用哪一版语法”声明。紧跟的是数量字段:比特币用可变长度整数(varint)编码”有几笔输入""有几笔输出”——数值 253 以内单字节直写,更大者用前导的 FD、FE、FF 引出后续字节。清单之后逐条展开输入:每条输入先是 36 字节的引用(32 字节前手交易哈希加 4 字节输出序号),再加 1 字节到若干字节的解锁脚本(长度同样由 varint 领路),最后 4 字节序列号。输出镜像了这种结构但换成了 8 字节金额(小端的聪数)加变长锁定脚本。收尾是 4 字节锁定时间。整条流水线没有任何”手续费”字段——费用永远是输入金额减输出金额的差额,这种”零字段设计”让序列化保持最小,代价是把核对账单的责任交给钱包界面。

三、隔离见证补丁式的路标

带见证的交易在版本数之后、输入计数之前插入两字节标记(0x00 0x01),老解析器读到它会困惑,因此计算 txid 时要把这段见证数据整体挖掉——这正是”同一条数据流两个哈希”(txid 与 wtxid)的由来。每条输入的解锁脚本位置在带见证版本里放一个 0x00 长度的占位,真正的栈项挪进交易尾部的见证列表,见证脚本自己内部再套一层 varint 数组。读取顺序因此分成新旧两条路:先嗅探标记字节,再决定走老式直读还是新式带见证读法。

四、字节账本与权重折价

序列化直接决定手续费账单的口径:基础部分(挖去见证的字节)按 4 倍计权,见证字节按 1 倍计权,相加除以 4 得到虚拟字节。同一笔转账,把签名从脚本里搬进见证区,等于把大部分签名开销从”四倍汇率”换成”一倍汇率”——这是地址迁移省手续费的字节级解释。脚本长度前缀也有硬上限:脚本本身与脚本栈项各有协议规定的字节天花板,抄错一个公钥多出或少出的字节会在算错哈希前先在解析阶段暴露。

五、动手核对一次

最扎实的学习方式是给自己造一笔小额交易,把 getrawtransaction 返回的裸十六进制打印出来,对照上面的顺序逐字段用铅笔划线:版本、varint、引用、序列号、金额、锁定时间,一笔一笔对上再广播。工具链层面,序列化是 PSBT 字段、钱包导入导出与所有区块浏览器共同的底层方言,理解了它,你在任何一层看到的”交易”都不再是黑盒,而只是一条你亲手量过尺寸的字节流水线。

六、标志字节与向前兼容的小字

交易格式的每个扩展位都藏着同款设计:版本字段给软分叉留语义空间,标记字节给见证留位置,锁定时间字段用两个解释域(高度或时间戳)以 5000 万这个阈值为界自描述。还有一条容易被略过的规则——当序列号与锁定时间同时”非最终”时,时间锁才真正生效;序列化只负责把这些字段如实摆出来,语义判定发生在验证器里。读到这里你应该能复述那句总结:序列化是宪法级的字节合同,改动任何一条都等价于分裂全网对 txid 的共识。想再深一层,可以拿同一笔交易分别用有见证与无见证两种读法序列化,对比两个哈希,亲手确认 txid 与 wtxid 的分叉点——那是理解隔离见证全部工程取舍的最短路径,十五分钟,一次 getrawtransaction,胜过十篇二手讲解。