Bitcoin-Core
如何從原始事務中獲取 r、S 和 Z 值(版本 2)
例如我有這個原始交易
0200000000010177858f84b8534b69d5ce161ce709854f18d3a37b607abf570f301eb3d6e0d2520100000017160014f8513401ea5e9dcd57597e8a736f162572d19079feffffff020f68a5000000000017a914d55600283b297e12a0a8e1a92da7c03c0bcb6c528780412942000000001976a914ed5268cb6853e1934f5ec3c1eb637e1ac8ca5fa688ac0247304402207db22867e47fd73b43d44d2faf51f492c7e13b0356e64928e4ee5ccb8c5654b3022046b569f15fae82c6c9ffe91e98c63004974aab0582e7296ef2cec555fc329ee30121037ef7c159605d43e78d4c1ad53b53e60e46bcc504ad9bca6c33fd889fcc324eea00000000
如何從簽名中提取 r、S 和 Z 值?
我很樂意一步一步地解釋。
要添加到前面的答案 0xb10c,Z 是簽名雜湊。它是正在簽名的消息的雜湊,對於交易,它是具有空 ScriptSig 的交易的雜湊。對於見證交易,這是交易的雜湊,因為 Scriptsig 已經是空的。
~~你的問題有點不清楚。我假設您正在使用 Bitcoin Core,並希望從原始交易中的 ECDSA 簽名中提取
r
和S
值。我不知道你所說的“sig Z”是什麼意思。~~編輯後的問題現在更清楚了。我是在回答問題後才了解 Z 值的,因此這裡不作說明。Bitcoin Core 提供了一個
decoderawtransaction
RPC,你可以使用它來將交易解碼為 JSON。bitcoin-cli decoderawtransaction 0200000000010177858f84b8534b69d5ce161ce709854f18d3a37b607abf570f301eb3d6e0d2520100000017160014f8513401ea5e9dcd57597e8a736f162572d19079feffffff020f68a5000000000017a914d55600283b297e12a0a8e1a92da7c03c0bcb6c528780412942000000001976a914ed5268cb6853e1934f5ec3c1eb637e1ac8ca5fa688ac0247304402207db22867e47fd73b43d44d2faf51f492c7e13b0356e64928e4ee5ccb8c5654b3022046b569f15fae82c6c9ffe91e98c63004974aab0582e7296ef2cec555fc329ee30121037ef7c159605d43e78d4c1ad53b53e60e46bcc504ad9bca6c33fd889fcc324eea00000000 { "txid": "de527fc755b4307c1f615cceda469c0a8057b0f29e73f86b543a98ce5d978462", "hash": "08b7d919d467558638a7f50e8011a3dfe62769d7f01a35d5b87b66712fe62740", "version": 2, "size": 249, "vsize": 168, "weight": 669, "locktime": 0, "vin": [ { "txid": "52d2e0d6b31e300f57bf7a607ba3d3184f8509e71c16ced5694b53b8848f8577", "vout": 1, "scriptSig": { "asm": "0014f8513401ea5e9dcd57597e8a736f162572d19079", "hex": "160014f8513401ea5e9dcd57597e8a736f162572d19079" }, "txinwitness": [ "304402207db22867e47fd73b43d44d2faf51f492c7e13b0356e64928e4ee5ccb8c5654b3022046b569f15fae82c6c9ffe91e98c63004974aab0582e7296ef2cec555fc329ee301", "037ef7c159605d43e78d4c1ad53b53e60e46bcc504ad9bca6c33fd889fcc324eea" ], "sequence": 4294967294 } ], "vout": [ { "value": 0.10840079, "n": 0, "scriptPubKey": { "asm": "OP_HASH160 d55600283b297e12a0a8e1a92da7c03c0bcb6c52 OP_EQUAL", "hex": "a914d55600283b297e12a0a8e1a92da7c03c0bcb6c5287", "reqSigs": 1, "type": "scripthash", "addresses": [ "3M92sq9ssFaNbEwF47uteVKJsbw125juS7" ] } }, { "value": 11.10000000, "n": 1, "scriptPubKey": { "asm": "OP_DUP OP_HASH160 ed5268cb6853e1934f5ec3c1eb637e1ac8ca5fa6 OP_EQUALVERIFY OP_CHECKSIG", "hex": "76a914ed5268cb6853e1934f5ec3c1eb637e1ac8ca5fa688ac", "reqSigs": 1, "type": "pubkeyhash", "addresses": [ "1NdqsNEXYx9RnpoPqdkfW7hmZiDuX8BrgK" ] } } ] }
從 JSON 響應中,您可以看出您的交易有一個輸入和兩個輸出。該交易有一個 Nested-P2WPKH 輸入和一個 P2SH 和 P2PKH 輸出。您將在輸入中找到 ECDSA 簽名。由於輸入花費了 SegWit 輸出,因此簽名是見證元素(在 JSON 中是 的一部分
txinwitness
)。見證包含兩個元素。
txinwitness: 1. 304402207db22867e47fd73b43d44d2faf51f492c7e13b0356e64928e4ee5ccb8c5654b3022046b569f15fae82c6c9ffe91e98c63004974aab0582e7296ef2cec555fc329ee301 2. 037ef7c159605d43e78d4c1ad53b53e60e46bcc504ad9bca6c33fd889fcc324eea
在 Nested-P2WPKH(或通常來自 P2PKH 系列的所有腳本模板)中,第一個見證元素是 ECDSA 簽名,第二個是相應的公鑰。所有較新的 ECDSA 簽名(自 2015 年夏季啟動 BIP-66 以來)必須嚴格進行 DER 編碼。有關 DER 編碼的更多資訊,請參見例如:為什麼簽名總是 65 (1+32+32) 字節長?
解碼 DER 編碼的 ECDSA 簽名(第一個見證元素)產生:
DER marker: 30 Sig length: 44 r-value marker: 02 r-value length: 20 (32 byte) r-value: 7db22867e47fd73b43d44d2faf51f492c7e13b0356e64928e4ee5ccb8c5654b3 S-value marker: 02 S-value length: 20 (32 byte) S-value: 46b569f15fae82c6c9ffe91e98c63004974aab0582e7296ef2cec555fc329ee3 SigHash: 01
r-value
和都是S-value
大端整數。