(伯顿·霍华德·布隆,布隆过滤器发明者。图片来源于网络)
前情回顾:
比特币史话·81 | 有容乃大(5): 1比特币300万美元?
比特币史话·82 | 有容乃大(6): 二层支付网络
比特币史话·83 | 压缩(1): 默克尔树
比特币史话·84 | 压缩(2): 装到手机里
比特币史话·85 | 压缩(3): 植树造林
正文:
采用默克尔树来组织比特币交易数据使得两种压缩比特币区块链大小的方法变得可能:第一种方法是剪枝,从默克尔树上把时间足够早的、埋的足够深的、已经花掉的“硬币”(交易输出)删除,从而减少数据量;第二种方法是SPV(简化支付验证),把默克尔树叶子上挂着的交易数据全部剔除,只保留默克尔树本身。由于默克尔树的特性,两种方法都可以在不破坏区块头哈希值的前提下删减交易数据,从而压缩区块大小。而第二种方法更是可以把一个区块的大小从1MB压缩到80字节,尺寸减小了99.99%还要多。
作为区块链最重要的检查双花交易的功能,SPV可以在占用很小的存储空间的情况下完成这一任务,但是它完成这一任务的方式与保存有全量区块链账本数据的全节点有所不同。由于SPV轻量级节点并不下载交易数据,所以它无法基于历史数据构建UTXO数据库。这样一来,当收到一笔交易时,它只能判断该笔交易所声称花费的一个之前的UTXO(未花交易输出)的确存在,但不能判断其是否真的没有被双花。它只能依靠全节点们来验证交易的有效性,通过等到该笔交易被挂到了“种在”某个区块高度的区块里的默克尔树上之后,又延长了6个区块。这被形象地称为“埋在”了6个区块“深度”之下。
因此,SPV轻量级节点的可靠性是由比特币网络中的其他全节点所保障的。正如中本聪在2008年比特币白皮书中所写的那样,“只要诚实节点控制网络,SPV就是可靠的;但是如果网络被攻击者压制,SPV就更脆弱。尽管网络节点可以自己验证交易,但是只要攻击者可以持续压制网络,SPV的方法就可能被攻击者的虚假交易所欺骗。一种防止这种情况发生策略是接受来自网络节点的警报,当网络节点检测到无效区块时,提示用户端软件去下载完整区块与被警报的交易以确认不一致性。频繁接收付款的企业可能仍然希望运行自己的节点,以获得更独立的安全性和更快的验证。”[1]
由于SPV轻量级节点需要从全节点下载自己关心的交易,比如钱包用户的地址相关的交易,这就存在泄露用户隐私的风险,因为他人可以通过窃听SPV节点下载了哪些交易从而分析出该钱包用户关心的比特币地址是哪些,从而把比特币地址和用户的真实身份关联起来。为了更好的保护用户隐私,比特币让SPV节点使用了称为“布隆过滤器”(bloom filter)的技术来从全节点获取数据但不让任何人知道哪些数据是它真正关心的。
布隆过滤器这个神奇的概率型数据结构(probabilistic data structure),是由美国计算机科学家伯顿·霍华德·布隆(Burton Howard Bloom)在1970年发明的[2]。它有一个有趣的特点,就是不感兴趣的数据有可能被过滤出来,也就是说,可能出现假阳性(false positive),但是,感兴趣的数据一定不会被过滤出去,换句话说,绝对不会有假阴性(false negative)。
通过使用布隆过滤器,比特币SPV轻量级节点可以轻松地从全节点下载感兴趣的交易数据,由于混杂了假阳性的数据,这就使得第三人很难通过数据分析来推测用户的真实地址,从而保护了隐私。而布隆过滤器绝对不会出现假阴性的特性,又保证了SPV轻量级节点绝对不会遗漏掉用户的交易数据,从而确保了历史数据的完整性。
【未完待续】(公众号:刘教链)