mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-03-26 21:42:35 +01:00
Move InFlightHtlcs into ChannelManager
This is part of moving the Router trait into ChannelManager, which will help allow ChannelManager to fetch routes on-the-fly as part of supporting trampoline payments.
This commit is contained in:
parent
dc7f65f703
commit
1840cae321
3 changed files with 42 additions and 35 deletions
|
@ -38,13 +38,13 @@
|
||||||
//! # use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
|
//! # use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
|
||||||
//! # use lightning::ln::msgs::LightningError;
|
//! # use lightning::ln::msgs::LightningError;
|
||||||
//! # use lightning::routing::gossip::NodeId;
|
//! # use lightning::routing::gossip::NodeId;
|
||||||
//! # use lightning::routing::router::{Route, RouteHop, RouteParameters};
|
//! # use lightning::routing::router::{InFlightHtlcs, Route, RouteHop, RouteParameters};
|
||||||
//! # use lightning::routing::scoring::{ChannelUsage, Score};
|
//! # use lightning::routing::scoring::{ChannelUsage, Score};
|
||||||
//! # use lightning::util::events::{Event, EventHandler, EventsProvider};
|
//! # use lightning::util::events::{Event, EventHandler, EventsProvider};
|
||||||
//! # use lightning::util::logger::{Logger, Record};
|
//! # use lightning::util::logger::{Logger, Record};
|
||||||
//! # use lightning::util::ser::{Writeable, Writer};
|
//! # use lightning::util::ser::{Writeable, Writer};
|
||||||
//! # use lightning_invoice::Invoice;
|
//! # use lightning_invoice::Invoice;
|
||||||
//! # use lightning_invoice::payment::{InFlightHtlcs, InvoicePayer, Payer, Retry, Router};
|
//! # use lightning_invoice::payment::{InvoicePayer, Payer, Retry, Router};
|
||||||
//! # use secp256k1::PublicKey;
|
//! # use secp256k1::PublicKey;
|
||||||
//! # use std::cell::RefCell;
|
//! # use std::cell::RefCell;
|
||||||
//! # use std::ops::Deref;
|
//! # use std::ops::Deref;
|
||||||
|
@ -140,16 +140,14 @@ use bitcoin_hashes::Hash;
|
||||||
use bitcoin_hashes::sha256::Hash as Sha256;
|
use bitcoin_hashes::sha256::Hash as Sha256;
|
||||||
|
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use lightning::io;
|
|
||||||
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
|
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
|
||||||
use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
|
use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
|
||||||
use lightning::ln::msgs::LightningError;
|
use lightning::ln::msgs::LightningError;
|
||||||
use lightning::routing::gossip::NodeId;
|
use lightning::routing::gossip::NodeId;
|
||||||
use lightning::routing::router::{PaymentParameters, Route, RouteHop, RouteParameters};
|
use lightning::routing::router::{InFlightHtlcs, PaymentParameters, Route, RouteHop, RouteParameters};
|
||||||
use lightning::util::errors::APIError;
|
use lightning::util::errors::APIError;
|
||||||
use lightning::util::events::{Event, EventHandler};
|
use lightning::util::events::{Event, EventHandler};
|
||||||
use lightning::util::logger::Logger;
|
use lightning::util::logger::Logger;
|
||||||
use lightning::util::ser::Writeable;
|
|
||||||
use crate::time_utils::Time;
|
use crate::time_utils::Time;
|
||||||
use crate::sync::Mutex;
|
use crate::sync::Mutex;
|
||||||
|
|
||||||
|
@ -641,7 +639,7 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
InFlightHtlcs(total_inflight_map)
|
InFlightHtlcs::new(total_inflight_map)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -730,31 +728,6 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A map with liquidity value (in msat) keyed by a short channel id and the direction the HTLC
|
|
||||||
/// is traveling in. The direction boolean is determined by checking if the HTLC source's public
|
|
||||||
/// key is less than its destination. See [`InFlightHtlcs::used_liquidity_msat`] for more
|
|
||||||
/// details.
|
|
||||||
pub struct InFlightHtlcs(HashMap<(u64, bool), u64>);
|
|
||||||
|
|
||||||
impl InFlightHtlcs {
|
|
||||||
/// Returns liquidity in msat given the public key of the HTLC source, target, and short channel
|
|
||||||
/// id.
|
|
||||||
pub fn used_liquidity_msat(&self, source: &NodeId, target: &NodeId, channel_scid: u64) -> Option<u64> {
|
|
||||||
self.0.get(&(channel_scid, source < target)).map(|v| *v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Writeable for InFlightHtlcs {
|
|
||||||
fn write<W: lightning::util::ser::Writer>(&self, writer: &mut W) -> Result<(), io::Error> { self.0.write(writer) }
|
|
||||||
}
|
|
||||||
|
|
||||||
impl lightning::util::ser::Readable for InFlightHtlcs {
|
|
||||||
fn read<R: io::Read>(reader: &mut R) -> Result<Self, lightning::ln::msgs::DecodeError> {
|
|
||||||
let infight_map: HashMap<(u64, bool), u64> = lightning::util::ser::Readable::read(reader)?;
|
|
||||||
Ok(Self(infight_map))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -767,7 +740,7 @@ mod tests {
|
||||||
use lightning::ln::functional_test_utils::*;
|
use lightning::ln::functional_test_utils::*;
|
||||||
use lightning::ln::msgs::{ChannelMessageHandler, ErrorAction, LightningError};
|
use lightning::ln::msgs::{ChannelMessageHandler, ErrorAction, LightningError};
|
||||||
use lightning::routing::gossip::{EffectiveCapacity, NodeId};
|
use lightning::routing::gossip::{EffectiveCapacity, NodeId};
|
||||||
use lightning::routing::router::{PaymentParameters, Route, RouteHop};
|
use lightning::routing::router::{InFlightHtlcs, PaymentParameters, Route, RouteHop};
|
||||||
use lightning::routing::scoring::{ChannelUsage, LockableScore, Score};
|
use lightning::routing::scoring::{ChannelUsage, LockableScore, Score};
|
||||||
use lightning::util::test_utils::TestLogger;
|
use lightning::util::test_utils::TestLogger;
|
||||||
use lightning::util::errors::APIError;
|
use lightning::util::errors::APIError;
|
||||||
|
@ -1864,7 +1837,7 @@ mod tests {
|
||||||
impl Router for FailingRouter {
|
impl Router for FailingRouter {
|
||||||
fn find_route(
|
fn find_route(
|
||||||
&self, _payer: &PublicKey, _params: &RouteParameters, _first_hops: Option<&[&ChannelDetails]>,
|
&self, _payer: &PublicKey, _params: &RouteParameters, _first_hops: Option<&[&ChannelDetails]>,
|
||||||
_inflight_htlcs: InFlightHtlcs
|
_inflight_htlcs: InFlightHtlcs,
|
||||||
) -> Result<Route, LightningError> {
|
) -> Result<Route, LightningError> {
|
||||||
Err(LightningError { err: String::new(), action: ErrorAction::IgnoreError })
|
Err(LightningError { err: String::new(), action: ErrorAction::IgnoreError })
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//! Convenient utilities to create an invoice.
|
//! Convenient utilities to create an invoice.
|
||||||
|
|
||||||
use crate::{CreationError, Currency, Invoice, InvoiceBuilder, SignOrCreationError};
|
use crate::{CreationError, Currency, Invoice, InvoiceBuilder, SignOrCreationError};
|
||||||
use crate::payment::{InFlightHtlcs, Payer, Router};
|
use crate::payment::{Payer, Router};
|
||||||
|
|
||||||
use crate::{prelude::*, Description, InvoiceDescription, Sha256};
|
use crate::{prelude::*, Description, InvoiceDescription, Sha256};
|
||||||
use bech32::ToBase32;
|
use bech32::ToBase32;
|
||||||
|
@ -16,7 +16,7 @@ use lightning::ln::channelmanager::{PhantomRouteHints, MIN_CLTV_EXPIRY_DELTA};
|
||||||
use lightning::ln::inbound_payment::{create, create_from_hash, ExpandedKey};
|
use lightning::ln::inbound_payment::{create, create_from_hash, ExpandedKey};
|
||||||
use lightning::ln::msgs::LightningError;
|
use lightning::ln::msgs::LightningError;
|
||||||
use lightning::routing::gossip::{NetworkGraph, NodeId, RoutingFees};
|
use lightning::routing::gossip::{NetworkGraph, NodeId, RoutingFees};
|
||||||
use lightning::routing::router::{Route, RouteHint, RouteHintHop, RouteParameters, find_route, RouteHop};
|
use lightning::routing::router::{InFlightHtlcs, Route, RouteHint, RouteHintHop, RouteParameters, find_route, RouteHop};
|
||||||
use lightning::routing::scoring::{ChannelUsage, LockableScore, Score};
|
use lightning::routing::scoring::{ChannelUsage, LockableScore, Score};
|
||||||
use lightning::util::logger::Logger;
|
use lightning::util::logger::Logger;
|
||||||
use secp256k1::PublicKey;
|
use secp256k1::PublicKey;
|
||||||
|
|
|
@ -29,6 +29,40 @@ use alloc::collections::BinaryHeap;
|
||||||
use core::cmp;
|
use core::cmp;
|
||||||
use core::ops::Deref;
|
use core::ops::Deref;
|
||||||
|
|
||||||
|
/// A map with liquidity value (in msat) keyed by a short channel id and the direction the HTLC
|
||||||
|
/// is traveling in. The direction boolean is determined by checking if the HTLC source's public
|
||||||
|
/// key is less than its destination. See [`InFlightHtlcs::used_liquidity_msat`] for more
|
||||||
|
/// details.
|
||||||
|
#[cfg(not(any(test, feature = "_test_utils")))]
|
||||||
|
pub struct InFlightHtlcs(HashMap<(u64, bool), u64>);
|
||||||
|
#[cfg(any(test, feature = "_test_utils"))]
|
||||||
|
pub struct InFlightHtlcs(pub HashMap<(u64, bool), u64>);
|
||||||
|
|
||||||
|
impl InFlightHtlcs {
|
||||||
|
/// Create a new `InFlightHtlcs` via a mapping from:
|
||||||
|
/// (short_channel_id, source_pubkey < target_pubkey) -> used_liquidity_msat
|
||||||
|
pub fn new(inflight_map: HashMap<(u64, bool), u64>) -> Self {
|
||||||
|
InFlightHtlcs(inflight_map)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns liquidity in msat given the public key of the HTLC source, target, and short channel
|
||||||
|
/// id.
|
||||||
|
pub fn used_liquidity_msat(&self, source: &NodeId, target: &NodeId, channel_scid: u64) -> Option<u64> {
|
||||||
|
self.0.get(&(channel_scid, source < target)).map(|v| *v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Writeable for InFlightHtlcs {
|
||||||
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> { self.0.write(writer) }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Readable for InFlightHtlcs {
|
||||||
|
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
|
||||||
|
let infight_map: HashMap<(u64, bool), u64> = Readable::read(reader)?;
|
||||||
|
Ok(Self(infight_map))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// A hop in a route
|
/// A hop in a route
|
||||||
#[derive(Clone, Debug, Hash, PartialEq, Eq)]
|
#[derive(Clone, Debug, Hash, PartialEq, Eq)]
|
||||||
pub struct RouteHop {
|
pub struct RouteHop {
|
||||||
|
|
Loading…
Add table
Reference in a new issue