- Full Node,存放所有Block和Transaction
- SPV Node,存放所有Block Header
自從中本聰的Bitcoin P2P Network論文,2008年橫空出世之來,他就預測到,將來必定是SPV Node盛行,所以他很早就提出了SPV (Simplified Payment Verification)的概念。
本篇先為這個問題:「Bitcion Wallet如何知道有多少UTXO?」,提供簡單的回答。
我們知道,Wallet只存所有的Block Header,而沒有全部的Transaction,最多只存屬於自己的Transaction。一開始,連Block Header都沒有的情況下,如何知道Wallet有些UTXO(Unspent Transaction Output)呢?它要去問具有完整帳本(Blockchain)的Peer。問的方式有兩種:
方法一:下載完整帳本(Blockchain)後自己從裡面去找
方法二:向Peer公開Wallet的所有訊息,Peer就回傳屬於該Wallet的UTXO
方法三:向Peer公開Wallet的部份訊息,Peer回傳可能屬於該Wallet的UTXO
這個問題,講白一點,就是:「我想知道錢包有多少錢?」
要知道真實的錢包有多少錢,直接打開來數一下就行了。Bitcoin Wallet,是電子錢包,運行的時候,會顯示目前的餘額,斷電的時候,不需要保存餘額,因為下次重啟的時候,只要去問就好了。根據什麼來問?Wallet惟一需要存放的,是一組Private Keys,被安全存放在晶片裡,可能是Secure Element或Trust Zone。這一組Key是別人獲取不到的,甚至Wallet App自己也獲取不到。Wallet的安全晶片,可以從Private Key去推算出Public Key。這個Public Key可以視為Address。有時候Address是從Public Key被Hash兩次算得來的。
我們把Address視為銀行的帳號。所以別人要給我Bitcoin,我就要將Address給別人,請他將錢匯到這個帳號,就行了。
回到原來的問題「我想知道錢包有多少錢?」
方法一:下載完整帳本(Blockchain),然後自己從裡面去找
這種方法,最簡單,但耗費的網路頻寬最多,至要要傳輸100G以上的資料量。因為Wallet沒有向Peer表明,那些Address屬於Wallet,所以Peer當然不知道那些Address屬於Wallet。我們無法從Blockchain存放的Address,往回推導出是從那一個Wallet產生出來的。所以Peer只好將Blockchain一股腦傳給Wallet,讓Wallet自己去找。
優點:結果精確,保留隱私
缺點:浪費頻寬
方法二:向Peer公開Wallet的所有訊息,Peer就回傳屬於該Wallet的UTXO
Wallet向Peer公開所有的Address,可是這樣一來,就洩露隱私。Peer拿到Address,就回報屬於該Wallet的UTXO,及所屬的Block。根據中本聰的論文,此Block不會自帶所有的Transaction,而是Merkle Path。
優點:結果精確,簡省頻寬
缺點:洩露隱私
缺點:洩露隱私
方法三:向Peer公開Wallet的部份訊息,Peer回傳可能屬於該Wallet的UTXO
Wallet向Peer公開部份訊息,以Bloom Filter呈現。Peer拿到Bloom Filter,就回報「可能」屬於該Wallet的UTXO,及所屬的Block Header,及Merkle Path。因為Bloom Filter沒有直接呈現Address,所以保留了一點隱私。
但是Bloom Filter,的特性是:
- 沒有從Bloom Filter過瀘出來的Transaction,「一定」不是屬於Wallet的
- 從Bloom Filter過瀘出來的Transaction,「應該」是屬於Wallet的
- 而且隨者Wallet的Transaction數量愈大,「應該」的準確性就愈低。
優點:保留一定程度的隱私,簡省頻寬
缺點:結果不精確 (但可接受)
下一篇,對「方法三」,會有圖文並茂的說明。
-Count
沒有留言:
張貼留言