Skip to content

Commit c59d781

Browse files
committed
Add ChainSource::BitcoindRpc variant and basic client struct
1 parent 0bec579 commit c59d781

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ lightning-net-tokio = { version = "0.0.125" }
3434
lightning-persister = { version = "0.0.125" }
3535
lightning-background-processor = { version = "0.0.125", features = ["futures"] }
3636
lightning-rapid-gossip-sync = { version = "0.0.125" }
37+
lightning-block-sync = { version = "0.0.125", features = ["rpc-client", "tokio"] }
3738
lightning-transaction-sync = { version = "0.0.125", features = ["esplora-async-https", "time"] }
3839
lightning-liquidity = { version = "0.1.0-alpha.6", features = ["std"] }
3940

@@ -65,6 +66,7 @@ bitcoin = "0.32.2"
6566
bip39 = "2.0.0"
6667
bip21 = { version = "0.5", features = ["std"], default-features = false }
6768

69+
base64 = { version = "0.22.1", default-features = false, features = ["std"] }
6870
rand = "0.8.5"
6971
chrono = { version = "0.4", default-features = false, features = ["clock"] }
7072
tokio = { version = "1.37", default-features = false, features = [ "rt-multi-thread", "time", "sync", "macros" ] }

src/chain/bitcoind_rpc.rs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// This file is Copyright its original authors, visible in version control history.
2+
//
3+
// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
5+
// http://opensource.org/licenses/MIT>, at your option. You may not use this file except in
6+
// accordance with one or both of these licenses.
7+
8+
use lightning_block_sync::http::HttpEndpoint;
9+
use lightning_block_sync::rpc::RpcClient;
10+
use lightning_block_sync::{AsyncBlockSourceResult, BlockData, BlockHeaderData, BlockSource};
11+
12+
use bitcoin::BlockHash;
13+
14+
use base64::prelude::{Engine, BASE64_STANDARD};
15+
16+
use std::sync::Arc;
17+
18+
pub struct BitcoindRpcClient {
19+
rpc_client: Arc<RpcClient>,
20+
}
21+
22+
impl BitcoindRpcClient {
23+
pub(crate) fn new(host: String, port: u16, rpc_user: String, rpc_password: String) -> Self {
24+
let http_endpoint = HttpEndpoint::for_host(host.clone()).with_port(port);
25+
let rpc_credentials =
26+
BASE64_STANDARD.encode(format!("{}:{}", rpc_user.clone(), rpc_password.clone()));
27+
28+
let rpc_client = Arc::new(
29+
RpcClient::new(&rpc_credentials, http_endpoint)
30+
.expect("RpcClient::new is actually infallible"),
31+
);
32+
33+
Self { rpc_client }
34+
}
35+
}
36+
37+
impl BlockSource for BitcoindRpcClient {
38+
fn get_header<'a>(
39+
&'a self, header_hash: &'a BlockHash, height_hint: Option<u32>,
40+
) -> AsyncBlockSourceResult<'a, BlockHeaderData> {
41+
Box::pin(async move { self.rpc_client.get_header(header_hash, height_hint).await })
42+
}
43+
44+
fn get_block<'a>(
45+
&'a self, header_hash: &'a BlockHash,
46+
) -> AsyncBlockSourceResult<'a, BlockData> {
47+
Box::pin(async move { self.rpc_client.get_block(header_hash).await })
48+
}
49+
50+
fn get_best_block<'a>(&'a self) -> AsyncBlockSourceResult<(BlockHash, Option<u32>)> {
51+
Box::pin(async move { self.rpc_client.get_best_block().await })
52+
}
53+
}

src/chain/mod.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
// http://opensource.org/licenses/MIT>, at your option. You may not use this file except in
66
// accordance with one or both of these licenses.
77

