最近对各种区块链的p2p网络的节点id的生成过程产生了兴趣,最近从ipfs的libp2p开始分析。
节点的表现形式
我们首先从go-libp2p提供的example里面中的host.go入手:
1 | package main |
在如上的范例中生成了两个libp2p的节点,我们运行两次后看下生成的ID分别是啥
从这里可以看到,节点ID的结果与私钥是一一对应的,接下来我们就开始探寻libp2p中节点id到底是如何生成的
节点id生成的方法
对libp2p.New代码进行一阵分析,可以看到peer.ID的生成是通过私钥得到对应公钥,然后再通过公钥获得的,核心方法如下所示:
1 |
|
其中,mh是libp2p自己的hash库 mh "github.com/multiformats/go-multihash"
,其实就是单纯的将公钥的hash计算出作为libp2p的节点hash,是个简单易懂的策略,和以太坊的非常类似。