btcd源碼解析 —— 簽名機制(2) ——簽名流程

4. 簽名流程——原理層

在前一篇博客中,我們介紹了比特幣簽名機制的基礎知識。本篇博客我們將從原理層介紹簽名流程。下一篇博客btcd源碼層面講解簽名流程

正如我們在第3節中所述,比特幣主要包含6種組合簽名類型。對應於每一種簽名類型,簽名的流程也不同。
本節將針對兩大類(無修飾類和有修飾類)進行分別介紹。對於每一大類,也將首先講解各種簽名類型下共有的一些簽名流程,然後按小節分別講解每一種簽名類型種特有的流程。
本節主要從原理層面進行介紹,下一節將展示對應的源碼實現。
此外,需要聲明的是,本小節使用到的多幅圖片都摘自電子書Bitcoin Developer Reference的4.5節。

4.1. 無修飾類

本小節首先介紹無修飾類中一些共有的簽名流程。
如上篇博客中的3.2小節所述,無修飾類中的message是包含了所有input的。但這裏的包含並不是簡單直接的包含,而是對所有input進行處理後的包含。
我們以圖1爲例進行共有簽名流程的介紹:

  1. 在後面的內容中,我們都是以第一個input (vin[0])爲例進行介紹,其他input也是同理。
  2. 簽名部分填充在vin[0]的的scriptSigLenscriptSig中,也即圖中紅色框中。
  3. 對於vin[0]而言,簽名之前scriptSigLenscriptSig中是沒有內容的。其藉助於vout[0]中的scriptPubkey進行填充。具體而言,將vout[0]中的scriptPubkey去除OP_CODESEP操作碼後,將其內容和長度分別填充到scriptSigscriptSigLen中。如圖2中黃色框所示。
  4. 對於其他input(如vin[1])而言,scriptSigLenscriptSig分別填充爲0值和空值,如圖2中暗綠色框所示。

以上便是無修飾類的簽名類型共有的簽名流程。以下分小節分別介紹每種特定類型的簽名流程。
圖1

圖1

圖2

圖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值。
圖3

圖3

4.1.3. SIGHASH_SINGLE類型

如前所述,SIGHASH_NONE類型中的message包含全部的input,且只包含對應當前inputoutput
如圖4所示,黃色框表示message中只包含vout[0]的內容。此外,nSequence也被置爲0值,output的數目被置爲當前inputindex+1(如紅色框所示)。
圖4

圖4

4.2. 有修飾類

本小節首先介紹有修飾類中一些共有的簽名流程。如前所述,SIGHASH_ANYONECANPAY修飾後的message不包含其他input.
如圖5所示:

  1. 對於vin[0]而言,scriptSigLenscriptSig也分別填充scriptPubkey去除OP_CODESEP操作碼後的內容。
  2. 其他input (如vin[1]) 的內容不被包含
  3. input的數目被置爲1,如圖5中的紅色框所示。
    圖5
圖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的灰色部分所示。
圖6

圖6

4.2.3. SIGHASH_SINGLE | SIGHASH_ANYONECANPAY類型

該類型和4.2.1.小節的區別也是在output部分,其message內容如圖7的灰色部分所示。
圖7

圖7
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章