演示IPFS的一個完整的流程以及針對部分概念的詳解

整體的流程

1,創建ipfs節點

  • 通過ipfs init在本地計算機建立一個IPFS節點
  • 本文有些命令已經執行過了,就沒有重新初始化。部分圖片拷貝自先前文檔,具體信息應以實物為準
$ ipfs init
initializing IPFS node at /Users/CHY/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmdKXkeEWcuRw9oqBwopKUa8CgK1iBktPGYaMoJ4UNt1MP
to get started, enter:ipfs cat /ipfs/QmVLDAhCY3X9P2uRudKAryuQFPM5zqA3Yij1dY8FpGbL7T/readme$ cd ~/.ipfs
$ ls
blocks		datastore	version config		keystore
$ open ./
  • 執行ipfs init初始化節點之后,會生成一個.ipfs的文件夾,用于存儲相關的信息,比如節點ID、環境配置信息、數據存儲等
  • 如果使用的是MAC電腦,使用shift+command+. 可以查看隱藏文件

  • 通過ipfs id查看創建的節點id的信息

2,啟動節點服務器?

  • 使用命令ipfs daemon啟動節點服務器
  • 一旦啟動當前界面會處于監聽狀態,需要新建標簽頁

3,簡單驗證

  • ?使用如下命令,進行簡單測試

ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme

  • 瀏覽器輸入下面的網址:http://localhost:5001/webui會看到一個漂亮的UI界面

?相關問題詳解

ipfs的存儲位置

  • IPFS的數據存儲,個人用戶的數據存儲在自己個人的硬盤上,也就是本地硬盤存儲。存儲后,會在IPFS網絡廣播,“我存儲哈希為Qm...的數據了”,因為哈希的唯一性,如果數據的分割方法一定,那么同樣的數據在網絡存儲中只會有一份,也就是只在本地節點存儲。當有用戶檢索該數據時,檢索數據的hash值就是key,節點會首先在DHT表(key/value存儲)中查詢有無該key,如果沒有,到與key異或距離最近的K桶里查找,如果該K桶中的某個節點有key對應的value則返回,否則返回它認為存有value值的最可能節點,以此遞歸,最終找到key對應的value。然后請求節點與value(也就是節點ID)建立連接,并請求數據,同時將該key/value鍵值對存儲到自己的DHT表中。請求節點將接收到的數據存儲到ipfs緩存中,數據檢索成功。該請求節點在緩存數據有效期內,同樣可以為ipfs網絡,提供該數據,作為原始數據的備份。

ipfs的冗余備份措施

  • IPFS采用了Erasure coding的冗余備份措施,集群中有n份原始數據和m份校驗數據,即共有n+m份備份數據。

修改節點默認存儲空間

  • ipfs節點默認存儲空間為10個G

方式一:可打開終端執行下面的命令

export EDITOR=/usr/bin/vim
ipfs config edit
  • 找到下圖使用紅色的框標定的內容,修改自己想要的大小
  • PS:輸入i可以開始編輯,編譯完畢后按esc鍵,再輸入:,再次輸入wq保存并且退出?

方式二 采用web界面進行修改

  • 修改對應的信息,然后點擊保存

