Golang

使用 Swarm API 生成目錄雜湊而不上傳

  • June 11, 2020

我正在使用 Swarm API (github.com/ethersphere/swarm/)go在專用網路上上傳目錄。客戶端 API ( /api/client ) 提供了一個UploadDirectory返回清單雜湊的函式。有沒有辦法在不將文件上傳到 Swarm 儲存的情況下計算相同的 Merkle Tree 雜湊,最好使用 API?這樣做的原因是在稍後的某個時間點上傳目錄並使用之前計算的雜湊值驗證雜湊值。

對於我可以查看的一些可能領域的任何幫助將不勝感激。

有沒有辦法在不將文件上傳到 Swarm 儲存的情況下計算相同的 Merkle Tree 雜湊,最好使用 API?

  1. 它不是默克爾樹的根
  2. 是的,您可以提前計算
  3. 但是不,你不會得到你想要達到的

=== 第一個優先 ===

在底層,manifest 是一個文本文件,其中包含文件夾結構的描述、文件的雜湊值、內容類型等。

假設您有一個包含 2 個文件的文件夾:hello.txt,包含單詞helloworld.txt,包含單詞world!。清單將類似於以下內容:

{
   "entries": [
       {
           "hash": "7a59da2349f6542e16fddc9399f01327084ed0692b5b110b0d62d9670bb451fd",
           "path": "hello.txt",
           "contentType": "text/plain; charset=utf-8",
           "mode": 436,
           "size": 6,
           "mod_time": "2020-06-11T19:22:50+02:00"
       },
       {
           "hash": "685cf57b9fd0231b111105e79bd9b843ba5083d3f1f4cd97bb71aca62848006a",
           "path": "world.txt",
           "contentType": "text/plain; charset=utf-8",
           "mode": 436,
           "size": 7,
           "mod_time": "2020-06-11T21:11:14+02:00"
       }
   ]
}

真正的清單沒有格式化,沒有空格,都在一行中,最後沒有新行,但你明白了。

您收到的雜湊根根本不是默克爾樹的根,它是清單的雜湊,實際上是一個 json

=== 第二個話題 ===

您可以提前計算雜湊,兩個快速選項:

  1. 使用一次性 swarm 命令,最好使用專用容器:無網路啟動、上傳、獲取雜湊、停止、銷毀。如果您不使用容器,請阻止 swarm 與啟動它的其他節點通信,swarm --maxpeers 0 --disable-auto-connect然後上傳、獲取雜湊、停止、刪除 swarm datadir
  2. 手動或通過腳本創建一個 json 文件並用於swarm hash <manifest_file>獲取雜湊。

=== 第三個到了(同上)===

如您所見,有一個非常奇怪的欄位:mod_time. 這會根據您上傳清單的確切方式假設不同的值(即使用 CLI,它被設置為文件的日期時間,基於本地電腦)。兩年前,有人討論過從清單中刪除該欄位或至少預設設置為 void ,但在某個時間點,以某種方式,有關此行為的問題的記憶失去了,並且該問題已關閉。

因此,如果稍後您將手動(或通過腳本)檢查所有文件和雜湊,沒關係,您可以做到。

但是,如果您想通過 swarm 使用單個命令進行檢查,那麼:

  1. 你永遠不會得到假陽性匹配
  2. 由於差異,您很可能會得到假陰性,錯誤的不匹配mod_time。在這種情況下,唯一的方法就是手動檢查。

=== 獎勵曲目 ===

您可以使用 IPFS 代替 Swarm ;P 至少在他們修復此行為之前。

❯ ipfs add --recursive my_folder
added QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN my_folder/hello.txt
added QmTToWbuguq2X4fCUbPXYwkmGd1FKWZ52KdGEzSGBSVs2E my_folder/world.txt
added QmQ3KxegSpqM2sPNM86XeYpYYHvc8JokzyJrKtcSVbbu82 my_folder

如果你想在這裡給 Swarm 一個角色,你可以將多重雜湊儲存到其中:

❯ echo QmQ3KxegSpqM2sPNM86XeYpYYHvc8JokzyJrKtcSVbbu82 > my_folder_hash
❯ swarm --manifest=false up my_folder_hash
79e9f2708e6051583f0e9d47f333b1d3954bcf02ad5284543187889a994d5fca

請記住--manifest=false要避免同樣的mod_time問題,並且請記住,如果沒有清單,您必須將 API 與bzz-raw:命名空間一起使用。

引用自:https://ethereum.stackexchange.com/questions/83977