SegWit地址交易虚拟大小计算疑问:公式与工具结果不符
嘿,这个问题问得太戳痛点了——我当初刚接触SegWit费用计算时也踩过一模一样的坑,咱们把这事掰碎了说清楚:
为什么你用的简化公式和工具结果对不上?
首先得明确那个简化公式的本质:它是极度简化的“一刀切”版本,只适用于特定理想场景,完全没考虑实际交易中脚本类型的差异,这就是核心矛盾:
- 硬编码了输入输出的权重值:公式里的
272其实是「原生P2WPKH输入」的总权重,128对应哪种输出类型都存疑(反正和工具默认的类型不匹配)。但实际交易中你可能用的是嵌套SegWit(P2SH-P2WPKH)输入、P2PKH输出这些,权重和公式假设的完全不一样。 - 存在笔误+忽略取整规则:你说的是1输入2输出,但代入时写的是
128×3,这本身就会导致结果偏差;另外比特币网络的虚拟大小(vsize)要求向上取整到整数,比如174.5会被算成175,但原公式直接输出了小数,而在线工具是严格遵循取整规则的。 - 头部权重的错误假设:公式里的
42也很可疑——标准SegWit交易的头部权重应该是40,这明显是原教程为了简化做的近似,放到实际场景里就不准了。
正确的SegWit交易虚拟大小计算方法
要准确计算vsize,必须拆解交易的每个部分,按照SegWit的权重规则(非见证字节×4,见证字节×1)来计算总权重,最后除以4并向上取整。我给你一步步拆解:
第一步:明确交易的核心组成部分
任何比特币交易都由这几块构成:
- 交易头部:版本、输入计数、输出计数、锁定时间
- 输入集合:每个输入分「非见证部分」(所有交易都有)和「见证部分」(仅SegWit交易有)
- 输出集合:每个输出的脚本字节
- 见证数据:所有输入的见证字段总和(SegWit专属)
第二步:分部分计算权重
1. 交易头部权重
字节数是4(版本)+1(输入数)+1(输出数)+4(锁定时间)=10字节,权重固定为 10×4=40(这是标准值,没有例外)
2. 输入权重(按类型区分)
不同输入类型的字节数差异很大,举几个最常用的:
- 原生P2WPKH输入(纯SegWit):
非见证部分:32(前序交易哈希)+4(前序输出索引)+1(解锁脚本长度为0)+4(sequence)=41字节 → 权重41×4=164
见证部分:2(见证元素数)+1(签名长度)+71(签名)+1(公钥长度)+33(公钥)=108字节 → 权重108×1=108
单输入总权重:164+108=272(这就是你那个公式里272的来源!) - 嵌套SegWit输入(P2SH-P2WPKH):
非见证部分多了一段解锁脚本,总字节数63 → 权重63×4=252
见证部分和原生P2WPKH一致为108字节 → 权重108
单输入总权重:252+108=360 - 普通P2PKH输入(非SegWit):
没有见证部分,非见证字节数148 → 权重148×4=592
3. 输出权重(按类型区分)
输出没有见证部分,所有字节都按×4计算:
- P2WPKH输出:22字节 → 权重
22×4=88 - P2PKH输出:24字节 → 权重
24×4=96 - P2SH输出:23字节 → 权重
23×4=92
4. 计算总权重和虚拟大小
总权重 = 头部权重 + 所有输入权重之和 + 所有输出权重之和
虚拟大小(vsize)= ceil(总权重 ÷ 4) (必须向上取整到整数,比特币网络按整数vsize收取手续费)
举个实际例子
比如你要算1输入2输出的交易,用原生P2WPKH输入 + 两个P2WPKH输出:
- 头部权重:40
- 输入权重:272
- 输出权重:88×2=176
- 总权重:40+272+176=488
- vsize:488÷4=122(整数,直接使用)
如果换成嵌套SegWit输入 + 两个P2PKH输出:
- 头部权重:40
- 输入权重:360
- 输出权重:96×2=192
- 总权重:40+360+192=592
- vsize:592÷4=148
总结一下
你用的那个公式是原教程为了方便理解做的极度简化版,只适用于「原生P2WPKH输入+某特定输出类型」的理想场景,完全不考虑实际交易中脚本类型的多样性。而在线工具会根据你选择的输入输出类型自动计算对应权重,再严格遵循取整规则,所以结果自然和简化公式对不上。
内容的提问来源于stack exchange,提问作者timothyylim
相关产品推荐
相关产品推荐

