隔離見證交易的結構、規則、驗證過程
上文講到了隔離見證升級方案的曲折之路,今天主要講一下原理。
首先聊一下隔離見證的交易結構。
我們需要清楚的是,對於那些沒有升級為支持隔離見證的節點來說,他們在獲取到隔離見證交易時是完全感知不到的,因為對於舊節點來說,交易結構並沒有改變。
對於升級為支持隔離見證的節點來說,他們不僅能看到屬於交易結構中的內容,並且還能看到這筆交易結構外部包含的一小塊信息,這裡的信息才是隔離見證的信息。信息里,包括了marker、flag、witness三個部分。
marker和flag都是標記,marker要求必須是1個位元組的0,即0x00,flag要求必須是1位元組的非0值,目前是0x01。
witness就是隔離見證(SegWit)中的見證(Wit)。即,對交易簽名。
我們在比特幣交易上鎖的幾大鎖定規則文章中提到過,目前比特幣的交易類型。文章提到的有:P2PKH、P2SH等等。不同的交易類型,對應著不同的隔離見證的方案。
我們先看P2PKH交易類型的交易,如果用了隔離見證,是什麼樣子的:
witness:
scriptSig: (empty)
scriptPubKey: 0
我們可以看到,witness部分,存放的是之前解鎖工具里的東西。scriptSig是指原交易結構中的解鎖工具,隔離見證的交易里,此處置空。scriptPubKey是指那把鎖,也就是鎖定腳本,包含兩個部分,一個是0,另一個是20個位元組的加密數據。
0的意思,是指隔離見證交易的版本號是0。未來可能會支持其它版本的交易。
很明顯,我們能看出來,原交易結構中的解鎖腳本置空,將本來存放於解鎖腳本里的內容放入了witness中存儲。
這樣的話,當未升級的節點在進行驗證時,發現解鎖腳本中竟然是空的,並且鎖定腳本也沒有什麼CHECK相關的操作,那麼舊節點會認為這個地址里的幣誰都可以花,但並不符合標準的交易類型,於是對於這種交易來說,他會拒絕, 對於包含這種交易的區塊來說,會驗證通過。(複雜的比特幣升級分析(4)里講過為什麼對交易拒絕,對區塊接受)
對於升級了的節點,首先要驗證鎖定腳本里開頭是不是0,如果是0,判斷後面的是不是20個位元組。如果是,再去用witness里的公鑰經過HASH160加密後與鎖定腳本中的20位元組數據對比是否一致。如果一致,再用witness中的私鑰簽名與公鑰通過CHECKSIG操作進行驗證,是否會返回TRUE。
我們把採用P2PKH交易類型的隔離見證交易稱為P2WPKH,即pay-to-witness-public-key-hash。
我們把採用P2SH交易類型的隔離見證交易稱為P2WSH,即pay-to-witness-script-hash。
對於P2WSH交易類型的交易,是什麼樣子的:
witness: 0
2 CHECKMULTISIG>
scriptSig: (empty)
scriptPubKey: 0
我們可以看到,witness部分就是原先解鎖腳本的內容。scriptSig就是原交易結構中的需要存儲解鎖腳本的地方,此處置空。scriptPubKey是上筆收幣地址的鎖,也就是鎖定腳本。
鎖定腳本中的0,與P2WPKH類型里鎖定腳本的0的意思是一樣的,是指隔離見證交易的版本號是0。未來可能會支持其它版本的交易。
舊節點驗證過程同P2WPKH。
對於新節點,在驗證P2WSH交易類型的交易時,需要用witness里的多個公鑰,進行SHA256加密,得到的結果與鎖定腳本中的32個位元組數據比對是否一致。然後再用witness里的簽名與公鑰,通過CHECKMULTISIG操作碼去驗證簽名是否正確,如果返回TRUE,則代表沒錯。
這裡需要提到的是,如果鎖定腳本中,隔離見證版本號不是0,那麼代表這個隔離見證交易的版本不是目前定義過的,於是會拒絕這樣的交易。(unknown)
在比特幣交易上鎖的幾大鎖定規則(補充)文章末尾,我們提到的還剩幾個隔離見證交易類型,今天已全部講解完畢。
關注【通俗易懂區塊鏈】,學懂區塊鏈
TAG:通俗易懂區塊鏈 |