IPFS-文件HASH值计算
文章目錄
- IPFS如何計(jì)算文件hash?
- IPFS-Multihash
- 易用需求:Base58
IPFS如何計(jì)算文件hash?
IPFS采用了SHA2-256這個(gè)安全級(jí)別還算高的算法,對(duì)任意長度的內(nèi)容,生成的HASH值長度固定,都是32個(gè)字節(jié)。
在Linux下,直接用sha256sum可以計(jì)算SHA2-256格式的HASH值:
[root@VM_0_14_centos bin]# sha256sum ipfsfile.txt e150a1ec81e8e93e1eae2c3a77e66ec6dbd6a3b460f89c1d08aecf422ee401a0 ipfsfile.txt [root@VM_0_14_centos bin]# ./ipfs add ipfsfile.txt added QmQU2gS4gZ7TpiTECjDUxdQFd9bBBEWxDxPPfhLfYHVuei ipfsfile.txt7 B / ? [---------------------------------------------------------------------------------=------] [root@VM_0_14_centos bin]#得到的結(jié)果有64字節(jié),其原因是因?yàn)橛昧耸M(jìn)制的表示方式,每個(gè)字符表示4個(gè)bit,加在一起就是256bit,也就是32字節(jié)。
但在IPFS中,并不能利用上面得到的SHA2-256結(jié)果,去確定文件地址,因?yàn)镮PFS還有一些額外的因素需要考慮。
我們把 ipfsfile.txt 加入到IPFS中,除了正文里面的 123456 幾個(gè)字符之外,IPFS還會(huì)添加一些元數(shù)據(jù)。
通過如下命令我們可以看到IPFSF里面到底存放了什么內(nèi)容:
返回的是一個(gè)JSON格式的字符串,Data顯示了具體的內(nèi)容。可見在文件的原始內(nèi)容之外,添加了一些其他的數(shù)據(jù)。** IPFS會(huì)把文件數(shù)據(jù)以u(píng)nixfs這種格式保存,可以認(rèn)為,它是IPFS的核心數(shù)據(jù)結(jié)構(gòu)MerkleDAG的一個(gè)表現(xiàn)方式。 **
我們可以通過獲取IPFS的原始格式的數(shù)據(jù),來計(jì)算正確的HASH值。IPFS保存的內(nèi)容會(huì)被分成許多塊(block),本例的文件因?yàn)楸容^小,一個(gè)塊就可以保存。
所以,我們可以用如下的命令直接獲取IPFS block的內(nèi)容:
該block的HASH值用十六進(jìn)制數(shù)表示為:1f9b484934c481946f11af0d87f8c04603fa8bfa6b8589185edf506c1e1cb09b 。它也就是IPFS用特定格式保存文件之后的HASH值。
是否用該HASH值就能得到我們通常看到的IPFS文件的HASH值?好像不是那么回事,因?yàn)槲覀兛吹降奈募﨟ASH值都是以Qm開頭的,顯然在這里對(duì)不上號(hào)。這就涉及到另外一個(gè)話題——?jiǎng)討B(tài)選擇HASH算法的設(shè)計(jì)。
IPFS-Multihash
【推薦】官方:https://github.com/multiformats/multihash
雖然現(xiàn)在SHA2-256還比較安全,但隨著科技的發(fā)展,說不定哪天就突然有人宣布,可以破解它呢?那自然需要采用更先進(jìn)的算法。但I(xiàn)PFS的協(xié)議制定好了,也不能隨便改。怎么辦呢?雖然現(xiàn)在用的是SHA2-256,但可以宣稱我支持多種HASH算法,到時(shí)候升級(jí)算法即可,但不會(huì)有大的架構(gòu)改動(dòng)。
于是,IPFS采用了multihash這種簡單的HASH表示方式,支持多種HASH算法。如果未來修改算法,用的仍然是multihash,保證了表達(dá)方式的持續(xù)性。
multihash是一種自識(shí)別hash (Self identifying hashes)
multihash 多重哈希 遵循TLV 模式(type-length-value)。它其實(shí)就是一個(gè)字符串,由三部分組成:HASH算法編碼、HASH值的長度(字節(jié)數(shù))、HASH 值。
SHA2-256的編碼為0x12,其HASH摘要長度為32字節(jié)(十六進(jìn)制數(shù)為0x20)。把1220加到前面所得HASH值的開頭,我們得到本例文件的multihash編碼(十六機(jī)制):
12201f9b484934c481946f11af0d87f8c04603fa8bfa6b8589185edf506c1e1cb09b
官方sha-256 格式demo:
總結(jié):我們把 ipfsfile.txt 加入到IPFS中,除了正文里面的 xxx 幾個(gè)字符之外,IPFS還會(huì)添加一些元數(shù)據(jù)。然后對(duì)這個(gè)添加元數(shù)據(jù)的文件進(jìn)行了sha256sum,然后再multihash 規(guī)則(前面加1120),文件的multihash編碼(十六機(jī)制)。
易用需求:Base58
【推薦】官網(wǎng):https://github.com/keis/base58
但這個(gè)HASH值顯然也不是我們看到的內(nèi)容。那是怎么回事呢?它太長了,一堆數(shù)字讀起來也不容易,所以需要再進(jìn)行編碼,壓縮其長度,且容易被傳播。為此,IPFS采用了Base58這種編碼。
Base58最早被比特幣采用,如今在區(qū)塊鏈項(xiàng)目中非常流行,經(jīng)常用于表示錢包地址。做過開發(fā)的朋友可能比較了解Base64這種編碼,能把任意二進(jìn)制內(nèi)容轉(zhuǎn)換成方便軟件查看的可讀字符。
但Base64有一些缺點(diǎn),就是某些字符不和諧,比如,O和0容易混淆,+和/等符號(hào),很容易讓人把一個(gè)完整的字符串認(rèn)為是兩個(gè)不同的字符串,形成閱讀上的障礙。有時(shí)候我們用鼠標(biāo)一點(diǎn),想自動(dòng)選中整個(gè)字符串,卻因?yàn)檫@些符號(hào)的干擾,導(dǎo)致選擇操作沒有那么高效。因此,就誕生了Base58這種編碼。
設(shè)計(jì)Base58主要的目的是:
- 避免混淆。在某些字體下,數(shù)字0和字母大寫O,以及字母大寫I和字母小寫l會(huì)非常相似。
- 不使用"+“和”/"的原因是非字母或數(shù)字的字符串作為帳號(hào)較難被接受。
- 沒有標(biāo)點(diǎn)符號(hào),通常不會(huì)被從中間分行。
- 大部分的軟件支持雙擊選擇整個(gè)字符串。
Base58的代碼非常簡單,查看官網(wǎng)https://github.com/keis/base58
python安裝模塊 base58 進(jìn)行驗(yàn)證
pip install base58
[root@VM_0_14_centos ~]# python Python 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import base58 >>> base58.b58encode_int(int("12201f9b484934c481946f11af0d87f8c04603fa8bfa6b8589185edf506c1e1cb09b", 16)) 'QmQU2gS4gZ7TpiTECjDUxdQFd9bBBEWxDxPPfhLfYHVuei' >>>基于前面生成的multihash 編碼(12201f9b484934c481946f11af0d87f8c04603fa8bfa6b8589185edf506c1)進(jìn)行計(jì)算,得到的結(jié)果
QmQU2gS4gZ7TpiTECjDUxdQFd9bBBEWxDxPPfhLfYHVuei 正是前面我們用ipfs add命令得到的HASH值!
注意: IPFS現(xiàn)在的multihash值,都是以1220開頭的,按照Base58的算法,算出來的結(jié)果就都是以Qm開頭。
總結(jié):我們把 ipfsfile.txt 加入到IPFS中,除了正文里面的 xxx 幾個(gè)字符之外,IPFS還會(huì)添加一些元數(shù)據(jù),形成IPFS文件。然后對(duì)這個(gè)添加元數(shù)據(jù)的文件進(jìn)行了sha256sum,然后再multihash 規(guī)則(前面加1120),文件的multihash編碼(十六機(jī)制)。因?yàn)檫@個(gè)不好記憶識(shí)別,它又用 base58對(duì)我們的 multihash 生成最終的IPFS文件的HASH值。
簡化總結(jié)為:原始數(shù)據(jù)添加元數(shù)據(jù)封裝成IPFS文件 -> 計(jì)算SHA2-256 -> 封裝成multihash -> 轉(zhuǎn)換成Base58
總結(jié)
以上是生活随笔為你收集整理的IPFS-文件HASH值计算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 串口服务器RS485转以太网网口TCP/
- 下一篇: 联想7400打印机如何与手机连到一起_联