Bitcoin-Core

如何從原始事務中獲取 r、S 和 Z 值(版本 2)

  • July 26, 2021

例如我有這個原始交易

0200000000010177858f84b8534b69d5ce161ce709854f18d3a37b607abf570f301eb3d6e0d2520100000017160014f8513401ea5e9dcd57597e8a736f162572d19079feffffff020f68a5000000000017a914d55600283b297e12a0a8e1a92da7c03c0bcb6c528780412942000000001976a914ed5268cb6853e1934f5ec3c1eb637e1ac8ca5fa688ac0247304402207db22867e47fd73b43d44d2faf51f492c7e13b0356e64928e4ee5ccb8c5654b3022046b569f15fae82c6c9ffe91e98c63004974aab0582e7296ef2cec555fc329ee30121037ef7c159605d43e78d4c1ad53b53e60e46bcc504ad9bca6c33fd889fcc324eea00000000

如何從簽名中提取 r、S 和 Z 值?

我很樂意一步一步地解釋。

要添加到前面的答案 0xb10c,Z 是簽名雜湊。它是正在簽名的消息的雜湊,對於交易,它是具有空 ScriptSig 的交易的雜湊。對於見證交易,這是交易的雜湊,因為 Scriptsig 已經是空的。

~~你的問題有點不清楚。我假設您正在使用 Bitcoin Core,並希望從原始交易中的 ECDSA 簽名中提取rS值。我不知道你所說的“sig Z”是什麼意思。~~編輯後的問題現在更清楚了。我是在回答問題後才了解 Z 值的,因此這裡不作說明。

Bitcoin Core 提供了一個decoderawtransactionRPC,你可以使用它來將交易解碼為 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大端整數。

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