IPFS協議棧詳解-身份層
阿新 • • 發佈:2018-12-27
當我們剛安裝好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
也可以掃碼加入我的星球,我們一起親密的玩耍