复制成功

分享至

主页 > 数字货币 >

optimism sequencer背后的魔法:libp2p在op-stack中的使用

2023.10.26

作者:joohhnnn

optimism中的libp2p应用

在本节中,主要用于讲解optimism是如何使用libp2p来完成op-node中的p2p网络建立的。 p2p网络主要是用于在不同的node中传递信息,例如sequencer完成unsafe的区块构建后,通过p2p的gossiphub的pub/sub进行传播。libp2p还处理了其他,例如网络,寻址等在p2p网络中的基础件层。

了解libp2p

libp2p(简称来自“库对等”或“library peer-to-peer”)是一个面向对等(P2P)网络的框架,能够帮助开发P2P应用程序。它包含了一套协议、规范和库,使网络参与者(也称为“对等体”或“peers”)之间的P2P通信变得更为简便 (source[2])。libp2p最初是作为IPFS(InterPlanetary File System,星际文件系统)项目的一部分,后来它演变成了一个独立的项目,成为了分布式网络的模块化网络堆栈 (source[3])。

libp2p是IPFS社区的一个开源项目,欢迎广泛社区的贡献,包括帮助编写规范、编码实现以及创建示例和教程 (source[4])。libp2p是由多个构建模块组成的,每个模块都有非常明确、有文档记录且经过测试的接口,使得它们可组合、可替换,因此可升级 (source[5])。libp2p的模块化特性使得开发人员可以选择并使用仅对他们的应用程序必要的组件,从而在构建P2P网络应用程序时促进了灵活性和效率。

相关资源

libp2p的官方文档[6]

libp2p的GitHub仓库[7]

在ProtoSchool上的libp2p简介[8]

libp2p的模块化架构和开源特性为开发强大、可扩展和灵活的P2P应用程序提供了良好的环境,使其成为分布式网络和网络应用程序开发领域的重要参与者。

libp2p实现方式

在使用libp2p时,你会需要实现和配置一些核心组件以构建你的P2P网络。以下是libp2p在应用中的一些主要实现方面:

1. 节点创建与配置:

创建和配置libp2p节点是最基本的步骤,这包括设置节点的网络地址、身份和其他基本参数。 关键使用代码:

libp2p.New()

2. 传输协议:

选择和配置你的传输协议(例如TCP、WebSockets等)以确保节点之间的通信。 关键使用代码:

tcpTransport := tcp.NewTCPTransport()

3. 多路复用和流控制:

实现多路复用来允许在单一的连接上处理多个并发的数据流。

实现流量控制来管理数据的传输速率和处理速率。 关键使用代码:

yamuxTransport := yamux.New()

4. 安全和加密:

配置安全传输层以确保通信的安全性和隐私。

实现加密和身份验证机制以保护数据和验证通信方。 关键使用代码:

tlsTransport := tls.New()

5. 协议和消息处理:

定义和实现自定义协议来处理特定的网络操作和消息交换。

处理接收到的消息并根据需要发送响应。 关键使用代码:

host.SetStreamHandler("/my-protocol/1.0.0", myProtocolHandler)

6. 发现和路由:

实现节点发现机制来找到网络中的其他节点。

实现路由逻辑以确定如何将消息路由到网络中的正确节点。 关键使用代码:

dht := kaddht.NewDHT(ctx, host, datastore.NewMapDatastore())

7. 网络行为和策略:

定义和实现网络的行为和策略,例如连接管理、错误处理和重试逻辑。 关键使用代码:

connManager := connmgr.NewConnManager(lowWater, highWater, gracePeriod)

8. 状态管理和存储:

管理节点和网络的状态,包括连接状态、节点列表和数据存储。 关键使用代码:

peerstore := pstoremem.NewPeerstore()

9. 测试和调试:

为你的libp2p应用编写测试以确保其正确性和可靠性。

使用调试工具和日志来诊断和解决网络问题。 关键使用代码:

logging.SetLogLevel("libp2p", "DEBUG")

10. 文档和社区支持:

- 查阅libp2p的文档以了解其各种组件和API。
- 与libp2p社区交流以获取支持和解决问题。

}

以上是使用libp2p时需要考虑和实现的一些主要方面。每个项目的具体实现可能会有所不同,但这些基本方面是构建和运行libp2p应用所必需的。在实现这些功能时,可以参考libp2p的官方文档[9]和GitHub仓库[10]中的示例代码和教程。

在OP-node中libp2p的使用

为了弄清楚op-node和libp2p的关系,我们必须弄清楚几个问题

- 为什么选择libp2p?为什么不选择devp2p(geth使用devp2p)
- OP-node有哪些数据或者流程和p2p网络紧密相关
- 这些功能是如何在代码层实现的

op-node需要libp2p网络的原因

首先我们要了解为什么optimism需要p2p网络libp2p是一个模块化的网络协议,允许开发人员构建去中心化的点对点应用,适用于多种用例 (source[11])(source[12])。而devp2p主要用于以太坊生态系统,专为以太坊应用定制 (source[13])。libp2p的灵活性和广泛适用性可能使其成为开发人员的首选。

op-node主要使用libp2p的功能点

- 用于sequencer将产生的unsafe的block传递到其他非sequencer节点
- 用于非sequencer模式下的其他节点当出现gap时进行快速同步(反向链同步)
- 用于采用积分声誉系统来规范整体节点的良好环境

代码实现

host自定义初始化

host可以理解为是p2p的节点,当开启这个节点的时候,需要针对自己的项目进行一些特殊的初始化配置

现在让我们看一下 op-node/p2p/host.go文件中的Host方法,

该函数主要用于设置 libp2p 主机并进行各种配置。以下是该函数的关键部分以及各部分的简单中文描述:

检查是否禁用 P2P
如果 P2P 被禁用,函数会直接返回。

从公钥获取 Peer ID
使用配置中的公钥来生成 Peer ID。

初始化 Peerstore
创建一个基础的 Peerstore 存储。

初始化扩展 Peerstore
在基础 Peerstore 的基础上,创建一个扩展的 Peerstore。

将私钥和公钥添加到 Peerstore
在 Peerstore 中存储 Peer 的私钥和公钥。

初始化连接控制器(Connection Gater)
用于控制网络连接。

初始化连接管理器(Connection Manager)
用于管理网络连接。

设置传输和监听地址
设置网络传输协议和主机的监听地址。

创建 libp2p 主机
使用前面的所有设置来创建一个新的 libp2p 主机。

初始化静态 Peer
如果有配置静态 Peer,进行初始化。

免责声明:数字资产交易涉及重大风险,本资料不应作为投资决策依据,亦不应被解释为从事投资交易的建议。请确保充分了解所涉及的风险并谨慎投资。OKEx学院仅提供信息参考,不构成任何投资建议,用户一切投资行为与本站无关。

加⼊OKEx全球社群

和全球数字资产投资者交流讨论

扫码加入OKEx社群

相关推荐

industry-frontier