Skip to content

Commit 1526b2b

Browse files
committed
Move ChannelContext::funding_tx_confirmation_height to FundingScope
When processing confirmed transactions, if the funding transaction is found then information about it in the ChannelContext is updated. In preparation for splicing, move this data to FundingScope.
1 parent b76dd17 commit 1526b2b

File tree

3 files changed

+61
-56
lines changed

3 files changed

+61
-56
lines changed

lightning/src/ln/channel.rs

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,6 +1687,7 @@ pub(super) struct FundingScope {
16871687
funding_transaction: Option<Transaction>,
16881688
/// The hash of the block in which the funding transaction was included.
16891689
funding_tx_confirmed_in: Option<BlockHash>,
1690+
funding_tx_confirmation_height: u32,
16901691
}
16911692

16921693
impl Writeable for FundingScope {
@@ -1698,6 +1699,7 @@ impl Writeable for FundingScope {
16981699
(7, self.channel_transaction_parameters, (required: ReadableArgs, None)),
16991700
(9, self.funding_transaction, option),
17001701
(11, self.funding_tx_confirmed_in, option),
1702+
(13, self.funding_tx_confirmation_height, required),
17011703
});
17021704
Ok(())
17031705
}
@@ -1711,6 +1713,7 @@ impl Readable for FundingScope {
17111713
let mut channel_transaction_parameters = RequiredWrapper(None);
17121714
let mut funding_transaction = None;
17131715
let mut funding_tx_confirmed_in = None;
1716+
let mut funding_tx_confirmation_height = RequiredWrapper(None);
17141717

17151718
read_tlv_fields!(reader, {
17161719
(1, value_to_self_msat, required),
@@ -1719,6 +1722,7 @@ impl Readable for FundingScope {
17191722
(7, channel_transaction_parameters, (required: ReadableArgs, None)),
17201723
(9, funding_transaction, option),
17211724
(11, funding_tx_confirmed_in, option),
1725+
(13, funding_tx_confirmation_height, required),
17221726
});
17231727

17241728
Ok(Self {
@@ -1732,6 +1736,7 @@ impl Readable for FundingScope {
17321736
channel_transaction_parameters: channel_transaction_parameters.0.unwrap(),
17331737
funding_transaction,
17341738
funding_tx_confirmed_in,
1739+
funding_tx_confirmation_height: funding_tx_confirmation_height.0.unwrap(),
17351740
#[cfg(any(test, fuzzing))]
17361741
next_local_commitment_tx_fee_info_cached: Mutex::new(None),
17371742
#[cfg(any(test, fuzzing))]
@@ -1805,6 +1810,26 @@ impl FundingScope {
18051810
pub fn get_channel_type(&self) -> &ChannelTypeFeatures {
18061811
&self.channel_transaction_parameters.channel_type_features
18071812
}
1813+
1814+
/// Returns the height in which our funding transaction was confirmed.
1815+
pub fn get_funding_tx_confirmation_height(&self) -> Option<u32> {
1816+
let conf_height = self.funding_tx_confirmation_height;
1817+
if conf_height > 0 {
1818+
Some(conf_height)
1819+
} else {
1820+
None
1821+
}
1822+
}
1823+
1824+
/// Returns the current number of confirmations on the funding transaction.
1825+
pub fn get_funding_tx_confirmations(&self, height: u32) -> u32 {
1826+
if self.funding_tx_confirmation_height == 0 {
1827+
// We either haven't seen any confirmation yet, or observed a reorg.
1828+
return 0;
1829+
}
1830+
1831+
height.checked_sub(self.funding_tx_confirmation_height).map_or(0, |c| c + 1)
1832+
}
18081833
}
18091834

18101835
/// Info about a pending splice, used in the pre-splice channel
@@ -1964,7 +1989,6 @@ pub(super) struct ChannelContext<SP: Deref> where SP::Target: SignerProvider {
19641989
/// milliseconds, so any accidental force-closes here should be exceedingly rare.
19651990
expecting_peer_commitment_signed: bool,
19661991

1967-
funding_tx_confirmation_height: u32,
19681992
short_channel_id: Option<u64>,
19691993
/// Either the height at which this channel was created or the height at which it was last
19701994
/// serialized if it was serialized by versions prior to 0.0.103.
@@ -2775,6 +2799,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
27752799
},
27762800
funding_transaction: None,
27772801
funding_tx_confirmed_in: None,
2802+
funding_tx_confirmation_height: 0,
27782803
};
27792804
let channel_context = ChannelContext {
27802805
user_id,
@@ -2838,7 +2863,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
28382863
closing_fee_limits: None,
28392864
target_closing_feerate_sats_per_kw: None,
28402865

2841-
funding_tx_confirmation_height: 0,
28422866
short_channel_id: None,
28432867
channel_creation_height: current_chain_height,
28442868

@@ -3011,6 +3035,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
30113035
},
30123036
funding_transaction: None,
30133037
funding_tx_confirmed_in: None,
3038+
funding_tx_confirmation_height: 0,
30143039
};
30153040
let channel_context = Self {
30163041
user_id,
@@ -3072,7 +3097,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
30723097
closing_fee_limits: None,
30733098
target_closing_feerate_sats_per_kw: None,
30743099

3075-
funding_tx_confirmation_height: 0,
30763100
short_channel_id: None,
30773101
channel_creation_height: current_chain_height,
30783102

@@ -3314,16 +3338,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
33143338
self.outbound_scid_alias = outbound_scid_alias;
33153339
}
33163340

3317-
/// Returns the height in which our funding transaction was confirmed.
3318-
pub fn get_funding_tx_confirmation_height(&self) -> Option<u32> {
3319-
let conf_height = self.funding_tx_confirmation_height;
3320-
if conf_height > 0 {
3321-
Some(conf_height)
3322-
} else {
3323-
None
3324-
}
3325-
}
3326-
33273341
/// Performs checks against necessary constraints after receiving either an `accept_channel` or
33283342
/// `accept_channel2` message.
33293343
pub fn do_accept_channel_checks(
@@ -3464,16 +3478,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
34643478
Ok(())
34653479
}
34663480

3467-
/// Returns the current number of confirmations on the funding transaction.
3468-
pub fn get_funding_tx_confirmations(&self, height: u32) -> u32 {
3469-
if self.funding_tx_confirmation_height == 0 {
3470-
// We either haven't seen any confirmation yet, or observed a reorg.
3471-
return 0;
3472-
}
3473-
3474-
height.checked_sub(self.funding_tx_confirmation_height).map_or(0, |c| c + 1)
3475-
}
3476-
34773481
/// Allowed in any state (including after shutdown)
34783482
pub fn get_counterparty_node_id(&self) -> PublicKey {
34793483
self.counterparty_node_id
@@ -6735,7 +6739,7 @@ impl<SP: Deref> FundedChannel<SP> where
67356739
matches!(self.context.channel_state, ChannelState::ChannelReady(_)))
67366740
{
67376741
// Broadcast only if not yet confirmed
6738-
if self.context.get_funding_tx_confirmation_height().is_none() {
6742+
if self.funding.get_funding_tx_confirmation_height().is_none() {
67396743
funding_broadcastable = Some(funding_transaction.clone())
67406744
}
67416745
}
@@ -8071,13 +8075,13 @@ impl<SP: Deref> FundedChannel<SP> where
80718075
// Called:
80728076
// * always when a new block/transactions are confirmed with the new height
80738077
// * when funding is signed with a height of 0
8074-
if self.context.funding_tx_confirmation_height == 0 && self.context.minimum_depth != Some(0) {
8078+
if self.funding.funding_tx_confirmation_height == 0 && self.context.minimum_depth != Some(0) {
80758079
return None;
80768080
}
80778081

8078-
let funding_tx_confirmations = height as i64 - self.context.funding_tx_confirmation_height as i64 + 1;
8082+
let funding_tx_confirmations = height as i64 - self.funding.funding_tx_confirmation_height as i64 + 1;
80798083
if funding_tx_confirmations <= 0 {
8080-
self.context.funding_tx_confirmation_height = 0;
8084+
self.funding.funding_tx_confirmation_height = 0;
80818085
}
80828086

80838087
if funding_tx_confirmations < self.context.minimum_depth.unwrap_or(0) as i64 {
@@ -8097,7 +8101,7 @@ impl<SP: Deref> FundedChannel<SP> where
80978101
// We got a reorg but not enough to trigger a force close, just ignore.
80988102
false
80998103
} else {
8100-
if self.context.funding_tx_confirmation_height != 0 &&
8104+
if self.funding.funding_tx_confirmation_height != 0 &&
81018105
self.context.channel_state < ChannelState::ChannelReady(ChannelReadyFlags::new())
81028106
{
81038107
// We should never see a funding transaction on-chain until we've received
@@ -8165,7 +8169,7 @@ impl<SP: Deref> FundedChannel<SP> where
81658169
for &(index_in_block, tx) in txdata.iter() {
81668170
// Check if the transaction is the expected funding transaction, and if it is,
81678171
// check that it pays the right amount to the right script.
8168-
if self.context.funding_tx_confirmation_height == 0 {
8172+
if self.funding.funding_tx_confirmation_height == 0 {
81698173
if tx.compute_txid() == funding_txo.txid {
81708174
let txo_idx = funding_txo.index as usize;
81718175
if txo_idx >= tx.output.len() || tx.output[txo_idx].script_pubkey != self.funding.get_funding_redeemscript().to_p2wsh() ||
@@ -8195,7 +8199,8 @@ impl<SP: Deref> FundedChannel<SP> where
81958199
}
81968200
}
81978201
}
8198-
self.context.funding_tx_confirmation_height = height;
8202+
8203+
self.funding.funding_tx_confirmation_height = height;
81998204
self.funding.funding_tx_confirmed_in = Some(*block_hash);
82008205
self.context.short_channel_id = match scid_from_parts(height as u64, index_in_block as u64, txo_idx as u64) {
82018206
Ok(scid) => Some(scid),
@@ -8289,8 +8294,8 @@ impl<SP: Deref> FundedChannel<SP> where
82898294

82908295
if matches!(self.context.channel_state, ChannelState::ChannelReady(_)) ||
82918296
self.context.channel_state.is_our_channel_ready() {
8292-
let mut funding_tx_confirmations = height as i64 - self.context.funding_tx_confirmation_height as i64 + 1;
8293-
if self.context.funding_tx_confirmation_height == 0 {
8297+
let mut funding_tx_confirmations = height as i64 - self.funding.funding_tx_confirmation_height as i64 + 1;
8298+
if self.funding.funding_tx_confirmation_height == 0 {
82948299
// Note that check_get_channel_ready may reset funding_tx_confirmation_height to
82958300
// zero if it has been reorged out, however in either case, our state flags
82968301
// indicate we've already sent a channel_ready
@@ -8330,10 +8335,10 @@ impl<SP: Deref> FundedChannel<SP> where
83308335
/// force-close the channel, but may also indicate a harmless reorganization of a block or two
83318336
/// before the channel has reached channel_ready and we can just wait for more blocks.
83328337
pub fn funding_transaction_unconfirmed<L: Deref>(&mut self, logger: &L) -> Result<(), ClosureReason> where L::Target: Logger {
8333-
if self.context.funding_tx_confirmation_height != 0 {
8338+
if self.funding.funding_tx_confirmation_height != 0 {
83348339
// We handle the funding disconnection by calling best_block_updated with a height one
83358340
// below where our funding was connected, implying a reorg back to conf_height - 1.
8336-
let reorg_height = self.context.funding_tx_confirmation_height - 1;
8341+
let reorg_height = self.funding.funding_tx_confirmation_height - 1;
83378342
// We use the time field to bump the current time we set on channel updates if its
83388343
// larger. If we don't know that time has moved forward, we can just set it to the last
83398344
// time we saw and it will be ignored.
@@ -8406,7 +8411,7 @@ impl<SP: Deref> FundedChannel<SP> where
84068411
NS::Target: NodeSigner,
84078412
L::Target: Logger
84088413
{
8409-
if self.context.funding_tx_confirmation_height == 0 || self.context.funding_tx_confirmation_height + 5 > best_block_height {
8414+
if self.funding.funding_tx_confirmation_height == 0 || self.funding.funding_tx_confirmation_height + 5 > best_block_height {
84108415
return None;
84118416
}
84128417

@@ -8527,7 +8532,7 @@ impl<SP: Deref> FundedChannel<SP> where
85278532
}
85288533

85298534
self.context.announcement_sigs = Some((msg.node_signature, msg.bitcoin_signature));
8530-
if self.context.funding_tx_confirmation_height == 0 || self.context.funding_tx_confirmation_height + 5 > best_block_height {
8535+
if self.funding.funding_tx_confirmation_height == 0 || self.funding.funding_tx_confirmation_height + 5 > best_block_height {
85318536
return Err(ChannelError::Ignore(
85328537
"Got announcement_signatures prior to the required six confirmations - we may not have received a block yet that our peer has".to_owned()));
85338538
}
@@ -8540,7 +8545,7 @@ impl<SP: Deref> FundedChannel<SP> where
85408545
pub fn get_signed_channel_announcement<NS: Deref>(
85418546
&self, node_signer: &NS, chain_hash: ChainHash, best_block_height: u32, user_config: &UserConfig
85428547
) -> Option<msgs::ChannelAnnouncement> where NS::Target: NodeSigner {
8543-
if self.context.funding_tx_confirmation_height == 0 || self.context.funding_tx_confirmation_height + 5 > best_block_height {
8548+
if self.funding.funding_tx_confirmation_height == 0 || self.funding.funding_tx_confirmation_height + 5 > best_block_height {
85448549
return None;
85458550
}
85468551
let announcement = match self.get_channel_announcement(node_signer, chain_hash, user_config) {
@@ -10695,7 +10700,7 @@ impl<SP: Deref> Writeable for FundedChannel<SP> where SP::Target: SignerProvider
1069510700
0u8.write(writer)?;
1069610701

1069710702
self.funding.funding_tx_confirmed_in.write(writer)?;
10698-
self.context.funding_tx_confirmation_height.write(writer)?;
10703+
self.funding.funding_tx_confirmation_height.write(writer)?;
1069910704
self.context.short_channel_id.write(writer)?;
1070010705

1070110706
self.context.counterparty_dust_limit_satoshis.write(writer)?;
@@ -11331,6 +11336,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
1133111336
channel_transaction_parameters: channel_parameters,
1133211337
funding_transaction,
1133311338
funding_tx_confirmed_in,
11339+
funding_tx_confirmation_height,
1133411340
},
1133511341
pending_funding: pending_funding.unwrap(),
1133611342
context: ChannelContext {
@@ -11394,7 +11400,6 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
1139411400
closing_fee_limits: None,
1139511401
target_closing_feerate_sats_per_kw,
1139611402

11397-
funding_tx_confirmation_height,
1139811403
short_channel_id,
1139911404
channel_creation_height,
1140011405

lightning/src/ln/channel_state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ impl ChannelDetails {
532532
next_outbound_htlc_minimum_msat: balance.next_outbound_htlc_minimum_msat,
533533
user_channel_id: context.get_user_id(),
534534
confirmations_required: context.minimum_depth(),
535-
confirmations: Some(context.get_funding_tx_confirmations(best_block_height)),
535+
confirmations: Some(funding.get_funding_tx_confirmations(best_block_height)),
536536
force_close_spend_delay: funding.get_counterparty_selected_contest_delay(),
537537
is_outbound: funding.is_outbound(),
538538
is_channel_ready: context.is_usable(),

0 commit comments

Comments
 (0)