ipfs的節點掉線,對于整個組織的影響

  • IPFS的容錯機制會保證數據被復制了足夠數量并存放在不同的地區,即使某一個地方的數據由于不可抗力的因素被完全銷毀,通過其他地區的備份也可以實現完整恢復數據,極大的保證了存儲在IPFS上的數據的安全性
  • 采用MerkleDAG,因為它具有以下特點:1.內容可尋址:所有內容都是被多重hash校驗和來唯一識別的,包括links。2.無法篡改:所有的內容都用它的校驗和來驗證。如果數據被篡改或損壞,IPFS會檢測到。3.重復數據刪除:重復內容并只存儲一次。
    在IPFS網絡中,數據的存儲可能是有重復的。重復的數量與用戶上傳的時候采用的IPFS進行分塊的方法有關。
  • 之前提到過數據在IPFS存儲是以塊的形式存儲的。在ipfs提供的數據分割方式有很多種。在ipfs源碼種core/commands/add.go代碼中描述了切割的方法:
  1. 默認模式,塊的大小是256kb,也就是256 * 1024 bytes,對應的size=262144。命令不需要加參數,即ipfs add 文件。
  2. 指定塊大小模式。命令是ipfs add --chunker=size-1000。其中后邊的1000可以是任意小于262144的數。
  3. rabin可變塊大小切割模式。命令是ipfs add --chunker=rabin-[min]-[avg]-[max] 文件。其中min,avg,max的值分別值最小塊大小,平均塊大小,最大塊大小的意思,值在小于262144自行設定。
    ?
The chunker option, '-s', specifies the chunking strategy that dictates
how to break files into blocks. Blocks with same content can
be deduplicated. The default is a fixed block size of
256 * 1024 bytes, 'size-262144'. Alternatively, you can use the
rabin chunker for content defined chunking by specifying
rabin-[min]-[avg]-[max] (where min/avg/max refer to the resulting
chunk sizes). Using other chunking strategies will produce
different hashes for the same file.> ipfs add ipfs-logo.svg> ipfs add --chunker=size-2048 ipfs-logo.svg> ipfs add --chunker=rabin-512-1024-2048 ipfs-logo.svg
  • 同一個文件存儲在ipfs中,因為存儲是選用的文件切割方法不同,返回的hash值卻不一樣。所以說IPFS的塊存儲沒有重復的,而IPFS塊文件拼湊的數據可能有重復的。也就是說同一個文件可以根據不同的文件切割方法在IPFS網絡中重復的存儲多次
  • 備份是如何實現的呢?假如一部非常火的電影,大家都習慣性的將該電影存儲到自己的電腦E盤或其它硬盤存儲中,全世界如果有1億的人存儲了這個電影,這不是對存儲的極大浪費嗎?在ipfs網絡中,該電影只被存儲在一個節點中,當有用戶需要讀取的時候,會產生新的備份。就是誰使用數據,這個數據就會復制到誰那里。當一個節點加入IPFS網絡時,這個節點會提供一部分硬盤空間(缺省為10G,可以配置)給整個網絡使用。那么通常情況下,在存儲文件的時候,您自己提供的這部分硬盤空間總是最快的,因為不需要跨網。當存儲完畢后,網絡上任意節點都可以訪問這個文件。當另一個節點訪問的時候,那個節點往往會復制一份您的數據到他的緩存空間。這樣整個網絡中就有兩份拷貝了。試想,當有很多人對這個文件感興趣,那么網絡中的拷貝數會越來越多。
  • 需要提出的是:拷貝一般都是緩存,也就是說是臨時存儲的。時間一長就被自動刪除掉了。這種臨時緩存非常好地解決了分布式數據分發的問題,比如說一個社會熱點往往呈現出預熱期、火熱期和退潮期等階段,利用IPFS,數據的分布和拷貝數與這些時期是完全匹配的。訪問的人越多,拷貝數就越多,但熱度下來了,拷貝數就會降下來,從而自然地實現空間利用率和存取效率的平衡。如果想讓這個文件永久存儲,那么必須將其設為固定的樣式,即存儲在硬盤中。

ipfs的使用

上傳txt文件

?上傳其他格式的文件

  • pdf
  • docx
  • jpg
  • mp4
  • mp3

注意事項

  1. 對于下載的文件需要進行格式的準換,否則不可用。這個轉化的方式可以手工進行轉化,也可以使用命令的方式。
  2. 也可以指定下載的文件名稱,加上-o 文件名,也可以加上-a : 壓縮成.tar格式,-C :壓縮成.gz格

pdf?

