## **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管理工具