布隆过滤器(Bloom Filter),可以不用知道一个块里的所有交易数据,而只用下载很少的数据,就能知道一个交易是否在一个块里(如果在块里,那么一定告诉你在块里,如果不在块里,有很小概率告诉你在块里). 算法的设计的还是很妙的,值得去学习一下这种概率型算法思维。
原理:
Step1 :
假设一个块有n个交易,那么做一个m=2*n长度的bit array,这里称为A
用一个hash函数把交易映射到A的响应位置x=hash[transaction], 并设置A[x]=1。并不处理冲突的情况。
那么查交易的时候,如果交易在块里的话A[hash[transation]]一定为1,
如果不在块里的话,A[hash[transaction]]为1的概率<=1/2 (因为A的长度m=2*n)。
现在这个算法的问题是1/2的误报概率太大了。
Step2:
做多个bit array, A1, A2 ... Ak.
先看两个bit array的情况: 用个两个不同的hash函数来填充A1,A2.
对一笔不在块里的交易,A1,A2相对应位置都为1的概率是1/2*1/2= 1/4,优化了很多
假设用10个bit array, 那么误报的概率为(1/2)^10 = 1/1024,是一个非常小的数字。
也就是说为了达到p的误报率,就用log2(1/p)个bit array就可以了
通过记录这些很少的hash数据,比特币的轻钱包可以快速定位交易在哪个块里。