重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
星際文件系統。
創新互聯公司10多年成都定制網頁設計服務;為您提供網站建設,網站制作,網頁設計及高端網站定制服務,成都定制網頁設計及推廣,對砂巖浮雕等多個領域擁有多年的網站制作經驗的網站建設公司。
IPFS是一種內容可尋址的對等超媒體分發協議。IPFS將現有的成功系統分布式哈希表、BitTorrent、版本控制系統Git、自認證文件系統與區塊鏈相結合的文件存儲和內容分發網絡協議。IPFS同時也是一個開放源代碼項目。
IPFS屬性:
1、永久的、去中心化保存和共享文件;
2、點對點超媒體:P2P 保存各種各樣類型的數據;
3、版本化:可追溯文件修改歷史。
擴展資料
IPFS優點:
1、內容尋址:所有內容(包括鏈接)都由其多哈希校驗和進行唯一標識。
2、防篡改:所有內容都使用其校驗和進行驗證。如果數據被篡改或損壞,則IPFS會檢測到該數據。
3、去冗余:所有內容完全相同的對象,只存儲一次。
4、PFS并不會要求每一個節點都存儲所有的內容,節點的所有者可以自由選擇想要維持的數據,在備份了自己的數據之外,自愿的為其他的關注的內容提供服務。
參考資料來源:百度百科-星際文件系統
package p2p
import (
"context"
"errors"
"time"
net "gx/ipfs/QmPjvxTpVH8qJyQDnxnsxF9kv9jezKD1kozz1hs3fCGsNh/go-libp2p-net"
manet "gx/ipfs/QmV6FjemM1K8oXjrvuq3wuVWWoU2TLDPmNnKrxHzY3v6Ai/go-multiaddr-net"
ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr"
pro "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol"
pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore"
p2phost "gx/ipfs/Qmb8T6YBBsjYsVGfrihQLfCJveczZnneSBqBKkYEBWDjge/go-libp2p-host"
peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer"
)
//P2P結構保存當前正在運行的流/監聽器的信息
// P2P structure holds information on currently running streams/listeners
type P2P struct {
//監聽器
Listeners ListenerRegistry
//數據流
Streams StreamRegistry
//節點ID
identity peer.ID
//節點地址
peerHost p2phost.Host
//一個線程安全的對等節點存儲
peerstore pstore.Peerstore
}
//創建一個新的p2p結構
// NewP2P creates new P2P struct
//這個新的p2p結構不包含p2p結構中的監聽器和數據流
func NewP2P(identity peer.ID, peerHost p2phost.Host, peerstore pstore.Peerstore) *P2P {
return P2P{
identity: identity,
peerHost: peerHost,
peerstore: peerstore,
}
}
//新建一個數據流 工具方法 構建一個有節點id,內容和協議的流
func (p2p P2P) newStreamTo(ctx2 context.Context, p peer.ID, protocol string) (net.Stream, error) {
//30s 后會自動timeout
ctx, cancel := context.WithTimeout(ctx2, time.Second 30) //TODO: configurable?
defer cancel()
err := p2p.peerHost.Connect(ctx, pstore.PeerInfo{ID: p})
if err != nil {
return nil, err
}
return p2p.peerHost.NewStream(ctx2, p, pro.ID(protocol))
}
//對話為遠程監聽器創建新的P2P流
//創建一個新的p2p流實現對對話的監聽
// Dial creates new P2P stream to a remote listener
//Multiaddr是一種跨協議、跨平臺的表示格式的互聯網地址。它強調明確性和自我描述。
//對內接收
func (p2p P2P) Dial(ctx context.Context, addr ma.Multiaddr, peer peer.ID, proto string, bindAddr ma.Multiaddr) ( ListenerInfo, error) {
//獲取一些節點信息 network, host, nil
lnet, _, err := manet.DialArgs(bindAddr)
if err != nil {
return nil, err
}
//監聽信息
listenerInfo := ListenerInfo{
//節點身份
Identity: p2p.identity,
////應用程序協議標識符。
Protocol: proto,
}
//調用newStreamTo 通過ctx(內容) peer(節點id) proto(協議標識符) 參數獲取一個新的數據流
remote, err := p2p.newStreamTo(ctx, peer, proto)
if err != nil {
return nil, err
}
//network協議標識
switch lnet {
//network為"tcp", "tcp4", "tcp6"
case "tcp", "tcp4", "tcp6":
//從監聽器獲取新的信息 nla.Listener, nil
listener, err := manet.Listen(bindAddr)
if err != nil {
if err2 := remote.Reset(); err2 != nil {
return nil, err2
}
return nil, err
}
//將獲取的新信息保存到listenerInfo
listenerInfo.Address = listener.Multiaddr()
listenerInfo.Closer = listener
listenerInfo.Running = true
//開啟接受
go p2p.doAccept(listenerInfo, remote, listener)
default:
return nil, errors.New("unsupported protocol: " + lnet)
}
return listenerInfo, nil
}
//
func (p2p *P2P) doAccept(listenerInfo *ListenerInfo, remote net.Stream, listener manet.Listener) {
//關閉偵聽器并刪除流處理程序
defer listener.Close()
//Returns a Multiaddr friendly Conn
//一個有好的 Multiaddr 連接
local, err := listener.Accept()
if err != nil {
return
}
stream := StreamInfo{
//連接協議
Protocol: listenerInfo.Protocol,
//定位節點
LocalPeer: listenerInfo.Identity,
//定位節點地址
LocalAddr: listenerInfo.Address,
//遠程節點
RemotePeer: remote.Conn().RemotePeer(),
//遠程節點地址
RemoteAddr: remote.Conn().RemoteMultiaddr(),
//定位
Local: local,
//遠程
Remote: remote,
//注冊碼
Registry: p2p.Streams,
}
//注冊連接信息
p2p.Streams.Register(stream)
//開啟節點廣播
stream.startStreaming()
}
//偵聽器將流處理程序包裝到偵聽器中
// Listener wraps stream handler into a listener
type Listener interface {
Accept() (net.Stream, error)
Close() error
}
//P2PListener保存關于偵聽器的信息
// P2PListener holds information on a listener
type P2PListener struct {
peerHost p2phost.Host
conCh chan net.Stream
proto pro.ID
ctx context.Context
cancel func()
}
//等待偵聽器的連接
// Accept waits for a connection from the listener
func (il *P2PListener) Accept() (net.Stream, error) {
select {
case c := -il.conCh:
return c, nil
case -il.ctx.Done():
return nil, il.ctx.Err()
}
}
//關閉偵聽器并刪除流處理程序
// Close closes the listener and removes stream handler
func (il *P2PListener) Close() error {
il.cancel()
il.peerHost.RemoveStreamHandler(il.proto)
return nil
}
// Listen創建新的P2PListener
// Listen creates new P2PListener
func (p2p P2P) registerStreamHandler(ctx2 context.Context, protocol string) ( P2PListener, error) {
ctx, cancel := context.WithCancel(ctx2)
list := P2PListener{
peerHost: p2p.peerHost,
proto: pro.ID(protocol),
conCh: make(chan net.Stream),
ctx: ctx,
cancel: cancel,
}
p2p.peerHost.SetStreamHandler(list.proto, func(s net.Stream) {
select {
case list.conCh - s:
case -ctx.Done():
s.Reset()
}
})
return list, nil
}
// NewListener創建新的p2p偵聽器
// NewListener creates new p2p listener
//對外廣播
func (p2p P2P) NewListener(ctx context.Context, proto string, addr ma.Multiaddr) ( ListenerInfo, error) {
//調用registerStreamHandler 構造一個新的listener
listener, err := p2p.registerStreamHandler(ctx, proto)
if err != nil {
return nil, err
}
//構造新的listenerInfo
listenerInfo := ListenerInfo{
Identity: p2p.identity,
Protocol: proto,
Address: addr,
Closer: listener,
Running: true,
Registry: p2p.Listeners,
}
go p2p.acceptStreams(listenerInfo, listener)
//注冊連接信息
p2p.Listeners.Register(listenerInfo)
return listenerInfo, nil
}
//接受流
func (p2p *P2P) acceptStreams(listenerInfo *ListenerInfo, listener Listener) {
for listenerInfo.Running {
//一個有好的 遠程 連接
remote, err := listener.Accept()
if err != nil {
listener.Close()
break
}
}
//取消注冊表中的p2p偵聽器
p2p.Listeners.Deregister(listenerInfo.Protocol)
}
// CheckProtoExists檢查是否注冊了協議處理程序
// mux處理程序
// CheckProtoExists checks whether a protocol handler is registered to
// mux handler
func (p2p *P2P) CheckProtoExists(proto string) bool {
protos := p2p.peerHost.Mux().Protocols()
for _, p := range protos {
if p != proto {
continue
}
return true
}
return false
}
ipfs不是項目,而是星際文件系統。
星際文件系統是一個旨在創建持久且分布式存儲和共享文件的網絡傳輸協議。它是一種內容可尋址的對等超媒體分發協議。在IPFS網絡中的節點將構成一個分布式文件系統。它是一個開放源代碼項目,自2014年開始由Protocol Labs在開源社區的幫助下發展。其最初由Juan Benet設計。
相關信息:
在2014年,IPFS協議利用比特幣區塊鏈協議和網絡基礎設施的優勢來存儲不可更改的數據,移除網絡上的重復文件,以及獲取存儲節點的地址信息——用以搜索網絡中的文件。
當前的實現采用Go和JavaScript,并有Python的實現正在發展。Go實現被認為是開發正式規范時的“參考實現”。
《開源精選》是我們分享Github、Gitee等開源社區中優質項目的欄目,包括技術、學習、實用與各種有趣的內容。本期推薦的IPFS 是一個分布式系統,用于存儲和訪問文件、網站、應用程序和數據。
而且,當您使用 IPFS 時,您不只是從其他人那里下載文件——您的計算機也有助于分發它們。當您在幾個街區外的朋友需要相同的 Wikipedia 頁面時,他們可能會像從您的鄰居或任何使用 IPFS 的人那里一樣從您那里獲得它。
IPFS 不僅可以用于網頁,還可以用于計算機可能存儲的任何類型的文件,無論是文檔、電子郵件,甚至是數據庫記錄。
可以從不由一個組織管理的多個位置下載文件:
最后一點實際上是 IPFS 的全名: InterPlanetary File System 。我們正在努力建立一個系統,該系統可以在不連貫或相隔很遠的地方工作,就像行星一樣。雖然這是一個理想主義的目標,但它讓我們努力工作和思考,幾乎我們為實現這一目標而創造的一切在家里也很有用。
IPFS 是一個點對點 (p2p) 存儲網絡。可以通過位于世界任何地方的對等點訪問內容,這些對等點可能會傳遞信息、存儲信息或兩者兼而有之。IPFS 知道如何使用其內容地址而不是其位置來查找您要求的內容。
理解 IPFS 的三個基本原則:
這三個原則相互依賴,以啟用 IPFS 生態系統。讓我們從 內容尋址 和內容的唯一標識開始。
互聯網和您的計算機上都存在這個問題!現在,內容是按位置查找的,例如:
相比之下,每條使用 IPFS 協議的內容都有一個 內容標識符 ,即 CID,即其 哈希值 。散列對于它所來自的內容來說是唯一的,即使它與原始內容相比可能看起來很短。
有向無環圖 (DAG)
IPFS 和許多其他分布式系統利用稱為有向無環圖的數據結構 (打開新窗口),或 DAG。具體來說,他們使用 Merkle DAG ,其中每個節點都有一個唯一標識符,該標識符是節點內容的哈希。
IPFS 使用針對表示目錄和文件進行了優化的 Merkle DAG,但您可以通過多種不同的方式構建 Merkle DAG。例如,Git 使用 Merkle DAG,其中包含許多版本的存儲庫。
為了構建內容的 Merkle DAG 表示,IPFS 通常首先將其拆分為 塊 。將其拆分為塊意味著文件的不同部分可以來自不同的來源并可以快速進行身份驗證。
分布式哈希表 (DHT)
要查找哪些對等方正在托管您所追求的內容( 發現 ),IPFS 使用分布式哈希表或 DHT。哈希表是值鍵的數據庫。 分布式 哈希表是一種表在分布式網絡中的所有對等方之間拆分的表。要查找內容,您需要詢問這些同行。
libp2p項目 (打開新窗口)是 IPFS 生態系統的一部分,它提供 DHT 并處理對等點之間的連接和交談。
一旦你知道你的內容在哪里(或者更準確地說,哪些對等點正在存儲構成你所追求的內容的每個塊),你就可以再次使用 DHT 來查找這些對等點的當前位置( 路由 )。因此,要獲取內容,請使用 libp2p 查詢 DHT 兩次。
然而,這確實意味著 IPFS 本身并沒有明確保護 有關 CID 和提供或檢索它們的節點的知識。這不是分布式網絡所獨有的。在 d-web 和 legacy web 上,流量和其他元數據都可以通過可以推斷出很多關于網絡及其用戶的方式進行監控。下面概述了這方面的一些關鍵細節,但簡而言之:雖然 節點之間 的 IPFS 流量是加密的,但這些節點發布到 DHT 的元數據是公開的。節點宣布對 DHT 功能至關重要的各種信息——包括它們的唯一節點標識符 (PeerID) 和它們提供的數據的 CID——因此,關于哪些節點正在檢索和/或重新提供哪些 CID 的信息是公開的可用的。
加密
網絡中有兩種類型的加密: 傳輸加密 和 內容加密 。
在兩方之間發送數據時使用傳輸加密。阿爾伯特加密文件并將其發送給萊卡,萊卡在收到文件后對其進行解密。這會阻止第三方在數據從一個地方移動到另一個地方時查看數據。
內容加密用于保護數據,直到有人需要訪問它。Albert 為他的每月預算創建了一個電子表格,并用密碼保存它。當 Albert 需要再次訪問它時,他必須輸入密碼才能解密文件。沒有密碼,Laika 無法查看該文件。
IPFS 使用傳輸加密,但不使用內容加密。這意味著您的數據在從一個 IPFS 節點發送到另一個節點時是安全的。但是,如果擁有 CID,任何人都可以下載和查看該數據。缺乏內容加密是一個有意的決定。您可以自由選擇最適合您的項目的方法,而不是強迫您使用特定的加密協議。
如果您精通命令行并且只想立即啟動并運行 IPFS,請遵循此快速入門指南。請注意,本指南假定您將安裝 go-ipfs,這是用 Go 編寫的參考實現。
ipfs將其所有設置和內部數據存儲在稱為 存儲庫的目錄中。 在第一次使用 IPFS 之前,您需要使用以下ipfs init命令初始化存儲庫:
如果您在數據中心的服務器上運行,則應使用server配置文件初始化 IPFS。這樣做會阻止 IPFS 創建大量數據中心內部流量來嘗試發現本地節點:
您可能需要設置大量其他配置選項 — 查看完整參考 (打開新窗口)更多。
后面的散列peer identity:是您節點的 ID,與上面輸出中顯示的不同。網絡上的其他節點使用它來查找并連接到您。如果需要,您可以隨時運行ipfs id以再次獲取它。
現在,嘗試運行在ipfs init. 那個樣子ipfs cat /ipfs/ /readme。
您應該看到如下內容:
您可以 探索 存儲庫中的其他對象。特別是quick-start顯示示例命令嘗試的目錄:
準備好將節點加入公共網絡后,在另一個終端中運行 ipfs 守護程序,并等待以下所有三行顯示您的節點已準備好:
記下您收到的 TCP 端口。如果它們不同,請在下面的命令中使用您的。
現在,切換回原來的終端。如果您已連接到網絡,您應該能夠在運行時看到對等方的 IPFS 地址:
這些是 /p2p/ .
現在,您應該能夠從網絡中獲取對象了。嘗試:
使用上述命令,IPFS 在網絡中搜索 CIDQmSgv...并將數據寫入spaceship-launch.jpg桌面上調用的文件中。
接下來,嘗試將對象發送到網絡,然后在您喜歡的瀏覽器中查看它。以下示例curl用作瀏覽器,但您也可以在其他瀏覽器中打開 IPFS URL:
您可以通過轉到 來查看本地節點上的 Web 控制臺localhost:5001/webui。這應該會彈出一個這樣的控制臺:
Web 控制臺顯示可變文件系統 (MFS)中的文件。MFS 是內置于 Web 控制臺的工具,可幫助您以與基于名稱的文件系統相同的方式導航 IPFS 文件。
當您使用CLI 命令ipfs add ...添加文件時,這些文件不會自動在 MFS 中可用。要查看您使用 CLI 添加的 IPFS 桌面中的文件,您必須將文件復制到 MFS:
—END—
開源協議:MIT License
開源地址:
原文:
Web3 應用程序在 2021 年的受歡迎程度飆升。該技術用例的增長也為支持它們的基礎設施帶來了更大的需求。 IPFS 已成為開發人員和用戶在新興 Web3 生態系統中使用的解決方案不可或缺的一部分。 網絡統計:存儲在 IPFS 上的 NFT:15M+每周唯一活躍 IPFS 節點:230K+ipfs.io 網關用戶每周:370 萬+ipfs.io 每周網關請求:805M+
2021 年合作與整合
擁有 IPFS 和NFT.Storage等工具 , Web3.存儲 , 和Estuary 在后端使項目能夠提供分散存儲功能作為其產品的一部分。
讓我們來看看一些最值得注意的應用程序:
1 Opensea 集成 NFT.Storage 以實現安全、平臺范圍的 NFT 持久性
OpenSea 是去中心化網絡上最大的 NFT 市場之一。它合作了 與 IPFS 和 FIlecoin 集成 NFT.Storage 并允許用戶“凍結”他們的 NFT 元數據。這個過程允許創作者真正去中心化他們的 NFT,將權力交還給創作者,而不是托管者。
如今, OpenSea 用戶可以創建不可變的 NFT 數據以持久存儲在 Filecoin 的區塊鏈上,并通過 IPFS 內容 ID 完成檢索數據的尋址。 IPFS 內容尋址通過消除“地毯拉動”或 NFT 元數據錯位的可能性,為 NFT 托管提供了完美的解決方案。
2 Brave 在其正在進行的 Web3 集成中添加了對 IPFS 的本地支持
在包含自己的加密貨幣錢包之后,Brave 通過集成 IPFS,繼續為其桌面 Web 瀏覽器添加 Web3 功能。 現在允許用戶通過本地解析 IPFS 地址來訪問存儲在協議上的內容。
整合是多年合作的結果 兩個團隊之間的合作, 目標是讓最終用戶盡可能地訪問 IPFS。這是朝著將 IPFS 轉變為所有瀏覽器最終可能支持的公認互聯網標準邁出的一大步。
3 Opera 擴展了對 IPFS 協議尋址的支持
Opera 于 2020 年首次在其 Android 瀏覽器中添加了對 IPFS 的支持 。今年,它將相同的功能擴展到其Opera Touch iOS 用戶的瀏覽器,允許他們導航到 ipfs:// 和 ipns:// 地址。
4 Pinata 讓任何人都可以輕松利用 IPFS
這種固定和文件管理服務允許用戶以簡單無縫的方式存儲區塊鏈經常引用的內容。 Pinata 充分利用IPFS 固定服務 API 將內容發布到 IPFS 網絡,允許基于 CID 的去中心化存儲和高效檢索 。
5 ScalaShare 通過 IPFS 為 Web3 帶來了安全的文件共享
互聯網上用戶之間的文件共享始于 P2P 共享,但ScalaShare 帶來了 在 IPFS 的幫助下將此功能應用于 Web3。 對于那些不愿意將數據交給大公司的人來說,這個簡單的開源工具可能會成為首選的文件存儲系統。
6 Audius 依靠 CID 按需流式傳輸音樂
Audius 將 Web3 上的音樂流媒體服務帶入了一個新的方向。 Audius使用 IPFS 集成來存儲和檢索數據 可以確保沒有斷開的曲目鏈接,并且所有音樂都交付給用戶,而不依賴于集中式服務器 。
IPFS 的 CID 是確保此音樂流媒體服務正常運行并繼續使用的關鍵 流行的 Web 2.0 應用程序(如 TikTok)上的 Web3 基礎架構。
7 Palm 在其可持續的 NFT 平臺上使用 IPFS 進行存儲
這個相對較新的 NFT 工作室最近與 IPFS 合作。Palm 具有用于生成 NFT 的可持續架構。它使用基于代幣的經濟來維持具有快速交易時間和低gas費用的生態系統,所有這些都基于節能技術。 IPFS 提供了它需要的解決方案,以確保用戶始終可以訪問他們的工作 。
8 Valist 信任 IPFS 以實現安全的 Web3 軟件分發
通過網站或應用商店發布軟件有時會引入安全問題,正如 2020 SolarWinds 攻擊所證明的那樣。Valist通過允許開發團隊以 Web3-native 方式分發軟件來解決這個問題。 IPFS 通過提供大量開箱即用的安全保證,充當 Valist 的主要存儲層。
9 Snapshot 確保 DAO 投票過程通過 IPFS 去中心化
流行的 DAO 投票系統快照 依賴 IPFS 作為其基礎設施的核心部分。 它允許 DAO 成員通過去中心化投票過程就特定協議提案達成共識。快照是從產品到協議的一切社區治理不斷增長的空間中最常用的工具之一
技術更新
2021 年還見證了 IPFS 工作方式的多項技術更新。其中的核心是:
1 IPFS 0.11.0
這是面向 Go 開發人員的 IPFS 實現。除了重要的修復之外, 最新版本還改進了 UnixFS 分片和 PubSub 實驗以及對 Circuit-Relay v2 的支持 。在這一年中,還進行了其他改進,例如:
對 go-ipfs 的 IPLD 內部結構的更改使使用非 UnixFS DAG 更容易提供多種新命令和配置選項網關支持通過 DAG 導出端點下載任意 IPLD 圖自定義 DNS 解析器支持非 ICANN DNSLink 名稱單獨打包的遷移為 Apple M1 硬件構建固定服務的 WebUI 支持遠程固定服務更快的固定和取消固定
2 JS IPFS 0.60.0
JS IPFS 是基于 JavaScript 的類似實現。 它緩解了將 IPFS 數據與 JavaScript 應用程序鏈接的問題,允許開發人員使用它來本地訪問 IPFS 數據 。最新版本包括重要的錯誤修復,并且全年進行了重要的改進,例如:
ESM 和 CJS 雙重發布一個更簡單的 globSource APIPubSub 支持解決瀏覽器連接限制ipfs.get 上的壓縮包輸出默認從 RSA 切換到 Ed25519Dag 導入導出實現更好的類型定義啟用 NAT UPnP 打孔在 ipfs-http-client 中添加了對支持遠程固定服務的支持
3 IPFS 集群 0.14.1
用于設置和運行 IPFS 集群的源代碼 。這個開源發行版向更多用戶和開發人員打開了 IPFS 的世界。在這一年中,它收到了更新,包括:
提高可以列出 pinset 的速度將內容遷移到新集群時更靈活CAR導入支持批量固定攝取對 Badger 數據存儲的自動垃圾收集
為了更好地理解為什么這些改進很重要,請務必查看本技術指南 到 IPFS。
采用的下一步
盡管 IPFS 在去年取得了長足的進步,但仍有增長空間。新的合作伙伴關系和進步將是更廣泛的 Web3 可用性的關鍵。 隨著越來越多的主流用戶意識到對去中心化互聯網的需求,對 IPFS 等工具的需求將會增加 。隨著他們繼續進入這個領域,我們將看到 2022 年會帶來什么。