讨论比特币交易尺寸时,大家盯着的都是上限:区块权重、标准交易权重上限。但源码里还有一条反方向的规定——交易也不能太小。非见证序列化部分低于 65 字节的交易,默认不会进内存池、不会被中继。这条”地板线”很少有人解释,而它和常被提到的尘埃规则其实是同一套防御的两个面。
65 字节出自哪条规则
先分清两层规则。共识层只管交易不能太大:consensus/tx_check.cpp 里对交易尺寸的唯一直接检查是非见证序列化体积乘以见证放大系数不得超过区块权重上限,另有输入输出不得为空等结构检查——共识层没有最小尺寸概念。
政策层才设地板:policy/policy.h 定义 MIN_STANDARD_TX_NONWITNESS_SIZE 为 65,注释写得很直白——“比 64 大一”。IsStandardTx 会先量一遍交易的非见证部分,低于这个值就以”tx-size-small”为由拒收。这个值来自早年一个专门防小型垃圾交易的常量,故意取 64 的下一位。
于是同一笔交易会有两种命运:塞进区块里,它是合法的,矿工愿意打包就永远合法;想让节点帮你中继,就必须过标准政策这一关。钱包默认都不中继非标准交易,所以这类交易实际上只能靠付费给直接收录它的矿工出块。

为什么要防”小”
直觉上交易越小越省空间,怎么会是问题?因为成本不对称。每笔交易无论多小,都要在UTXO集合里登记新的输出、在节点内存里挂一条索引记录、在传播时占一次带宽和一次校验。1 字节的交易不是”便宜”,而是把验证与存储成本转嫁给全网。若不设地板,理论上可以批量构造极小交易把节点内存和索引结构塞满,这是一种用合法手段实施的资源消耗攻击。地板线把”每笔交易至少承载多少真实价值载体”钉在一个合理的下限上。
与尘埃规则的分工
地板线管整笔交易的非见证体积,尘埃规则管单个输出的价值:按默认尘埃费率,一个输出如果把它自己花出去还要付出比自身面值更高的成本,就被认定为尘埃,标准交易不允许携带。两者配合后,“小交易”的两个维度——结构上和金额上——都封住了。尘埃费率本身是可配置的,源码注释特意警告:改动尘埃线会改变哪些交易算标准,历史上宁可保持不动也不轻易调整,因为这直接影响中继行为的一致性。
尘埃线的具体数字
尘埃判定按输出的序列化体积加上一个典型输入的花费成本、再乘尘埃费率来算门槛。源码注释给了现成例子:典型非见证输出约 34 字节、花它至少要挂 148 字节输入,按默认费率折算出 546 聪的门槛;见证版的 P2WPKH 输出约 31 字节、输入约 67 字节,门槛降到 294 聪。低于对应门槛的输出,标准钱包会直接拒绝构造携带它的交易,有的实现选择把它并进手续费。65 字节地板和这几百聪量级的门槛,一个防结构上畸形、一个防金额上畸形,两套参数共同构成”标准”二字在尺寸维度的完整定义。
实际会碰到吗
普通钱包交易远大于这条线:光一个输入一个输出的非见证骨架就远超 65 字节。真正容易撞到它的场景是两类:一是手工构造的极端测试交易;二是把输出拆得极碎、每个输出都接近尘埃线的操作——这类交易不仅可能被拒,即便上链也会永久拖累全节点的UTXO集合体积,是公论上的不友好行为。对普通用户的启示很朴素:不要为了”省空间”去做碎片化输出,省下的那一点体积会变成别人服务器里多出来的永久负担。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。