10 stable releases

2.8.0 Sep 21, 2024
2.5.0 Jul 5, 2024
2.4.0 Feb 28, 2024
2.3.1 Dec 16, 2023
2.0.0 Feb 28, 2023

#1084 in Asynchronous

Download history 2/week @ 2024-07-14 78/week @ 2024-07-28 6/week @ 2024-08-04 1/week @ 2024-08-11 150/week @ 2024-09-01 27/week @ 2024-09-08 322/week @ 2024-09-15 114/week @ 2024-09-22 55/week @ 2024-09-29 35/week @ 2024-10-06 37/week @ 2024-10-13 8/week @ 2024-10-20 7/week @ 2024-10-27

97 downloads per month
Used in 3 crates

MIT license

99KB
361 lines

LND gRPC Client in Rust.

Rust 🦀 implementation of LND RPC client using async gRPC library tonic_openssl.

About

This crate implements LND GRPC using tonic_openssl and prost. Apart from being up-to-date at the time of writing (:D) it also allows async usage. It contains vendored *.proto files so LND source code is not required but accepts an environment variable LND_REPO_DIR which overrides the vendored *.proto files. This can be used to test new features in non-released lnd.

Adding to your Rust 🦀 project

cargo add lnd_grpc_rust

Usage

There's no setup needed beyond adding the crate to your Cargo.toml. If you need to change the *.proto files from which the client is generated, set the environment variable LND_REPO_DIR to a directory with cloned lnd during build.

Here's an example of retrieving information from LND ([getinfo](https://api.lightning.community/#getinfo) call). You can find the same example in crate root for your convenience.

Connect function takes cert and macaroon in hex format.

use std::fs;

#[tokio::main]
async fn main() {
        // Read the contents of the file into a vector of bytes
        let cert_bytes = fs::read("/path/to/tls.cert").expect("FailedToReadTlsCertFile");
        let mac_bytes = fs::read("path/to/macaroon").expect("FailedToReadMacaroonFile");

       // Convert the bytes to a hex string
        let cert = buffer_as_hex(cert_bytes);
        let macaroon = buffer_as_hex(mac_bytes);
        let socket = "localhost:10001".to_string();

        let mut client = lnd_grpc_rust::connect(cert, macaroon, socket)
        .await
        .expect("failed to connect");

    let info = client
        .lightning()
        // All calls require at least empty parameter
        .get_info(lnd_grpc_rust::lnrpc::GetInfoRequest {})
        .await
        .expect("failed to get info");

    // We only print it here, note that in real-life code
    // you may want to call `.into_inner()`
    // on the response to get the message.
    println!("{:#?}", info);
}

fn buffer_as_hex(bytes: Vec<u8>) -> String {
    let hex_str = bytes.iter().map(|b| format!("{:02x}", b)).collect::<String>();

    return hex_str;
}

License

MIT

Dependencies

~12–23MB
~330K SLoC