[libp2p的一些核心概念]

1.什么是libp2p

libp2使用对等体的身份和位置进行区分。对等体的身份是稳定的、可验证的,并在对等体的整个生命周期内有效。

在特定网络上,在特定时间点,对等体可能具有一个或多个位置,可以用地址表示。例如,我可以通过全局IPv4地址198.51.100的TCP端口1234进行访问。

在一个只支持TCP/IP或UDP over IP的系统中,我们可以很容易地使用熟悉的:表示法编写我们的地址,并将它们存储为地址和端口的元组。然而,libp2p被设计为传输无关,这意味着我们甚至不能假设我们将使用基于IP的网络。

为了支持不断增长的传输协议集,而不是为每个寻址方案特别制定规则,libp2p使用multiaddr以一种自描述的方式对所有支持的传输协议的网络地址进行编码。

2. libp2p 中 multiaddr

multiaddr在整个libp2p中用于编码网络地址。当需要在进程之间共享或交换地址时,它们以multiaddr的二进制表示形式进行编码。

2.1 multiaddr的基本部分

multiaddr是一系列指令,可以被遍历到达某个目的地。
例如,/ip4/198.51.100/tcp/1234
multiaddr以ip4开头,这是请求地址的最底层协议。tcp协议运行在ip4之上,所以它紧随其后。
上述multiaddr由两个组件组成,即/ip4/198.51.100组件和/tcp/1234组件。无法进一步拆分其中任何一个。

2.2 合成整个multiaddr

协议地址可以在multiaddr中以一种反映网络堆栈中协议组合的方式进行组合。。通常用于描述multiaddr组合的术语是“封装”和“解封装”,它们基本上指的是在multiaddr中分别添加和移除协议组件。

2.2.1 封装

当来自“内部”协议的数据被另一个“外部”协议包装时,该协议被称为“封装在”另一个协议中,通常通过将来自内部协议的数据重新组织为外部协议使用的数据包、帧或数据报类型来实现。
一些协议封装的例子包括在TCP/IP流中封装的HTTP请求,或者TCP段本身封装在IP数据报中。

multiaddr格式的设计是为了使地址以与其描述的协议相同的方式相互封装。其结果是一个地址,以网络堆栈的“最外层”开始,逐渐向“内部”推进。例如,在地址/ip4/198.51.100/tcp/80/ws中,最外层协议是IPv4,其封装了TCP流,而TCP流又封装了WebSockets。

2.2.2 解封装

解封装操作接受一个复合的multiaddr,并从中移除一个“内部”multiaddr,返回结果。

例如,如果我们从/ip4/198.51.100/tcp/1234/ws开始,然后解封装/ws,结果将是/ip4/198.51.100/tcp/1234。

2.3 p2p多地址

libp2p定义了p2p multiaddr协议,其地址组件是libp2p对等节点的对等ID。 p2p multiaddr的文本表示如下:

/p2p/QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N

其中,QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N 是对等节点对等ID的字符串表示形式,是从其公钥派生而来的。
单独使用p2p地址并不提供足够的寻找对等节点在网络上位置的 addressing 信息;它不是一个传输地址。然而,就像ws协议用于WebSockets一样,p2p地址可以被封装在另一个multiaddr中。

例如,上述p2p地址可以与节点正在侦听的传输地址相结合:

/ip4/198.51.100/tcp/1234/p2p/QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N

这个传输地址与p2地址的组合是节点在识别协议和其他核心libp2协议中通过网络传递地址的格式。

3. Peer Ids and Keys

libp2p使用加密密钥对对消息进行签名并生成唯一的对等身份(或“对等id”)。

文档描述了支持的密钥类型,密钥在传输中如何进行序列化,以及如何从序列化的公钥的哈希生成对等id。

尽管私钥不会通过网络传输,但在磁盘上存储密钥所使用的序列化格式也作为参考包括在内,供希望导入现有libp2p密钥对的libp2p实现者参考。

3.1 Keys

PublicKey和PrivateKey消息包含一个带有序列化密钥的Data字段,以及指定密钥类型的Type枚举。

syntax = "proto2";

enum KeyType {
	RSA = 0;
	Ed25519 = 1;
	Secp256k1 = 2;
	ECDSA = 3;
}

message PublicKey {
	required KeyType Type = 1;
	required bytes Data = 2;
}

message PrivateKey {
	required KeyType Type = 1;
	required bytes Data = 2;
}

当前的libp2p实现将私钥存储在磁盘上,格式为序列化的PrivateKey protobuf消息。希望加载现有密钥的libp2p实现者可以使用PrivateKey消息定义来反序列化私钥文件。

3.2 Peer Ids

对等id通过使用multihash对编码的公钥进行哈希派生而来。将序列化为超过42字节的键必须使用sha256 multihash进行哈希,将序列化为最多42字节的键必须使用“identity” multihash编解码。

