Skip to content

Commit 89919aa

Browse files
committed
Add pending funding scopes to FundedChannel
Once a channel is funded, it may be spliced to add or remove funds. The new funding transaction is pending until confirmed on chain and thus needs to be tracked. Additionally, it may be replaced by another transaction using RBF with a higher fee. Hence, there may be more than one pending FundingScope to track for a splice. This commit adds support for tracking pending funding scopes. The following commits will account for any pending scopes where applicable (e.g., when handling commitment_signed).
1 parent 84939ac commit 89919aa

File tree

4 files changed

+75
-12
lines changed

4 files changed

+75
-12
lines changed

lightning/src/chain/onchaintx.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
368368
let prev_holder_commitment = Readable::read(reader)?;
369369
let _prev_holder_htlc_sigs: Option<Vec<Option<(usize, Signature)>>> = Readable::read(reader)?;
370370

371-
let channel_parameters = ReadableArgs::<u64>::read(reader, channel_value_satoshis)?;
371+
let channel_parameters = ReadableArgs::<Option<u64>>::read(reader, Some(channel_value_satoshis))?;
372372

373373
// Read the serialized signer bytes, but don't deserialize them, as we'll obtain our signer
374374
// by re-deriving the private key material.

lightning/src/ln/chan_utils.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,8 +1034,8 @@ impl Writeable for ChannelTransactionParameters {
10341034
}
10351035
}
10361036

