簡介
IPFS是一個遊戲改變者。與當今的web相比,IPFS實際上可以實現一個分散式的、永久的web。 IPFS利用點對點架構,其中每個節點既是客戶端又是伺服器。 如果您從網路請求某些內容,則將您請求的內容提供給其他節點。
除了點對點體系結構,我們在IPFS上檢索內容的方式也是革命性的。我們不是透過內容的位置即IP地址來標識內容,而是透過對內容本身進行雜湊建立的唯一識別符號來標識內容。這稱為內容定址。出於以下幾個原因,這非常有用:
資料永續性。 如果許多同行擁有您想要的內容,您將從最接近的同行那裡獲得。即使內容的原始上載者已離線,但由於內容已定址,因此您很有可能仍會獲得它。與今天的web相比,如果伺服器宕機,內容也隨之宕機,這是一個很大的改進。
內建安全性。由於內容識別符號(CID)是透過對內容本身進行雜湊處理而建立的,因此您始終可以確保完全獲得所需的內容。無法欺騙系統,因為如果您修改內容,其識別符號將隨之改變。
準備入門
在開始之前,我想先解決一些問題。IPFS客戶端有兩種實現,一種在JavaScript,另一種在Go。在這裡,JavaScript似乎是最好的選擇,但是由於它處於比Go客戶端更早的開發狀態,因此這不是最佳選擇。我們將使用Go客戶端,並透過其API與Node連線。
先決條件:
1. Node.js(最好是更高版本之一)和npm
2. go-ipfs客戶端
3. postman或curl,用於向我們的REST API發出請求
首先,我們的節點必須以線上模式執行,因此開啟一個終端並執行ipfs daemon。您應該會看到以下內容:
在第19行,您可以看到API伺服器正在偵聽埠5001。這是我們需要連線的埠。
其次,建立一個新的專案目錄並執行npm install ipfs-http-client。這是我們需要連線到正在執行的IPFS節點的軟體包。
接下來,讓我們建立js檔案,在該檔案中我們將連線到節點:
在第3行上,我們實際上連線到守護程式API伺服器。現在,我們可以開始在ipfs物件上執行命令以與網路互動。
舉例來說,讓我們編寫一個向IPFS新增一些文字的函式:
在第1行上,我們建立一個要新增到IPFS的物件。路徑是我們希望在IPFS上呼叫檔案的路徑(可以包含目錄),內容是我們要新增的檔案的Buffer(在這種情況下,只是純文字)。接下來,我們使用ipfs.add()將檔案新增到ipfs中,這將返回包含所有已新增檔案的陣列。因為我們只新增了一個,所以console.log()的結果將是:
如果繼續進行,您會發現雜湊欄位每次都會完全相同,因為您新增了與我相同的內容。另外請注意,路徑名不會影響內容識別符號。如果現在要檢索內容,則有兩種可能性:
使用您的本地閘道器伺服器:http//localhost:8080/ipfs/QmWfVY9y3xjsixTgbd9AorQxH7VtMpzfx2HaWtsoUYecaX
閘道器伺服器由您的IPFS守護程序啟動。使用公共閘道器:https://gateway.ipfs.io/ipfs/QmWfVY9y3xjsixTgbd9AorQxH7VtMpzfx2HaWtsoUYecaX
所有這些都已經很酷了,但讓我們看看如何在應用程式中使用它。為了演示更多功能,讓我們使用Express建立一個小的REST API。
構建應用程式
不要忘記執行npm install express。
讓我們從一些樣板程式碼開始:
繼續執行它,並用curl http://localhost:3000 其進行測試。您應該看到 Welcome to my IPFS app。
現在新增一條POST路線:
現在,我們可以與postman一起測試這條路線。建立一個新的POST請求到http:// localhost:3000 / upload。 您可以選擇放入正文中的內容,但必須為JSON:
如果一切順利,您應該已經得到響應,並且從Express應用程式獲得了一些終端輸出:{path:'postman request',content:'postman said whassup'}。由於我們使用JSON中介軟體,因此req.body被解析為JS物件,這已經是我們需要向IPFS新增內容的格式。讓我們透過修改和呼叫addFile函式擴充套件功能,然後透過公共閘道器返回指向已新增檔案的連結:
在第8行的addFile()中,我們將req.body資料作為引數並將其新增到IPFS。然後,我們返回fileHash,以便可以將其包含在作為響應傳送回的連結中。如果現在我們對郵遞員發出另一個POST請求:
我們返回一個連結以在公共閘道器上檢視我們的檔案! 請注意,由於公共閘道器的速度可能很慢,因此實際上可能需要一段時間才能載入此連結。