Bitcoin Network 大致上有两种Node:
如果只有Full Node,那我们就不用去想设计Merkle Tree,以及后来的Bloom Filter,那么这个世界就简单多了。但为了要让Bitcoin Wallet(钱包)可以通行所有装置,特别是手机,SPV Node就很重要了,不然就需要100G以上空间存放整个Blockchain,这是不可行的。
自从中本聪的Bitcoin P2P Network论文,2008年横空出世之来,他就预测到,将来必定是SPV Node盛行,所以他很早就提出了SPV (Simplified Payment Verification)的概念。
而后来2012年提出的BIP37 - Connection Bloom Filtering,是基于SPV的概念,用Bloom Filter,提出一个更加可行的方案出来。
本篇先为这个问题:“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,的特性是:
优点:保留一定程度的隐私,简省频宽
缺点:结果不精确 (但可接受)
下一篇,对“方法三”,会有图文并茂的说明。
-Count