区块链 | IPFS:Merkle DAG

🦊原文:IPFS: Merkle DAG 数据结构 - 知乎
🦊写在前面:本文属于搬运博客,自己留存学习。



1 Merkle DAG 的简介

Merkle DAG 是 IPFS 系统的核心概念之一。虽然 Merkle DAG 并不是由 IPFS 团队发明的,它来自于 Git 数据结构,但是 IPFS 团队对其进行了改造。可以肯定的是,IPFS 团队并非直接拿来使用,而是在原有基础上进行修改以更适合项目的使用。

Merkle DAG 的全称是 Merkle Directed Acyclic Graph,即默克有向无环图。它是在 Merkle Tree 基础上构建的,Merkle Tree 是由美国计算机学家 Merkle 于 1979 年申请的专利。Merkle DAG 跟 Merkle Tree 很相似,但不完全一样,比如:Merkle DAG 不需要进行树的平衡操作,非叶子节点允许包含数据等。



2 Merkle DAG 的功能

Merkle DAG 拥有如下的功能:

  • 内容寻址:使用多重哈希来唯一标识一个数据块的内容;
  • 防篡改:通过检查哈希值来确认数据块的内容是否被篡改;
  • 去重:由于内容相同的数据块哈希值是相同的,因此很容易去除重复的数据,以节省存储空间;


3 IPFS 的数据对象格式

IPFS 的数据对象格式如下:

type IPFSLink struct {name string 		// Link的名字hash Multihash 		// 数据的加密哈希size int 			// 数据大小
}type IPFSObject struct {links []IPFSLink 	// Link数组data []byte 		// 数据内容
}

这段代码是用 Go 语言写的,Go 语言又称为 Golang 语言。

在 IPFS 网络中,大的文件通常会被分割成多个小片。每个碎片拥有自己的哈希值,再根据碎片的哈希值生成对应的「链接」。按照每个碎片在文件中出现的顺序,使用它们的链接生成「链接数组」,再使用「链接数组」生成最终的顶层「对象」,以此来表示文件。

除此之外,IPFS 赋予应用完全的数据字段控制权,允许应用自由定义数据类型和结构,包括那些 IPFS 系统无法直接识别的复杂数据结构,从而提供了极大的灵活性。



4 IPFS 的数据对象如何工作

第一步:准备数据

一张图片,文件名为 rainy_day.jpg,文件大小为 1MB,如下图所示:

在这里插入图片描述

说明:我没有采用原博的图片,因为图片上的水印导致图片内容改变了。如果你想自己测试的话,那么建议使用一个超过 256K 的数据文件,因为 IPFS 当前的数据分片标准是 256K 一个。



第二步:添加文件

执行 ipfs add 命令以添加文件:

$ ipfs add rainy_day.jpg
added QmQhSvoNcYCXk7JAjXzkQN8TmQaA8wP4oZxB9EmDNXiUzd rainy_day.jpg

说明:在本文中,以 $ 开头的是命令,不以 $ 开头的是输出结果。



第三步:查看文件分片

执行 ipfs ls -v 命令以查看文件分片:

$ ipfs ls -v QmQhSvoNcYCXk7JAjXzkQN8TmQaA8wP4oZxB9EmDNXiUzd

输入的就是刚才得到的哈希值。

如下所示,可以看到文件被分成了 5 个区块(block),每个区块的大小为 256K,除了最后一个。

Hash Size Name
QmTKqvEAgEaWfJVZjq7drgQUBLxwWzyrCTBVzZ9dcBc3Cq 262158
QmQCxXC4EUqw9gRmiRStNfYSr15oyPTV6yVJ7G9KBzecVt 262158
QmT4vb3Ujn6RpLijb8z4jFooCWmNqgvPbSagQf1WgdJjZe 262158
QmZ4UtPdZ5aBL4g55Yb7erWVtJGEBwhyGd5dCwYx28CafK 262158
QmcbpccHVURapPiKPn37yG14ar1myeFvTdqm215RRKcKqW 3071

由此可见,当执行 ipfs add 命令时,文件 first.JPG 的数据被分割成多个相等大小的区块,同时构建一个 Merkle DAG 来将这些数据区块整合成一个有序的结构。如下图所示:

在这里插入图片描述

上图源自 IPFS 官方在线测试网站:https://dag.ipfs.tech/



5 IPFS 的查询命令

