1 个不稳定版本
0.0.1 | 2022 年 4 月 29 日 |
---|
#16 在 #中继服务器
92KB
2K SLoC
tx3
tx3 p2p 通信
一个临时的 Holochain 网络解决方案
Holochain 已经试验了许多不同的网络解决方案。我们主要关注 webrtc,因为它可以直接进行 STUN p2p 协商,对于非对称网络情况,还可以回退到 TURN 中继。我们还运行在 QUIC 上。然而,到目前为止,这些解决方案还没有在 Rust 生态系统中得到足够的成熟,以满足我们所需的性能、可靠性和端到端加密。
Tx3 提供了一个非常简单的临时堆栈:TLS over TCP。中继服务器将原始 TCP 流拼接在一起,为 NAT 后面的客户端提供可寻址性。客户端在这些拼接的流上协商端到端 TLS,确保中继服务器或任何中间人无法访问明文。(如果您想了解更多关于中继协议的信息,请参阅 [Tx3Relay] 文档。)
+-------+
| relay | (TCP splicing)
+-------+
/ \
/ \ (TLS over TCP)
/ \
+-------+ +-------+
| node1 | | node2 |
+-------+ +-------+
与许多 p2p 解决方案一样,确保您与您认为的人交谈留给了应用程序的其他层。但 tx3 通过在 URL 中包含 TLS 证书摘要来尝试使这个过程变得简单,这样 Holochain 就可以轻松提供签名验证。
例如。
tx3-rst://127.0.0.1:38141/EHoKZ3-8R520Unp3vr4xeP6ogYAqoZ-em8lm-rMlwhw
可直接寻址的节点,或可以配置端口转发,欢迎使用并鼓励它们建立直接连接,而不是中继。
+-------+ (TLS over TCP) +-------+
| node1 |----------------| node2 |
+-------+ +-------+
运行本地可寻址的 tx3 节点
let tx3_config = tx3::Tx3Config::new().with_bind("tx3-st://127.0.0.1:0");
let (node, _inbound_con) = tx3::Tx3Node::new(tx3_config).await.unwrap();
println!("listening on addresses: {:#?}", node.local_addrs());
运行进程内的中继节点
注意:除非您正在编写测试代码,否则您可能想要可执行文件。下面提供了 tx3-relay
命令行标志和选项。
let tx3_relay_config = tx3::Tx3RelayConfig::new()
.with_bind("tx3-rst://127.0.0.1:0");
let relay = tx3::Tx3Relay::new(tx3_relay_config).await.unwrap();
println!("relay listening on addresses: {:#?}", relay.local_addrs());
运行通过给定中继地址中继的 tx3 节点
// set relay_addr to your relay address, something like:
// let relay_addr = "tx3-rst://127.0.0.1:38141/EHoKZ3-8R520Unp3vr4xeP6ogYAqoZ-em8lm-rMlwhw";
let tx3_config = tx3::Tx3Config::new().with_bind(relay_addr);
let (node, _inbound_con) = tx3::Tx3Node::new(tx3_config).await.unwrap();
println!("listening on addresses: {:#?}", node.local_addrs());
连接并接收连接
// create a listening node
let tx3_config = tx3::Tx3Config::new().with_bind("tx3-st://127.0.0.1:0");
let (node1, mut recv1) = tx3::Tx3Node::new(tx3_config).await.unwrap();
let addr1 = node1.local_addrs()[0].to_owned();
// listen for incoming connections
let task = tokio::task::spawn(async move {
let acceptor = recv1.recv().await.unwrap();
// in production code we might want to spawn this so we can
// receive more connections, handling their handshakes in paralel
let mut in_con = acceptor.accept().await.unwrap();
// make sure we can read data
let mut got = [0; 5];
in_con.read_exact(&mut got).await.unwrap();
assert_eq!(b"hello", &got[..]);
// make sure we can write data
in_con.write_all(b"world").await.unwrap();
in_con.shutdown().await.unwrap();
});
// create an outgoing-only node
let tx3_config = tx3::Tx3Config::new();
let (node2, _) = tx3::Tx3Node::new(tx3_config).await.unwrap();
// connect from our outgoing node to our receive node
let mut out_con = node2.connect(&addr1).await.unwrap();
// make sure we can write data
out_con.write_all(b"hello").await.unwrap();
out_con.shutdown().await.unwrap();
// make sure we can read data
let mut got = [0; 5];
out_con.read_exact(&mut got).await.unwrap();
assert_eq!(b"world", &got[..]);
// make sure our receiver task shuts down cleanly
task.await.unwrap();
许可证:Apache-2.0
tx3-relay
可执行文件
tx3-中继--帮助
tx3-relay 0.0.1
TCP splicing relay for tx3 p2p communications
USAGE:
tx3-relay [OPTIONS]
OPTIONS:
-c, --config <CONFIG> Configuration file to use for running the
tx3-relay. [default: ./tx3-relay.yml]
-h, --help Print help information
-i, --init Initialize a new tx3-relay.yml configuration file
(as specified by --config).
Will abort if it already exists.
-V, --version Print version information
依赖项
~21–33MB
~613K SLoC