最初讓我關注到比特幣的 Dust Limit, 是因為比特幣銘文。按說比特幣銘文是和一個獨立的 Sat(聰) 關聯在一起的,為啥銘文的大小不是一個 Sat(聰) 而是不同的數量呢?最近再次關注到這個問題,是因為所參與的比特幣生態跨鏈橋項目,用戶要將一些銘文從比特幣二層提到他的一層比特幣 bc1p 地址時竟然提幣失敗了,因為那些銘文所在 UTXO 的值為 294,為什么?
0x01 什么是比特幣 Dust
比特幣 Dust 也經常被稱為比特幣粉塵。當比特幣 UTXO 所帶的值太小,以至于單獨花費這個 UTXO 所要花的礦工費比這個值還要大時,就可以稱這個 UTXO 為比特幣粉塵。這是個非?;\統的概念,因為礦工費隨著網絡擁堵情況時高時低,這里沒有明確多大的 UTXO 算是粉塵。
花費或產生 Dust UTXO 的交易稱為粉塵交易,除了正常找零,這些交易基本都可以認為是徒增節點負擔的無價值交易,大量的粉塵交易產生時很多時候就稱這個網絡受到了粉塵攻擊。
0x02 什么是比特幣 Dust Limit
比特幣網絡本身肯定都不希望有太多粉塵。于是就對 UTXO 的最小值加了一個限制,這個限制值就是比特幣 Dust Limit。當某一筆交易的 input/output 包含小于 Dust Limit 的 UTXO 時,節點回報錯并拒絕接收這筆交易。
Dust Limit 設為多少合理呢?
因為比特幣的礦工費都是由交易大小確定的,Dust Limit 的值也和交易大小有關,下面是計算 Dust Limit 的一個公式:
dust limit = (input_vsize + output_size) × dustRelayFee/1000
dustRelayFee 是比特幣節點可以設置的一個值,默認為 3000,所以上面的那個公式也可以變為
dust limit = (input_vsize + output_size) × 3
這里的 output_size 為一個 output 的大小,input_vsize 為消費這個 output 所需要的 input 的大小
因為不同比特幣地址類型所構造的交易的 input 和 output 大小不同,導致不同地址類型的 Dust Limit 也不同
- P2PKH 地址 ('1' 開頭): 546
- P2SH-P2WPKH 地址 ('3' 開頭): 540
- P2WPKH 地址 ('bc1q' 開頭): 294
- P2TR 地址 ('bc1p' 開頭): 330
0x03 比特幣 Dust Limit 要注意什么呢
首先,小于這個值的 UTXO 是花不出去的,這也是為什么銘文 UTXO 很多都是帶有 546 聰甚至更多聰 BTC 的原因
其次,這個值的大小是和地址類型相關聯的。怎么理解呢?比如我現在有個 294 聰的銘文在我的 bc1q 地址上,但你的地址是是 bc1p 開頭的 P2TR 地址,我是沒辦法把這個銘文直接轉給你的。你要準備一個 bc1q 的地址才好接收那個 294 聰大小的銘文。
0x04 總結
- 要記住不同地址類型的 Dust Limit, 也就是最小 UTXO 大小的限制。
- 接收銘文用 bc1q 開頭的地址是最保險的,可以接收任意大小的銘文
- 鑄造銘文的時候 546 聰大小的 UTXO 兼容性最好,任何地址類型都可以支持。
- 還補充一點兒,OP_RETURN 指令可以打破這個限制,這個有空再聊。