Blockchain

白皮書是如何從區塊鏈中解碼出來的(Tx 有大約 1000x m 的 n 個多重簽名輸出)

  • April 21, 2021

白皮書顯然編碼為54e48e5f5c656b26c3bca14a8c95aa583d07ebe84dde3b7dd4a78f4e4186e713,這是一個m of n multisig Tx,有947 個輸出(略低於 20kB 的腳本限制!)。

使用Blocktrail Python SDK,我使用以下 Python (2.7) 程式碼獲得了十六進制的輸出列表(注意,如果需要,可以從www.blocktrail.com獲得APIKEYAPISECRET參數):

from blocktrail import APIClient
bt_client = APIClient(APIKEY, APISECRET, network='BTC')
txnObj = bt_client.transaction('54e48e5f5c656b26c3bca14a8c95aa583d07ebe84dde3b7dd4a78f4e4186e713')
hashes = [(t['script_hex']) for t in (txnObj)['outputs']]   

結果列表可在此處獲得完整的列表,並且基本上都是付費到 pubkey-script Txns。摘錄:

[u'5141e4cf0200067daf13255044462d312e340a25c3a4c3bcc3b6c39f0a322030206f626a0a3c3c2f4c656e6774682033203020522f46696c7465722f466c617465446541636f64653e3e0a73747265616d0a789cad5c4b8b24b911becfafa8b3a1da292925654253d0d55373f06d61c007e39bbd061f0cde8bffbe25c55b5266f61ab3905d419ba54728e28bb76a963777fbcfb77fdf96db7d291f93f3e599f7fafcedefb73fffe1f6aff665fdefb77f7c7bfefce6c2fa166e695bdfd6dbcfbfddfef8c3dd5cf953ae',
.....
u'514130206e200a30303030313832353430203030303030206e200a747261696c65720a3c3c2f53697a652036382f526f6f74203636203020520a2f496e666f20363720413020520a2f4944205b203c43413142304134344244353432343533424546393138464643443436444330343e0a3c4341314230413434424435343234353342454641393138464643443436444330343e205d0a2f446f63436865636b73756d202f36463732454137353134444641443233464142434337413535303032314146370a3e53ae',
u'51213e0a7374617274787265660a3138323732370a2525454f460a000000000000000051ae',
u'76a91462e907b15cbf27d5425399ebf6f0fb50ebb88f1888ac',
u'76a914031c79236ff3017496cf8d9a883f494458f245f288ac']

**問題:**這個十六進制數據數組是如何解析成bitcoin.pdf的?將不勝感激具體的 Python 框架答案!

基本上,這是區塊鏈上的一個有趣的小謎題。首先,您需要了解一些關於 pdf 及其結構的資訊,您可以在此處找到。

其次,您會從第 3.4.1 節中註意到所有 pdf 都以該字元串開頭:

%PDF-

在十六進制中,即255044462d. 事實上,這是在第一個裸多重簽名公鑰的第一個輸出中:

<e4cf0200><067daf13>**255044462d**312e340a25c3a4c3bcc3b6c39f0a322030206f626a0a3c3c2f4c656e6774682033203020522f46696c7465722f466c6174654465

我還沒有弄清楚前 8 個字節是什麼(♦編輯:)e4cf0200067daf13 = 2x 4byte little Endian "checksums", see @WizardOfOzzie comment below,但其餘的裸多簽名密鑰(每個輸出中 1 到 3 個 OP_CHECKMULTISIG 之間的所有內容——注意最後一個是 1 的 1,所以它是 1 OP_CHECKMULTISIG) 是 pdf 的數據片段,它們是有序的。如果您可以將裸多重簽名密鑰的所有十六進制數字放入名為“fromblockchain.hex”的單個文件(無空格)中,則可以執行這個非常簡單的程序來提取 pdf:

contents = open('fromblockchain.hex').read()
bytes = contents[16:].decode('hex')
f = open("bitcoin.pdf")
f.write(bytes)
f.close()

這應該創建一個 bitcoin.pdf,它是實際的 satoshi 白皮書。我已經對此進行了測試,確實是白皮書。很高興知道它確實在區塊鏈中。

或者,如果你的機器上執行了 bitcoind,你可以執行這個 python 腳本來獲取比特幣白皮書:

import subprocess

# raw = full hex of raw Tx using Bitcoin-cli
raw = subprocess.check_output(["bitcoin-cli", "getrawtransaction", "54e48e5f5c656b26c3bca14a8c95aa583d07ebe84dde3b7dd4a78f4e4186e713"])

outputs = raw.split("0100000000000000")

pdf = ""
for output in outputs[1:-2]:
   # there are 3 65-byte parts in this that we need
   cur = 6
   pdf += output[cur:cur+130].decode('hex')
   cur += 132
   pdf += output[cur:cur+130].decode('hex')
   cur += 132
   pdf += output[cur:cur+130].decode('hex')

pdf += outputs[-2][6:-4].decode("hex")
f = open("bitcoin.pdf", "wb")
f.write(pdf[8:-8])
f.close()

最後檢查校驗和

sha256sum bitcoin.pdf
b1674191a88ec5cdd733e4240a81803105dc412d6c6708d53ab94fc248f4f553  bitcoin.pdf

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