深入理解 IPFS - 分层架构总览

2023-12-26 13:38

本文主要是介绍深入理解 IPFS - 分层架构总览,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们首先从官方文档中一张比较经典的层级架构图开始,右边是 IPFS 的层级图,左边是对应现实网络中的一些实现形式。

   (一) applications 应用层

这个很好理解,就是基于 IPFS 网络开发的应用。我们可以在 awesome 看到一些应用。生态能不能繁荣,肯定是需要开发者参与。

(二) naming 命名

SFS 中文是自我认证文件系统,熟悉其他区块链项目的同学应该很好理解。比如比特币,我们采用非对称加密算法给节点生成了公钥和私钥。通过公钥生成的地址一旦参与转账行为,就会成为比特币网络中一份子,所有节点都知道这个地址。那么怎么证明这个地址是属于你,这就是一个自证明的过程,通过与公钥配对的私钥就可证明所有权。同样对于 IPFS 来说,也采用同样的方式,每个节点的 ID 都是全局唯一的存在,你可以通过 ID 对应的私钥来证明你是这个节点的主人。

举个应用的例子,你有个静态网站想要上传到 IPFS 上,但是网站是需要一直更新内容的,更新后 hash 值变了,在 IPFS 上访问的链接都会变。解决办法是将节点 ID 指向生成的 hash 上。用户访问节点 ID 即可 。

其实不仅仅是文件系统,身份认证(OpenID, OAuth2)可能也会由于区块链的发展出现新的契机。比如 ArcBlock 在推广的 DID。

(三)merkledag

merkledag 是 IPFS 的核心数据结构。比特币中用 merkle tree(默克尔树)快速校验区块数据完整性,使得轻节点钱包无需下载所有交易数据就能校验交易数据。而 merkledag 是一个有向无环图,对象模型和 Git 相似。这部分以后会详细说明。

(四)exchange 块交换

因为 IPFS 是一个全网文件系统,当你上传一个文件的时候,文件会被分割成 block,然后被传输到最近的节点上(XOR)。这样当你再去获取这个文件的时候,节点间就会相互沟通,每个节点都有一个 wantlist 和 havelist,最终找到所有的 block,重新获取到文件。

(五)routing 路由

其实在说到 exchange 的时候,有同学可能发现已经有点熟悉了,这不就是 BitTorrent 么。说的没错,不管是当年的电驴还是现在的迅雷,BT 网络一直很坚挺的存在着。IPFS 的很多设计都是借鉴于它 。说到 BT 的发展,最开始种子是存储到中央 Tracker 服务器上,这样一旦中央服务器挂了,这个种子也就废了,所以发展出了 DHT (分布式哈希表)。节点加入 DHT 网络,所有的资源都通过 hash 来寻址,无需中央节点介入,通过询问自己已知的节点,最终找到目标节点。

对于 IPFS 来说,内容和地址寻址都是同构hash,这样可以避免转换成本。虽然说 routing 的方式不止 DHT 一种,还有 mdns,DHCP。但是作为一个去中心化的项目来说,DHT 是 IPFS 路由必不可少的一项。

(六)network 网络

IPFS 没有创造新的协议来做节点间通信,而是尽可能的兼容现存的所有协议,包括 tcp, http, quic 等等。兼容是通过一个 self-describing 的方式,如 /ip4/7.7.7.7/tcp/6543, 这种风格我们在 IPFS 其他 repos 中也都能看到身影,如 MultiHash, MultiAddress。不得不说,这种 self-describing 的形式在之后的协议升级上会有很大的好处。同样,面对各种网络环境,NAT 穿透也是必备的,IPFS 基于 ICE 框架,支持 TURN 和 STUN。

本文对 IPFS 各层做了简单的介绍,细节我们后续再聊。

这篇关于深入理解 IPFS - 分层架构总览的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/539618

相关文章

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基