如何驗證鎖定和解鎖腳本?
我選擇了一個任意的交易 id 並使用 blockcypher explorer 檢索了它的相關交易細節,如下所示:
from blockcypher import get_transaction_details get_transaction_details('0db8ca471c0e0fd3ce6f24197d9a9cec9647fd3df5ab6aa2e174e0ea85949146')
輸出是以下python字典
{'addresses': ['17uP1g6ppdKVonMQWJ2ojeUZ8r9AhH2tgf', '19jaGQFE39oH71WdR1ZJjpajjnP8tWNZdv', '1PJwNGYympRP3kJ8hqkY2ayHDVHokrASrv'], 'block_hash':'0000000000000000032ba4f95d39b86b2cc24c27e3c0d3201070945faf890e0d', 'block_height': 419922, 'block_index': 1, 'confidence': 1, 'confirmations': 186323, 'confirmed': datetime.datetime(2016, 7, 9, 4, 3, tzinfo=tzutc()), 'double_spend': False, 'fees': 311300, 'hash':'0db8ca471c0e0fd3ce6f24197d9a9cec9647fd3df5ab6aa2e174e0ea85949146', 'inputs': [{'addresses': ['19jaGQFE39oH71WdR1ZJjpajjnP8tWNZdv'], 'age': 418553, 'output_index': 0, 'output_value': 44695270, 'prev_hash':'81b3bcc34490facea42a729ae166f599c7933501273010d0eb0c2a0efe190153', 'script': '483045022100e664861517c0ea91df7e4bde7001b7cda6b034a7f4c4c6e622b681a57bf72c4102207b02fa4046f6ca5c180aa60ee57e67fff4e82c09a7e60515b15a989cd4bd5d3a012103017e89c4294b1ca99533b424c367db4f18747c0cacad393e3fb103640bcdb2ce', 'script_type': 'pay-to-pubkey-hash', 'sequence': 4294967295}], 'outputs': [{'addresses': ['17uP1g6ppdKVonMQWJ2ojeUZ8r9AhH2tgf'], 'script': '76a9144bb8c253f24fa707f6796a0b3c542f78c94b4dcc88ac', 'script_type': 'pay-to-pubkey-hash', 'spent_by': '43a771f414804dcc5ef5b4a577961a1e694ce8f477b391da1a404a600a14c8e3', 'value': 18695900}, {'addresses': ['1PJwNGYympRP3kJ8hqkY2ayHDVHokrASrv'], 'script': '76a914f4b738bc3ee9ebad027381304b2b3e81a618a60488ac', 'script_type': 'pay-to-pubkey-hash', 'spent_by': '0ea2858001f752c4eb7d0bba88568e9dfb25cdcc76adab42bc1ccfbf27c8bda1', 'value': 25688070}], 'preference': 'high', 'received': datetime.datetime(2016, 7, 9, 3, 41, 4, 370000, tzinfo=tzutc()), 'relayed_by': '80.249.197.154:8333', 'size': 226, 'total': 44383970, 'ver': 1, 'vin_sz': 1, 'vout_sz': 2}
現在,據我了解,輸入腳本應該是
<sig> <PubKey>
並且輸出腳本應該是
DUP HASH160 <PubKHash> EQUALVERIFY CHECKSIG
在上面的交易細節中,我看到有一個輸入腳本和兩個輸出腳本,blockcypher 文件說它們是原始的十六進制編碼。但是,當我將“腳本”欄位下的編碼放入十六進制解碼器時,我沒有任何意義。我的問題是:
1)如何解碼交易詳情字典的“腳本”欄位中的字元串以查看實際腳本。當我這樣做時,他們會遵循我上面概述的格式嗎?
2)如何驗證解鎖(輸入)腳本確實適用於鎖定(輸出)腳本?僅使用我上面生成的交易詳細資訊是否可行?
1)如何解碼交易詳情字典的“腳本”欄位中的字元串以查看實際腳本。當我這樣做時,他們會遵循我上面概述的格式嗎?
腳本只是遵循某種格式的原始字節,此處稍作解釋。為了以您概述的格式(OP_DUP,…)查看它,您必須“解碼”這些字節。基本上,您首先讀取整個腳本的大小以了解應該讀取多少字節(當使用返回反序列化 tx 的 API 時,您不會看到這個大小)。在此事務中,SignatureSCript 大小為 0x6b=107。然後開始“解釋”腳本。為此,您首先讀取 1 個字節,然後根據該字節決定下一步要做什麼。例如,在您的 SignatureScript 中,第一個字節是 0x48(在上面的連結中,您可以在單詞列 N/A 的常量表中看到它),該值表示要推入堆棧的後續數據的大小。所以現在你有一個大小為 0x48=72 字節的數據推送:
<3045022100e664861517c0ea91df7e4bde7001b7cda6b034a7f4c4c6e622b681a57bf72c4102207b02fa4046f6ca5c180aa60ee57e67fff4e82c09a7e60515b15a989cd4bd5d3a01>
在這個特定的交易中,這恰好是一個簽名。然後讀取下一個 1 字節,即 0x21,就像上面一樣,您還有另一個數據要推送,大小 = 33,恰好是公鑰:
<03017e89c4294b1ca99533b424c367db4f18747c0cacad393e3fb103640bcdb2ce>
對其他腳本執行相同操作。例如,對於 PubkeyScript,腳本的大小是 0x19=25,腳本中的第一個字節是 0x76(你會在 Stack 下找到它)這個值是 OP_DUP(與前兩個字節不同,沒有後續數據要讀取,只有要執行的“操作”是複制頂部堆棧項)。下一個字節是 0xa9=OP_HASH160(在 Crypto 下找到)等等。
2)如何驗證解鎖(輸入)腳本確實適用於鎖定(輸出)腳本?僅使用我上面生成的交易詳細資訊是否可行?
您總是需要至少 2 筆交易。1 是您擁有並想要驗證的目前一個,另一個是它正在花費的交易輸出。這裡是 txid
81b3bcc34490facea42a729ae166f599c7933501273010d0eb0c2a0efe190153
和 outIndex=0 的交易。現在,您將相應索引(鎖定腳本)中的先前事務的 PubkeyScript 與該事務的 SignatureScript(解鎖腳本)一起使用並執行每個操作。每個步驟請參見此範例。