2017年3月15日 星期三

Full Node和SPV Node如何驗證Transaction?

對於Full Node和SPV Node如何驗證Transaction?在閱讀完以下論文、書籍、網上資料後,我把這個問題整理出來,希望能解釋清楚,讓大家了解:

首先,我們要知道,Transaction的驗證,實際上有兩件事情要做。前篇文章有提:
  1. Transaction存在性檢查 
  2. Transaction無重花(重覆花費)檢查 
Full Node和SPV Node對這兩項檢查的策略不同,Full Node是走Height,SPV Node是走Depth。想必大家剛開始研究Bitcoin時,也常常搞不清楚什麼是Height,什麼是Depth?希望本文,對照下圖,能為大家撥雲見日:


Verify Transaction
  • Full Node - Block Height Verification
  • SPV Node - Block Depth Verification

Full Node - BHV (Block Height Verification)

Full Node就是有完整Blockchain的Node,所以檢查Transaction是否存在Block,就拿它與整個Blockchain搜尋一下就好了。

Transaction存在性檢查通過,並不保證該Transaction的Input不是重花,所以要進行這項檢查。方法有兩種:

方法一:如圖,我們要檢查的Transaction叫tx2,它己經被驗證是在Block 300000裡。於是Full Node就往之前的Block去找Transaction串列,如找到tx1的output是tx2的input,就表示tx2的確被花費了。為了確保tx2沒有被重花,還得往更前面的Block去找,直到Genesis Block為止。

方法二:從Blockchain建立UTXO Pool,也就是將所有未花費的transaction收集起來。其實一旦建立了UTXO Pool,也就驗證了所有Transaction沒有被重花。

SPV Node - BDV (Block Depth Verification)

這種方法,在中本聰論文提到。SPV Node只有Block Header,為了檢查Transaction是否存在某個Block,就去問Full Node,它會回傳Merkle Path給SPV Node,SPV Node用它來驗證該Transaction是否存在Block,此驗證方稱之為Merkle Path Proof。

一樣,Transaction存在性檢查通過,並不保證該Transaction的Input不被重花。SPV Node採用不同的方式,它是去看之後的Block有幾個。愈多,表示該Transaction所屬的Block被「埋」的愈深,用Depth表示Transaction被埋的深度。埋的愈深,表示該Transaction被Confirm的次數就愈多。一般來說,Transaction被6個Block埋,就夠了。這表示該Transaction在Blockchain裡面,是被大家核準通過的,而且沒有重花。

當然,BDV的嚴謹性,比不上BHV。因為SPV Node沒有全部的Transaction,無法做到BHV,BDV是退而求其次的方法。

-Count

沒有留言:

張貼留言