首页 > Filecoin > 正文

IPFS协议栈详解-身份层

IPFS区块链  2019-08-08  IPFS/Filecoin栏目  

当我们刚安装好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,相当于校验用户信息,如果校验结果不相等,则用户信息不匹配,节点连接立即终止。

版权信息
作者:昂刺鱼
来源:IPFS区块链

关于我们

联系我们

作者进驻

手机版

Copyright © 2013 比特巴 www.btb8.com
始建于2013年,提供比特币 区块链及数字货币新闻、技术教程、测评、项目周报、人物等资讯
本页面提供的是IPFS教程资讯,星际文件系统IPFS(Filecoin)目标是为了补充甚至是取代目前统治互联网的超文本传输协议(HTTP)。