Lightning-Network

可以在資金 tx 仍停留在記憶體池中時關閉通道嗎?

  • May 27, 2021

最近想開通一個渠道,不小心把資金交易的手續費設置得太低了。現在資金 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 sendrawtransactionorlightning-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,或者至少我不知道有任何工具。一旦我們有,我會跟進。

引用自:https://bitcoin.stackexchange.com/questions/102180