当我们刚安装好ipfs,第一次使用的时候,我们首先得输入:
ipfs init
这个命令的作用我们之前讲过,就是创建一个ipfs节点,我们可以在当前目录看到一个.ipfs的文件夹,就是节点文件夹。我们可以查看该文件夹下config文件,看到节点的id和秘钥,以及节点的大小等默认属性。或者也可以通过命令:
ipfs id
来查看节点的id和公钥,这个节点的id(NodeId)就像我们的身份证号码,是全网唯一的,是节点的身份标志,用来唯一的代表一个节点。
那么这个节点id是如何产生的?这就是身份层干的事,身份层给予节点唯一的身份,我们详细来了解。
身份层(Identity)
我们先来看,一个节点由什么组成。看源码就非常清楚:
type NodeId Multihash //自描述加密哈希摘要(也有称“多重哈希”)
type Multihash []byte
type PublicKey []byte
type PrivateKey []byte
type Node struct { //结构体
NodeId NodeID
PubKey PublicKey
PriKey PrivateKey
}
每一个节点在IPFS网络中由Node这个结构体来表示,该结构体包含NodeId以及一个公私钥对。其中NodeId是个亮点,它是一个自描述的加密哈希摘要,什么叫“自描述”呢?就是你看到这个id,你就知道它采用了什么hash算法,截取了结果的那一部分用来表示,它自带描述信息,详细的我们后面再讲。 这种加密方式有两个优势:
- 根据需求选择最佳功能用例。在更强的安全性和更快的性能之间做一个平衡取舍。
- 随着功能的变化而演变,自定义值可以兼容不同场景下的参数选择。
所有节点在IPFS网络中都要一个唯一的NodeId进行标识,它其实就是公钥的哈希,然而为了增加攻击者的成本,IPFS使用了S/Kademlia中提到的算法增加创建新身份的成本,源码定义如下:
difficulty = <integer parameter>
n = Node{}
do
{
n.PubKey,n.PrivKey = PKI.genKeyPair()
n.NodeId = hash(n.PubKey)
p = count_preceding_zero_bits(hash(n.NodeId))
}
while (p<difficulty)
S/K要求每个节点在接入网络前必须解决两个密码学问题。静态问题是:产生一对公钥和私钥,公钥两次哈希运算后,具有C1个前导零。公钥的一次哈希值就是节点的NodeID。动态问题是:不断生成一个随机数X,将X与NodeID求XOR再求哈希,哈希值要求C2个前导零。这样设计,第一个静态问题,保证节点不能再自由选择节点ID,后一个动态问题,提高了大量生成ID的成本。女巫攻击和日蚀攻击将难以进行。
身份层的主要作用是标识IPFS网络中的每一个节点,有点像用户信息的生成。在节点建立首次连接时,节点间将交换公钥,并检查:
hash(other.PublicKey)是否等于other.NodeId,相当于校验用户信息,如果校验结果不相等,则用户信息不匹配,节点连接立即终止。
如果你也中意区块链,可以加:
微信公众号:ipfscom
QQ群:71789361
个人微信:18191727
也可以扫码加入我的星球,我们一起亲密的玩耍