1037-
impl ReadableArgs<u64> for ChannelTransactionParameters {
1038-
fn read<R: io::Read>(reader: &mut R, read_args: u64) -> Result<Self, DecodeError> {
1037+
impl ReadableArgs<Option<u64>> for ChannelTransactionParameters {
1038+
fn read<R: io::Read>(reader: &mut R, read_args: Option<u64>) -> Result<Self, DecodeError> {
10391039
let mut holder_pubkeys = RequiredWrapper(None);
10401040
let mut holder_selected_contest_delay = RequiredWrapper(None);
10411041
let mut is_outbound_from_holder = RequiredWrapper(None);
@@ -1058,10 +1058,17 @@ impl ReadableArgs<u64> for ChannelTransactionParameters {
10581058
(13, channel_value_satoshis, option),
10591059
});
10601060

1061-
let channel_value_satoshis = channel_value_satoshis.unwrap_or(read_args);
1062-
if channel_value_satoshis != read_args {
1063-
return Err(DecodeError::InvalidValue);
1064-
}
1061+
let channel_value_satoshis = match read_args {
1062+
None => channel_value_satoshis.ok_or(DecodeError::InvalidValue)?,
1063+
Some(expected_value) => {
1064+
let channel_value_satoshis = channel_value_satoshis.unwrap_or(expected_value);
1065+
if channel_value_satoshis == expected_value {
1066+
channel_value_satoshis
1067+
} else {
1068+
return Err(DecodeError::InvalidValue);
1069+
}
1070+
},
1071+
};
10651072

10661073
let mut additional_features = ChannelTypeFeatures::empty();
10671074
additional_features.set_anchors_nonzero_fee_htlc_tx_required();

lightning/src/ln/channel.rs

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ use crate::sign::{EntropySource, ChannelSigner, SignerProvider, NodeSigner, Reci
6060
use crate::events::{ClosureReason, Event};
6161
use crate::events::bump_transaction::BASE_INPUT_WEIGHT;
6262
use crate::routing::gossip::NodeId;
63-
use crate::util::ser::{Readable, ReadableArgs, TransactionU16LenLimited, Writeable, Writer};
63+
use crate::util::ser::{Readable, ReadableArgs, RequiredWrapper, TransactionU16LenLimited, Writeable, Writer};
6464
use crate::util::logger::{Logger, Record, WithContext};
6565
use crate::util::errors::APIError;
6666
use crate::util::config::{UserConfig, ChannelConfig, LegacyChannelConfig, ChannelHandshakeConfig, ChannelHandshakeLimits, MaxDustHTLCExposure};
@@ -1519,6 +1519,7 @@ impl<SP: Deref> Channel<SP> where
15191519
};
15201520
let mut funded_channel = FundedChannel {
15211521
funding: chan.funding,
1522+
pending_funding: vec![],
15221523
context: chan.context,
15231524
interactive_tx_signing_session: chan.interactive_tx_signing_session,
15241525
holder_commitment_point,
@@ -1665,6 +1666,53 @@ pub(super) struct FundingScope {
16651666
funding_transaction: Option<Transaction>,
16661667
}
16671668

1669+
impl Writeable for FundingScope {
1670+
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
1671+
write_tlv_fields!(writer, {
1672+
(1, self.value_to_self_msat, required),
1673+
(3, self.counterparty_selected_channel_reserve_satoshis, option),
1674+
(5, self.holder_selected_channel_reserve_satoshis, required),
1675+
(7, self.channel_transaction_parameters, (required: ReadableArgs, None)),
1676+
(9, self.funding_transaction, option),
1677+
});
1678+
Ok(())
1679+
}
1680+
}
1681+
1682+
impl Readable for FundingScope {
1683+
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
1684+
let mut value_to_self_msat = RequiredWrapper(None);
1685+
let mut counterparty_selected_channel_reserve_satoshis = None;
1686+
let mut holder_selected_channel_reserve_satoshis = RequiredWrapper(None);
1687+
let mut channel_transaction_parameters = RequiredWrapper(None);
1688+
let mut funding_transaction = None;
1689+
1690+
read_tlv_fields!(reader, {
1691+
(1, value_to_self_msat, required),
1692+
(3, counterparty_selected_channel_reserve_satoshis, option),
1693+
(5, holder_selected_channel_reserve_satoshis, required),
1694+
(7, channel_transaction_parameters, (required: ReadableArgs, None)),
1695+
(9, funding_transaction, option),
1696+
});
1697+
1698+
Ok(Self {
1699+
value_to_self_msat: value_to_self_msat.0.unwrap(),
1700+
counterparty_selected_channel_reserve_satoshis,
1701+
holder_selected_channel_reserve_satoshis: holder_selected_channel_reserve_satoshis.0.unwrap(),
1702+
#[cfg(debug_assertions)]
1703+
holder_max_commitment_tx_output: Mutex::new((0, 0)),
1704+
#[cfg(debug_assertions)]
1705+
counterparty_max_commitment_tx_output: Mutex::new((0, 0)),
1706+
channel_transaction_parameters: channel_transaction_parameters.0.unwrap(),
1707+
funding_transaction,
1708+
#[cfg(any(test, fuzzing))]
1709+
next_local_commitment_tx_fee_info_cached: Mutex::new(None),
1710+
#[cfg(any(test, fuzzing))]
1711+
next_remote_commitment_tx_fee_info_cached: Mutex::new(None),
1712+
})
1713+
}
1714+
}
1715+
16681716
impl FundingScope {
16691717
pub fn get_value_satoshis(&self) -> u64 {
16701718
self.channel_transaction_parameters.channel_value_satoshis
@@ -4945,6 +4993,7 @@ pub(super) struct DualFundingChannelContext {
49454993
// Counterparty designates channel data owned by the another channel participant entity.
49464994
pub(super) struct FundedChannel<SP: Deref> where SP::Target: SignerProvider {
49474995
pub funding: FundingScope,
4996+
pending_funding: Vec<FundingScope>,
49484997
pub context: ChannelContext<SP>,
49494998
pub interactive_tx_signing_session: Option<InteractiveTxSigningSession>,
49504999
holder_commitment_point: HolderCommitmentPoint,
@@ -9548,6 +9597,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
95489597

95499598
let mut channel = FundedChannel {
95509599
funding: self.funding,
9600+
pending_funding: vec![],
95519601
context: self.context,
95529602
interactive_tx_signing_session: None,
95539603
is_v2_established: false,
@@ -9824,6 +9874,7 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
98249874
// `ChannelMonitor`.
98259875
let mut channel = FundedChannel {
98269876
funding: self.funding,
9877+
pending_funding: vec![],
98279878
context: self.context,
98289879
interactive_tx_signing_session: None,
98299880
is_v2_established: false,
@@ -10633,6 +10684,7 @@ impl<SP: Deref> Writeable for FundedChannel<SP> where SP::Target: SignerProvider
1063310684
(49, self.context.local_initiated_shutdown, option), // Added in 0.0.122
1063410685
(51, is_manual_broadcast, option), // Added in 0.0.124
1063510686
(53, funding_tx_broadcast_safe_event_emitted, option), // Added in 0.0.124
10687+
(54, self.pending_funding, optional_vec), // Added in 0.2
1063610688
(55, removed_htlc_failure_attribution_data, optional_vec), // Added in 0.2
1063710689
(57, holding_cell_failure_attribution_data, optional_vec), // Added in 0.2
1063810690
});
@@ -10862,7 +10914,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
1086210914
_ => return Err(DecodeError::InvalidValue),
1086310915
};
1086410916

10865-
let channel_parameters: ChannelTransactionParameters = ReadableArgs::<u64>::read(reader, channel_value_satoshis)?;
10917+
let channel_parameters: ChannelTransactionParameters = ReadableArgs::<Option<u64>>::read(reader, Some(channel_value_satoshis))?;
1086610918
let funding_transaction: Option<Transaction> = Readable::read(reader)?;
1086710919

1086810920
let counterparty_cur_commitment_point = Readable::read(reader)?;
@@ -10932,6 +10984,8 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
1093210984
let mut next_holder_commitment_point_opt: Option<PublicKey> = None;
1093310985
let mut is_manual_broadcast = None;
1093410986

10987+
let mut pending_funding = Some(Vec::new());
10988+
1093510989
read_tlv_fields!(reader, {
1093610990
(0, announcement_sigs, option),
1093710991
(1, minimum_depth, option),
@@ -10967,6 +11021,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
1096711021
(49, local_initiated_shutdown, option),
1096811022
(51, is_manual_broadcast, option),
1096911023
(53, funding_tx_broadcast_safe_event_emitted, option),
11024+
(54, pending_funding, optional_vec), // Added in 0.2
1097011025
(55, removed_htlc_failure_attribution_data, optional_vec),
1097111026
(57, holding_cell_failure_attribution_data, optional_vec),
1097211027
});
@@ -11142,6 +11197,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
1114211197
channel_transaction_parameters: channel_parameters,
1114311198
funding_transaction,
1114411199
},
11200+
pending_funding: pending_funding.unwrap(),
1114511201
context: ChannelContext {
1114611202
user_id,
1114711203

lightning/src/sign/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ impl_writeable_tlv_based!(DelayedPaymentOutputDescriptor, {
124124
(8, revocation_pubkey, required),
125125
(10, channel_keys_id, required),
126126
(12, channel_value_satoshis, required),
127-
(13, channel_transaction_parameters, (option: ReadableArgs, channel_value_satoshis.0.unwrap())),
127+
(13, channel_transaction_parameters, (option: ReadableArgs, Some(channel_value_satoshis.0.unwrap()))),
128128
});
129129

130130
pub(crate) const P2WPKH_WITNESS_WEIGHT: u64 = 1 /* num stack items */ +
@@ -199,7 +199,7 @@ impl_writeable_tlv_based!(StaticPaymentOutputDescriptor, {
199199
(2, output, required),
200200
(4, channel_keys_id, required),
201201
(6, channel_value_satoshis, required),
202-
(7, channel_transaction_parameters, (option: ReadableArgs, channel_value_satoshis.0.unwrap())),
202+
(7, channel_transaction_parameters, (option: ReadableArgs, Some(channel_value_satoshis.0.unwrap()))),
203203
});
204204

205205
/// Describes the necessary information to spend a spendable output.
@@ -559,7 +559,7 @@ pub struct ChannelDerivationParameters {
559559
impl_writeable_tlv_based!(ChannelDerivationParameters, {
560560
(0, value_satoshis, required),
561561
(2, keys_id, required),
562-
(4, transaction_parameters, (required: ReadableArgs, value_satoshis.0.unwrap())),
562+
(4, transaction_parameters, (required: ReadableArgs, Some(value_satoshis.0.unwrap()))),
563563
});
564564

565565
/// A descriptor used to sign for a commitment transaction's HTLC output.

0 commit comments

Comments
 (0)