可以在資金 tx 仍停留在記憶體池中時關閉通道嗎?
最近想開通一個渠道,不小心把資金交易的手續費設置得太低了。現在資金 tx 已經在記憶體池中停留了一個多星期。有什麼方法可以關閉頻道,即使它從未真正打開過?
從技術上講,您可以以更高的費用將用於資助 TX 的輸出翻倍。那麼通道將永遠不會打開。實際上,我認為任何閃電網路實現都沒有提供這樣做的 api。
我開始嘗試自己編寫這個答案,但後來發現我們還沒有工具來手動編輯部分簽名的比特幣交易(PSBT),這是我們最終確定雙花之前的最後一步。所以這個答案目前不完整,但我計劃建構該工具並編寫一個自動化所有這些的外掛,所以它變得更容易😉
鑑於您要求使用 c-lightning,讓我向您介紹您擁有的選項:
等待並重播
如果費用不是太低,並且對等方還沒有放棄,您可以通過確認原始資金交易來建立通道。當交易退出記憶體池時,它可能需要您不時重新廣播交易。為此,請注意在呼叫
fundchannel
或通過查找其 ID 從數據庫中檢索它時返回的資金交易:CHANID=$(lightning-cli listpeers [peer_id] | jq '.peers[].channel_id') sqlite3 $HOME/.lightning/bitcoin/lightningd.sqlite3 \ "SELECT hex(rawtx) FROM transactions WHERE hex(id) LIKE '$CHANID'"
這將為您提供該特定對等方的資金 tx。您可以使用
bitcoin-cli decoderawtransaction
解碼交易並驗證 txid 與輸出funding_txid
中的匹配。lightning-cli listpeers
然後,您可以使用
bitcoin-cli sendrawtransaction
orlightning-cli sendrawtransaction
方法重新廣播。我建議至少在周末等待,因為費用大幅下降,增加了 tx 確認的機會。
雙花資金交易
如果您在其他地方需要資金,或者認為該渠道不值得等待,您也可以雙花任何輸入,並且資金交易將永遠無法確認。
🚧 請注意,除非雙方都放棄,否則您將無法與該特定對等方打開新頻道,因為從 c-lightning 的角度來看,它可能仍然會發生,如果發生,我們需要做好準備🚧
為此,請像上面一樣查找資金交易,然後使用以下內容列出資金交易的輸入:
bitcoin-cli decoderawtransaction [tx] | jq '.vin[] | [.txid, .vout]'
接下來我們將 UTXO 狀態與 同步
bitcoind
,因為我們將資金交易花費的輸出標記為已花費(請注意,您需要編譯 c-lightningDEVELOPER=1
才能使用它):lightning-cli dev-rescan-outputs
現在選擇輸入的一個子集並創建一個新交易,該交易與資金交易相衝突,目的是雙花:
lightning-cli utxopsbt satoshi=all feerate=normal startweight=756 utxos=["ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB:0"]
這為您提供了一個部分簽名的比特幣交易(PSBT),它有一個輸入
ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB:0
(與上述結果匹配decoderawtransaction
),沒有輸出。請注意,起始權重是 756sipa,這大約是我們正在嘗試建構的單輸入單輸出事務的大小。這還不是一個有效的交易,所以我們需要添加一個輸出回你的錢包。為此,我們首先生成一個地址以發送到您的錢包:
lightning-cli newaddr
現在我們需要修改 PSBT 以包含所有資金(減去費用)流向新地址的輸出。
…但我們還沒有工具來手動編輯 PSBT,或者至少我不知道有任何工具。一旦我們有,我會跟進。