Script

如何驗證鎖定和解鎖腳本?

  • December 3, 2019

我選擇了一個任意的交易 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 是您擁有並想要驗證的目前一個,另一個是它正在花費的交易輸出。這裡是 txid81b3bcc34490facea42a729ae166f599c7933501273010d0eb0c2a0efe190153和 outIndex=0 的交易。現在,您將相應索引(鎖定腳本)中的先前事務的 PubkeyScript 與該事務的 SignatureScript(解鎖腳本)一起使用並執行每個操作。每個步驟請參見此範例

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