8 releases (4 breaking)

0.5.0 Aug 23, 2024
0.4.1 Mar 20, 2024
0.4.0 Jan 22, 2024
0.3.2 Aug 10, 2023
0.1.0 Nov 28, 2022

#2 in #pubkey

Download history 86/week @ 2024-07-21 139/week @ 2024-07-28 72/week @ 2024-08-04 93/week @ 2024-08-11 264/week @ 2024-08-18 143/week @ 2024-08-25 317/week @ 2024-09-01 410/week @ 2024-09-08 181/week @ 2024-09-15 71/week @ 2024-09-22 89/week @ 2024-09-29 36/week @ 2024-10-06 193/week @ 2024-10-13 140/week @ 2024-10-20 174/week @ 2024-10-27 264/week @ 2024-11-03

773 downloads per month
Used in async-hwi

Apache-2.0

110KB
2.5K SLoC

Ledger Bitcoin application client

Client library in Rust for the Ledger Bitcoin application with minimal dependencies.

If you wish to contribute to this library, please read CONTRIBUTING.md.

Minimum Supported Rust Version

bitcoin_client_rs should always compile using Rust 1.60.

Getting started

The client::BitcoinClient struct implements the methods that call and interpret the commands between the Ledger device and your software.

pub struct BitcoinClient<T: Transport> {...}
impl<T: Transport> BitcoinClient<T> {
    pub fn get_extended_pubkey(
        &self,
        path: &bitcoin::util::bip32::DerivationPath,
        display: bool,
    ) -> Result<bitcoin::util::bip32::ExtendedPubKey, BitcoinClientError<T::Error>>;
}

It requires an internal connection implementing the client::Transport Trait.

pub trait Transport {
    type Error: Debug;
    fn exchange(&self, command: &APDUCommand) -> Result<(StatusWord, Vec<u8>), Self::Error>;
}

In order to satisfy this Trait, it is possible to import the ledger-transport-hid crate from https://github.com/Zondax/ledger-rs. Please, read the examples/ledger_hwi/src/transport.rs file to find an example.

The async feature

The optional feature async adds the async_client module to the crate and imports the async_trait library. The async_client::BitcoinClient struct is an asynchronous equivalent to the BitcoinClient struct. It requires an internal connection implementing the async_client::Transport Trait.

#[async_trait]
pub trait Transport {
    type Error: Debug;
    async fn exchange(&self, command: &APDUCommand) -> Result<(StatusWord, Vec<u8>), Self::Error>;
}

The no-std support

Work in progress.

Example

The code source for a simple tool to communicate with either a Ledger device or Speculos emulator can be found in the examples directory.

Example of a command to retrieve the extended pubkey with the given derivation path and display it on the device screen:

cargo run --package ledger_hwi -- \
get-extended-pubkey --derivation-path "m/44'/0'/0'/0/0" --display

Dependencies

~8.5MB
~105K SLoC