## **Multihash**
Multihash 在ipfs中被廣泛應用。
定義如下:
Multihash is a protocol for differentiating outputs from various well-established hash functions, addressing size + encoding considerations. It is useful to write applications that future-proof their use of hashes, and allow multiple hash functions to coexist.
簡單翻譯如下:
Multihash 是一種協議,用于區分各種成熟哈希函數的輸出,解決大小+編碼的實際問題。 編寫應用程序來保證它們對哈希的使用永不過時,并允許多個哈希函數共存是很有用的。
采用Mutihash的根本原因是,有時哈希算法可能被證明是不安全的,這意味著它不再符合我們先前定義的特征(如一無二的、不可逆轉、不會被破解等)。這已經在sha1發生了(目前不同的明文通過MD5或SHA1后,可以生成相同的數字摘要,從而導致暴力破解的概率加大,從而造成不安全) 。隨著時間的流逝,其他算法可能證明不足以實現IPFS和其他分布式信息系統中的內容尋址。因此,為了支持多種密碼算法,我們需要能夠知道使用哪種算法來生成特定內容的哈希。
由此,Multihash 應運而生。
Multihash 由hash算法名稱+hash值長度+hash值共同構成。
multihash 是自描述散列本身包含描述其兩個長度和什么加密算法生成的它的元數據。系統使用Mutihah具有永不過時的功能,因為它們使用多重哈希來支持多種哈希算法,而不是依賴特定的哈希算法。
多重哈希遵循TLV 模式(type-length-value)。本質上,“原始哈希”的前綴是type所應用的哈希算法類型和hash的length。
* `type`:所述的識別碼的加密算法來生成的散列(例如的標識符`sha2-256`將是`18`\-`0x12`在十六進制) -參見multicodec 表對于所有標識符
* `length`:哈希的實際長度(如果使用`sha2-256`它將是`256`位,等于32個字節)
* `value`:實際的哈希值
在ipfs的節點標識(identity)上,節點唯一標識為節點公鑰的mutihash。計算其mutihash時,type為IDENTITY(十六進制的0x00)或SHA2_256(十六進制0x18):
```
func IDFromPublicKey(pk ic.PubKey) (ID, error) {
? ? b, err := ic.MarshalPublicKey(pk)
if err != nil {
return "", err
}
var alg uint64 = mh.SHA2_256
if AdvancedEnableInlining && len(b) <= maxInlineKeyLength {
alg = mh.IDENTITY
}
? hash, _ := mh.Sum(b, alg, -1)
return ID(hash), nil
}
```
根據ipfs文檔說明,采用IDENTITY的type,是為向后兼容,未來會廢棄(也就是將AdvancedEnableInlining置為false),這樣,未來根據公鑰產生的ID的hash type將是SHA2_256。
- 重要更新說明
- linechain發布
- linechain新版設計
- 引言一
- 引言二
- 引言三
- vs-code設置及開發環境設置
- BoltDB數據庫應用
- 關于Go語言、VS-code的一些Tips
- 區塊鏈的架構
- 網絡通信與區塊鏈
- 單元測試
- 比特幣腳本語言
- 關于區塊鏈的一些概念
- 區塊鏈組件
- 區塊鏈第一版:基本原型
- 區塊鏈第二版:增加工作量證明
- 區塊鏈第三版:持久化
- 區塊鏈第四版:交易
- 區塊鏈第五版:實現錢包
- 區塊鏈第六版:實現UTXO集
- 區塊鏈第七版:網絡
- 階段小結
- 區塊鏈第八版:P2P
- P2P網絡架構
- 區塊鏈網絡層
- P2P區塊鏈最簡體驗
- libp2p建立P2P網絡的關鍵概念
- 區塊鏈結構層設計與實現
- 用戶交互層設計與實現
- 網絡層設計與實現
- 建立節點發現機制
- 向區塊鏈網絡請求區塊信息
- 向區塊鏈網絡發布消息
- 運行區塊鏈
- LineChain
- 系統運行流程
- Multihash
- 區塊鏈網絡的節點發現機制深入探討
- DHT
- Bootstrap
- 連接到所有引導節點
- Advertise
- 搜索其它peers
- 連接到搜到的其它peers
- 區塊鏈網絡的消息訂發布-訂閱機制深入探討
- LineChain:適用于智能合約編程的腳本語言支持
- LineChain:解決分叉問題
- LineChain:多重簽名
- libp2p升級到v0.22版本
- 以太坊基礎
- 重溫以太坊的樹結構
- 世界狀態樹
- (智能合約)賬戶存儲樹
- 交易樹
- 交易收據樹
- 小結
- 以太坊的存儲結構
- 以太坊狀態數據庫
- MPT
- 以太坊POW共識算法
- 智能合約存儲
- Polygon Edge
- block結構
- transaction數據結構
- 數據結構小結
- 關于本區塊鏈的一些說明
- UML工具-PlantUML
- libp2p介紹
- JSON-RPC
- docker制作:啟動多個應用系統
- Dockerfile
- docker-entrypoint.sh
- supervisord.conf
- docker run
- nginx.conf
- docker基礎操作整理
- jupyter計算交互環境
- git技巧一
- git技巧二
- 使用github項目的最佳實踐
- windows下package管理工具