libp2p notes

因为ng的整个P2P都是依赖于libp2p的,所以这里记录一下使用libp2p的一些经验。

先这边记录一下各类子库,因为我这边是用go的,所以都是根据go的库来介绍

核心库

go-libp2p 作为整个libp2p的进入点,没多少代码,但是主要的函数都在;go-libp2p-core核心库,包含了核心接口、类型和抽象。其他所有内容都得跟着这两个库(尤其是core)一起更新,否则依赖会出现问题
go-libp2p-blankhost是host的最小实现不包含任何身份识别,转发或NAT遍历代码。一般测试才用。

网络层

go-libp2p-swarm 是使用给定libp2p网络的“低级”接口。它可以在系统的各个方面提供更细的控制。大多数应用程序不需要这种访问级别,因此Swarm通常被抽象包装在Host里以提供更友好的接口。

传输层

go-ws-transport WS
go-tcp-transport TCP
go-libp2p-quic-transport QUIC
go-udp-transport UDP
go-utp-transport 这里utp指的是uTorrent transport
go-libp2p-circuit relay传输
go-libp2p-transport-upgrader 将multiaddr-net的连接升级到完整的libp2p传输
go-reuseport-transport 为自动(智能地)重用 TCP 端口提供了基本的传输层

加密通道

go-libp2p-noise 基于noise协议的加密通道。这个暂时我还未使用过,github介绍也说没在生产环境试过(
go-libp2p-tls tls
go-conn-security-multistream 为mux stream提供加密通道,目前支持tls和secio
go-libp2p-secio 官方不建议用了,以前是标配

私有网络

go-libp2p-pnet 简易的private net实现,需要一个go-libp2p-core/pnet.PSK才能加入网络建立Conn。

流复用器 Mux

go-libp2p-yamux YAMUX是hashicorp做的一个muxer
go-libp2p-mplex MPLEX是libp2p自己做的一个muxer

NAT穿透

go-libp2p-nat 本质上是用了github.com/fd/go-nat,在github.com/libp2p/go-libp2p/p2p/host/basic的NATManager里被引入。在host里有个看起来很像的go-libp2p-autonat,但是并不是做穿透的,而是通过同样用AutoNAT的Peer使用测试回拨来确定他们的 NAT 可拨情况。

Peer存储

go-libp2p-peerstore peer管理器,一般没用(因为host自带有简易的存储了)

连接管理

go-libp2p-connmgr pubsub的test里有用到

路由

go-libp2p-record 路由记录
go-libp2p-kad-dht 类Kademlia的路由实现,非常的重,但是在公网寻址上必用
go-libp2p-kbucketgo-libp2p-kad-dht提供类型
go-libp2p-coral-dht Coral DHT,官方弃坑
go-libp2p-pubsub-router 利用pubsub请求路由,当前ipfs用这个做IPNS

共识

go-libp2p-consensus 共识抽象层
go-libp2p-raft 用的hashicorp家的raft库github.com/hashicorp/raft

Pubsub

go-libp2p-pubsub p2p网络上Pub/Sub消息范式的实现

RPC

go-libp2p-gorpc 等于net/rpc放到p2p

工具/杂项

许多实用的小功能实现,值得学习但是需要注意依赖版本

测试

go-libp2p-testing 官方自己用的套件,没用过且不建议用(没文档)