jk20342/speer
GitHub: jk20342/speer
一个无外部依赖的轻量级 C 语言 P2P 网络协议栈,实现了 Noise 加密握手、yamux 流多路复用和部分 libp2p 兼容功能。
Stars: 2 | Forks: 0
# speer
一个小型的、类似 libp2p 的 C 语言协议栈。由个人独立维护;对一个人来说工作量有点大。
但我们还是做到了。
**两个入口点(同一代码库,不同的传输方式):**
| api | 传输协议 | 对端节点 |
| --- | --- | --- |
| `speer.h` | udp + speer `packet.c` 格式(内嵌 noise **xx**;非 libp2p 的 tcp/quic) | 仅限原生 speer |
| `speer_libp2p_tcp.h` | tcp + multistream + noise xx + yamux | kubo、py-libp2p、rust-libp2p 等 基于 tcp 的实现 |
`examples/libp2p_tcp_full_session.c` 会拨号连接到一个标准的 libp2p tcp 主机(noise → yamux
→ stream proto);它已经与 py-libp2p 进行了核对验证。
它包含 noise xx、基于 tcp 的 libp2p、yamux、mdns、部分 dht 功能、部分 quic,以及一个
tls 1.3 核心。无任何外部依赖。
源码规模:`src/` 和 `include/` 目录下共 121 个 `.c`/`.h` 文件,计 19,180 行代码
(其中非空行 16,747 行)。不包含测试、示例、rust 代码和构建输出。
更多细节:
- [架构](docs/architecture.md)
- [安全性](docs/SECURITY.md)
## 构建
```
make
make examples
make test
```
在 Windows 上使用 mingw:
```
mingw32-make
.\tests\run_tests.ps1
```
## 快速使用
基于 udp 的原生 speer 主机(网络层仅限 speer-to-speer):
```
#include "speer.h"
speer_host_t* host = speer_host_new(seed, NULL);
speer_peer_t* peer = speer_connect(host, peer_pk, "1.2.3.4:4242");
speer_stream_t* s = speer_stream_open(peer, 0);
speer_stream_write(s, (uint8_t*)"hello", 5);
while (running) speer_host_poll(host, 100);
```
基于 tcp 的 libp2p 会话(与 tcp 上的其他 libp2p 实现互通):
```
#include "speer_libp2p_tcp.h"
#include "transport_tcp.h"
speer_libp2p_identity_t id;
/* fill id from keys - copy pattern in examples/libp2p_tcp_full_session.c */
int fd;
speer_tcp_dial(&fd, "127.0.0.1", 4001);
speer_libp2p_tcp_session_t session;
speer_libp2p_tcp_session_init_dialer(&session, fd, &id);
/* then yamux + multistream per stream - same example file */
```
包含 yamux 和协议开启的完整引导程序位于
`examples/libp2p_tcp_full_session.c`。
## 示例
```
./examples/echo_server
./examples/chat
./examples/libp2p_ping demo
./examples/libp2p_quic_ping
```
包含 mdns/tcp/noise/yamux 的终端聊天演示程序位于 rust 工作空间中的 crate
`speer-chat`(`rust/speer-chat`)。
## 安装
cmake install 会同时导出 cmake 和 pkg-config 元数据:
```
cmake -S . -B build -DSPEER_BUILD_TESTS=OFF
cmake --build build
cmake --install build
```
然后使用者可以选择使用 `find_package(speer)` 或 `pkg-config speer`。
## Rust
Rust 仓库:
- [`speer-sys-rust`](https://github.com/jk20342/speer-sys-rust) - 原始 FFI 绑定
- [`speer-rust`](https://github.com/jk20342/speer-rust) - 安全的 Rust 封装
- [`speer-rust-chat`](https://github.com/jk20342/speer-rust-chat) - 终端聊天应用
## 状态
- noise xx: 完整
- yamux: 完整
- mdns: 完整,但请将记录视为提示信息
- dht: 实用核心部分
- tls 1.3: 核心片段
- quic v1: 数据包编解码器,尚非完整的连接协议栈
- relay / dcutr: 部分实现;v2 hop reserve:`relay_public_hop_check`(网络,公共 relay)。
## 许可证
MIT
标签:Bash脚本, DHT, libp2p, mDNS, Noise协议框架, P2P网络, QUIC协议, TCP/IP, TLS 1.3, UDP通信, Yamux, 分布式哈希表, 加密通信, 区块链基础设施, 去中心化, 多路复用, 客户端加密, 嵌入式网络, 底层网络开发, 无外部依赖, 点对点通信, 组播DNS, 网络协议栈, 网络安全, 隐私保护, 零依赖网络库