具体而言,计算对等id的键:

  1. 根据键部分的描述对公钥进行编码。
  2. 如果序列化字节的长度小于或等于42,则计算序列化字节的“identity” multihash。换句话说,不执行哈希操作,但仍然遵循multihash格式(字节加varint加序列化字节)。这里的想法是,如果序列化的字节数组足够短,我们可以将其完整地适应multihash而无需使用哈希函数进行压缩。
  3. 如果长度大于42,则使用SHA256 multihash对其进行哈希。

4. Identify protocol(识别协议)

syntax = "proto2";
message Identify {
  //协议版本标识对等节点使用的协议系列。该字段是可选的,但建议用于调试和统计目的。
  optional string protocolVersion = 5;
  //这是一个自由格式的字符串,用于标识对等节点的实现。
  optional string agentVersion = 6;
  //这是对等节点的公钥,以二进制形式编组
  optional bytes publicKey = 1;
  //这些是对等节点作为多地址监听的地址
  repeated bytes listenAddrs = 2;
  //这是由正在标识的对等节点观察到的流发起对等节点的连接源地址;
  //它是一个多地址。发起方可以使用此地址推断NAT的存在及其公共地址。
  //例如,在TCP/IP传输的情况下,观察到的地址将具有类似/ip4/x.x.x.x/tcp/xx的形式。
  //在电路中继连接的情况下,观察到的地址将具有类似/p2p/QmRelay/p2p-circuit的形式。
  //在洋葱传输的情况下,没有可观察到的源地址。
  optional bytes observedAddr = 4;
  //这是对等节点支持的协议列表。
  repeated string protocols = 3;
}

4.1 identify

identify协议具有协议标识 /ipfs/id/1.0.0,它用于查询远程对等节点的信息。

该协议通过使用 /ipfs/id/1.0.0 作为协议标识字符串,向要查询的远程对等节点打开一个流。被识别的对等节点通过返回一个识别消息并关闭流来做出响应。

4.2 identify/push

identify/push协议的协议标识为/ipfs/id/push/1.0.0,它用于通知已知对等节点关于运行时发生的更改。
当对等节点的基本信息发生变化时,例如因为它们获得了新的公共侦听地址,它们可以使用identify/push来通知其他节点有关新信息的变更。

push变体通过向要更新的每个远程对等节点打开一个流来工作,使用 /ipfs/id/push/1.0.0 作为协议标识字符串。当远程对等节点接受流时,本地对等节点将发送一个Identify消息并关闭流。

在接收到推送的Identify消息后,远程对等节点应该使用消息中的信息更新其本地元数据存储库。请注意,应该忽略缺失的字段,因为对等节点可能选择发送仅包含值已更改的字段的部分更新。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv5改进 | SPPF篇 | FocalModulation替换SPPF(精度更高的空间金字塔池化)

一、本文介绍 本文给大家带来的改进是用FocalModulation技术来替换了原有的SPPF(快速空间金字塔池化)模块。FocalModulation是今年新提出的特征增强方法,它利用注意力机制来聚焦于图像中的关键区域,从而提高模型对这些区域的识别…

什么是缓存击穿、缓存穿透、缓存雪崩?

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

在计算机专业中,应该把学习的重点放在哪里?

在计算机专业中,应该把学习的重点放在哪里?这是许多计算机专业学生常常面临的关键问题。随着计算机科技的快速发展,学生们往往陷入了各种各样的选择和困惑中。是将时间投入到深奥的数学领域,还是专注于编程技能的磨练?…

0x17 二叉堆

0x17 二叉堆 二叉堆是一种支持插入、删除、查询最值的数据结构。它其实是一种满足“堆性质”的完全二叉树,树上的每一个节点带有一个权值。若树中的任意一个节点的权值都小于等于其父节点的权值,则称该二叉树满足“大根堆性质”,称其为“大根…

微信小程序:布局样式

效果 wxml <view class"layout"><view class"left"><view>1</view><view>1</view><view>1</view><view>1</view><view>1</view></view><view class"right"&…

2023 亚马逊云科技 re:Invent 大会探秘:Aurora 无限数据库的突破性应用

文章目录 一、前言二、Amazon Aurora 无限数据库2.1 亚马逊云科技数据库产品发展历程2.2 什么是 Amazon Aurora Limitless Database&#xff08;无限数据库&#xff09;2.3 Amazon Aurora Limitless Database 设计架构2.4 Amazon Aurora Limitless Database 分片功能2.5 使用 A…

c语言:判断是否为整数|练习题

一、题目 输入一个数字&#xff0c;判断该数字是否为整数 如图&#xff1a; 二、思路分析 1、没有小数部分的数字&#xff0c;即为整数。所以&#xff0c;只要知道该数字是否有小数部分&#xff0c;即可。 2、例子&#xff1a;1.5减去10.5&#xff0c;由于有小数部分&#xff0…

跟着官网学 Vue - 插槽

Vue 插槽是一种强大的组件通信方式。 插槽内容与出口 在 Vue 中&#xff0c;插槽是一种让父组件向子组件传递内容的方式。子组件使用 <slot> 元素作为插槽出口&#xff0c;父组件可以通过插槽内容填充这些空白区域。 示例&#xff1a; <!-- MyButton.vue --> &…

