跳转到正文
buybitcoinsmart

术语表 /交易与手续费

序列化交易

又称原始交易。

序列化交易是什么?
序列化交易是钱包交给网络的确切字节串,即十六进制形式,每个节点都会对其进行解析、计算哈希并转发,且不会改动其中任何一个字节。

规定于 BIP-144。

交易中所有看起来友好的内容,如地址、以本地货币显示的金额和标签,都是钱包添加的装饰。真正传输的是一段紧凑的二进制数据,简单支付通常为200至250字节,并且完全自成一体。将这段十六进制数据从离线计算机复制到任何一台联网计算机上,即可从那里广播这笔支付。

运作方式

序列化采用固定顺序,没有字段名,因此解析器完全依赖位置和长度前缀。

数据以4字节的版本号开头。隔离见证交易随后会插入两个标志字节0x00 和0x01,旧版解析器会把它读作输入数为零的交易并因此拒绝,这是一个有意为之的设计,使新格式得以与旧格式共存。接下来是以 compactSize 整数表示的输入数量,然后是每个输入:36字节,指明被花费的币;带长度前缀的解锁脚本;以及4字节的序列号。随后是输出数量,再是每个输出:8字节的聪金额,加上带长度前缀的锁定脚本。见证数据(如有)位于接近末尾处,最后4个字节始终是锁定时间。

数字以小端序存储,即最小字节在前,因此100,000聪的金额在十六进制中显示为 a0 86 01 00 00 00 00 00。哈希以内部字节序存储,与区块浏览器显示的顺序相反,因此原始数据中的交易 ID 看起来是倒过来的。

这一个结构会产生两个哈希。交易 ID 是对去掉标记、标志和见证数据后的序列化内容计算的双重 SHA-256,这使得签名不会在事后被篡改。见证交易 ID 在 BIP141 中定义,对包含见证数据的整个内容计算哈希,节点用它来记录转发情况。一笔1个输入、2个输出的原生 SegWit 支付序列化后约为222个原始字节,计为大约141个虚拟字节,因为见证部分享有折扣。

在哪里会遇到它

一旦离开单一应用,原始形式就会出现,对大多数人来说,这意味着离线签名或补救一笔支付。

硬件钱包和气隙隔离的配置会把已完成的交易导出为十六进制,或导出为包含相同字节的二维码,您将其粘贴到区块浏览器的广播表单中即可发送。Bitcoin Core 的命令行双向都会用到它:createrawtransaction和signrawtransactionwithwallet生成十六进制数据,decoderawtransaction把十六进制数据转回可读的 JSON,sendrawtransaction则将其发送到网络。技术支持工单常常要求提供原始十六进制数据,而不是交易 ID,因为十六进制数据能证明交易包含的内容,而不只是给出其名称。

一条安全提示。已签名的原始交易具有不记名凭证的性质:任何拥有这段十六进制数据的人都可以广播它,其中没有任何内容是保密的。除非您接受这笔支付被执行,否则请勿在求助时把它粘贴到公开论坛。

序列化交易 vs 交易 ID

序列化交易是文件本身,交易 ID 是它的文件名。前者是几百字节的十六进制数据,在屏幕上可长达五百个字符,后者则始终恰好是64个十六进制字符。

人们容易混淆两者,因为它们看起来都是很长的十六进制字符串。区分的办法是看长度以及这串字符能做什么。64个字符的字符串只能用于在区块浏览器中查询,别无他用。更长的字符串可以被解码为各个字段,如果已完成签名,任何持有它的人都可以将其广播,包括您把它发送给的陌生人。

请勿混淆

常见问题

任何人都可以广播我分享给他们的已签名原始交易吗?

可以。已完整签名的序列化交易是完整的,提交时无需任何许可,因此请像对待已签名的支票一样对待这段十六进制数据。把它发在公开帖子里,等于把这笔支付交给第一个复制它的人。

为什么原始十六进制数据中的交易 ID 看起来是倒过来的?

因为哈希以内部字节序存储,与区块浏览器显示的顺序相反。两者描述的是同样的32个字节,解码器在输出 ID 时都会替您把顺序翻转过来。

相关术语

交易与手续费中的更多术语

阅读本页英文版