ipfs get QmZJBKrLFPvn8zEatZsxSJTtJkCFm4YeMwChDLRPPPerZ6 -o 1.pdf

  • 使用命令open hh.pdf 打開pdf文件,此處open的用法是Linux自帶功能,和ipfs無關

docx

mp3?

?jpg

mp4

上傳整個文件夾

  • 此處上傳的整個文件夾里面的文件和先前測試使用的是相同的文件,所以他們的哈希值是一致的,這個就是ipfs要求的避免相同的文件被用戶上傳多次。

查看上傳的文件中包含的子文件

查看被引用的hash

  • 被引用的hash概念:一般指文件夾下面有多少個文件,這個文件夾的名稱就被引用多少次,hash就是應用該文件名的文件hash

如果上傳的是一個文件夾,那么將文件夾拉回到本地,里面的文件是正常的存儲格式,無需進行格式轉化?

?進入web可視化界面,將哈希序列輸入到搜索框,進行文件的查詢,如果文件不支持預覽,需要點擊downloading進行下載查看

發現的問題

  • ?使用root用戶和普通用戶,使用ipfs id查看自己的節點信息,還不一樣。

?而且,這兩個節點之間還不能互相交換文件,不隸屬于同一個集群。

參考鏈接

  • 使用ipfs完成一個圖片上傳的案例?
  • IPFS:分布式文件存儲
  • IPFS

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447061.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447061.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447061.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++ 算法的時間復雜度

一般ACM或者筆試題的時間限制是1秒或2秒。 在這種情況下&#xff0c;C代碼中的操作次數控制在 10^7為最佳。 下面給出在不同數據范國下&#xff0c;代碼的時間復雜度和算法該如何選擇&#xff1a; 1.n≤ 30,指數級別&#xff0c;dis剪枝&#xff0c;狀態壓縮dp 2.n < 100 &g…

簡單工廠模式實現計算器

#include <iostream> #include <vector> #include <string> #include <iostream> #include <map> using namespace std; #define __THROW_ZERO do {cerr << "The dividend is 0" << endl; exit(1);}while(0);/* 簡單工廠處…

TDengine安裝教程

TDengine安裝教程 前言 TDengine的安裝十分簡單&#xff0c;可以有以下三種安裝方式&#xff0c;源碼安裝、通過Docker容器進行安裝、通過安裝包進行安裝。但是使用源碼安裝較為復雜&#xff0c;通過docker的方式最為簡單&#xff0c;但是需要一定docker相關的知識&#xff0…

C++中size_t的學習

size_t的定義 size_t是一種數據相關的無符號類型&#xff0c;它被設計得足夠大以便能夠存儲內存中任意對象的大小。設計 size_t 就是為了適應多個平臺&#xff0c;size_t等效于unsigned short int 或者 unsigned long int 類型&#xff0c;這個過程是動態匹配的。在需要通過數…

策略模式解決商店打折問題

#include <bits/stdc.h> using namespace std; /*策略模式解決商店打折問題*/class Cashsuper { private:/* data */ public:virtual double addcash(double cash) 0;double Getresult(double money){return addcash(money);} };class Cashnormal : public Cashsuper {p…

android 軟件首次運行時引導頁左右滑動效果

很多手機軟件在安裝后首次運行都會進入到引導頁面&#xff0c;再次運行時會進入到主頁面。 多了不說了&#xff0c;先看效果圖&#xff1a; 代碼如下&#xff1a; main.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:an…

C++中size_type類型詳解

介紹 是和string類類型和vector類類型定義相關的類型&#xff0c;用以保存任意string對象或vector對象的長度&#xff0c;標準庫類型將size_type定義為unsigned類型string抽象意義是字符串&#xff0c; size&#xff08;&#xff09;的抽象意義是字符串的尺寸&#xff0c; str…

單一職責原則 實現貪吃蛇代碼的封裝

單一職責原則(SRP),就一個類而言&#xff0c;應該僅有一個引起它 變化的原因。 一個c語言的貪吃蛇代碼 如何使用單一職責原則封裝成c面向對象呢 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include <wi…

