Expand description
§ADNL
This crate provides a minimal implementation of the Abstract Datagram Network Layer (ADNL) protocol in Rust. ADNL is a network protocol used in The Open Network (TON) blockchain.
§Client example
use adnl::AdnlPeer;
use base64::Engine as _;
use futures::{SinkExt, StreamExt};
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
// decode liteserver public key
let remote_public = base64::engine::general_purpose::STANDARD.decode("n4VDnSCUuSpjnCyUk9e3QOOd6o0ItSWYbTnW3Wnn8wk=")?;
// act as a client: connect to ADNL server and perform handshake
let mut client = AdnlPeer::connect(remote_public, "5.9.10.47:19949").await?;
// already serialized TL with getTime query
let query = hex::decode("7af98bb435263e6c95d6fecb497dfd0aa5f031e7d412986b5ce720496db512052e8f2d100cdf068c7904345aad16000000000000")?;
// send over ADNL
client.send(query.into()).await?;
// receive result
let result = client.next().await.ok_or_else(|| "no result")??;
// get time from serialized TL answer
println!(
"received: {}",
u32::from_le_bytes(result[result.len() - 7..result.len() - 3].try_into()?)
);
Ok(())
}
See the examples/
directory for more usage examples.
Modules§
Structs§
- Adnl
Address - Wrapper struct to hold ADNL address, which is a hash of public key
- Adnl
AesParams - Session parameters for AES-CTR encryption of datagrams
- Adnl
Builder - Builder of
AdnlHandshake
structure, which then can be transformed into [crate::AdnlClient
] - Adnl
Codec - Implementation of ADNL protocol. Connection must be first initialized with [
AdnlHandshake
] to exchange keys. - Adnl
Connection Info - Information about connected peers.
- Adnl
Handshake - Handshake packet, must be sent from client to server prior to any datagrams
- Adnl
Peer - Abstraction over [
AdnlSender
] and [AdnlReceiver
] to keep things simple
Enums§
- Adnl
Error - Common error type