Skip to content

Commit 166dafc

Browse files
committed
Add inital implementation of persisted payment store
1 parent fdabd21 commit 166dafc

File tree

4 files changed

+296
-143
lines changed

4 files changed

+296
-143
lines changed

src/event.rs

+39-46
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
22
hex, ChannelManager, Error, FilesystemPersister, LdkLiteChainAccess, LdkLiteConfig,
3-
NetworkGraph, PaymentInfo, PaymentInfoStorage, PaymentStatus,
3+
NetworkGraph, PaymentDirection, PaymentInfo, PaymentInfoStorage, PaymentStatus,
44
};
55

66
#[allow(unused_imports)]
@@ -232,8 +232,7 @@ pub(crate) struct LdkLiteEventHandler {
232232
channel_manager: Arc<ChannelManager>,
233233
network_graph: Arc<NetworkGraph>,
234234
keys_manager: Arc<KeysManager>,
235-
inbound_payments: Arc<PaymentInfoStorage>,
236-
outbound_payments: Arc<PaymentInfoStorage>,
235+
payment_store: Arc<PaymentInfoStorage<FilesystemPersister>>,
237236
logger: Arc<FilesystemLogger>,
238237
_config: Arc<LdkLiteConfig>,
239238
}
@@ -243,8 +242,8 @@ impl LdkLiteEventHandler {
243242
chain_access: Arc<LdkLiteChainAccess<bdk::sled::Tree>>,
244243
event_queue: Arc<LdkLiteEventQueue<FilesystemPersister>>,
245244
channel_manager: Arc<ChannelManager>, network_graph: Arc<NetworkGraph>,
246-
keys_manager: Arc<KeysManager>, inbound_payments: Arc<PaymentInfoStorage>,
247-
outbound_payments: Arc<PaymentInfoStorage>, logger: Arc<FilesystemLogger>,
245+
keys_manager: Arc<KeysManager>,
246+
payment_store: Arc<PaymentInfoStorage<FilesystemPersister>>, logger: Arc<FilesystemLogger>,
248247
_config: Arc<LdkLiteConfig>,
249248
) -> Self {
250249
Self {
@@ -253,8 +252,7 @@ impl LdkLiteEventHandler {
253252
channel_manager,
254253
network_graph,
255254
keys_manager,
256-
inbound_payments,
257-
outbound_payments,
255+
payment_store,
258256
logger,
259257
_config,
260258
}
@@ -339,49 +337,49 @@ impl ldk_events::EventHandler for LdkLiteEventHandler {
339337
(Some(*preimage), None)
340338
}
341339
};
342-
let mut payments = self.inbound_payments.lock().unwrap();
343-
match payments.entry(*payment_hash) {
344-
hash_map::Entry::Occupied(mut e) => {
345-
let payment = e.get_mut();
346-
payment.status = PaymentStatus::Succeeded;
347-
payment.preimage = payment_preimage;
348-
payment.secret = payment_secret;
349-
}
350-
hash_map::Entry::Vacant(e) => {
351-
e.insert(PaymentInfo {
340+
341+
let payment_info =
342+
if let Some(mut payment_info) = self.payment_store.payment(payment_hash) {
343+
payment_info.status = PaymentStatus::Succeeded;
344+
payment_info.preimage = payment_preimage;
345+
payment_info.secret = payment_secret;
346+
payment_info
347+
} else {
348+
PaymentInfo {
352349
preimage: payment_preimage,
350+
hash: *payment_hash,
353351
secret: payment_secret,
354-
status: PaymentStatus::Succeeded,
355352
amount_msat: Some(*amount_msat),
356-
});
357-
}
358-
}
353+
direction: PaymentDirection::Inbound,
354+
status: PaymentStatus::Succeeded,
355+
}
356+
};
357+
358+
self.payment_store.insert_payment(payment_info).unwrap();
359359
}
360360
ldk_events::Event::PaymentSent {
361361
payment_preimage,
362362
payment_hash,
363363
fee_paid_msat,
364364
..
365365
} => {
366-
let mut payments = self.outbound_payments.lock().unwrap();
367-
for (hash, payment) in payments.iter_mut() {
368-
if *hash == *payment_hash {
369-
payment.preimage = Some(*payment_preimage);
370-
payment.status = PaymentStatus::Succeeded;
371-
log_info!(
372-
self.logger,
373-
"Successfully sent payment of {} millisatoshis{} from \
374-
payment hash {:?} with preimage {:?}",
375-
payment.amount_msat.unwrap(),
376-
if let Some(fee) = fee_paid_msat {
377-
format!(" (fee {} msat)", fee)
378-
} else {
379-
"".to_string()
380-
},
381-
hex::to_string(&payment_hash.0),
382-
hex::to_string(&payment_preimage.0)
383-
);
384-
}
366+
if let Some(mut payment_info) = self.payment_store.payment(payment_hash) {
367+
payment_info.preimage = Some(*payment_preimage);
368+
payment_info.status = PaymentStatus::Succeeded;
369+
self.payment_store.insert_payment(payment_info.clone()).unwrap();
370+
log_info!(
371+
self.logger,
372+
"Successfully sent payment of {} millisatoshis{} from \
373+
payment hash {:?} with preimage {:?}",
374+
payment_info.amount_msat.unwrap(),
375+
if let Some(fee) = fee_paid_msat {
376+
format!(" (fee {} msat)", fee)
377+
} else {
378+
"".to_string()
379+
},
380+
hex::to_string(&payment_hash.0),
381+
hex::to_string(&payment_preimage.0)
382+
);
385383
}
386384
self.event_queue
387385
.add_event(LdkLiteEvent::PaymentSuccessful {
@@ -397,19 +395,14 @@ impl ldk_events::EventHandler for LdkLiteEventHandler {
397395
hex::to_string(&payment_hash.0)
398396
);
399397

400-
let mut payments = self.outbound_payments.lock().unwrap();
401-
if payments.contains_key(&payment_hash) {
402-
let payment = payments.get_mut(&payment_hash).unwrap();
403-
payment.status = PaymentStatus::Failed;
404-
}
398+
self.payment_store.set_payment_status(payment_hash, PaymentStatus::Failed).unwrap();
405399
self.event_queue
406400
.add_event(LdkLiteEvent::PaymentFailed {
407401
payment_hash: *payment_hash,
408402
inner: event.clone(),
409403
})
410404
.unwrap();
411405
}
412-
413406
ldk_events::Event::PaymentPathSuccessful { .. } => {}
414407
ldk_events::Event::PaymentPathFailed { .. } => {}
415408
ldk_events::Event::ProbeSuccessful { .. } => {}

src/io.rs

+23-8
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
use crate::error::LdkLiteError as Error;
22

3-
use crate::{FilesystemLogger, LdkLiteConfig, NetworkGraph, PeerInfo, Scorer};
3+
use crate::payment_store::{PaymentInfo, PAYMENT_INFO_PERSISTENCE_PREFIX};
4+
use crate::{FilesystemLogger, LdkLiteConfig, NetworkGraph, Scorer};
45

56
use lightning::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringParameters};
6-
use lightning::util::ser::ReadableArgs;
7-
8-
use bitcoin::secp256k1::PublicKey;
7+
use lightning::util::ser::{Readable, ReadableArgs};
98

109
use rand::{thread_rng, RngCore};
1110

12-
use std::collections::HashMap;
13-
use std::convert::TryFrom;
1411
use std::fs;
15-
use std::io::{BufRead, BufReader, Write};
16-
use std::net::SocketAddr;
12+
use std::io::{BufReader, Write};
1713
use std::sync::Arc;
1814

1915
pub(crate) fn read_or_generate_seed_file(config: Arc<LdkLiteConfig>) -> Result<[u8; 32], Error> {
@@ -68,3 +64,22 @@ pub(crate) fn read_scorer(
6864
}
6965
ProbabilisticScorer::new(params, network_graph, logger)
7066
}
67+
68+
pub(crate) fn read_payment_info(config: Arc<LdkLiteConfig>) -> Result<Vec<PaymentInfo>, Error> {
69+
let ldk_data_dir = format!("{}/ldk", &config.storage_dir_path.clone());
70+
let payment_store_path =
71+
format!("{}/{}", ldk_data_dir.clone(), PAYMENT_INFO_PERSISTENCE_PREFIX);
72+
let mut payments = Vec::new();
73+
74+
for entry in fs::read_dir(payment_store_path)? {
75+
let entry = entry?;
76+
if entry.path().is_file() {
77+
let mut f = fs::File::open(entry.path())?;
78+
if let Ok(payment_info) = PaymentInfo::read(&mut f) {
79+
payments.push(payment_info);
80+
}
81+
}
82+
}
83+
84+
Ok(payments)
85+
}

0 commit comments

Comments
 (0)