Segregated-Witness

使用 python 比特幣區塊鏈解析器庫提取閃電網路資金交易

  • April 18, 2018

我的最終目標是從區塊鏈解析資金交易(以及後續步驟中的通道關閉)。為了做到這一點,我想從資金交易開始並對其進行剖析。不幸的是,我有點卡住了,希望你能幫忙。

通過#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 多重簽名,但在使用此輸出之前,您將無法知道它實際上是什麼。

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