日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IPFS-文件HASH值计算

發(fā)布時(shí)間:2024/1/1 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IPFS-文件HASH值计算 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 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)容:

[root@VM_0_14_centos bin]# ./ipfs object get QmQU2gS4gZ7TpiTECjDUxdQFd9bBBEWxDxPPfhLfYHVuei {"Links":[],"Data":"\u0008\u0002\u0012\u0007123456\n\u0018\u0007"} [root@VM_0_14_centos bin]#

返回的是一個(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)容:

[root@VM_0_14_centos bin]# ./ipfs block get QmQU2gS4gZ7TpiTECjDUxdQFd9bBBEWxDxPPfhLfYHVuei | sha256sum 1f9b484934c481946f11af0d87f8c04603fa8bfa6b8589185edf506c1e1cb09b - [root@VM_0_14_centos bin]#

該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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。