亮點
在多個選項卡和密碼檔案之間更快地共享IPFS節點
[email protected] 支援在多個瀏覽器選項卡之間共享節點,極大地提高了固定的效能。
我們也在逐步淘汰 Node.js 緩衝區作為資料型別的使用,取而代之的是標準的 JavaScript Uint8Arrays。
請繼續閱讀,瞭解完整的細節!
瀏覽器標籤之間共享一個節點
IPFS 節點與網路上的其他節點進行了大量連線,而且由於預設情況下開啟了委託節點,所以這種連線更多。這是為了確保你有最大的機會在網路上找到內容,因此其他人也有最大的機會在網路上找到你的內容。
但是,這並不是沒有代價的,維護多個連線可能是資源密集型的,而且在某些情況下,瀏覽器會限制您可以擁有的併發連線的數量。
在 web 瀏覽器中,如果使用者在兩個選項卡中開啟你的應用程式,突然你有兩個節點在執行,並且開啟的連線數是原來的兩倍,這就會出現問題。更糟糕的是,它們共享一個資料儲存和相同的對等 ID。
幫助以 ipfs-message-port-client 和 ipfs-message-port-server 的形式存在,它們允許您在 SharedWorker 中執行 IPFS 節點,並在應用程式中的多個選項卡之間共享該節點。
不久將在此主題上發表更深入的文章,但與此同時,請檢視 browser-sharing-node-across-tabs 示例以瞭解如何使用它!
固定效能
在向本地 IPFS 節點新增內容時,將其固定在適當的位置,以防止在垃圾收集期間刪除組成檔案的塊。pin 被放置在一個pin集合中,我們稱之為 pinset。
這個 pinset 背後的資料結構是一個 DAG,非常類似於表示已新增到 IPFS 中的檔案和資料夾的結構。DAG 的根 CID 儲存在資料儲存中,組成 DAG 的所有塊都儲存在塊儲存中。
pinset 由樹形結構中的許多桶組成,每個桶最多包含 8192 項,每層最多包含 256 個桶。第一個桶滿後,pin 在桶之間分配。
當垃圾收集執行時,DAG 中的所有節點都將被遍歷,與它們的 cid 對應的塊將免於刪除。
當你新增和移除 pin 時,這個 DAG 會變大或縮小。DAG 內部的中間節點的 cid 會隨著結構的變化而重新計算。隨著 DAG 變得越來越大,這可能會變得昂貴,並且會損害非常大的應用程式效能。
[email protected] 改變了 pin 的預設儲存,使用資料儲存,而不是 DAG,並且隨著回購中固定塊的數量增加,您看到了相應的加速:
在上面的圖表中,你可以看到隨著固定專案數量的增加,新增下一個固定專案所需的時間也在增加。當第一個桶被認為是滿的,並且建立了多個桶,然後需要更多的操作來新增下一個 pin 時,pin 會急劇增加到 8192 個。
與以前的版本相比,[email protected] 所採用的方法的效能非常好,本質上只受底層資料儲存效能的限制,因為它已經切換到簡單的 put 和 get,而沒有建立資料結構的開銷。
Uint8Arrays
最初有陣列。可以容納各種混合型別的簡單陣列無法很好地最佳化,並且是對記憶體塊的抽象。
然後 Node.js 出現了,並引入了 Buffer,JavaScript 開發人員就可以直接訪問記憶體了!這些工具儲存的數字的整數值範圍為 0-255,速度非常快。JavaScript 開始看起來像是一種合適的語言,您可以用它來完成資源密集型的工作。
ECMAScript 標準的作者注意到了這一點,並引入了 TypedArrays,它有很多變體,但我們最感興趣的是 Uint8Array。
這些型別的陣列儲存的數字的整數值範圍為 0-255,並且支援一個非常類似於 Node.js 緩衝區的 API,這一點也不奇怪,因為 Node 的版本是 3.0.0。Buffer 是 Uint8Arrays 的子類。
這是一個激動人心的時代,隨著 JavaScript 功能的增強和瀏覽器的支援的到來,我們正在減少對核心 Node.js 庫和工具的依賴。其中一部分是在我們的程式碼庫中刪除 Node.js 緩衝區的所有使用。
對於 [email protected],您應該停止依賴 Node.js 緩衝區來從核心 api 的任何部分返回,而應該根據 Uint8Array 介面進行編碼。
我們所依賴的一些模組仍然會返回 Buffer,我們將其傳遞以避免任何轉換成本,但我們希望隨著時間的推移刪除或重構這些緩衝區。為了保持向前相容,你不應該在這些返回值上使用 Node.js 緩衝區方法。
例如,在下面的程式碼中,我們從字串“Hello”建立一個Buffer,將它新增到IPFS中,然後立即對它進行 cat 並對資料塊呼叫toString()。這利用了我們新增的 Buffer 是utf8編碼的這一事實。tostring()的編碼引數預設是 utf8,所以下面的程式碼可以工作,但這只是巧合:
const { cid } = await ipfs.add(Buffer.from())
for await (const chunk of ipfs.cat(cid)) {
console.info(chunk.toString()) // prints
}
相反,我們將使用 TextEncoder 和 TextDecoder 類。它們在編碼/解碼中是明確的(預設也是utf8),所以使用起來更安全:
const encoder = new TextEncoder()
const decoder = new TextDecoder()
const { cid } = await ipfs.add(encoder.encode())
for await (const chunk of ipfs.cat(cid)) {
console.info(decoder.decode(chunk)) // prints
}
新功能
在資料儲存中儲存 pin 而不是DAG (#2771) (64b7fe4)
將協議列表新增到 ipfs id 輸出(#3250)(1b6cf60)
IPNS 在瀏覽器中釋出示例(#3207)(91faec6)
將 hapi 更新到 v20 (#3245) (1aeef89)
更新到 [email protected] (63d4d35)
ing 重大變化
節點 Buffer 已被替換為 Uint8Arrays (#3220)
API 的變化
核心 API 和 HTTP API 客戶端
現在的返回值 ipfs.id 包括節點可理解的協議列表
重大更改 previously Buffer 以前返回 Node.js 物件 Uint8Arrays 的位置,現在位於它們的位置。這會影響:
ipfs.block.*現在.data,塊物件的屬性為 Uint8Array
ipfs.dag.get 根據返回的節點型別:
ipld-raw節點現在返回為 Uint8Arrays
現在.data,返回 ipld-dag-pb 節點的屬性為 Uint8Array
ipfs.dht.get返回一個Uint8Array
ipfs.cat 檔案資料現在以 Uint8Arrays 返回
ipfs.files.read 檔案資料現在以 Uint8Arrays 返回
ipfs.object.data 物件資料現在作為 Uint8Array
ipfs.pubsub.subscript 釋出到主題的資料現在作為 Uint8Array
有關更多閱讀,請參閱 Core API Docs。
接下來是什麼?
檢視 js-IPFS 專案路線圖,其中包含按我們希望的順序組織的主要特性。
路線圖中只有大的特性被呼叫,預計在路線圖項之間會有很多小的 bug 修復釋出!
非常感謝所有能夠釋出此版本的人
@abbasogaji(1個問題,1條評論)
@achingbrain(77次提交,33個PR,1個問題,57條評論)
@alanshaw(3次提交)
@aphelionz(1個問題,3條評論)
@aschmahmann(1條評論)
@AuHau(1次提交,1個PR,2個問題,5條評論)
@bluelovers(1個PR,2個問題,4條評論)
@bmann(1個問題,1條評論)
@christopheSeeka(1條評論)
@ codecov-commenter(15條評論)
@ crypt0maniak(1個PR,2條評論)
@ dave-dm(1個問題)
@dependabot [bot](2次提交)
@ duxiaofeng-github(1個問題)
@ er123rin(1 PR)
@ ffa500(1條評論)
@Gozala(1次提交,1個PR,1個問題,21條評論)
@hugomrdias(2次提交,1條評論)
@hunterInt(1個問題)
@icidasset(1條評論)
@jacekv(1個問題,1條評論)
@jacobheun(23提交,6 PR,1問題,28評論)
@josselinchevalay(1個問題,2條評論)
@koivunej(2個問題,1條評論)
@lidel(2條評論)
@ lukaw3d(1個問題,1條評論)
@mikeal(1次提交)
@mitjat(1條評論)
@moodysalem(1個問題,5條評論)
@ mrh42(1個問題)
@negamaxi(1個問題,1條評論)
@ olivier-nerot(1個問題,1條評論)
@olizilla(2次提交,1個PR,1條評論)
@onichandame(1條評論)
@ OR13(2個問題)
@rvagg(5條評論)
@shazow(1次提交,1個PR)
@StationedInTheField(1個問題,4條評論)
@tabcat(1個PR,2個問題,4條評論)
@Tcll(2問題,4評論)
@ tk26(1次提交,1個PR,3條評論)
@ vasco-santos(66次提交,20個PR,3個問題,24條評論)
@vmx(2次提交,1個PR,3條評論)
@vojtechsimetka(1次提交,1個PR)
@welcome(11條評論)
@wemeetagain(35次提交,6個PR,2個問題,5條評論)
@Xmader(3次提交,3個PR,2條評論)
@xmaysonnave(1個問題,1條評論)
想貢獻?
你是否願意為IPFS專案做貢獻,但又不知道如何做?嗯,有幾個地方你可以開始:
檢查 js-IPFS 儲存庫中help wanted標籤的問題
加入 IPFS 的“全力以赴”,自我介紹,並讓我們知道您想在哪裡做出貢獻:https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands
用 IPFS 破解並向我們展示您的成就!All Hands 呼叫也是進行演示的理想場所,請加入並向我們展示您建立的內容
透過https://discuss.ipfs.io/加入討論,並幫助使用者找到答案。
加入 IPFS 核心實施每週同步,並參與其中!
你有問題嗎?
最好的地方要問你關於 IPFS 的問題,它是如何工作的,以及你可以用它做的是在discuss.ipfs.io。我們也可以在#ipfsFreenode 上的頻道上找到。