解密比特币交易规格计算,大小、权重与费用背后的逻辑
摘要:比特币,作为首个成功的去中心化数字货币,其核心在于点对点的价值转移,每一笔比特币交易都被记录在公开的区块链上,而交易的“规格”——包括其大小、权重以及由此产生的费用——是确保网络高效、安全运行的关键要...
比特币,作为首个成功的去中心化数字货币,其核心在于点对点的价值转移,每一笔比特币交易都被记录在公开的区块链上,而交易的“规格”——包括其大小、权重以及由此产生的费用——是确保网络高效、安全运行的关键要素,理解比特币交易规格的计算方法,对于用户优化交易成本、开发者构建应用以及深入理解比特币协议都至关重要,本文将详细拆解比特币交易规格的计算逻辑。
比特币交易的基本构成
在深入计算之前,我们先简要回顾一笔比特币交易的基本结构,一笔典型的比特币交易包含以下几个部分:
- 版本号 (Version):交易遵循的协议版本。
- 输入 (Inputs):指该笔交易消耗的之前未花费的交易输出(UTXO),每个输入包含:
- 前一笔交易的哈希值(Outpoint)
- 前一笔交易输出的索引(vout)
- 解锁脚本(ScriptSig):满足前一笔交易输出锁定条件的脚本。
- 序列号(Sequence):用于相对锁定时间等高级功能。
- 输出 (Outputs):指该笔交易创建的新UTXO,每个输出包含:
- 锁定脚本(ScriptPubKey):定义了谁可以花费这笔资金,通常包含接收地址的公钥哈希或其他脚本条件。
- 数额(Value):以聪(satoshhi,1比特币=1亿聪)为单位的金额。
- 锁定时间 (Locktime):交易最早可以被纳入区块的时间(区块高度或Unix时间戳)。
交易大小 (Transaction Size) 的计算
交易大小是最直观的规格指标,它指序列化后的交易数据所占用的字节数,比特币网络对交易大小有限制(目前默认最大为1,000,000字节,即1MB),超过此限制的交易不会被传播和打包。
计算方法:
交易大小是其所有组成部分序列化后字节数的总和,比特币使用一种叫做“变长整数 (VarInt)”和“变长字符串 (VarString)”的编码方式来表示长度可变的字段。
- 版本号 (Version):4字节。
- 输入数量 (Input Count):使用VarInt编码,VarInt的字节数取决于数值大小:
- 0-252:1字节
- 253-65535:3字节(首字节为0xFD,后跟2字节数值)
- 65536-4294967295:5字节(首字节为0xFE,后跟4字节数值)
- 更大:9字节(首字节为0xFF,后跟8字节数值) 通常交易输入数量不会太大,多为1字节。
- 每个输入 (Each Input):
- 前一笔交易哈希 (Previous Tx Hash):32字节
- 前一笔交易输出索引 (Previous Tx Output Index):4字节
- 解锁脚本长度 (ScriptSig Length):VarInt编码
- 解锁脚本内容 (ScriptSig):实际字节数(长度由上一项决定)
- 序列号 (Sequence):4字节
- 输出数量 (Output Count):同样使用VarInt编码,通常也为1字节。
- 每个输出 (Each Output):
- 数额 (Value):8字节
- 锁定脚本长度 (ScriptPubKey Length):VarInt编码
- 锁定脚本内容 (ScriptPubKey):实际字节数(长度由上一项决定)
- 锁定时间 (Locktime):4字节
示例简化计算: 假设一笔交易有1个输入,1个输出。
- 版本号:4字节
- 输入数量:VarInt(1) = 1字节
- 输入:
- 前一笔交易哈希:32字节
- 输出索引:4字节
- 解锁脚本长度:假设解锁脚本为73字节,VarInt(73) = 1字节(因为73 < 252)
- 解锁脚本:73字节
- 序列号:4字节
- 小计:32+4+1+73+4 = 114字节
- 输出数量:VarInt(1) = 1字节
- 输出:
- 数额:8字节
- 锁定脚本长度:假设锁定脚本为25字节,VarInt(25) = 1字节
- 锁定脚本:25字节
- 小计:8+1+25 = 34字节
- 锁定时间:4字节
总交易大小 ≈ 4 + 1 + 114 + 1 + 34 + 4 = 158字节
实际交易中,脚本长度变化较大,因此交易大小也各不相同。
交易权重 (Transaction Weight) 的计算
随着隔离见证(SegWit)的引入,比特币的交易结构发生了变化,SegWit将签名等数据从“传统交易数据”部分移到了“见证数据”部分,这使得交易在网络传播和存储时更加高效。
为了兼容旧有的基于交易大小的限制机制,同时体现SegWit的优势,引入了“交易权重”的概念。
核心概念:
- 区块权重单位 (WU, Weight Unit):对于SegWit交易,1字节的传统交易数据(非见证数据)等于1个权重单位,1字节的见证数据等于4个权重单位。
- 基础权重 (Base Weight):交易中非见证数据部分的大小(字节)乘以1。
- 总权重 (Total Weight):基础权重 + (见证数据大小(字节)乘以4)。
计算方法:
-
确定传统交易数据(非见证数据)大小: 这部分包括版本号、输入数量、每个输入的前一笔交易哈希、输出索引、序列号、输出数量、每个输出的数额、锁定时间,但不包括输入的解锁脚本(ScriptSig)。 在SegWit交易中,解锁脚本被替换为一个“见证数据指示器”(通常是0x00,表示有见证数据,且长度由输入中的witness字段指定)。
-
确定见证数据大小: 见证数据包含每个输入的见证脚本(Witness Script)和签名等,其长度也是用VarInt编码的。
-
计算基础权重:传统交易数据的大小(字节)。
-
计算见证权重:见证数据的大小(字节)乘以4。
-
计算总权重:基础权重 + 见证权重。
SegWit交易大小限制: 一个区块的最大权重为4,000,000 WU,单个交易的最大权重不能超过区块最大权重的25%(即1,000,000 WU),除非是区块的第一笔交易(coinbase交易)。
为什么是1:4的比例? 这相当于将SegWit交易的“有效数据大小”视为其传统部分加上见证部分的1/4,这样设计是为了确保SegWit交易在存储和带宽占用上不会对旧节点造成过大负担,同时又能享受SegWit带来的扩容益处。
交易费用 (Transaction Fee) 的计算
交易费用是用户为了激励矿工将交易打包进区块而支付的费用,比特币网络中的交易费用主要取决于交易占用的“区块空间”大小。
计算方法:
在SegWit时代,费用更准确地说是基于交易的总权重来计算的。
-
费率 (Fee Rate):用户愿意支付的单位费用,通常以“聪/字节”(sat/B)或更精确的“聪/权重单位”(sat/WU)表示,使用sat/WU能更公平地反映SegWit交易的实际成本。
10 sat/B = 10 sat/weight unit * (1 traditional byte + 4 witness bytes) / (1 traditional byte + 1 witness byte) ≈ 13.33 sat/WU (这是一个简化理解,实际费率直接按sat/WU设定更清晰)
-
交易费用 (Fee):
- 基于传统大小(旧方式,不推荐用于SegWit交易精确计算):
Fee = 交易大小 (字节) * 费率 (sat/字节) - 基于总权重(推荐方式):
Fee = 交易总权重 (WU) * 费率 (sat/WU)
- 基于传统大小(旧方式,不推荐用于SegWit交易精确计算):
示例: 假设一笔SegWit交易:
- 传统数据大小:150字节
- 见证数据大小:50字节
- 总权重 = 150 1 + 50 4 = 150 + 200 = 350 WU
- 费率设定为 5 sat/WU
- 交易费用 = 350 WU * 5 sat/WU = 1750 聪 =
