5.7 以太坊原始碼詳解7

尹成發表於2018-11-09

Kademila演算法

1 概念:一種分散式儲存以及路由的演算法

 

1 分散式儲存:不設中心化伺服器,所有的檔案分散儲存到各個節點上面

2 問題

 

1 儲存內容如何分配到各個節點,如何處理新增/刪除內容

2 如果一個節點要獲取特定的檔案,應該如何找到指定的節點/地址

3 節點要素

 

1 NodeID 二進位制 160位

2 IP地址和埠號

維護內容

 

1 被分配到的內容

2 內容是以“(key,value)”的形式儲存的,“<檔名,檔案內容>”

3 k-bucket路由表:通過NodeID分層,記錄有限其他節點的ID,IP地址,埠號

4 檔案儲存及查詢

 

1 假如要查詢的書名(hash)是0x100000

2 那麼我們希望它能被儲存在學號(nodeId)位0x100000中

3 為了防止節點罷工,就儲存到0x100000,0x100001,0x100002,…

5 節點的異或距離

 

1 距離:

2 樹:把整個網路節點梳理為按nodeid排列的二叉樹,樹最末端的葉子就是他的每一個節點。

3 由於nodeId有160位,那它的分層應該有160層,整個網路中能夠容納2^160個節點,每個節點最多可以維護160*k行其他節點。

6 節點定位(查詢原理)

 

1 同學A(00000110)要查詢《分散式演算法》

2 計算出《分散式演算法的雜湊》= 00010000

3 同學Z的雜湊就是00010000

4 計算異或距離00010110,結果為從倒數第五位開始不同,k-bucket 5

5 在自己的k-bucket 5中查詢Z同學

6 查詢到之後,直接要

7 如果沒找到,就在自己的k-bucket 5中查詢任意一個同學B,請求B同學查詢Z

8 重複6、7步驟

9 通過這種方式查詢,最多查log2n次

7 演算法引數

 

1 keyspace

    1 keyspace決定ID有多少位

    2 每個節點的通訊錄有幾層

2 k

    1 每一層的k-bucket裡面裝了k個node的資訊

    2 每次查詢node,返回k個Node的資訊

    3 對於某個特定的data,離key最近的幾個k會被要求儲存這個data

3 a

    1 每次向其他節點發起請求查詢某個node,會向a個節點發出請求

8 節點指令

 

1 PING:測試一個節點是否線上

2 STORE:要求一份節點儲存資料

3 FIND_NODE:根據NODE_ID查詢一個節點

4 FIND_VALUE:根據Key值查詢一個樹據

9 k-bucket的維護和更新機制

 

1 每個節點都會按照最後一次接觸時間倒序排列

2 沒次執行4個指令之一就會觸發更新

3 當一個節點與自己接觸的時候要檢查其是否在自己的k-bucket中

    1 如果在,將其挪到自己k-bucket列表的最底

    2 如果不在

        1 PING一下列表中最上面(最舊)的節點,如果該節點能ping通,將其挪到最底部,拋棄新節點

        2 如果ping不同,扔掉該節點,將新節點加入列表中,從而保證節點介入或者刪除不會影響整個網路。

 

相關文章