A Library for writing Peer-to-Peer applications.
Many peer-to-peer libraries go to great lengths to provide a reliable stream abstraction over as many different transports as possible. That makes them unsuitable for modeling protocols over lossy mediums (UDP, IP, ethernet). This library takes a message oriented approach instead of a stream oriented approach.
Unreliable, fire-and-forget communication is provided using Tell
and Receive
methods.
Reliable request-response communication is provided using Ask
and ServeAsk
methods.
The core abstraction is the Swarm
. Which represents a group of nodes which can send messages to one another.
type Swarm[A Addr] interface {
Tell(ctx context.Context, dst A, data []byte) error
Receive(ctx context.Context, fn func(Message[A])) error
ParseAddr(data []byte) (A, error)
LocalAddrs() []A
MTU(A) int
Close() error
}
Addr
is an interface type.
Overlay networks are a common pattern in p2p systems.
Swarms have methods for introspection such as LocalAddrs
and MTU
.
Addrs
also have a canonical serialization provided by MarshalText
and ParseAddr
These two features make Swarms the building blocks for higher order swarms, which can be overlay networks.
The underlying swarm is often referred to as the transport
throughout these packages.
The power of the Swarm
abstraction is exemplified by the fact we merely call some Swarms
"transports" in certain contexts rather than having a separate Transport type, as other libraries do.
Swarms
provide a Tell
method, which makes a best effort to send the message payload to the destination.
It will error if the message cannot be set in flight, but does not guarantee the transmision of the message if the error is nil.
Formats are just protocols that send/write once and receive/read many times.
- x509 Deals with the formats in the x509 public key infrastructure.
-
In-Memory Swarm A swarm which transfers data to other swarms in memory. Useful for testing.
-
Multi Swarm Creates a multiplexed addressed space using names given to each subswarm. Applications can use this to "future-proof" their transport layer.
-
P2PKE Swarm A Secure Swarm which can secure any underlying Swarm.
-
QUIC Swarm A secure swarm supporting
Asks
built on the QUIC protocol. It can wrap any otherp2p.Swarm
, and provide ap2p.SecureAskSwarm
-
SSH Swarm A secure swarm supporting
Asks
built on the SSH protocol (TCP based). -
UDP Swarm An insecure swarm, included mainly as a building block.
-
Fragmenting Swarm A higher order swarm which increases the MTU of an underlying swarm by breaking apart messages, and assembling them on the other side.
-
Virtual Swarm A swarm which can be used to mock swarms of any comparable address type, and any public key type.
The swarmutil
package contains utilities for writing Swarms
.
The swarmtest
package contains a test suite which checks that a given Swarm implementation exhibits all the behaviors expected.
-
Chord A package for the Chord DHT algorithm.
-
Kademlia A package for the Kademlia DHT algorithm.
-
Multiplexing Multiplexing creates multiple logical swarms on top of a single swarm. The
p2pmux
package provides string and integer multiplexers. -
P2PKE P2PKE is an authenticated key exchange suitable for securing
p2p.Swarms
. Provides a session state machine, and a long-lived secure channel, which is used bys/p2pkeswarm
The p2ptest
packages contains utilities for testing, such as generating adjacency matricies for networks of various connectivities.