在弄清ipfs的kademlia dht之前,首先需要了解它的k桶原理,ipfs的kbucket路由表主要包含乙個桶的大小(kvalue = 20),一組k桶陣列,其中每個k桶裡面存放的是libp2p的節點id的雙向鍊錶。該路由表主要利用xor演算法計算與主機節點之間的邏輯距離,並分別將這些節點存放到不同的k桶中。ipfs預設k桶大小為20,libp2p節點peer.id最大256位,理論上兩個不同節點之間距離最大值是255,該路由表最多可以存放5120個libp2p節點。
type routingtable structlibp2p節點id長度256位,由32個位元組組成,xor演算法將節點id從低到高進行與操作。簡單點講兩個位數相同則為0,不同則為1。type bucket struct
兩個節點之間的距離首先通過xor演算法計算出兩個節點id之間的值,然後再從低到高位計算該值第乙個非0的長度
任意乙個節點計算自己節點id之間的距離必然是256,同理,如果有兩個節點,乙個節點第乙個位元組為0,乙個節點第乙個位元組為1,那麼對任意節點,這兩個節點之中必然有乙個節點與該任意節點之間的距離為0。
該比較演算法直接把節點id的32個位元組從低到高比較位元組之間的大小。
該演算法主要用於在路由表中查詢到節點陣列後,再與自己的節點算出乙個距離後,再進行排序。
1) 首先以目標節點id與自己節點id之間的距離,然後通過該距離找到對應的k桶,並將該節點id放入到該k桶最前面。
2) 如果該k桶容量超過了最大容量,那麼
2.1) 如果不是最後乙個桶,那麼移除當前桶的最後乙個節點id
2.2) 依次拆分最後乙個桶,如果當前桶內節點id與主節點id距離為5的話,那麼所有距離大於5的節點id都拆分到後面乙個桶裡
1) 根據id計算出與主節點id之間的距離,然後找到對應的k桶,然後從該k桶裡面的所有節點id拷貝出來
2) 如果該拷貝出來的陣列容量低於count,則從該k桶前後兩個k桶裡面拷貝對應的節點id
3) 對拷貝出來的節點進行排序,並返回最終的陣列
ipfs的模組化做得非常好,針對每乙個模組,首先關注的是其測試用例,裡面基本上能覆蓋該模組所有主要路徑。執行go test或者用dlv進行除錯相關的內部邏輯。
並不是所有的的節點都能夠加入到本地的路由表中,如下面例項
func testtablefindmultiple(t *testing.t)最終返回的結果也就是241,很多前面的節點都會被淘汰掉rt.print()
t.logf("totoal size is: %d", rt.size())
}
AOP技術研究 引言
1 引言 軟體設計因為引入物件導向思想而逐漸變得豐富起來。一切皆為物件 的精義,使得程式世界所要處理的邏輯簡化,開發者可以用一組物件以及這些物件之間的關係將軟體系統形象地表示出來。而從物件的定義,進而到模組,到元件的定義,利用物件導向思想的封裝 繼承 多型的思想,使得軟體系統開發可以向搭建房屋那樣,...
引擎技術研究之Shader技術
shader 技術屬於 gpu的渲染技術,其相應語言是高階著色器語言 high level shader language 簡稱hlsl hlsl 主要作用為將一些複雜的影象處理快速而又有效率地在顯示卡上完成。在 directx 中有兩種 shader 頂點著色器 vertex shader vs ...
技術研究與工程開發
一 r d概念的分拆 搞研發的掏出名片來一般會印上這麼個部門 r d。所謂r d就是research develop,研究與開發,所以簡稱研發。我曾經碰到個高人,強調把這兩詞拆開來單獨理解。研究 就是把乙個團隊知識之外的知識點弄懂,引入專案中使用 開發 就是把已經明白的東西做出來。二 為什麼多數程式...