使用 python 比特幣區塊鏈解析器庫提取閃電網路資金交易
我的最終目標是從區塊鏈解析資金交易(以及後續步驟中的通道關閉)。為了做到這一點,我想從資金交易開始並對其進行剖析。不幸的是,我有點卡住了,希望你能幫忙。
通過#recksplorer,我點擊了一條邊,發現該交易是支付渠道的資金交易。我使用bitcoin-blockchain-parser (in python) lib在我的本地區塊鏈副本中找到了這個交易
使用此程式碼
for i,h in enumerate(tx.hex): print('{:02x}'.format(h),end=" ") if i%8==7: print(" ",end="") if i%16==15: print() print()
我得到了我的交易的以下十六進製表示(包括兩個 asterix ** 以強調感興趣的輸出腳本):
02 00 00 00 00 01 01 e3 3d f6 39 1a 02 5c 79 b3 1a 2a ab 94 9f b5 6d f8 f9 2d 9f 3a bb ab 7d d3 92 47 7f 31 9f b6 69 01 00 00 00 00 ff ff ff ff 02 21 4e 00 00 00 00 00 00 22 **00 20 98 2b 53 22 31 08 07 d3 68 d1 dc 26 11 43 09 5d c7 d0 2f ba 6d 67 08 bb 76 21 51 9f 31 29 08 b2** e1 99 0d 00 00 00 00 00 16 00 14 8c 35 c6 98 4d f9 d6 a2 9e 4e 7d 76 21 19 3c fe 53 82 ce 60 02 48 30 45 02 21 00 ba 9e 6e 56 a6 4f a2 53 4a 02 e9 30 20 8e 80 38 f6 f0 7c a8 d2 0e b3 e4 03 59 99 20 8f 9d a1 15 02 20 3a 12 73 72 c4 bc ee 6f 76 9e 07 fd 05 0e f0 62 9b 4d e8 e6 43 84 26 46 53 56 03 46 07 f3 9a eb 01 21 03 0c fa b1 4c d0 4a 01 5a 58 40 2a 5e a6 84 e4 d9 b3 4b 33 23 73 04 0c 57 5e 83 b1 0a d3 90 79 66 00 00 00 00
我還發現了兩個輸出腳本,特別是第一個(在字節 58 之後!)將 20001 satoshi 發送到支付通道:
output = tx.outputs[0] for x in output.script.hex: print('{:02x}'.format(h),end=" ")
00 20 98 2b 53 22 31 08 07 d3 68 d1 dc 26 11 43 09 5d c7 d0 2f ba 6d 67 08 bb 76 21 51 9f 31 29 08 b2
我無法理解資金交易本身的格式。根據BOLT3 它應該是這樣的:
2 < pubkey1 > < pubkey2 > 2 OP_CHECKMULTISIG
我假設 2 表示 OP_2。然而,在比特幣維基的幫助下,我找不到 OP_2 和 OP_CHECKMULTISIG 的十六進制值。
我猜(但目前無法驗證)我在此站點上遇到了與此問題類似的問題。還是我弄亂了字節序符號?如前所述,我未來的目標是自動提取所有資金交易,因此我需要能夠繼續努力,非常感謝您的幫助!謝謝!
首先,您偏離了兩個字節。輸出腳本是
0020982b5322310807d368d1dc261143095dc7d02fba6d6708bb7621519f312908b2
,但您已選擇00220020982b5322310807d368d1dc261143095dc7d02fba6d6708bb7621519f312908b2
。其次,複雜的輸出腳本永遠不會只是放在輸出中。它們總是包裝在某種形式的 Pay to Script Hash 中。在這種情況下,因為它是 segwit,所以它是 Pay to Witness Script Hash (P2WSH)。因此,如果不使用輸出,您將無法知道實際使用的腳本。LN 中的一切都是 P2WSH,沒有腳本只是放在輸出中。
要分解這個腳本,首先你有
00
. 這是見證版本號,版本 0。然後你有20
它是下一個數據塊的長度指示器。在這種情況下,即 32 個字節。最後982b5322310807d368d1dc261143095dc7d02fba6d6708bb7621519f312908b2
是腳本本身的 SHA256 雜湊。該腳本將是 2-of-2 多重簽名,但在使用此輸出之前,您將無法知道它實際上是什麼。