解决“bat中文路径乱码“问题

今天&#xff0c;在使用.bat脚本&#xff0c;将hello.png从"D:\mypic\备份"目录&#xff0c;拷贝到"D:\mypic\备份"时&#xff1b;发现中文乱码,弹出如下对话框: 图(1) bat中文路径乱码 原来的命令是&#xff1a; copy D:\mypic\one\hello.png D:\mypic\备…

PIG框架学习1——密码模式登录认证获取Token流程

文章目录 O、前言一、总流程概括&#xff1a;二、具体流程分析PIG提供的具体流程图&#xff1a;鉴权请求报文示例0、网关前置处理1、客户端认证处理2、正式接受登录请求3、组装认证对象4、认证管理器进行认证&#xff08;授权认证调用&#xff09;5、认证成功处理器 O、前言 对…

读取小数部分

1.题目描述 2.题目分析 //假设字符串为 char arr[] "123.4500"; 1. 找到小数点位置和末尾位置 代码如下&#xff1a; char* start strchr(arr, .);//找到小数点位置char* end start strlen(start) - 1;//找到末尾位置 如果有不知道strchr()用法的同学&#xf…

Yapi详细安装过程(亲测可用)

1. 前置条件 1、Git 2、NodeJs&#xff08;7.6&#xff09; 3、Mongodb&#xff08;2.6&#xff09; 2. NodeJs的安装 1、获取资源 curl -sL https://rpm.nodesource.com/setup_8.x | bash - 2、安装NodeJS yum install -y nodejs 3、查看NodeJs和Npm node -v npm -v…

[AI工具推荐]AiRestful智能API代码生成

智能API代码示例生成工具AiRestful 一、产品介绍二、如何使用1、第一步(必须):2、第二步(可选):3、第三步(智能生成): 三、如何集成到您的网站(应用)1、开始接入2、接入案例 四、注意点 一、产品介绍 AiRestful是一款基于智能AI的,帮助小白快速生成任意编程语言的API接口调用示…

centos7安装node-v18版本

背景# 背景就是上一篇文章提到的&#xff0c;部署gitbook这个文档中心的话&#xff0c;是需要先安装node&#xff0c;然后&#xff0c;如果你的node版本过高的话&#xff0c;一般会报错&#xff0c;此时&#xff0c;网上很多文章就是降node版本解决&#xff0c;但其实用高版本…

如何做搜索?如何做搜索优化?如何在搜索领域快速成长?

三年多的搜索研发经历&#xff0c;万亿级集群管理经历&#xff0c;集群优化搜索优化经历。将生产环境的集群&#xff0c;检索性能提升了数十倍。也遇到过大大小小的生产事故。在工作中有幸能够得到前谷歌中国首席架构陈老师的指导。在搜索方面&#xff0c;自己也积累了蛮多的经…

最具挑战的骑行路线

1&#xff0c;318川藏线 2&#xff0c;独库公路 - 561公里 3&#xff0c;珠峰尼泊尔 1000公里 4&#xff0c;沙漠公路 1800公里 5&#xff0c;219新藏线 2500公里 下面是一些别人的骑行记录、证书或奖牌。 参考&#xff1a; 1&#xff0c;抖音 - Max骑行玩家 https://v.douy…

链路聚合 (hcia)

原理 采用链路聚合技术可以在不进行硬件升级的条件下&#xff0c;通过将多个物理接口捆绑为一个逻辑接 口&#xff0c;达到增加链路带宽的目的。在实现增大带宽目的的同时&#xff0c;链路聚合采用备份链路的机制&#xff0c; 可以有效的提高设备之间链路的可靠性 &#x…

Chrome2023新版收藏栏UI改回旧版

版本 120.0.6099.109&#xff08;正式版本&#xff09;Chrome浏览器菜单新版、旧版的差异 想要将书签、功能内容改回旧版的朋友可以网址栏输入&#xff1a;「chrome://flags」&#xff0c;接着搜寻「Chrome Refresh 2023」。 最后将 Chrome Refresh 2023、Chrome Refresh 2023…

如何使用JavaScript 将数据网格绑定到 GraphQL 服务

前言 作为一名前端开发人员&#xff0c;GraphQL对于我们来说是令人难以置信的好用。它可以用来简化数据访问&#xff0c;这让我们的工作变得更加容易。 什么是 GraphQL&#xff1f;它是一个抽象层&#xff0c;位于任意数量的数据源之上&#xff0c;并为您提供一个简单的 API …

学网安:先来学学Python之Excel

在 Python 中&#xff0c;exec 是一个内置函数&#xff0c;允许在运行时动态执行 Python 代码。虽然 exec 的使用需要谨慎&#xff0c;因为它可以导致安全问题和难以调试的代码&#xff0c;但它也提供了一些非常强大的功能。 本文将详细介绍 Python exec 函数的高级用法&#…
最新文章