Crate lightning_net_tokio[][src]

A socket handling library for those running in Tokio environments who wish to use rust-lightning with native TcpStreams.

Designed to be as simple as possible, the high-level usage is almost as simple as “hand over a TcpStream and a reference to a PeerManager and the rest is handled”, except for the Event handlng mechanism, see below.

The PeerHandler, due to the fire-and-forget nature of this logic, must be an Arc, and must use the SocketDescriptor provided here as the PeerHandler’s SocketDescriptor.

Three methods are exposed to register a new connection for handling in tokio::spawn calls, see their individual docs for more. All three take a mpsc::Sender<()> which is sent into every time something occurs which may result in lightning Events. The call site should, thus, look something like this:

use tokio::sync::mpsc;
use std::net::TcpStream;
use bitcoin::secp256k1::key::PublicKey;
use lightning::util::events::EventsProvider;
use std::net::SocketAddr;
use std::sync::Arc;

// Define concrete types for our high-level objects:
type TxBroadcaster = dyn lightning::chain::chaininterface::BroadcasterInterface;
type FeeEstimator = dyn lightning::chain::chaininterface::FeeEstimator;
type Logger = dyn lightning::util::logger::Logger;
type ChainAccess = dyn lightning::chain::Access;
type ChainFilter = dyn lightning::chain::Filter;
type DataPersister = dyn lightning::chain::channelmonitor::Persist<lightning::chain::keysinterface::InMemorySigner>;
type ChainMonitor = lightning::chain::chainmonitor::ChainMonitor<lightning::chain::keysinterface::InMemorySigner, Arc<ChainFilter>, Arc<TxBroadcaster>, Arc<FeeEstimator>, Arc<Logger>, Arc<DataPersister>>;
type ChannelManager = Arc<lightning::ln::channelmanager::SimpleArcChannelManager<ChainMonitor, TxBroadcaster, FeeEstimator, Logger>>;
type PeerManager = Arc<lightning::ln::peer_handler::SimpleArcPeerManager<lightning_net_tokio::SocketDescriptor, ChainMonitor, TxBroadcaster, FeeEstimator, ChainAccess, Logger>>;

// Connect to node with pubkey their_node_id at addr:
async fn connect_to_node(peer_manager: PeerManager, chain_monitor: Arc<ChainMonitor>, channel_manager: ChannelManager, their_node_id: PublicKey, addr: SocketAddr) {
    let (sender, mut receiver) = mpsc::channel(2);
    lightning_net_tokio::connect_outbound(peer_manager, sender, their_node_id, addr).await;
    loop {
        receiver.recv().await;
        for _event in channel_manager.get_and_clear_pending_events().drain(..) {
            // Handle the event!
        }
        for _event in chain_monitor.get_and_clear_pending_events().drain(..) {
            // Handle the event!
        }
    }
}

// Begin reading from a newly accepted socket and talk to the peer:
async fn accept_socket(peer_manager: PeerManager, chain_monitor: Arc<ChainMonitor>, channel_manager: ChannelManager, socket: TcpStream) {
    let (sender, mut receiver) = mpsc::channel(2);
    lightning_net_tokio::setup_inbound(peer_manager, sender, socket);
    loop {
        receiver.recv().await;
        for _event in channel_manager.get_and_clear_pending_events().drain(..) {
            // Handle the event!
        }
        for _event in chain_monitor.get_and_clear_pending_events().drain(..) {
            // Handle the event!
        }
    }
}

Structs

SocketDescriptor

The SocketDescriptor used to refer to sockets by a PeerHandler. This is pub only as it is a type in the template of PeerHandler.

Functions

connect_outbound

Process incoming messages and feed outgoing messages on a new connection made to the given socket address which is expected to be accepted by a peer with the given public key (by scheduling futures with tokio::spawn).

setup_inbound

Process incoming messages and feed outgoing messages on the provided socket generated by accepting an incoming connection.

setup_outbound

Process incoming messages and feed outgoing messages on the provided socket generated by making an outbound connection which is expected to be accepted by a peer with the given public key. The relevant processing is set to run free (via tokio::spawn).