1 个不稳定版本

0.0.1 2022 年 4 月 29 日

#16#中继服务器

Apache-2.0 许可

92KB
2K SLoC

tx3

tx3 p2p 通信

Project Forum Chat

License: Apache-2.0

一个临时的 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