Client library in Rust for the Ledger Bitcoin application with minimal dependencies.
If you wish to contribute to this library, please read CONTRIBUTING.md.
bitcoin_client_rs
should always compile using Rust 1.60.
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 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>;
}
Work in progress.
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