8+
mod bitcoind_rpc;
9+
810
use crate::config::{
911
Config, EsploraSyncConfig, BDK_CLIENT_CONCURRENCY, BDK_CLIENT_STOP_GAP,
1012
BDK_WALLET_SYNC_TIMEOUT_SECS, FEE_RATE_CACHE_UPDATE_TIMEOUT_SECS, LDK_WALLET_SYNC_TIMEOUT_SECS,
@@ -35,6 +37,8 @@ use std::collections::HashMap;
3537
use std::sync::{Arc, Mutex, RwLock};
3638
use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
3739

40+
use self::bitcoind_rpc::BitcoindRpcClient;
41+
3842
// The default Esplora server we're using.
3943
pub(crate) const DEFAULT_ESPLORA_SERVER_URL: &str = "https://blockstream.info/api";
4044

@@ -109,6 +113,16 @@ pub(crate) enum ChainSource {
109113
logger: Arc<FilesystemLogger>,
110114
node_metrics: Arc<RwLock<NodeMetrics>>,
111115
},
116+
BitcoindRpc {
117+
bitcoind_rpc_client: Arc<BitcoindRpcClient>,
118+
onchain_wallet: Arc<Wallet>,
119+
fee_estimator: Arc<OnchainFeeEstimator>,
120+
tx_broadcaster: Arc<Broadcaster>,
121+
kv_store: Arc<DynStore>,
122+
config: Arc<Config>,
123+
logger: Arc<FilesystemLogger>,
124+
node_metrics: Arc<RwLock<NodeMetrics>>,
125+
},
112126
}
113127

114128
impl ChainSource {
@@ -141,6 +155,26 @@ impl ChainSource {
141155
}
142156
}
143157

158+
pub(crate) fn new_bitcoind_rpc(
159+
host: String, port: u16, rpc_user: String, rpc_password: String,
160+
onchain_wallet: Arc<Wallet>, fee_estimator: Arc<OnchainFeeEstimator>,
161+
tx_broadcaster: Arc<Broadcaster>, kv_store: Arc<DynStore>, config: Arc<Config>,
162+
logger: Arc<FilesystemLogger>, node_metrics: Arc<RwLock<NodeMetrics>>,
163+
) -> Self {
164+
let bitcoind_rpc_client =
165+
Arc::new(BitcoindRpcClient::new(host, port, rpc_user, rpc_password));
166+
Self::BitcoindRpc {
167+
bitcoind_rpc_client,
168+
onchain_wallet,
169+
fee_estimator,
170+
tx_broadcaster,
171+
kv_store,
172+
config,
173+
logger,
174+
node_metrics,
175+
}
176+
}
177+
144178
pub(crate) async fn continuously_sync_wallets(
145179
&self, mut stop_sync_receiver: tokio::sync::watch::Receiver<()>,
146180
channel_manager: Arc<ChannelManager>, chain_monitor: Arc<ChainMonitor>,
@@ -201,6 +235,7 @@ impl ChainSource {
201235
}
202236
}
203237
},
238+
Self::BitcoindRpc { .. } => todo!(),
204239
}
205240
}
206241

@@ -319,6 +354,7 @@ impl ChainSource {
319354

320355
res
321356
},
357+
Self::BitcoindRpc { .. } => todo!(),
322358
}
323359
}
324360

@@ -411,6 +447,7 @@ impl ChainSource {
411447

412448
res
413449
},
450+
Self::BitcoindRpc { .. } => todo!(),
414451
}
415452
}
416453

@@ -506,6 +543,7 @@ impl ChainSource {
506543

507544
Ok(())
508545
},
546+
Self::BitcoindRpc { .. } => todo!(),
509547
}
510548
}
511549

@@ -582,6 +620,7 @@ impl ChainSource {
582620
}
583621
}
584622
},
623+
Self::BitcoindRpc { .. } => todo!(),
585624
}
586625
}
587626
}
@@ -590,11 +629,13 @@ impl Filter for ChainSource {
590629
fn register_tx(&self, txid: &bitcoin::Txid, script_pubkey: &bitcoin::Script) {
591630
match self {
592631
Self::Esplora { tx_sync, .. } => tx_sync.register_tx(txid, script_pubkey),
632+
Self::BitcoindRpc { .. } => (),
593633
}
594634
}
595635
fn register_output(&self, output: lightning::chain::WatchedOutput) {
596636
match self {
597637
Self::Esplora { tx_sync, .. } => tx_sync.register_output(output),
638+
Self::BitcoindRpc { .. } => (),
598639
}
599640
}
600641
}

0 commit comments

Comments
 (0)