區塊鏈
挖礦,比特幣,EOS,以太坊

IPFS技術丨IPFS文件HASH值解析 ipfs幣怎么買

 

1477093304564-for-108715-o_1b05k57a11jg015241jdsagdif9q-uid-444918_看圖王.png
作者丨上海儲迅信息技術有限公司聯合創始人-冷波
IPFS的熱門就不必說了,太多的人關注基于它的Filecoin挖礦。
但是否能獲得很大的收益,誰也說不清楚,畢竟主網沒有上線,測試網也沒有上線。但礦工們的交集等待,并不會降低大家對IPFS相關技術的關注。
除了Filecoin,越來越多的項目也會利用IPFS作為底層存儲層或者網絡數據傳輸協議。
空話少說。直奔主題。
IPFS和傳統文件系統的一個重要區別就是——內容尋址。顧名思義,就是文件的內容定了,其地址(訪問路徑)也就確定了。這和我們平時存放文件不一樣。通常,我可以給一張圖片隨意更換文件名,把它拷貝到不同的路徑。
這樣,一模一樣的文件,其訪問方式卻隨時變化,不可能根據文件的內容確定其訪問路徑。相比較而言,內容尋址的IPFS就具有一個天然的優勢——防篡改。數據只要修改了一個bit,其地址就徹底變化。想借助修改文件瞞天過海,難度就陡增。
比如,我創建了一個很簡單的文本文件demo.txt,然后把它上傳到IPFS網絡中:

$echo?-n?“StorSwift”?>?demo.txt

$ipfs?add?demo.txt

added?QmSsw6EcnwEiTT9c4rnAGeSENvsJMepNHmbrgi2S9bXNJr?demo.txt

于是,我就得到一個HASH值QmSsw6EcnwEiTT9c4rnAGeSENvsJMepNHmbrgi2S9bXNJr,在全球任何地方都可以訪問這個文件。也可以通過IPFS的網關在瀏覽器中查看:
https://gateway.ipfs.io/ipfs/QmSsw6EcnwEiTT9c4rnAGeSENvsJMepNHmbrgi2S9bXNJr
下面我們簡單探索一下,這個HASH值是如何得來的。

1. HASH算法:SHA2-256
區塊鏈的人,不管對技術多熟悉,或多或少都知道這個概念。每個文件存入IPFS網絡,都會有一個唯一的哈希(HASH)值,通過該值便可以確定文件,進而訪問數據。只要文件內容稍微修改,HASH就會變化。IPFS采用了SHA2-256這個安全級別還算高的算法,對任意長度的內容,生成的HASH值長度固定,都是32個字節。
在Linux下,直接用sha256sum可以計算SHA2-256格式的HASH值:

$sha256sum?demo.txt

6739529c5fb0802b60da9827b1a0942e08ab1a63f4bd855c49a74de55774bbef?demo.txt

得到的結果有64字節,其原因是因為用了十六進制的表示方式,每個字符表示4個bit,加在一起就是256bit,也就是32字節。但在IPFS中,并不能利用上面得到的SHA2-256結果,去確定文件地址,因為IPFS還有一些額外的因素需要考慮。
前面我們把demo.txt加入到IPFS中,除了正文里面的StorSwift幾個字符之外,IPFS還會添加一些元數據。比如,通過如下命令我們可以看到IPFSF里面到底存放了什么內容:

$ipfs?object?get?QmSsw6EcnwEiTT9c4rnAGeSENvsJMepNHmbrgi2S9bXNJr

{“Links”:[],”Data”:”\u0008\u0002\u0012\tStorSwift\u0018\t”}

返回的是一個JSON格式的字符串,Data顯示了具體的內容。可見在文件的原始內容之外,添加了一些其他的數據。IPFS會把文件數據以unixfs這種格式保存,可以認為,它是IPFS的核心數據結構MerkleDAG的一個表現方式。
具體內容,以后再做解釋。我們可以通過獲取IPFS的原始格式的數據,來計算正確的HASH值。IPFS保存的內容會被分成許多塊(block),本例的文件因為比較小,一個塊就可以保存。
所以,我們可以用如下的命令直接獲取IPFS block的內容:

