- Bitcoin: A Peer-to-Peer Electronic Cash System
- Mastering Bitcoin
- https://en.bitcoin.it/wiki/Thin_Client_Security
首先,我們要知道,Transaction的驗證,實際上有兩件事情要做。前篇文章有提:
- Transaction存在性檢查
- 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
沒有留言:
張貼留言