文章目錄
4. 簽名流程——原理層
在前一篇博客中,我們介紹了比特幣簽名機制的基礎知識。本篇博客我們將從原理層介紹簽名流程。下一篇博客從btcd
源碼層面講解簽名流程
正如我們在第3節中所述,比特幣主要包含6種組合簽名類型。對應於每一種簽名類型,簽名的流程也不同。
本節將針對兩大類(無修飾類和有修飾類)進行分別介紹。對於每一大類,也將首先講解各種簽名類型下共有的一些簽名流程,然後按小節分別講解每一種簽名類型種特有的流程。
本節主要從原理層面進行介紹,下一節將展示對應的源碼實現。
此外,需要聲明的是,本小節使用到的多幅圖片都摘自電子書Bitcoin Developer Reference的4.5節。
4.1. 無修飾類
本小節首先介紹無修飾類中一些共有的簽名流程。
如上篇博客中的3.2小節所述,無修飾類中的message
是包含了所有input
的。但這裏的包含並不是簡單直接的包含,而是對所有input
進行處理後的包含。
我們以圖1爲例進行共有簽名流程的介紹:
- 在後面的內容中,我們都是以第一個
input
(vin[0]
)爲例進行介紹,其他input
也是同理。 - 簽名部分填充在
vin[0]
的的scriptSigLen
和scriptSig
中,也即圖中紅色框中。 - 對於
vin[0]
而言,簽名之前scriptSigLen
和scriptSig
中是沒有內容的。其藉助於vout[0]
中的scriptPubkey
進行填充。具體而言,將vout[0]
中的scriptPubkey
去除OP_CODESEP
操作碼後,將其內容和長度分別填充到scriptSig
和scriptSigLen
中。如圖2中黃色框所示。 - 對於其他
input
(如vin[1]
)而言,scriptSigLen
和scriptSig
分別填充爲0值和空值,如圖2中暗綠色框所示。
以上便是無修飾類的簽名類型共有的簽名流程。以下分小節分別介紹每種特定類型的簽名流程。
4.1.1. SIGHASH_ALL
類型
如前所述,SIGHASH_ALL
類型中的message
包含了全部的outputs
和修改後的inputs
。
如圖2所示,其中TxNew
的灰色部分即爲message
的內容。
4.1.2. SIGHASH_NONE
類型
如前所述,SIGHASH_NONE
類型中的message
包含全部的input
但不包含任何output
。
如圖3所示,output
的數目被置爲0,message
中不包含任何output
。此外,nSequence
也被置爲0值。
4.1.3. SIGHASH_SINGLE
類型
如前所述,SIGHASH_NONE
類型中的message
包含全部的input
,且只包含對應當前input
的output
。
如圖4所示,黃色框表示message
中只包含vout[0]
的內容。此外,nSequence
也被置爲0值,output
的數目被置爲當前input
的index+1
(如紅色框所示)。
4.2. 有修飾類
本小節首先介紹有修飾類中一些共有的簽名流程。如前所述,SIGHASH_ANYONECANPAY
修飾後的message
不包含其他input
.
如圖5所示:
- 對於
vin[0]
而言,scriptSigLen
和scriptSig
也分別填充scriptPubkey
去除OP_CODESEP
操作碼後的內容。 - 其他
input
(如vin[1]
) 的內容不被包含 input
的數目被置爲1,如圖5中的紅色框所示。
以下分小節分別介紹每種特定類型的簽名流程。
4.2.1. SIGHASH_ALL | SIGHASH_ANYONECANPAY
類型
圖5中TxNew
的灰色部分也表示了SIGHASH_ALL | SIGHASH_ANYONECANPAY
類型的message
內容。
對比4.1.小節中的圖1,兩者除了input
外,message
中的其他內容完全一致。
4.2.2. SIGHASH_NONE | SIGHASH_ANYONECANPAY
類型
該類型和4.2.1.小節的區別主要在output
部分,其message
內容如圖6的灰色部分所示。
4.2.3. SIGHASH_SINGLE | SIGHASH_ANYONECANPAY
類型
該類型和4.2.1.小節的區別也是在output
部分,其message
內容如圖7的灰色部分所示。