作者:林冠巨集 / 指尖下的幽靈。轉載者,請: 務必標明出處。
GitHub : https://github.com/af913337456/
出版的書籍:
本文風格採用單刀直入方式。
前提資訊
- 私鑰 可以推出 公鑰;
- 公鑰 可以推出 公鑰雜湊;
- 1 和 2 皆不能反推。
發交易時 -- 簽名資料的組成
花費比特幣的一個輸入,即花費 input 的時候,在構建交易的時候,簽名階段
需要在 input 結構中,攜帶上簽名資料體,即 signature_script
。其核心結構如下:
{
"outpoint":{
"tx_hash": "",
"index": 0
},
"signature_script": object,
...
}
關鍵在 signature_script
中,它的組成有幾部分,結合下面原始碼片段可知。
signature_script = 其它 + signature + pkData
上面等式右邊的其它
,代表是一些比特幣虛擬機器的操作碼,我們忽略它。然後,signature
私鑰是對交易簽名的真實資料,pkData
是從私鑰privKey
推出的公鑰雜湊(pubkeyHash)。
發交易時 -- 接受者的 output 組成
output 即輸出,可以在裡面指明轉賬的收款人是誰,收多少數值的 btc,其結構是:
{
"value": 1,
"pk_script": []byte
}
pk_script
是位元組陣列,它對應著指令碼位元組資料。比特幣擁有很多不同的腳步(script)結構:
P2PKH, P2SH, P2WSH, P2WPKH ...
下面拿 P2PKH 做例子。結合下面原始碼截圖可知其位元組陣列結構是:
OP_DUP
OP_HASH160
pubKeyHashOP_EQUALVERIFY
OP_CHECKSIG
OP_DUP
OP_HASH160
這些是什麼?這些是比特幣虛擬機器的操作碼,OP
是英文operation
的縮寫,操作碼的本質是16進位制數字。想詳細瞭解它們,可以購買本人的第二本書籍,內含詳細技術分析,包含虛擬機器。
上面的 P2PKH
結構,虛擬機器在執行它的時候,程式碼執行流程如下:
OP_DUP
: 執行複製棧頂資料
操作,然後該資料放置棧頂;OP_HASH160
: 執行對棧頂資料進行 ripemd160 雜湊運算
操作。160 前,會先進行一次 sha256(data);OP_EQUALVERIFY
: 執行對比棧頂的兩個資料
操作,如果相等都被移除;OP_CHECKSIG
: 執行驗證簽名
操作,這裡會用到pubKeyHash
。
記住這個 pubKeyHash
,它是後面驗籤要用到的,它是公鑰雜湊。
驗籤
上面內容把驗籤需要的資料都準備好了,驗簽名步驟如下:
- 節點接收到交易後,從新交易的資料中獲取到 input 結構中的 signature_script(scriptSign), tx_hash, index 引數;
- 使用 1 中的 tx_hash,index 找到這筆 input 所對應的 output (UTXO模型),設為 A ;
- 從 A 中得到
pk_script
指令碼指令,以及它裡面的pubKeyHash
; - 從 signature_script 按照位元組範圍得到
pkData
,即pubKey
(公鑰); - 從 pubKey 中推出
pubKeyHash_1
,比較pubKeyHash_1
==pubKeyHash
; - 結束驗籤。
課後解答
- 為什麼 P2PKH 腳步中不直接存放 pubKey 而放 pubKeyHash?
答:為了隱藏收款人的公鑰。
- 為什麼以太坊的驗籤方式和比特幣的差異這麼大?
答:賬戶模型的不同,導致了這樣的結果。