The Swift implementation of the libp2p networking stack
libp2p is a networking stack and library modularized out of The IPFS Project, and bundled separately for other tools to use.
libp2p is the product of a long, and arduous quest of understanding -- a deep dive into the internet's network stack, and plentiful peer-to-peer protocols from the past. Building large-scale peer-to-peer systems has been complex and difficult in the last 15 years, and libp2p is a way to fix that. It is a "network stack" -- a protocol suite -- that cleanly separates concerns, and enables sophisticated applications to only use the protocols they absolutely need, without giving up interoperability and upgradeability. libp2p grew out of IPFS, but it is built so that lots of people can use it, for lots of different projects.
To learn more, check out the following resources:
Include the following dependency in your Package.swift file
let package = Package(
...
dependencies: [
...
.package(name: "LibP2P", url: "https://github.com/swift-libp2p/swift-libp2p.git", .upToNextMajor(from: "0.1.0"))
],
...
.target(
...
dependencies: [
...
.product(name: "LibP2P", package: "swift-libp2p"),
]),
...
)
import LibP2P
import LibP2PNoise
import LibP2PMPLEX
/// Configure your Libp2p networking stack...
let lib = try Application(.development, peerID: PeerID(.Ed25519))
lib.security.use(.noise)
lib.muxers.use(.mplex)
lib.servers.use(.tcp(host: "127.0.0.1", port: 0))
/// Register your routes handlers...
/// - Note: Uses the same syntax as swift-vapor
try lib.routes()
/// Start libp2p
lib.start()
/// Do some networking stuff... 📡
/// At some later point, when you're done with libp2p...
lib.shutdown()
Name | Status | Description | Build (macOS & Linux) |
---|---|---|---|
Libp2p | |||
swift-libp2p |
🟢 | swift-libp2p entry point | |
swift-libp2p-core |
🟢 | Core interfaces, types, and abstractions | |
Protocol Negotiation | |||
swift-libp2p-mss |
🟢 | MultistreamSelect transport upgrader (embedded) | |
Transport | |||
swift-libp2p-tcp |
🟢 | TCP transport (embedded) | N/A |
swift-libp2p-udp |
🟡 | UDP transport (embedded) | N/A |
swift-libp2p-websocket |
🟢 | WebSocket transport | |
swift-libp2p-http |
🔴 | TODO: HTTP1 transport | N/A |
swift-libp2p-http2 |
🔴 | TODO: HTTP2 transport | N/A |
Encrypted Channels | |||
swift-libp2p-plaintext |
🟢 | Plaintext channel | |
swift-libp2p-noise |
🟢 | Noise crypto channel | |
swift-libp2p-tls |
🔴 | TODO: TLS 1.3+ crypto channel | N/A |
Stream Muxers | |||
swift-libp2p-mplex |
🟢 | MPLEX stream multiplexer | |
swift-libp2p-yamux |
🔴 | TODO: YAMUX stream multiplexer | N/A |
Private Network | |||
- | - | - | N/A |
NAT Traversal | |||
- | - | - | N/A |
Peerstore | |||
swift-libp2p-peerstore |
🔴 | TODO: Reference implementation of peer metadata storage component (embedded) | N/A |
Connection Manager | |||
swift-libp2p-connection-manager |
🔴 | TODO: Reference implementation of connection manager (embedded) | N/A |
Routing | |||
swift-libp2p-record |
🔴 | TODO: Record type and validator logic | N/A |
swift-libp2p-kad-dht |
🔴 | TODO: Kademlia-like router | N/A |
swift-libp2p-kbucket |
🔴 | TODO: Kademlia routing table helper types | N/A |
Pubsub | |||
swift-libp2p-pubsub |
🔴 | TODO: Multiple pubsub implementations | N/A |
RPC | |||
swift-libp2p-rpc |
🔴 | TODO: A simple RPC library for libp2p | N/A |
Utilities/miscellaneous | |||
swift-libp2p-dnsaddr |
🟡 | A DNSAddr Resolver | |
swift-libp2p-mdns |
🟡 | MulticastDNS for LAN discovery | |
swift-libp2p-identify |
🟢 | IPFS Identify Protocols (embedded) | |
Testing and examples | |||
swift-libp2p-testing |
🔴 | TODO: A collection of testing utilities for libp2p | N/A |
Name | Description | Build (macOS & Linux) |
---|---|---|
Cryptography | ||
swift-libp2p-crypto |
Crypto abstractions for Keys, Hashes and Ciphers | |
Multiformats | ||
swift-multibase |
Self Identifying Base Encodings | |
swift-multicodec |
Multiformat Codecs | |
swift-multihash |
Self Identifying Hashes | |
swift-multiaddr |
Self Identifying Addresses | |
swift-peer-id |
Peer IDs | |
Utilities | ||
swift-bases |
Base encodings & decodings | |
swift-varint |
Protocol Buffer Variable Integers | |
swift-cid |
Content Identifiers | |
External | ||
swift-nio |
Network application framework | N/A |
/// TODO
Contributions are welcomed! This code is very much a proof of concept. I can guarantee you there's a better / safer way to accomplish the same results. Any suggestions, improvements, or even just critques, are welcome!
Let's make this code better together! 🤝
MIT © 2022 Breth Inc.
link |
Stars: 20 |
Last commit: 3 weeks ago |
Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics