区块链 | IPFS:Merkle DAG

news2024/11/15 6:13:15

🦊原文: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.coloradmin.cn/o/1638234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pyspark+关联规则 Kaggle购物篮分析案例

数据集地址:Market Basket Analysis | Kaggle 我的NoteBook地址:pyspark Market Basket Analysis | Kaggle 零售商期望能够利用过去的零售数据在自己的行业中进行探索,并为客户提供有关商品集的建议,这样就能提高客户参与度、改…

llama_index微调BGE模型

微调模型是为了让模型在特殊领域表现良好,帮助其学习到专业术语等。 本文采用llama_index框架微调BGE模型,跑通整个流程,并学习模型微调的方法。 一、环境准备 Linux环境,GPU L20 48G,Python3.8.10。 pip该库即可。 二、数据准备 该框架实现了读取各种类型的文件,给…

AI项目二十一:视频动态手势识别

若该文为原创文章,转载请注明原文出处。 一、简介 人工智能的发展日新月异,也深刻的影响到人机交互领域的发展。手势动作作为一种自然、快捷的交互方式,在智能驾驶、虚拟现实等领域有着广泛的应用。手势识别的任务是,当操作者做出…

html--剑雨

<!doctype html> <html> <head> <meta charset"utf-8"> <title>css3剑雨-jq22.com</title> <script src"http://www.jq22.com/jquery/jquery-1.10.2.js"></script> <style> .sword:before, .sword:…

Java_从入门到JavaEE_08

一、Eclipse开发工具的介绍 Eclipse工具简绍 Eclipse 是著名的跨平台的自由集成开发环境&#xff08;IDE&#xff09;。最初主要用来 Java 语言开发&#xff0c;但是目前亦有人通过插件使其作为其他计算机语言比如 C 和 Python 的开发工具。 下载与安装 下载&#xff1a; Ecli…

spring boot3多模块项目工程搭建-上(团队开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 多模块结构优缺点 模块介绍 Common 模块&#xff1a; API 模块&#xff1a; Web 模块&#xff1a; Service 模块&#xff1a; DAO 模块&#xff1a; 搭建步骤 1.创建 父…

Java面试八股之强软弱虚引用的概念及区别

Java中强软弱虚引用的概念及区别 在Java中&#xff0c;强引用、软引用、弱引用和虚引用是四种不同类型的引用&#xff0c;它们在对象生命周期管理、垃圾收集&#xff08;Garbage Collection, GC&#xff09;以及内存管理方面有着不同的行为和用途。以下是它们的概念和主要区别…

脑筋急转弯在线问答

页面效果 点击“显示答案”按钮&#xff0c;显示参考答案。 页面代码 <% layout(/layouts/default.html, {title: 脑筋急转弯管理, libs: [dataGrid]}){ %> <div class"main-content"><div class"box box-main"><div class"bo…

3.自动驾驶-局部路径规划

1. 规划planning 2. 局部路径规划模块实现-模块外围&#xff1a;输入 3. 局部路径规划模块实现模块外围:输出 4. 控制control 5. 系统分类 6 系统分类

推开通用人工智能大门,多模态大模型是新一代人工智能技术范式

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

如何理解Go语言的逃逸分析(escape analysis)?

文章目录 什么是逃逸分析&#xff1f;逃逸的原因逃逸的影响 如何查看逃逸分析的结果&#xff1f;解决方案和示例代码减少逃逸的策略示例代码 在Go语言中&#xff0c;逃逸分析&#xff08;escape analysis&#xff09;是一个编译器优化过程&#xff0c;它决定了哪些变量会被分配…

38-3 Web应用防火墙 - 安装配置WAF

首先需要安装Centos 7 虚拟机:Centos7超详细安装教程_centos7安装教程-CSDN博客 安装配置WAF 在桌面环境中,右键点击打开终端,首先执行以下步骤: 1)安装必要的工具: 输入命令: sudo su yum install -y wget epel-release 2)第二步,安装依赖工具,输入以下命令: y…

使用Git把写好的项目放到github上

把之前的文章差缺补漏了一下&#xff0c;发现少一个TUserController文件&#xff0c;然后加上了。 以及发现前后端交互时的跨域问题需要处理。 在Controller文件里加入注释 CrossOrigin(origins "*")即可。 不然数据在Vue里显示不出来。 ** 壹 首先先把前端项目 de…

【深耕 Python】Data Science with Python 数据科学(17)Scikit-learn机器学习(二)

写在前面 关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 往期数据科学博文一览&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;2&…

c#word文档:1.创建空白Word文档及保存/2.添加页内容...

---创建空白Word文档 --- &#xff08;1&#xff09;创建一个名为OfficeOperator的类库项目。引用操作Word的.NET类库 &#xff08;2&#xff09;定义用于操作Word的类WordOperator1。添加引用Microsoft.Office.Interop.Word命名空间。 &#xff08;3&#xff09;为WordOper…

劳动节不劳动!陕西程序员手把手带你度假,领略祖国大好河山!

文章大纲 5 天 4 晚 陕西小环线错峰 放松度假遛娃天师堂石门栈道关山牧场草原九龙山温泉扶风温泉 想起一些旧事&#xff0c; 那时候搞IT比现在欢乐很多参考文献 秉承劳动节不劳动的一贯做法&#xff0c;节前我就带娃出来了&#xff0c;想着劳动节当天就能返回西安&#xff0c;不…

礼赞劳动节,致敬劳动者。节日随想:疾笔耕耘也是一种劳动方式。

马克思也快诞辰了206年了&#xff0c;恩格斯领导的第二国际通过的决议节日也迎来了134岁的生日了&#xff0c;我也继续在劳动的路上。 五月是值得纪念的日子&#xff0c;作为一名无上光荣的分子&#xff0c;无比仰慕崇拜的两位先驱前辈大胡子&#xff0c;其一 生于斯&#xff0…

数据可视化宝典:Matplotlib图形实战

在数据分析领域&#xff0c;图形化展示数据是非常重要的环节。Python中的matplotlib库是绘制各类图形的强大工具。本文将介绍如何使用matplotlib绘制折线图、直方图、饼图、散点图和柱状图等数据分析中常见的图形&#xff0c;并附上相应的代码示例&#xff0c;可以当初matplotl…

mac如何打开exe文件?如何mac运行exe文件 如何在Mac上打开/修复/恢复DMG文件

在macOS系统中&#xff0c;无法直接运行Windows系统中的.exe文件&#xff0c;因为macOS和Windows使用的是不同的操作系统。然而&#xff0c;有时我们仍然需要运行.exe文件&#xff0c;比如某些软件只有Windows版本&#xff0c;或者我们需要在macOS系统中运行Windows程序。 虽然…

Python中的观察者模式及其应用

观察者模式是设计模式之一&#xff0c;实现一对多依赖&#xff0c;当主题状态变化时通知所有观察者更新。在Python中&#xff0c;通过自定义接口或内置模块实现观察者模式&#xff0c;可提高程序灵活性和扩展性&#xff0c;尤其适用于状态变化时触发操作的场景&#xff0c;如事…