我们还可以使用 IPFS 提供的命令来查看数据块(block)的信息,数据块下面还允许链接子数据块(sub-block),本文的例子中没有涉及。

相关的查询命令如下:

  • ipfs block stat:查询数据块的大小,不包含子块;
  • ipfs refs:列出数据块的子块信息;
  • ipfs ls or ipfs object links:显示所有的块和子块的大小;

例如:

$ ipfs block stat QmTKqvEAgEaWfJVZjq7drgQUBLxwWzyrCTBVzZ9dcBc3Cq
Key: QmTKqvEAgEaWfJVZjq7drgQUBLxwWzyrCTBVzZ9dcBc3Cq
Size: 262158

既然每个数据块都能被我们查询到,那么我们可以手动将这些数据块重新组合起来。

比如刚才那张图片,就可以使用命令:

$ ipfs cat hash1 hash2 hash3 ... hashn > rainy_day.jpg

从而得到上面的那张照片,有兴趣的读者可以自己动手试试。



6 直接操作 Merkle DAG

IPFS 可以让我们直接操作 Merkle DAG 的数据,举个例子:

$ echo "hello world" | ipfs block put
QmZjTnYw2TFhn9Nn7tjmPSoTBoY7YRkwPzwSrSbabY24Kp$ ipfs block get QmZjTnYw2TFhn9Nn7tjmPSoTBoY7YRkwPzwSrSbabY24Kp
hello world

上述命令的意思应该是:将 “hello world” 编码为一个 IPFS 块,IPFS 返回该数据块的哈希值。然后,可以通过该哈希值访问到数据内容是 “hello world”。

怎么样?很魔性吧,我们完全控制了数据块中的数据内容和结构,IPFS 把 Merkle DAG 的操作权限几乎全部下放给了开发者,开发者可以很容易构造出来自己的数据结构。

IPFS 在论文里面提出了可以自己一些潜在的数据结构:

  • 键值对存储(Key-value Stores)
  • 关系型数据库(Traditional Relatioinal Databases)
  • 三元组存储(Linked Data Triple Stores)
  • 文档发布系统(Linked Document Publishing Systems)
  • 通信平台(Linked Communications Platforms)
  • 加密货币区块链(Cryptocurrency Blockchains)

在此基础上开发者还可以完全自定义自己的数据结构。看到最后一条了吧,IPFS 为所有的区块链准备好了数据存储结构,IPFS 将作为区块链的基础设施存在。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/319148.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UnityRPG游戏制作】Unity_RPG项目_玩家逻辑相关

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:就业…

自动驾驶-第02课软件环境基础(ROSCMake)

1. 什么是ros 2. 为什么使用ros 3. ROS通信 3.1 Catkin编译系统

MT3608B 航天民芯代理 1.2Mhz 24V输入 升压转换器

深圳市润泽芯电子有限公司为航天民芯一级代理商 技术支持欢迎试样~Tel:18028786817 简述 MT3608B是恒定频率的6针SOT23电流模式升压转换器,用于小型、低功耗应用。MT3608B开关频率为1.2MHz,允许使用微小、低电平成本电容器和电感器高度不…

正版Office-Word使用时却提示无网络连接请检查你的网络设置 然后重试

这是购买电脑时自带的已经安装好的word。看纸箱外壳有office标记,但是好像没有印系列号。 某天要使用。提示:无网络连接请检查你的网络设置。 经过网上高手的提示: 说要勾选勾选ssl3.0、TLS1.0、1.1、1.2。 我的截图 我电脑进去就缺1.2. …

Go协程的底层原理(图文详解)

为什么要有协程 什么是进程 操作系统“程序”的最小单位进程用来占用内存空间进程相当于厂房,占用工厂空间 什么是线程 进程如果比作厂房,线程就是厂房里面的生产线: 每个进程可以有多个线程线程使用系统分配给进程的内存,线…

深度学习之基于Vgg16卷积神经网络印度交警手势识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着智能交通系统的不断发展,手势识别技术在其中扮演着越来越重要的角色。特别是在印度等…

Golang | Leetcode Golang题解之第58题最后一个单词的长度

题目: 题解: func lengthOfLastWord(s string) (ans int) {index : len(s) - 1for s[index] {index--}for index > 0 && s[index] ! {ansindex--}return }

AST原理(反混淆)

