{"author":{"address":"0x53b322DcdFEb07de5510facc37797D013292c54F","user":"https://learnblockchain.cn/people/29"},"content":{"body":"\u003e 最初让我关注到比特币的 Dust Limit, 是因为比特币铭文。按说比特币铭文是和一个独立的 Sat(聪) 关联在一起的，为啥铭文的大小不是一个 Sat(聪) 而是不同的数量呢？最近再次关注到这个问题，是因为所参与的比特币生态跨链桥项目，用户要将一些铭文从比特币二层提到他的一层比特币 bc1p 地址时竟然提币失败了，因为那些铭文所在 UTXO 的值为 294，为什么？\r\n\r\n## 0x01 什么是比特币 Dust\r\n比特币 Dust 也经常被称为比特币粉尘。当比特币 UTXO 所带的值太小，以至于单独花费这个 UTXO 所要花的矿工费比这个值还要大时，就可以称这个 UTXO 为比特币粉尘。这是个非常笼统的概念，因为矿工费随着网络拥堵情况时高时低，这里没有明确多大的 UTXO 算是粉尘。\r\n花费或产生 Dust UTXO 的交易称为粉尘交易，除了正常找零，这些交易基本都可以认为是徒增节点负担的无价值交易，大量的粉尘交易产生时很多时候就称这个网络受到了粉尘攻击。\r\n\r\n## 0x02 什么是比特币 Dust Limit\r\n比特币网络本身肯定都不希望有太多粉尘。于是就对 UTXO 的最小值加了一个限制，这个限制值就是比特币 Dust Limit。当某一笔交易的 input/output 包含小于 Dust Limit 的 UTXO 时，节点回报错并拒绝接收这笔交易。\r\n\r\nDust Limit 设为多少合理呢？\r\n\r\n因为比特币的矿工费都是由交易大小确定的，Dust Limit 的值也和交易大小有关，下面是计算 Dust Limit 的一个公式：\r\n```\r\ndust limit = (input_vsize + output_size) × dustRelayFee/1000\r\n\r\n```\r\ndustRelayFee 是比特币节点可以设置的一个值，默认为 3000，所以上面的那个公式也可以变为\r\n```\r\ndust limit = (input_vsize + output_size) × 3\r\n```\r\n这里的 output_size 为一个 output 的大小，input_vsize 为消费这个 output 所需要的 input 的大小\r\n\r\n因为不同比特币地址类型所构造的交易的 input 和 output 大小不同，导致不同地址类型的 Dust Limit 也不同\r\n\r\n* **P2PKH 地址 ('1' 开头):** 546\r\n* **P2SH-P2WPKH 地址 ('3' 开头):** 540\r\n* **P2WPKH 地址 ('bc1q' 开头):** 294\r\n* **P2TR 地址 ('bc1p' 开头):** 330\r\n\r\n## 0x03 比特币 Dust Limit 要注意什么呢\r\n首先，小于这个值的 UTXO 是花不出去的，这也是为什么铭文 UTXO 很多都是带有 546 聪甚至更多聪 BTC 的原因\r\n其次，这个值的大小是和地址类型相关联的。怎么理解呢？比如我现在有个 294 聪的铭文在我的 bc1q 地址上，但你的地址是是 bc1p 开头的 P2TR 地址，我是没办法把这个铭文直接转给你的。你要准备一个 bc1q 的地址才好接收那个 294 聪大小的铭文。\r\n\r\n## 0x04 总结\r\n1. 要记住不同地址类型的 Dust Limit, 也就是最小 UTXO 大小的限制。\r\n2. 接收铭文用 bc1q 开头的地址是最保险的，可以接收任意大小的铭文\r\n3. 铸造铭文的时候 546 聪大小的 UTXO 兼容性最好，任何地址类型都可以支持。\r\n4. 还补充一点儿，OP_RETURN 指令可以打破这个限制，这个有空再聊。","title":"关于比特币 Dust Limit"},"history":null,"timestamp":1726207092,"version":1}