vls-proxy 0.14.0

A library for implementing a Lightning signer, which externalizes and secures cryptographic operations.
Documentation
use std::sync::Arc;

use lightning_signer::bitcoin::{secp256k1, Network};
use lightning_signer::node::NodeServices;
use lightning_signer::persist::DummyPersister;
use lightning_signer::persist::Persist;
use lightning_signer::signer::ClockStartingTimeFactory;
use lightning_signer::util::clock::StandardClock;
use nix::sys::socket::{socketpair, AddressFamily, SockFlag, SockType};
use nix::unistd::{close, fork, ForkResult};
use secp256k1::rand::rngs::OsRng;
use secp256k1::Secp256k1;

use vls_protocol_signer::handler::RootHandlerBuilder;
use vls_protocol_signer::vls_protocol::model::PubKey;
use vls_protocol_signer::vls_protocol::msgs;
use vls_proxy::util::make_validator_factory;

use crate::client::{Client, UnixClient};
use crate::connection::UnixConnection;

fn run_parent(conn: UnixConnection) {
    let mut client = UnixClient::new(conn);
    println!("parent: start");
    client.write(msgs::Memleak {}).unwrap();
    println!("parent: {:?}", client.read());
    let secp = Secp256k1::new();
    let mut rng = OsRng;
    let (_, key) = secp.generate_keypair(&mut rng);

    client
        .write(msgs::ClientHsmFd { peer_id: PubKey(key.serialize()), dbid: 0, capabilities: 0 })
        .unwrap();
    println!("parent: {:?}", client.read());
    let fd = client.recv_fd().expect("fd");
    println!("parent: received fd {}", fd);
    let mut client1 = UnixClient::new(UnixConnection::new(fd));
    client1.write(msgs::Memleak {}).unwrap();
    println!("parent: client1 {:?}", client1.read());
}

#[tokio::main]
async fn do_child(conn: UnixConnection) {
    let network = Network::Regtest;

    let client = UnixClient::new(conn);
    let persister: Arc<dyn Persist> = Arc::new(DummyPersister {});
    let seed = [0; 32];
    let starting_time_factory = ClockStartingTimeFactory::new();
    let validator_factory = make_validator_factory(network);
    let clock = Arc::new(StandardClock());
    let looper = crate::Looper { external_persist: None };
    let services = NodeServices { validator_factory, starting_time_factory, persister, clock };
    let (handler, _muts) = RootHandlerBuilder::new(network, client.id(), services, seed)
        .build()
        .expect("handler build");
    looper.root_signer_loop(client, handler).await
}

pub(crate) fn run_test() {
    println!("starting test");
    let (fd3, fd4) =
        socketpair(AddressFamily::Unix, SockType::Stream, None, SockFlag::empty()).unwrap();
    assert_eq!(fd3, 3);
    assert_eq!(fd4, 4);
    match unsafe { fork() } {
        Ok(ForkResult::Parent { child, .. }) => {
            println!("child pid {}", child);
            close(fd3).unwrap();
            let conn = UnixConnection::new(fd4);
            run_parent(conn);
        }
        Ok(ForkResult::Child) => {
            close(fd4).unwrap();
            let conn = UnixConnection::new(fd3);
            do_child(conn);
        }
        Err(_) => {}
    }
}