高性能的Go Merkle树的实现方法

444 阅读3分钟

我很高兴与大家分享我新实现的具有良好性能的Golang Merkle树计算库。

GitHub链接:https://github.com/txaty/go-merkletree

Go文档:pkg.go.dev/github.com/…

我认为对于Merkle树来说,大多数时候我们需要的是Merkle根和每个叶子节点的证明,这样我们就可以通过重新计算根和它的证明来证明叶子节点的成员资格/存在性,然后将计算出来的根和原始根进行比较。如果计算出的根与原始的根是等价的,那么叶子节点的成员资格就是有效的(它存在)。

因此,与其他一些实现不同,当构建一个新的Merkle树时,我的程序只构建叶子节点的证明,最后生成Merkle根,而不是缓存树本身。通过这种优化,我的程序可以比GitHub上最开始的类似库:Cbergoon/merkletree运行得更快。我通过goroutines的并行化来更好地提高性能。

下面是我的Merkle树库与cbergoon/merkletree之间的一个快速基准测试。我测量的是

  • 生成证明的时间--生成Merkle根和所有叶子节点的证明,以及
  • 验证时间--验证树上的所有叶子节点。

在我的库中,建树和证明生成是同时进行的。在cbergoon/merkletree中,建树只是建树,证明(Merkle路径)是通过调用每个叶子节点的GetMerklePath()函数获得的。

1,000个节点(证明基因快4.7倍,验证快3.6倍)。

goos: linux
goarch: amd64
pkg: github.com/txaty/go-merkletree
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkMerkleTreeProofGen
BenchmarkMerkleTreeProofGen-12             	     774	   1525119 ns/op
BenchmarkMerkleTreeProofGenParallel
BenchmarkMerkleTreeProofGenParallel-12     	     866	   1402052 ns/op
Benchmark_cbergoonMerkleTreeProofGen
Benchmark_cbergoonMerkleTreeProofGen-12    	     165	   7142707 ns/op
BenchmarkMerkleTreeVerify
BenchmarkMerkleTreeVerify-12               	     172	   6886498 ns/op
Benchmark_cbergoonMerkleTreeVerify
Benchmark_cbergoonMerkleTreeVerify-12      	      46	  24741956 ns/op
PASS

10,000个节点(证明基因快24倍,验证快8.2倍)。

goos: linux
goarch: amd64
pkg: github.com/txaty/go-merkletree
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkMerkleTreeProofGen
BenchmarkMerkleTreeProofGen-12             	      55	  20999696 ns/op
BenchmarkMerkleTreeProofGenParallel
BenchmarkMerkleTreeProofGenParallel-12     	     128	   9295963 ns/op
Benchmark_cbergoonMerkleTreeProofGen
Benchmark_cbergoonMerkleTreeProofGen-12    	       2	 504747049 ns/op
BenchmarkMerkleTreeVerify
BenchmarkMerkleTreeVerify-12               	      12	  93694508 ns/op
Benchmark_cbergoonMerkleTreeVerify
Benchmark_cbergoonMerkleTreeVerify-12      	       2	 771403038 ns/op
PASS

100,000个节点(证明基因快333倍,验证快42倍)。

goos: linux
goarch: amd64
pkg: github.com/txaty/go-merkletree
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkMerkleTreeProofGen
BenchmarkMerkleTreeProofGen-12             	       6	 181101101 ns/op
BenchmarkMerkleTreeProofGenParallel
BenchmarkMerkleTreeProofGenParallel-12     	      10	 107610935 ns/op
Benchmark_cbergoonMerkleTreeProofGen
Benchmark_cbergoonMerkleTreeProofGen-12    	       1	60383341291 ns/op
BenchmarkMerkleTreeVerify
BenchmarkMerkleTreeVerify-12               	       1	1148882340 ns/op
Benchmark_cbergoonMerkleTreeVerify
Benchmark_cbergoonMerkleTreeVerify-12      	       1	48003616811 ns/op
PASS

另外,在大量区块方面,并行化算法比原始算法运行得更快。现在,并行化还不够完美,我还在考虑如何改进它。

希望我的库可以帮助你。如果你在我的代码中发现任何问题,请告知我(例如,提交一个问题)。谢谢:slight_smile: