Merkle树及其变体,便于数据验证。

merklelib的Python项目详细描述


#merkle树是一种基于散列的数据结构,用于有效地验证大量数据。这种数据结构用于解决以前在多台计算机上保持数据一致性的耗时和计算代价高昂的问题。Merkle树及其变体的突出用途是在对等网络中,如比特币、以太坊、Git和Tor。



从图中可以猜到,merkle散列根维护数据的完整性。如果任何节点被更改,或者数据项的顺序被更改,merkle散列根将完全不同。

<;img src="https://github.com/vpaliy/merkle-trees/blob/master/ext/merkle.jpg/">;



这就是"人工"平衡树的样子(叶子数不是二次幂的树):

<;img src="https://github.com/vpaliy/merkle-trees/blob/master/ext/empty.jpg"/>;

我们必须添加一个空的轻量级节点以保持其平衡。
因此,当我们附加一个新叶时,我们可以替换该空节点并重新计算哈希根。



\merkle audit proof

audit proof允许您验证数据库中是否包含特定的数据记录。通常,维护数据库的服务器向客户机提供记录存在于该数据库中的证据。如果merkle审核证明未能生成与merkle根哈希匹配的根哈希(从受信任的机构获取),则表示数据记录不在数据库中。

下图说明了应如何构造审核证明:

<;img src="https://github.com/vpaliy/merkle-trees/blob/master/ext/proof.jpg"/>;

在本例中,我们需要提供一个证据,证明记录"d"存在于数据库中。
因为我们已经知道"d"的散列值(我们可以很容易地计算它),我们需要"h-3"来计算"d-2"。现在,当我们能够计算"d-2"时,我们需要得到"d-1"才能得到"t-1"的散列值,依此类推……
你已经知道要点了,对吧?我们只需要抓住兄弟节点并爬上树,直到我们到达根。[此](https://github.com/vpaliy/merklelib/blob/master/merklelib/merkle.py l468)实现了上述所有功能。




后一个版本包括前一个版本中的所有内容,顺序相同,所有新条目都在旧版本中的条目之后。




\构建merkle树并验证叶包含:

``python
import string
import hashlib

hashlib.sha256(value.hexdigest()



#现在验证a是否在树中
;您还可以传入hash值"a"
;如果用户忘记对它进行hash
if tree,它将自动进行hash。验证叶包含("a",证明):
print('a在树中')
else:
exit('a不在树中')
````


`` python
tree=merkletree(get_data())




new_tree=merkletree(get_new_data())


检查新树是否包含相同的项
,并且与旧版本的顺序相同
如果tree<;=new_tree:
print('版本一致')
否则:
exit('versions are different')
```

或者,您可以使用'verify\u tree\u consistency'函数来执行以下操作:
``python

验证"目录树"的一致性




我们需要提供的信息
旧的"哈希"根=旧的"目录树"。merkle"哈希"
旧的"目录树"大小=len(旧的"目录树"

检查新的目录树是否包含相同的项
,如果验证"树"的一致性(new"树"、old"hash"根、old"树"大小):
打印("版本一致")
其他:
退出("版本不同")
``````


美化



transactions=get廑transactions(user)廑random data
tree=merkletree(transactions)


美化(tree)廑打印终端中的树
````


```````
e11a20bae8379fdc0ed560561ba33f30c877e95051aed5acebc9806f6521f
862532E6A3C9AFC2016810598ED0CC3025AF5640DB73224F586B6F1138385F4
——FA13BB36C022A6943F37C638126A2C88FC8D008EB5A9FE8FCDE17026807FEAE4
——5FECEB66FFC86F38D952786C6D69C79C2DBC239DD4E91B46729D73A27FB57E9
-6B86B273FF34FCE19D6B804EFF5A3F5747ADA4EAA22F1D49C01E52DDB7875B4B
4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce
f4685cb09ef9f1c86b2d8f544d89f1c1d352a3654beb8feecad11e9545e0e72
_-67d62ee831ff99506ce1cd94351408c3a845fca2dc0f34d085cdb51a37ec40
4b227777d4dd1fc61c6f884f48641d02b4d121d3fd328cb08b5531fcadabf8a
——ef2d127de37b942baad06145e54b0c619a1f2237b2ebbcfbec78f5564afe39d
e7f6c011776e8db7cd330b54174fd76f7d0216b612387a5ffcfb81e6f0919683
&7902699be42c8a8e46fbb4501726517e86b22c56a189f7625a6da49081b2451
```

这样做:



``python
from merklelib import merkletree,export



transactions=get_transactions(user)random data
tree=merkletree(transactions)

export(tree,filename="transactions",ext='jpg')
````

default extension总是`.json.`您还可以指定一个绝对路径。

您可能需要在您的机器上安装graphviz。
这里是您如何在mac和ubuntu上安装graphviz的方法:


<
mac



































我已经包含了一些基本的基准测试衡量性能的代码。如果你想试试,只需使用以下命令下载存储库:

```
$git clone git clone https://github.com/vpaliy/merklelib.git
$cd merklelib
````

建筑:0.016072秒。
附加:0.000868秒。
树大小:637401
叶数:2056

审核验证时间:
平均时间:0.0001469080739296172秒。
总时间:0.304746秒。
最长时间:0.000325秒。
最短时间:5.9e-05秒。

me:0.008714925583657588秒。
总时间:17.925458秒。
最长时间:0.035517秒。
最短时间:9e-05秒。

````

上述测试提供以下结果:
-构建merkle树需要多长时间。
-append需要多长时间附加叶。
-验证树中包含的每个叶需要多长时间。
-证明生成的merkle树的每个可能的子树与原始子树一致需要多长时间



这里有一个简单的方法来衡量构建一棵长65536片叶子的merkle树所需的时间:

````
>;>import os
>;>import timeit
>;>from merklelib import merkle tree
>;>leaves=[os.urandom(2048)for i in range(2**16)]
>;>def timeav(code,n=20):
>;>gt;返回timeit.timeit(
…code,setup="from uu main_uuu进口merkle tree,leaves",number=n)/n

建造树所需的时间
>;"打印时间av(merkletree(leaves)"
0.70325

`````
以及如何使用它们(https://www.codeproject.com/articles/1176140/%2ftarticles%2f1176140%2fUnderstanding-merkle-trees-why-use-them-who-uses-t)

*[证书透明度](https://tools.ietf.org/html/rfc6962\section-2.1.2)

*[merkle-treeBrilliant)(https://brilliant.org/wiki/merkle tree/)

不受限制地处理软件中的
,包括但不限于使用、复制、修改、合并、发布、分发、再授权和/或出售
软件副本的权利,并允许向其提供软件的人这样做,受限于以下条件:

对于适销性的保证,
适用于特定目的和不侵权。在任何情况下,
作者或版权所有人都不对任何索赔、损害或其他
责任负责,无论是在合同诉讼、侵权诉讼或其他诉讼中,由软件或
软件的使用或其他交易引起的或与之相关的。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java编辑并重新运行spring引导单元测试,无需重新加载上下文即可加快测试速度   为什么我不能做演员?   java为什么是线程。join通常用于停止安卓中的线程   java从weblogic服务器调用JSON POST REST服务时收到400:错误请求   java在DeviceAdmin模式禁用时设置身份验证?   java SortedMap的keySet()能否始终安全地强制转换到SortedSet?   安卓 java。lang.NoSuchMethodException可包裹类   java JOGL库安装   javatomcat内存管理   java使用getString()中的变量   java将最小星号设置为评级栏   Java中字符串相等的println()方法。。。它到底是如何工作的?   java如何从文本中输出的数组中放入随机图像