| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 区块链 -> Merkle Tree、Merkle Proof、SPV安全性分析、Bloom过滤器 -> 正文阅读 |
|
[区块链]Merkle Tree、Merkle Proof、SPV安全性分析、Bloom过滤器 |
Merkle Tree
Merkle ProofMerkle Tree的最大特点是:可以以一个很简短的方法来证明一棵树中存在某一个元素。即 Simplified Payment Verification,SPV SPV 轻节点安全性分析【问题】tx10、proof均为外部提供的信息,roothash又是公开信息,是否可以构造恶意数据对(tx,proof)骗过轻节点的验证,如果不能,为什么? (下图与上图是类似的含义,不同的画图方式)
Bloom过滤器SPV节点直接就向全节点请求某一交易的Merkle路径。SPV节点怎么样从网络中接收到与自己相关的交易,确定交易所在的区块呢? SPV节点一般只需要的是和自己的地址相关的交易。最直接的做法就是SPV节点向全节点请求和自己地址相关的交易,也即在请求中附上自己的地址信息。如果全节点发现某个交易符合SPV节点时,就将以Merkleblock消息的形式发送该交易,Merkleblock消息包含区块头和Merkle路径。 SPV节点对特定数据的请求可能无意中透露了钱包里的地址信息。如果监控网络的第三方跟踪某个SPV节点上的钱包所请求的全部交易信息,就能利用这些交易信息把比特币地址和钱包的用户关联起来。 举例来说,如果在问路时,使用具体的地址,如“南京路188号”,那么可能得到具体的位置;但同时也泄露了目的地。如果问不同的人,188号在哪里?可能得到所有188号的信息;然后问南京路在哪里?可以得到一整条路的信息。那么虽然获得的答案中包括一些无关的信息;但是,相对应的,隐私得到了一定程度的保护。 因此,在引入SPV节点/轻量级节点后不久,比特币开发人员就添加了一个新功能:Bloom过滤器。这是在2012年的BIP37中引入的。 在比特币中,使用Bloom过滤器来加快钱包同步;以太坊使用Bloom过滤器用于快速查询以太坊区块链的日志。
Bloom过滤器的实现是由一个可变长度(N)的二进制数组(N位二进制数构成一个位域)和数量可变(M)的一组哈希函数组成。这些哈希函数的输出值始终在1和N之间,并且该函数为确定性函数,也即对特定输入总是得到同一个的结果。Bloom过滤器的准确性和私密性能通过改变长度(N)和哈希函数的数量(M)来调节。与其它数据结构相比较,Bloom filter的优点包括:空间效率和查找时间复杂性;不需要存储元素本身,在保护隐私方面具有优势。 工作原理这里使用十六位数组(N=16)和三个哈希函数(M=3)来演示Bloom过滤器的应用原理。 如果N比较小,当添加关键词时,所有的位都成为1,意味着什么? 为测试某一关键词是否被记录在某个Bloom过滤器中,则将该关键词逐一代入各哈希函数中运算,并将所得的结果与原数组进行对比。如果所有的结果对应的位都变为了1,则表示这个关键词有可能已被该过滤器记录。之所以这一结论并不确定,是因为这些字节1也有可能是其他关键词运算的重叠结果。简单来说,Bloom过滤器正匹配代表着“可能是”。 通过使用Bloom Filter,使得SPV节点只接收交易信息的子集,同时不会泄露哪些是它们感兴趣的地址。实际上,再对Bloom Filter进行设置时,如果带宽和硬件条件宽裕,SPV节点可以选择具有高FP(false positive)率的Bloom Filter,此时如果有第三方对SPV进行跟踪,看到的将是大量的数据中混杂着与节点相关的数据,从而隐私性得到了保护。相反,如果带宽和硬件条件不宽裕,则可以选择尽可能精确的设置从而过滤掉不相关的数据,但是第三方就有可能将交易和IP地址关联起来。 工作过程首先,SPV节点会初始化一个不会匹配任何关键词的“空白”Bloom过滤器。接下来,SPV节点会创建一个包含钱包中所有地址信息的列表,并创建一个与每个地址相对应的交易输出相匹配的搜索模式。通常,这种搜索模式是一个向公钥付款的哈希脚本,该脚本是一个会出现在每一个向公钥哈希地址(P2PKH)付款的交易中的锁定脚本。如果SPV节点需要追踪P2SH地址余额,搜索模式就会变成P2SH脚本。然后,SPV节点会把每一个搜索模式添加至Bloom过滤器里,这样只要关键词出现在交易中就能够被过滤器识别出来。最后,对等节点会用收到的Bloom过滤器来匹配传送至SPV节点的交易。 Bloom Filter匹配算法问题:哪些数据应该加入到filter中呢? 在重复数据删除应用中的空间和时间效率分析重复数据删除技术的基本原理是对文件进行定长或变长分块,然后利用hash函数计算数据块指纹,如果两个数据块指纹相同则认为是重复数据块(存在数据碰撞问题),只保存一个数据块副本即可,其他相同数据块使用该副本索引号表示,从而实现数据缩减存储空间并提高存储效率。 为了查询一个数据块是否重复或者已经存在,需要计算数据块指纹并进行查找,并记录所有唯一数据块的指纹。举一个例子:32TB的数据,平均数据块大小为8KB,每个数据块使用MD5和SHA1计算两个指纹并用64位整数表示唯一块号则共占用44字节((128+160+64)/8),则总共最多需要176GB(32TB/8KB * 44 Byte)的存储空间来保存数据块信息。 现在的去重系统数据容量通常多达数十到数百TB,如果把数据块信息全部保存在内存中,显然对内存的需求量非常巨大。通常的做法是把数据块信息保存在磁盘或SSD上,使用一定内存量作Cache缓存数据块指纹,利用时间局部性和空间局部性来提高查找性能。这种方法的一个关键问题是,如果新的数据块是不重复的,查找时会出现Cache不命中,从而引起大量的磁盘读写操作。 由于磁盘或SSD性能要远远小于内存的,对查找性能影响非常大。 Bloom filter可以有效解决这个问题,DataDomain中的Summary Vector就是采用Bloom filter来实现的。对于前面的例子,一个数据块用3个hash函数计算指纹最多占用N位,则Bloom filter仅需要1.5GB = 32TB/8KB * N /8 bytes的内存空间。引入Bloom filter机制后,对于一个新数据块,首先查找Bloom filter,如果未命中则说明这是一个新的唯一数据块,直接保存数据块和并cache数据块信息即可;如果命中,则说明这有可能是一个重复数据块,需要通过进一步的hash或tree查找进行确认,此时需要Cache与Disk进行交互。受益于Bloom filter以及Cache,DataDomain系统可以减少99%的磁盘访问,从而利用少量的内存空间大幅提高了数据块查重性能。【即:解决了带来巨大代价的 判空 问题】 Merkle Patricia Trie
Reference |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 3:52:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |