作者:Gregory Sanders
來源:https://bitcoinops.org/en/bitcoin-core-28-wallet-integration-guide/
Bitcoin Core 28.0 包含了一些新的 P2P 和交易池條款特性,可能對一些錢包和交易類型有用。Gregory Sanders 給出了一份概要的指南,介紹了這些新特性以及單項或集體使用它們的方法。
一父一子(1P1C)交易包轉發
在 Bitcoin Core 28.0 以前,每一筆交易都必須達到或者超過一個節點的交易池動態最低費率,才能進入這個節點的交易池。這個數值(最低費率)大體上會隨著交易的擁塞而上漲和回落,從而為交易的傳播創造一個浮動的地板價格。這一機制,給處理預簽名交易且無法簽名替代交易的錢包帶來了極大的困難,因為它們將不得不預測:當這筆預簽名的交易需要確認的時候,交易傳播的地板價會變成什麼樣。即便是幾分鐘之後的情形,也難以預測;如果時間跨度超過幾個月,那顯然是不可能的。
“交易包轉發” 是一項人們夢寐以求的功能,可以緩解這種交易因為缺乏手續費追加能力而無法得到確認的風險。一旦得到合理的開發並在網絡中廣泛部署,交易池轉發將允許錢包開發者通過另一筆相關的交易來為某一筆交易支付手續費,從而,低手續費的祖先交易也可以進入交易池。
Bitcoin Core 28.0 為包含一筆父交易和一筆子交易的交易包(“1P1C”)實現了交易包轉發的一種受限制的變種。1P1C 允許一筆父交易進入交易池,無論該父交易是否達到了交易池的動態最低費率,只要一筆子交易在為它應用簡單的 “子為父償(CPFP)” 手續費追加。如果子交易還有額外的未確認父交易,那麼這些交易都不會在 1P1C 的規則下得到轉發。這種限制極大地簡化了實現,並允許交易池的其他設計(比如 “族群交易池”)得到應用,同時依然能滿足大量的應用場景。
除非交易的版本是 “TRUC 交易”(詳見下文),在 1P1C 規則下傳播的交易依然必須滿足 靜態的 每一虛擬字節支付 1 聰的費率下限。
關於這項特性的最後一個警告是,本版本的傳播保證也是受限的。如果一個 Bitcoin Core 節點連接到了一個足夠強硬的敵手,敵手可以打破父子交易對的傳播。交易包轉發的額外補強措施,作為一個項目,還在繼續開發。
通用的交易包轉發留待未來實現,並且需要得到來自受限的交易包轉發及其在網絡中被採用的信息。
此處是在一個 regtest 環境中建立一個演示 1P1C 轉發的錢包的命令:
bitcoin-cli -regtest createwallet test{ "name": "test"}# 獲得一個自己給自己支付的地址bitcoin-cli -regtest -rpcwallet=test getnewaddressbcrt1qqzv3ekkueheseddqge3mqdcukse6p9d5yuqxv3# 創建一筆費率低於最低轉發費率(“minrelay”)的交易bitcoin-cli -regtest -rpcwallet=test -generate 101{[...]}bitcoin-cli -regtest -rpcwallet=test listunspent[ { "txid": "49ea7a01bcba744bd82ecea3e36c4ee9a994f010508a28a09df38f652e74643b", "vout": 0, ... "amount": 50.00000000, ... }]# 交易池的 minfee 和 minrelay 設成了相同的值,以便於測試這一功能# 我們將使用 TRUC 交易類型,以允許零費率交易並要求 1P1C 轉發。# 啟用完全 RBF(Fullrbf),這也是 28.0 的默認值。bitcoin-cli -regtest getmempoolinfo{ "loaded": true, ... "mempoolminfee": 0.00001000, "minrelaytxfee": 0.00001000, ... “fullrbf”: true,}# 先將交易的版本號設為 2bitcoin-cli -regtest createrawtransaction '[{"txid": "49ea7a01bcba744bd82ecea3e36c4ee9a994f010508a28a09df38f652e74643b", "vout": 0}]' '[{"bcrt1qqzv3ekkueheseddqge3mqdcukse6p9d5yuqxv3": "50.00000000"}]'02000000013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff01f90295000000000016001400991cdadccdf30cb5a04663b0371cb433a095b400000000# 再將開頭的 02 換成 03,也即 TRUC 交易的版本號03000000013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff01f90295000000000016001400991cdadccdf30cb5a04663b0371cb433a095b400000000# 簽名併發送bitcoin-cli -regtest -rpcwallet=test signrawtransactionwithwallet 03000000013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff01f90295000000000016001400991cdadccdf30cb5a04663b0371cb433a095b400000000{ "hex": "030000000001013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff01f90295000000000016001400991cdadccdf30cb5a04663b0371cb433a095b40247304402200a82f2fd8aa5f32cdfd9540209ccfc36a95eea21518ede1c3787561c8fb7269702207a258e6f027ce156271879c38628ad9b3425b83c33d8cd95fb20dd3c567fdff70121030af1fadce80bcb8ba614634bc82c71eea2ed87a5692d3127766cc896cef1bdb100000000", "complete": true}bitcoin-cli -regtest sendrawtransaction 030000000001013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff01f90295000000000016001400991cdadccdf30cb5a04663b0371cb433a095b40247304402200a82f2fd8aa5f32cdfd9540209ccfc36a95eea21518ede1c3787561c8fb7269702207a258e6f027ce156271879c38628ad9b3425b83c33d8cd95fb20dd3c567fdff70121030af1fadce80bcb8ba614634bc82c71eea2ed87a5692d3127766cc896cef1bdb100000000error code: -26error message:min relay fee not met, 0 < 110# 我們需要使用這個輸出的交易包轉發和 CPFPbitcoin-cli -regtest decoderawtransaction 030000000001013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff01f90295000000000016001400991cdadccdf30cb5a04663b0371cb433a095b40247304402200a82f2fd8aa5f32cdfd9540209ccfc36a95eea21518ede1c3787561c8fb7269702207a258e6f027ce156271879c38628ad9b3425b83c33d8cd95fb20dd3c567fdff70121030af1fadce80bcb8ba614634bc82c71eea2ed87a5692d3127766cc896cef1bdb100000000{ "txid": "bf9164db69d216da4af6d9c720a0cec6d7e0bafb1702fdf8c2cd5606101576de", "hash": "7d855ffbd8bc17892e28f3f326d0e4919d35c27a7370f5d9f9ce538e93a347cf", "version": 3, "size": 191, "vsize": 110, ... "vout": [ ... "scriptPubKey": { "hex": "001400991cdadccdf30cb5a04663b0371cb433a095b4", ...}# 從輸出中扣減掉為 CPFP 準備的手續費bitcoin-cli -regtest createrawtransaction '[{"txid": "bf9164db69d216da4af6d9c720a0cec6d7e0bafb1702fdf8c2cd5606101576de", "vout": 0}]' '[{"bcrt1qqzv3ekkueheseddqge3mqdcukse6p9d5yuqxv3": "49.99994375"}]'0200000001de7615100656cdc2f8fd0217fbbae0d7c6cea020c7d9f64ada16d269db6491bf0000000000fdffffff0100ed94000000000016001400991cdadccdf30cb5a04663b0371cb433a095b400000000# 簽名 TRUC 變體併發送(作為一個 1P1C 交易包)bitcoin-cli -regtest -rpcwallet=test signrawtransactionwithwallet 0300000001de7615100656cdc2f8fd0217fbbae0d7c6cea020c7d9f64ada16d269db6491bf0000000000fdffffff0100ed94000000000016001400991cdadccdf30cb5a04663b0371cb433a095b400000000 '[{"txid": "bf9164db69d216da4af6d9c720a0cec6d7e0bafb1702fdf8c2cd5606101576de", "vout": 0, "scriptPubKey": "001400991cdadccdf30cb5a04663b0371cb433a095b4", "amount": "50.00000000"}]'{ "hex": "03000000000101de7615100656cdc2f8fd0217fbbae0d7c6cea020c7d9f64ada16d269db6491bf0000000000fdffffff0100ed94000000000016001400991cdadccdf30cb5a04663b0371cb433a095b4024730440220685a6d76db97b2c27950f267b70d606f1864002ff6b4617cd2e29afd5ddfac83022037be8bb2ebe8194b4263f16a634e5c00a5f6c4eef0968d12994ed66dcf15b9ac0121020797cc343a24dfe49c7ee9b94bf3daaf15308d8c12e3f0f7e102b95ee55f939f00000000", "complete": true}bitcoin-cli -regtest -rpcwallet=test submitpackage '["030000000001013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff01f90295000000000016001400991cdadccdf30cb5a04663b0371cb433a095b40247304402200a82f2fd8aa5f32cdfd9540209ccfc36a95eea21518ede1c3787561c8fb7269702207a258e6f027ce156271879c38628ad9b3425b83c33d8cd95fb20dd3c567fdff70121030af1fadce80bcb8ba614634bc82c71eea2ed87a5692d3127766cc896cef1bdb100000000", "03000000000101de7615100656cdc2f8fd0217fbbae0d7c6cea020c7d9f64ada16d269db6491bf0000000000fdffffff0100ed94000000000016001400991cdadccdf30cb5a04663b0371cb433a095b4024730440220685a6d76db97b2c27950f267b70d606f1864002ff6b4617cd2e29afd5ddfac83022037be8bb2ebe8194b4263f16a634e5c00a5f6c4eef0968d12994ed66dcf15b9ac0121020797cc343a24dfe49c7ee9b94bf3daaf15308d8c12e3f0f7e102b95ee55f939f00000000"]'{ "package_msg": "success", "tx-results": { "7d855ffbd8bc17892e28f3f326d0e4919d35c27a7370f5d9f9ce538e93a347cf": { "txid": "bf9164db69d216da4af6d9c720a0cec6d7e0bafb1702fdf8c2cd5606101576de", "vsize": 110, "fees": { "base": 0.00000000, "effective-feerate": 0.00025568, "effective-includes": [ "7d855ffbd8bc17892e28f3f326d0e4919d35c27a7370f5d9f9ce538e93a347cf", "4333b3d2eea820373262c7ffb768028bc82f99f47839349722eb60c58cd65b55" ] } }, "4333b3d2eea820373262c7ffb768028bc82f99f47839349722eb60c58cd65b55": { "txid": "6c2f4dec614c138703f33e6a5c215112bad4cf79593e9757105e09b09bf3e2de", "vsize": 110, "fees": { "base": 0.00005625, "effective-feerate": 0.00025568, "effective-includes": [ "7d855ffbd8bc17892e28f3f326d0e4919d35c27a7370f5d9f9ce538e93a347cf", "4333b3d2eea820373262c7ffb768028bc82f99f47839349722eb60c58cd65b55" ] } } }, "replaced-transactions": [ ]}這個 1P1C 交易包進入了本地的交易池,實質費率是 25.568 聰/vB,雖然其中的父交易的費率低於最低轉發費率。成功!
TRUC 交易
“確認前拓撲受限的(TRUC)” 交易也叫 “v3 交易”,是一種新的、可選的交易池條款,旨在允許可靠的交易手續費替換(RBF)、緩解跟手續費相關的交易釘死攻擊以及交易包限制釘死攻擊。它的核心理念是:雖然許多特性並不適合所有交易,但我們可以為內部拓撲受到限制的交易包實現它們。TRUC 創造了一種以拓撲上的限制為代價、選擇性進入這些更健壯的條款的方法。
簡而言之,一筆 TRUC 交易就是一筆 nVersion 字段的值為 3 的交易,並且,其交易單體不能超過 10 kvB、其僅有的一筆子交易也是 TRUC 交易且體積不得超過 1kvB。TRUC 交易不能花費未確認且非 TRUC 的交易,反之也如此(未確認且非 TRUC 的交易也不能花費 TRUC 交易)。所有 TRUC 交易也都被認為選擇性使用 RBF,不論是否在交易中表達了 BIP125 信號。如果另一筆不衝突的 TRUC 子交易被添加到了父 TRUC 交易,該交易會被當成跟原本的子交易衝突,然後適用通常的 RBF 替換規則,包括手續費率檢查和總手續費檢查。
TRUC 交易也允許是 0 手續費的,因為子交易足以為整個交易包追加手續費。
這種受限制的拓撲也恰好在 1P1C 轉發範式內,如果所有版本的預簽名交易都是 TRUC 交易的話,就不必管交易的對手方做什麼。
TRUC 支付是可以替換的,所以,任何攜帶了不完全屬於交易者的輸入的交易都是可以被重複花費的。換句話說,收取 TRUC 的零確認支付是在安全性上不如收取非 TRUC 的零確認支付。
1P1C 拓撲的交易包 RBF
有時候,1P1C 交易包中的父交易會跟交易池內的交易相沖突。在這筆父交易的多個版本都得到了預簽名的時候,可能就會出現這種情況。以往,這筆新的父交易會在 RBF 規則下被單獨考慮,並且,如果手續費太低的話,就會被拋棄。
而使用 1P1C 拓撲交易包 RBF,這個新的子交易也會被納入 RBF 檢查的考量,這就允許錢包開發者通過 P2P 網絡獲得可靠的 1P1C 交易包傳播,無論哪個版本的交易曾經進入交易池。
注意,目前,衝突交易的單體和 1P1C 交易包都不能有別的依賴。否則,替代交易會被拒絕。這樣的族群的衝突可能有任意多個。在未來,當我們實現族群交易池的時候,這條規則會被放鬆。
繼續我們前面的 1P1C 案例,我們準備對已有的這個 1P1C 交易包執行一次交易包 RBF,這一次將使用一筆非 TRUC 的交易包:
# 父子交易對bitcoin-cli -regtest getrawmempool[ "bf9164db69d216da4af6d9c720a0cec6d7e0bafb1702fdf8c2cd5606101576de", "6c2f4dec614c138703f33e6a5c215112bad4cf79593e9757105e09b09bf3e2de"]# 使用一個新的 v2 1P1C 交易包來重複花費上述父交易 # 新交易包中的父交易的手續費率超過最低轉發費率,但不足以 RBF 原交易包bitcoin-cli -regtest createrawtransaction '[{"txid": "49ea7a01bcba744bd82ecea3e36c4ee9a994f010508a28a09df38f652e74643b", "vout": 0}]' '[{"bcrt1qqzv3ekkueheseddqge3mqdcukse6p9d5yuqxv3": "49.99999"}]'02000000013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff0111ff94000000000016001400991cdadccdf30cb5a04663b0371cb433a095b400000000# 簽名併發送(將遭遇失敗)bitcoin-cli -regtest -rpcwallet=test signrawtransactionwithwallet 02000000013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff0111ff94000000000016001400991cdadccdf30cb5a04663b0371cb433a095b400000000{ "hex": "020000000001013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff0111ff94000000000016001400991cdadccdf30cb5a04663b0371cb433a095b4024730440220488d98ad79495276bb4cdda4d7c62292043e185fa705d505c7dceef76c4b61d30220567243245416a9dd3b76f3d94bfd749e0915929226ba079ec918f6675cbfa3950121030af1fadce80bcb8ba614634bc82c71eea2ed87a5692d3127766cc896cef1bdb100000000", "complete": true}bitcoin-cli -regtest sendrawtransaction 020000000001013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff0111ff94000000000016001400991cdadccdf30cb5a04663b0371cb433a095b4024730440220488d98ad79495276bb4cdda4d7c62292043e185fa705d505c7dceef76c4b61d30220567243245416a9dd3b76f3d94bfd749e0915929226ba079ec918f6675cbfa3950121030af1fadce80bcb8ba614634bc82c71eea2ed87a5692d3127766cc896cef1bdb100000000error code: -26error message:insufficient fee, rejecting replacement f17146d87a029cb04777256fc0382c637a31b2375f3981df0fb498b9e44ceb59, less fees than conflicting txs; 0.00001 < 0.00005625# 通過子交易,向新的交易包注入更多手續費,以打敗舊的交易包bitcoin-cli -regtest createrawtransaction '[{"txid": "f17146d87a029cb04777256fc0382c637a31b2375f3981df0fb498b9e44ceb59", "vout": 0}]' '[{"bcrt1qqzv3ekkueheseddqge3mqdcukse6p9d5yuqxv3": "49.99234375"}]'020000000159eb4ce4b998b40fdf81395f37b2317a632c38c06f257747b09c027ad84671f10000000000fdffffff01405489000000000016001400991cdadccdf30cb5a04663b0371cb433a095b400000000# 簽名併發送(新的交易包)bitcoin-cli -regtest -rpcwallet=test signrawtransactionwithwallet 020000000159eb4ce4b998b40fdf81395f37b2317a632c38c06f257747b09c027ad84671f10000000000fdffffff01405489000000000016001400991cdadccdf30cb5a04663b0371cb433a095b400000000 '[{"txid": "f17146d87a029cb04777256fc0382c637a31b2375f3981df0fb498b9e44ceb59", "vout": 0, "scriptPubKey": "001400991cdadccdf30cb5a04663b0371cb433a095b4", "amount": "49.99999"}]'{ "hex": "0200000000010159eb4ce4b998b40fdf81395f37b2317a632c38c06f257747b09c027ad84671f10000000000fdffffff01405489000000000016001400991cdadccdf30cb5a04663b0371cb433a095b40247304402205d086fa617bdbf5a3df3a15cc9a927ad884c714d46d9ef6762ad2fa6a259740c022032c60b4fe5d533d990489c27dc3283d8b3999b97f6c12986ac8159b92cb6de820121020797cc343a24dfe49c7ee9b94bf3daaf15308d8c12e3f0f7e102b95ee55f939f00000000", "complete": true}bitcoin-cli -regtest -rpcwallet=test submitpackage '["020000000001013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff0111ff94000000000016001400991cdadccdf30cb5a04663b0371cb433a095b4024730440220488d98ad79495276bb4cdda4d7c62292043e185fa705d505c7dceef76c4b61d30220567243245416a9dd3b76f3d94bfd749e0915929226ba079ec918f6675cbfa3950121030af1fadce80bcb8ba614634bc82c71eea2ed87a5692d3127766cc896cef1bdb100000000", "0200000000010159eb4ce4b998b40fdf81395f37b2317a632c38c06f257747b09c027ad84671f10000000000fdffffff01405489000000000016001400991cdadccdf30cb5a04663b0371cb433a095b40247304402205d086fa617bdbf5a3df3a15cc9a927ad884c714d46d9ef6762ad2fa6a259740c022032c60b4fe5d533d990489c27dc3283d8b3999b97f6c12986ac8159b92cb6de820121020797cc343a24dfe49c7ee9b94bf3daaf15308d8c12e3f0f7e102b95ee55f939f00000000"]'{ "package_msg": "success", "tx-results": { "fe15d23f59537d12cddf510616397b639a7b91ba2f846c64533e847e53d7c313": { "txid": "f17146d87a029cb04777256fc0382c637a31b2375f3981df0fb498b9e44ceb59", "vsize": 110, "fees": { "base": 0.00001000, "effective-feerate": 0.03480113, "effective-includes": [ "fe15d23f59537d12cddf510616397b639a7b91ba2f846c64533e847e53d7c313", "256cebd037963d77b2692cdc33ee36ee0b0944e6b9486a6aaad0792daa0f677c" ] } }, "256cebd037963d77b2692cdc33ee36ee0b0944e6b9486a6aaad0792daa0f677c": { "txid": "858fe07b01bc7c1c1dda50ba16a33b164c0bc03d0eff8f9546558c088e087f60", "vsize": 110, "fees": { "base": 0.00764625, "effective-feerate": 0.03480113, "effective-includes": [ "fe15d23f59537d12cddf510616397b639a7b91ba2f846c64533e847e53d7c313", "256cebd037963d77b2692cdc33ee36ee0b0944e6b9486a6aaad0792daa0f677c" ] } } }, "replaced-transactions": [ "bf9164db69d216da4af6d9c720a0cec6d7e0bafb1702fdf8c2cd5606101576de", "6c2f4dec614c138703f33e6a5c215112bad4cf79593e9757105e09b09bf3e2de" ]}支付到錨點(P2A)
“錨點輸出” 可以定義為一種輸出,父交易攜帶它的唯一目的就是允許子交易通過 CPFP 來為父交易追加手續費。因為這樣的輸出並非支付,它們是低價值的,面額接近於 “粉塵數額”,而且會被立即花掉。
Bitcoin Core 28.0 添加了一種新的輸出腳本類型 “支付到錨點(P2A)”,允許使用一種優化的 “無密鑰” 錨點。這種輸出的腳本是 “OP_1 <4e73>”,花費它不需要任何見證數據,這意味著需要為它支付的手續費會比現有的錨點輸出更小。它也允許任何人憑它來創建用於 CPFP 的子交易。
P2A 可以獨立於 TRUC 交易和 1P1C 交易包來使用。一筆帶有 P2A 輸出但沒有子交易的交易也可以得到廣播,只不過這種輸出很容易被花掉。類似地,交易包和 TRUC 交易也不是必須使用 P2A 輸出。
這種新的輸出的粉塵面額下限是 240 聰。攜帶低於這個面額的 P2A 輸出的交易不會得到傳播,即使它們在交易包中被花費,因為交易包條款依然完全實施粉塵面額限制。雖然這個提議曾經跟 “臨時粉塵” 提議相關聯,但現在已經不是這樣了。
創建和花費 P2A 的案例:
# Regtest 上的 P2A 地址是 “bcrt1pfeesnyr2tx”,主網上的 P2A 地址是 “bc1pfeessrawgf”bitcoin-cli -regtest getaddressinfo bcrt1pfeesnyr2tx{ "address": "bcrt1pfeesnyr2tx", "scriptPubKey": "51024e73", "ismine": false, "solvable": false, "iswatchonly": false, "isscript": true, "iswitness": true, "ischange": false, "labels": [ ]}# 這是一種隔離見證輸出,類型為 “anchor”bitcoin-cli -regtest decodescript 51024e73{ "asm": "1 29518", "desc": "addr(bcrt1pfeesnyr2tx)#swxgse0y", "address": "bcrt1pfeesnyr2tx", "type": "anchor"}# P2WPKH 和 P2S 輸出的最低面額bitcoin-cli -regtest createrawtransaction '[{"txid": "49ea7a01bcba744bd82ecea3e36c4ee9a994f010508a28a09df38f652e74643b", "vout": 0}]' '[{"bcrt1qqzv3ekkueheseddqge3mqdcukse6p9d5yuqxv3": "0.00000294"}, {"bcrt1pfeesnyr2tx": "0.00000240"}]'02000000013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff02260100000000000016001400991cdadccdf30cb5a04663b0371cb433a095b4f0000000000000000451024e7300000000# 簽名和發送帶有 P2A 輸出的交易bitcoin-cli -regtest -rpcwallet=test signrawtransactionwithwallet 02000000013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff02260100000000000016001400991cdadccdf30cb5a04663b0371cb433a095b4f0000000000000000451024e7300000000{ "hex": "020000000001013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff02260100000000000016001400991cdadccdf30cb5a04663b0371cb433a095b4f0000000000000000451024e7302473044022002c7e756b15135a3c0a061df893a857b42572fd816e41d3768511437baaeee4102200c51fcce1e5afd69a28c2d48a74fd5e58b280b7aa2f967460673f6959ab565e80121030af1fadce80bcb8ba614634bc82c71eea2ed87a5692d3127766cc896cef1bdb100000000", "complete": true# 關閉健全費用檢查bitcoin-cli -regtest -rpcwallet=test sendrawtransaction 020000000001013b64742e658ff39da0288a5010f094a9e94e6ce3a3ce2ed84b74babc017aea490000000000fdffffff02260100000000000016001400991cdadccdf30cb5a04663b0371cb433a095b4f0000000000000000451024e7302473044022002c7e756b15135a3c0a061df893a857b42572fd816e41d3768511437baaeee4102200c51fcce1e5afd69a28c2d48a74fd5e58b280b7aa2f967460673f6959ab565e80121030af1fadce80bcb8ba614634bc82c71eea2ed87a5692d3127766cc896cef1bdb100000000 "0"fdee3b6a5354f31ce32242db10eb9ee66017e939ea87db0c39332262a41a424b# 替換前一個交易包bitcoin-cli -regtest getrawmempool[ "fdee3b6a5354f31ce32242db10eb9ee66017e939ea87db0c39332262a41a424b"]# 對子交易,將價值都變成手續費;讓 65vbyte 大小的交易使用 OP_RETURN 輸出,以避免 tx-size-small 錯誤bitcoin-cli -regtest createrawtransaction '[{"txid": "fdee3b6a5354f31ce32242db10eb9ee66017e939ea87db0c39332262a41a424b", "vout": 1}]' '[{"data": "feeeee"}]'02000000014b421aa4622233390cdb87ea39e91760e69eeb10db4222e31cf354536a3beefd0100000000fdffffff010000000000000000056a03feeeee00000000# 不需要簽名;這是一種不需要見證數據的隔離見證輸出bitcoin-cli -regtest -rpcwallet=test sendrawtransaction 02000000014b421aa4622233390cdb87ea39e91760e69eeb10db4222e31cf354536a3beefd0100000000fdffffff010000000000000000056a03feeeee000000008d092b61ef3c1a58c24915671b91fbc6a89962912264afabc071a4dbfd1a484e用戶指引
以下不再是更新公告式的特性說明,而會介紹一些常見的錢包模式,以及它們如何能從這些更新中獲益,不論錢包是否主動升級。
簡單支付
支付者面臨的一個問題是,無法保證支付交易的接收者不能創建一個任意長的交易鏈條、從而將支付交易釘死在交易池中;因此也無法有把握地運行 RBF。如果用戶希望有更加可預測的 RBF 行為,一種辦法是選擇性進入 TRUC 交易。即使是接收支付,也可以通過一筆最大可達 1kvB 的子交易(花費正在等待確認的支付)來可靠地追加手續費。
如果採用這種技術,錢包軟件應該:
- 將交易版本號設為 3
- 僅使用已經得到確認的輸出
- 保持交易體積在 10kvB 以下(與非 TRUC 交易所面臨的 100 kvB 限制不同)
- 這個更嚴格的限制依然支持稍微大一些的批量支付
- 如果錢包沒有別的選擇,只能花費一個未確認的輸入,那麼這個輸入必須來自一筆 TRUC 交易,並且這筆新交易的體積要低於 1kvB
Coinjoin
在 coinjoin 場景中,人們關注的是隱私性,但 coinjoin 交易本身並沒有隱藏起來的需要,因此,為 coinjoin 交易使用 TRUC 交易可能是有價值的。一筆 coinjoin 交易可能因為費率不夠而無法進入區塊鏈,從而需要手續費追加。
還可以跟 TRUC 交易一道,加入 P2A 輸入,從而允許另一個錢包(比如瞭望塔)單獨為交易支付手續費。
如果其他參與者也想花費自己的未確認的 coinjoin 交易輸出,可能就會發生 “TRUC 親屬驅逐”。親屬交易驅逐可以保持 TRUC 的拓撲限制,但允許發生更高費率的 CPFP —— 新的子交易可以 “替代” 舊的子交易,無需花費相同的輸入(譯者注:此處的 “替代” 打雙引號是因為這兩筆子交易本身並非衝突交易,它們並沒有花費相同的輸入,只是因為 TRUC 只允許一個子交易,才會不能共存)。因此,coinjoin 交易的所有參與者都總是能夠 CPFP coinjoin 交易。
警告:一筆 coinjoin 交易的參與者依然可以通過重複花費自己在 coinjoin 交易中的輸入來挫敗 coinjoin 交易(只需付出微小的經濟代價);要反擊,就需要 coinjoin 交易 RBF 掉攻擊者的第一筆交易。
閃電網絡
在商店網絡協議中生成的交易有幾種主要的類型:
- 注資交易:單方注資或雙方注資的交易,用於建立合約。對及時確認相對不敏感。
- 承諾交易:承諾一條支付通道的最新狀態。這些交易是不對稱的,而且當前雙方需要一筆 “update_fee” 消息來更新將注資輸出中的多少價值變成手續費。這裡的手續費必須足以將最新版本的承諾交易傳播到礦工的交易池。
- 與 HTLC 相關的預簽名交易。
使用 1P1C 轉發和交易包 RBF,更新後的 Bitcoin Core 節點可以極大低提高閃電網絡的安全性。閃電通道的單方面關閉可以通過低於交易池最低費率的承諾交易來實現,也可以跟另一個低費率、無法立即進入區塊的承諾交易包相沖突。
為了最大限度利用這一升級,錢包和後端應該集成 Bitcoin Core 的 RPC 命令 submitpackage :
bitcoin-cli submitpackage ‘[“<commitment_tx_hex>”, “<anchor_spend_hex>”]’錢包實現應該讓自己的軟件集成這個命令,並使用這個命令來發送承諾交易以及一筆花費錨點輸出的子交易,以保證這個交易包能以合適的費率到達礦工的交易池。
注意:如果你發送的是一個包含單個父交易和多個子交易的交易包,命令依然會返回 “成功”,但這樣的交易包無法在(本次更新的) 1P1C 交易包轉發條款下轉發。
如果有足夠多的節點升級到支持這些特性,閃電網絡協議可能會升級為拋棄 “update_fee” 消息 —— 這一消息本身也是多年來網絡手續費暴漲期間、許多通道不必要地強制關閉的源頭。移除這種消息之後,承諾交易可以設置為靜態的 1 聰/vB 費率。使用 TRUC 交易,我們可以保證,相互競爭的承諾交易及其花費錨點輸出的子交易可以在網絡中相互 RBF;而且,如果同一筆承諾交易有相互競爭的輸出花費子交易,RBF 依然可以發生,無論被花費的是哪個輸出。TRUC 交易可以是 0 費率的,允許進一步降低規範的複雜性。有了 TRUC 親屬驅逐,我們也可以拋棄長達 1 區塊的 CSV 鎖定時間,因為我們已經不再需要擔心哪個未確認的輸出會被花費,只要每一方都至少可以花費一個輸出。
使用 TRUC + P2A 輸出,我們可以將承諾交易當前的兩個錨點輸出減少為一個無密鑰的錨點,從而降低對區塊空間的使用。無密鑰錨點不需要進入公鑰,花費起來也不需要簽名,可以進一步降低對區塊空間的使用。手續費追加也可以外包給沒有私鑰的其他代理人。錨點也可以由雙方共享密鑰材料的一個輸出組成,而不使用 P2A,代價則是在良性的單方關閉場景中佔用更多 vbyte。
在實現一些高級特性,比如 “通道拼接” 時,也可以追求類似的策略,以降低 RBF 釘死攻擊風險。舉個例子,一筆體積小於 1 kvB 的 TRUC 通道拼接交易,可以 CPFP 另一條通道的單方關閉交易,而追加手續費的用戶也無需擔心 RBF 釘死攻擊。後續的手續費追加可以通過連續替代這筆通道拼接交易來實現。代價則是在通道拼接期間暴露 TRUC 交易類型。
如你所見,這些更新後的特性可以避免許多複雜性並節約空間佔用,只要每一筆交易都符合 1P1C 範式。
Ark
並非所有交易都符合 1P1C 範式。一個主要的例子就是 Ark 輸出,它承諾的是一棵由預簽名的(或者被限制條款鎖定的)交易組成的樹;這棵樹可以使一個共享 UTXO 的內部狀態完全展開。
如果一個 Ark 服務供應商(ASP)離線了,或不處理某一筆交易,用戶可以選擇單方面退出,那麼這名用戶需要提交一系列的交易,以展開自己在交易樹上的分支。這需要 O(logn) 筆交易。如果其他用戶也在同一時間嘗試離開這棵樹,導致超過了交易池的限制,或產生了相互衝突的交易但都不足以及時進入區塊,問題就會變得更加複雜。如果單方退出的相關交易經過了特別長的時間窗口都沒有得到區塊確認,這個 APS 就可以單方面取走這棵交易樹上的所有資金、導致用戶資金損失。
理想情況下,一棵 Ark 樹的單方面退出應該是這樣的:
- 發佈從樹根(Ark 輸出)到最底層的虛擬 UTXO(vUTXO)的完整默克爾分支
- 構成分支的每一筆交易都是 0 費率的,以避免手續費預測以及提前確認由誰來支付手續費
- 最終的葉子交易有一個 0 價值的錨點,並被單方退出的用戶所花費,從而為整個默克爾分支 CPFP 支付手續費,讓整個默克爾分支可以進入礦工的交易池然後進入區塊
為了塑造這樣的理想情形,我們還缺少一些東西:
- 通用的交易包轉發。當前,我們還沒有方法,能在這個 P2P 網絡中可靠地轉發由 0 費率交易構成的交易鏈條。
- 如果太多分支以較低費率發佈,某些用戶可能無法及時發佈自己的分支,因為已有的發佈已經觸及了後代交易的數量限制。這可能會變成災難,如果 Ark 的參與者數量變得很大,就像理想化的 Ark 使用場景中那樣。
- 我們需要通用的親屬驅逐。而且當前,還不能為無價值的錨定支持 0 價值的輸出。
反過來,我們可以嘗試將所需的交易結構儘可能放進 1P1C 範式中,代價是一些額外的手續費。所有的 Ark 樹交易(從樹根開始),都設為 TRUC 交易,並添加一個最小价值的 P2A 輸出。
當一個用戶決定單方面從一棵 Ark 樹退出,這名用戶需要發佈根交易以及花費其 P2A 輸出、追加手續費的交易,然後等待確認。一旦根交易得到確認,就發佈他們在默克爾分支上的下一筆交易,以及花費其 P2A 輸出、追加手續費的交易(然後等待確認)。以此類推,直到發佈整個默克爾分支、從 Ark 樹中安全地取回自己的資金。同一棵 Ark 樹的其他用戶可能惡意或者以外地提交相同的交易、並使用太低的費率,但親屬驅逐保證了,在每一步中,低於 1kvB 的誠實子交易總是能 RBF 相互競爭的子交易,既不需要鎖定所有其它輸出,也不需要設置多個錨點輸出。
假設交易樹的形式是二叉樹,相比理想化的 Ark,第一位退出的用戶需要多佔用接近 100% 的 vbyte;如果是完全展開整棵樹,則需要多佔用大約 50% 的 vbyte。如果是四叉樹,展開整棵樹可以降低到只多佔用大約 25% 的 vbyte。
閃電通道拼接
其它類型的拓撲也出現在更高級的閃電網絡構造中,可能需要一些工作來匹配 1P1C 交易包轉發。
閃電網絡中的 “通道拼接” 是一種新興的標準操作,而且已經被使用了。每一次拼接都會花費原有的注資輸出、將合約中的資金重新存入一個新的注資輸出,併為兩個注資輸出準備相同的預簽名承諾交易鏈條。在拼接交易還未確認的時候,基於原注資輸出和通道狀態和新注資輸出的通道狀態是同時簽名和追蹤的。
會超出 1P1C 範式的一個例子是這樣的:
- Alice 和 Bob 為一條通道注資。
- Alice 拼出 一些資金給一個由 Carol 控制的鏈上資金,Carol 正在使用一組冷密鑰,所以無法 CPFP。而這筆拼接交易就在那裡等待確認等了幾個駕駑車。
- Bob 的節點離線了,或出於什麼原因強制關閉了通道。
- 費率的暴漲(可能又有什麼 token 發售了),將這筆拼接交易的確認進一步推遲。
Alice 希望給 Caol 的鏈上支付儘快發生,所以她不會拿沒有發生拼接的承諾交易上聯。這意味著,拼接交易 -> 承諾交易 -> 錨點花費變成了需要傳播的交易包。
反過來,讓我們看看怎麼把它放進 1P1C 範式中,同時減少不必要的空間佔用。閃電錢包可以為一筆鏈上支付運行兩次(而不是一次)通道拼接,那麼這兩筆拼接交易就會相互衝突。其中一個版本使用由費率估算器選出的相對保守的費率,而另一個版本可以包含一個 240 聰的 P2A 輸出(或者 0 聰的 P2A 輸出,在有了 “臨時錨點” 之後)。
首先,廣播沒有錨點的拼接交易。
如果沒有發生費率暴漲,該交易會得到確認,然後 Alice 可以按需繼續強制關閉通道,就像正常情形。
如果手續費市場突發變化,導致第一筆拼接交易等待了太長時間,那麼就廣播帶有錨點的拼接交易以及花費錨點的子交易(作為 1P1C 交易包),從而使用交易包 RBF 替代掉第一筆拼接交易。這一手續費追加將讓給 Carol 的支付得到確認,然後 Alice 可以按需繼續強制關閉通道。
拼接交易的更多副本可以使用多種費率水平,但要提醒的是,每多一個副本,就需要多一組承諾交易的簽名,以及對承諾交易中給出的 HTLC(offered HTLC) 的簽名。
(完)



