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-kbucket
为go-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
官方自己用的套件,没用过且不建议用(没文档)