2017年3月7日 星期二

SPV Node如何建立UTXO Pool?

SPV Node如何建立UTXO Pool?

這個問題,又衍生另一個問題。

SPV Node需要建立包含所有UTXO的UTXO Pool嗎?

我們可以從Wallet(電子錢包)的角度去想這些問題。

Bitcoin的UTXO (Unspent Transaction Output),就是尚未花費的輸出,相當於現實世界還沒有花出去的鈔票。

Software Wallet是SPV Node的一種,它會有一個Database儲存屬於該Wallet的UTXO Pool。

Wallet為何不存放別人的UTXO呢?

因為這樣做沒有多大用處。我們知道Wallet,相當於現實世界的錢包,Wallet所記錄的UTXO,其值的加總,就相當於現實世界的錢包裡放了多少錢。

現實世界裡,你的錢包會記錄別人的錢包有多少錢嗎?

不會的。所以Bitcoin Wallet只記錄所屬的UTXO就好了。

使用新的Wallet,它的UTXO Pool為空的,因為還沒有用它來進行Transaction。只要有Transaction發生,並且該Transaction收集到Block,成為Blockchain,該Transaction的Output就是UTXO了。這時Wallet的UTXO Pool就會記錄一筆UTXO了。

UTXO Pool就是Persistent Database,如果被破壞了,UTXO不見了,是否表示錢就不見了?

我們使用Bitcoin不用擔心Database消失這件事。因為Wallet的UTXO來自於Blockchain,而每一個Node都有相同的Blockchain。所以UTXO不見了,只要去連網,重新下載UTXO就好了。我們要擔心的是Private Key消失或洩露。

即然Wallet的UTXO來自於網路上的Blockchain,為何還要自己保存一份在UTXO Pool?

那是為了Offline Payment方便。可以在離線狀況,知道自己有多少錢。甚至可以做到離線支付。

如何預防 Malicious Wallet (惡意錢包)?

Bitcoin Wallet有很多型式,程式是其中一種。我們可以自己寫一個Wallet程式,然後建立一個Transaction,去挖別人的UTXO,變成自己的嗎?

如果有別人的Private Key,這麼做是可行的,因為我們可以拿別人的Private Key對Transaction的Input簽名。這樣一來,當Transaction上傳到某個Node,會被驗證通過,進而放到Blockchain,這樣錢就要不回來了。

所以Wallet的Private Key非常重要,絕不能洩露出去,也絕不能不遺失。因為若Private Key遺失,我們就沒辦將UTXO花掉。所以:
  • 「Private Key遺失」,就是錢不見的意思。
  • 「Private Key洩露」,就是錢隨時會被愉走的意思。

所以有另一種Wallet叫Paper Wallet,就是將Private Key印出來,長的像鈔票似的,上面有Private Key,還有它的二維碼。說它長的像鈔票,其實就是鈔票。和一般鈔票不同,這張鈔票是不能給別人看到的,自己留者備份,防止Private Key遺失。

下圖是「Mastering Bitcoin」這本書裡,談到的Paper Wallet


Paper Wallet安全嗎?

這裡有一個吊詭的地方。我們做Security System的都知道,存放Private Key最安全的地方是Secure Element,程式是無法讀取裡面的Private Key。
  • 程式要能讀取Private Key,才能列印。
  • 若Private Key能被程式讀取,表示它的儲存方式是不安全的。
這裡面還有很多細節,需要去探討。用密碼去保護Private Key,可能是其中一個方法。目前我還沒有明確的答案。

-Count

沒有留言:

張貼留言