IPFS协议栈详解-身份层

17 篇文章 2 订阅
13 篇文章 1 订阅

当我们刚安装好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

也可以扫码加入我的星球,我们一起亲密的玩耍

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值