一、AST原理 jscode var a "\u0068\u0065\u006c\u006c\u006f\u002c\u0041\u0053\u0054";在上述代码中,a 是一个变量,它被赋值为一个由 Unicode 转义序列组成的字符串。Unicode 转义序列在 JavaScript 中以 \u 开头,后跟四个十六进…

JavaScript 如何理解柯里化函数结构及调用

文章目录 柯里化函数是什么逐步理解柯里化函数 柯里化函数是什么 柯里化(Currying)函数,又称部分求值,是一种函数转换技术。这种技术将一个接受多个参数的函数转换为一系列接受单一参数的函数。具体来说,一个柯里化的…

LWIP+TCP客户端

一、TCP API函数 其中tcp_poll()函数的第三个参数表示隔几秒调用一次这个周期性函数 二、修改服务器的IP 三、TCP客户端编程思路 申请套接字绑定服务器IP和端口号等待客户端连接 进入连接回调函数在连接回调函数中 配置一些回调函数,如接收回调函数,周期…

C语言 基本数据类型及大小

一、基本数据类型 1.整型int 整型的关键字是int,定义一个整型变量时,只需要用int来修饰即可。也分为短整型和长整型。 2.浮点型 浮点型又分单精度浮点型float和双精度浮点型double。 3.字符型char 前面的整型和浮点型都是用于存放数字。字符型&…

【python的魅力】:教你如何用几行代码实现文本语音识别

文章目录 引言一、运行效果二、文本转换为语音2.1 使用pyttsx32.2 使用SAPI实现文本转换语音2.3 使用 SpeechLib实现文本转换语音 三、语音转换为文本3.1 使用 PocketSphinx实现语音转换文本 引言 语音识别技术,也被称为自动语音识别,目标是以电脑自动将…

用LangChain打造一个可以管理日程的智能助手

存储设计定义工具创建llm提示词模板创建Agent执行总结 众所周知,GPT可以认为是一个离线的软件的,对于一些实时性有要求的功能是完全不行,比如实时信息检索,再比如我们今天要实现个一个日程管理的功能,这个功能你纯依赖…

Hdfs小文件治理策略以及治理经验

小文件是 Hadoop 集群运维中的常见挑战,尤其对于大规模运行的集群来说可谓至关重要。如果处理不好,可能会导致许多并发症。Hadoop集群本质是为了TB,PB规模的数据存储和计算因运而生的。为啥大数据开发都说小文件的治理重要,说HDFS 存储小文件…

Rust中的并发性:Sync 和 Send Traits

在并发的世界中,最常见的并发安全问题就是数据竞争,也就是两个线程同时对一个变量进行读写操作。但当你在 Safe Rust 中写出有数据竞争的代码时,编译器会直接拒绝编译。那么它是靠什么魔法做到的呢? 这就不得不谈 Send 和 Sync 这…

jupyter notebook 设置密码报错ModuleNotFoundError: No module named ‘notebook.auth‘

jupyter notebook 设置密码报错ModuleNotFoundError: No module named ‘notebook.auth‘ 原因是notebook新版本没有notebook.auth 直接输入以下命令即可设置密码 jupyter notebook password

ICode国际青少年编程竞赛- Python-1级训练场-基础训练1

ICode国际青少年编程竞赛- Python-1级训练场-基础训练1 1、 Dev.step(4)2、 Dev.step(-4) Dev.step(8)3、 Dev.turnLeft() Dev.step(4)4、 Dev.step(3) Dev.turnLeft() Dev.step(-1) Dev.step(4)5、 Dev.step(-1) Dev.step(3) Dev.step(-2) Dev.turnLeft() Dev.step(…

tomcat打开乱码修改端口

将UTF-8改成GBK 如果端口冲突,需要修改tomcat的端口

PR2019软件下载教程

打开下载网址:rjctx.com 选择Premiere: 选择PR2019,并点击: 拉到最后,选择百度网盘下载: 下载到本地。 二,软件安装 解压缩后,双击set_up 选择位置后,进行安装&…

Java中接口的默认方法

为什么要使用默认方法 当我们把一个程序的接口写完后 用其他的类去实现,此时如果程序需要再添加一个抽象方法的时候我们只有两种选择 将抽象方法写在原本的接口中 但是这样写会导致其他所有改接口的实现类都需要实现这个抽象方法比较麻烦 写另一个接口 让需要的实…