android ProgressBar實現掃描SD卡文件 + SimpleAdapter綁定ListView

代碼 activity_main.xml <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height"match_parent"to…

C++標準庫函數begin和end函數

主要的目的 為了讓指針更加簡單、安全&#xff0c;引入了begin和end函數&#xff0c;這兩個函數和容器中兩個同名的成員函數類似。但是由于數組畢竟不是類類型&#xff0c;因此這兩個函數不是成員函數。正確的使用形式就是將數組作為他們的參數int ia[] {0,1,2,3,4,5,6,7,8,9…

dex分包之--------multidex包的配置使用

目錄&#xff1a;一、前言二、產生原因三、MultiDex的簡要原理四、MultiDex的使用 一、前言 首先說一下我遇到的情況&#xff0c;最近接手了一個項目是在已有的項目里進行更新添加一些功能&#xff0c;然后該項目導了N多的包&#xff0c;在我使用Android Studio的run”App”直…

C++ primer第六章函數的學習

介紹 首先介紹函數的定義和聲明&#xff0c;包括如何傳入參數以及函數如何返回結果。C語言允許使用重載函數&#xff0c;即幾個不同的函數可以使用向同一個名字。所以接下來介紹重載函數的方法&#xff0c;以及編譯器選擇如何從函數的若干重載的形式中選取一個與調用模板相互匹…

C語言指針作為函數參數 以及智能指針作為函數參數

總所周知指針作為函數參數傳遞的時候 傳遞的是指針的拷貝&#xff08;指針也是變量&#xff09; 這里提供四種指針的傳遞方法 改到實際的指針。 #include <stdio.h> #include <memory> #include <iostream> using namespace std; void test1(char **string)…

Android Studio打包和引用aar

一、簡介 Android 庫在結構上與 Android 應用模塊相同。它可以提供構建應用所需的一切內容&#xff0c;包括源代碼、資源文件和 Android 清單。不過&#xff0c;Android 庫將編譯到您可以用作 Android 應用模塊依賴項的 Android 歸檔 (AAR) 文件&#xff0c;而不是在設備上運行…

C++ primer第六章6.4函數的學習 之函數的重載

6.4 函數的重載 函數的名字相同但是形參的列表不同&#xff0c;將其稱之為重載函數 void print(const char *cp); void print(const int *beg,const int * end); void print(const int ia[],size_t size); 形如上面所展現的這樣&#xff0c;當調用這些函數的時候&#xff0c;…

C++有限狀態機的實現

//待完善 有限狀態機是一個很常用的技術&#xff0c;在流程控制和游戲AI中都比較實用&#xff0c;因為狀態機編程簡單又很符合直覺。與有限狀態機類似的是設計模式中的狀態模式。本文是參考《Programming Game AI by Example》 一、 記得最開始工作時候也接觸過有限狀態機&…

手勢希爾排序

void shell_sort(int *data, int length){int gap0;int i0,j0;for(gaplength/2;gap>1;gap/2){//組內插入排序for(igap;i<length;i){int temp data[i];for(ji-gap;j>0&&temp<data[j];jj-gap){data[jgap]data[j];}data[jgap]temp;}} }

Android之android.os.Build

一、類概述&#xff1a;從系統屬性中提取設備硬件和版本信息。 二、內部類&#xff1a; 1、Build.VERSION 各種版本字符串 2、Build.VERSION_CODES 目前已知的版本代碼的枚舉類 三、常量&#xff1a;UNKNOWN 當一個版本屬性不知道時所設定的值。其字符串值為 “unknown” 。 …

C++ unsigned char*轉化為string的形式

unsigned char*轉化為string int main(int argc,char **argv){//unsigned char * 轉化為string//參考鏈接 https://www.itdaan.com/tw/4ff531a5e6651468a5b7c6d95927ba3dunsigned char *foo;unsigned char str[] "Hello world";string strHH;foo str;strHH.append…