$ipfs?block?get?QmSsw6EcnwEiTT9c4rnAGeSENvsJMepNHmbrgi2S9bXNJr??|?sha256sum

437246839fc6ad5e2b74386df944f99e7cb42998dee02f169644d88ce6b00b8f??–

該block的HASH值用十六進制數表示為:437246839fc6ad5e2b74386df944f99e7cb42998dee02f169644d88ce6b00b8f。它也就是IPFS用特定格式保存文件之后的HASH值。

2. 擴展需求:multihash
是否用該HASH值就能得到我們通常看到的IPFS文件的HASH值?好像不是那么回事,因為我們看到的文件HASH值都是以Qm開頭的,顯然在這里對不上號。這就涉及到另外一個話題——動態選擇HASH算法的設計。
雖然現在SHA2-256還比較安全,但隨著科技的發展,說不定哪天就突然有人宣布,可以破解它呢?那自然需要采用更先進的算法。但IPFS的協議制定好了,也不能隨便改。怎么辦呢?雖然現在用的是SHA2-256,但可以宣稱我支持多種HASH算法,到時候升級算法即可,但不會有大的架構改動。
于是,IPFS采用了multihash這種簡單的HASH表示方式,支持多種HASH算法。如果未來修改算法,用的仍然是multihash,保證了表達方式的持續性。
multihash的格式簡單,具體文檔參見:multiformats/multihash。它其實就是一個字符串,由三部分組成:HASH算法編碼、HASH值的長度(字節數)、HASH 值。
SHA2-256的編碼為0x12,其HASH摘要長度為32字節(十六進制數為0x20)。把1220加到前面所得HASH值的開頭,我們得到本例文件的multihash編碼(十六機制):

1220437246839fc6ad5e2b74386df944f99e7cb42998dee02f169644d88ce6b00b8f

3. 易用需求:Base58
但這個HASH值顯然也不是我們看到的內容。那是怎么回事呢?它太長了,一堆數字讀起來也不容易,所以需要再進行編碼,壓縮其長度,且容易被傳播。為此,IPFS采用了Base58這種編碼。
Base58最早被比特幣采用,如今在區塊鏈項目中非常流行,經常用于表示錢包地址。做過開發的朋友可能比較了解Base64這種編碼,能把任意二進制內容轉換成方便軟件查看的可讀字符。
但Base64有一些缺點,就是某些字符不和諧,比如,O和0容易混淆,+和/等符號,很容易讓人把一個完整的字符串認為是兩個不同的字符串,形成閱讀上的障礙。有時候我們用鼠標一點,想自動選中整個字符串,卻因為這些符號的干擾,導致選擇操作沒有那么高效。因此,就誕生了Base58這種編碼。
很簡單,就是和Base64類似,能轉換二進制內容為可讀字符,只是把前面講的那些有干擾的字符全部剔除。
Base58的代碼非常簡單,可以從這里獲取:keis/base58
我引用了里面的Python源文件,基于前面生成的multihash編碼進行計算:

>>>?import?base58

>>>?base58.b58encode_int(int(“1220437246839fc6ad5e2b74386df944f99e7cb42998dee02f169644d88ce6b00b8f”,?16))

‘QmSsw6EcnwEiTT9c4rnAGeSENvsJMepNHmbrgi2S9bXNJr’

得到的結果QmSsw6EcnwEiTT9c4rnAGeSENvsJMepNHmbrgi2S9bXNJr,正是前面我們用ipfs add命令得到的HASH值!
補充一點,IPFS現在的multihash值,都是以1220開頭的,按照Base58的算法,算出來的結果就都是以Qm開頭。

4. 總結
大功告成!現在對IPFS文件的HASH值有了比較清楚的認識,知道其來龍去脈了。總結一下,就是:
原始數據封裝成 -> 計算SHA2-256 -> 封裝成multihash -> 轉換成Base58
當然,如果上傳的是目錄,或者分成多塊的文件,其過程就要復雜一些。

贊(0)

評論 搶沙發

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
p3试机号99