這就是本文要**的主題!
先來看一下 add 和 get 的基本操作過程
當乙個 ipfs 節點執行 add 操作時,它會把檔案進行分塊 block,通過構建乙個 merkle 樹根節點,來把每個子塊節點都連線起來,每個 block 都會用乙個唯一的 cid 進行標識。
block 資料會被儲存到本地的 blockstore 中。但是需要注意的是,除此之外,block 資料並不會立刻主動上傳到 ipfs 網路中(也即,與其連線的 peers 節點中)。除非,某 peer 節點曾經請求過該 block 資料。
add 執行邏輯如下圖所示:
理解這一點非常重要,因為,我們很容易會把 ipfs 想象成乙個會自動備份資料的分布式資料庫,就像傳統的冗餘備份機制一樣。實際上,ipfs 並不會這樣做。這是由 ipfs 在公網環境中執行和傳統分布式資料庫在私有網路中執行的場景要求不一樣所導致的。作為網際網路基礎設施,這種設計不僅減少網路頻寬占用,還能為網路提供可靠、恆久的資料儲存機制。
現在就來來了解一下 get 操作背後的原理,先看下圖:
上圖展示了 ipfs 執行 get 命令的執行流程。
對於當前節點來說,所有與其連線的 peers 節點會構成乙個 swarm 網路。
當本地節點發出乙個 get 請求時,它首先會從本地的 blockstore 中查詢請求的資料,如果沒有找到,它便會向 swarm 網路發出請求,通過 dht routing 找到擁有該資料的節點,一旦找到乙個擁有所請求資料的節點,該節點會把資料反饋回來。然後,本地節點會把收到的 block 資料快取乙份到本地的 blockstore 中,這樣,整個網路中就相當於多了乙份原資料的拷貝。當有更多的節點都請求該資料的時候,就變得更加容易,而由於越來越多的節點都存有該資料,資料就變得幾乎不可丟失。
這也就是 ipfs 網路能夠永久儲存資料的原理,只要有任何乙個 ipfs 節點擁有某資料,這個資料就可以被全網所獲取。
那麼,執行 ipfs 的 add 命令之後,為什麼直接訪問ipfs.io
閘道器就能獲取到資料呢?
比如,在瀏覽器中開啟類似 這樣的**位址,就能直接訪問到剛才我們新增的資料!
原理是這樣的:
ipfs 閘道器,即 ipfs.io,實際上扮演的是乙個 ipfs 節點的作用,當我們開啟上述**的時候,其實就是向 ipfs 閘道器發出了一次請求,ipfs 閘道器會**我們(因為我們不是 ipfs 節點,我們只是瀏覽器而已)向擁有這個資料的 peer 節點(就是我們本地節點)發出 get 請求,一旦獲取到資料,閘道器會先自己快取乙份,然後把請求到的資料通過 http 協議**給我們!
也就是說,任何一台機器,只要開啟瀏覽器,都能通過上述位址訪問到我們剛才執行 add 命令時新增的資料。一旦 ipfs 閘道器第一次快取節點資料之後,再次請求時,它就無需再向原節點請求資料了,只要 hash 值沒有變化,就可以直接把之前快取的資料返回給瀏覽器。
當然,這個快取的資料是有時效的,通常是一周左右就會失效。這個是由 ipfs daemon 內建的預設時效所設定。因為作為網關節點,其磁碟容量也是有限的,不可能無限儲存所有的資料,採用快取時效機制不僅能解決資源訪問問題,還能避免資料膨脹給節點帶了的負擔,當越來越多的機器加入 ipfs 網路並且承擔閘道器的作用,那麼資料時效的概率就會大大降低。
更多細節
實際上,peer 節點在執行 add 命令時,還會廣播自己擁有的塊資訊。同時,它還會維護乙個該 swarm 網路中所有已發給當前節點的 block 請求列表,一旦 add 命令都新增的資料滿足請求列表,就會向對應節點主動傳送資料,並更新該列表。
到底是怎麼傳參的?
開始學習分層以後,理解上有些問題。問同學的看法,上網搜。現在,理解了一些,大家看看理解 有問題,望指出!層與層之間是如何聯絡的?程式是按照u b d b u的順序執行的。分為兩個階段 1.去時 u b d,是通過u層呼叫b層方法,b層呼叫d層方法,把三層聯絡起來的 2.返回時 d b u,是通過一次...
STL map的operator 到底是怎麼回事
來看一道題 請統計陣列strs裡各個字元出現的次數。使用map string strs 那麼最直觀,最容易想到的方法,就是用first來存字元,second來存次數。map countmap first為string型別存字元,second為size t型別存次數 for size t i 0 i ...
AlphaGo到底是怎麼下棋的?
在一局圍棋中,平均每一步的下法大約有200種可能。棋盤上可能出現的局面總數到了遠大於宇宙中原子總數的地步。因此,通過暴力窮舉手段 所有的可能情況並從中篩選中最優勢走法的思路,並不適用於圍棋ai。alphago選擇了別的下棋方式。支撐alphago提高棋力 打敗人類選手的 秘訣 有三個 深度神經網路 ...