Skip to content

Commit 19daccf

Browse files
committed
Introduce internal package ID to track pending claims
Now that our txids will no longer be stable for package claims that require external funds to be allocated, we transition to a 32-byte array identifier to remain compatible with them.
1 parent 1533c77 commit 19daccf

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

lightning/src/chain/onchaintx.rs

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,9 @@ pub(crate) enum OnchainClaim {
198198
Event(ClaimEvent),
199199
}
200200

201+
/// An internal identifier to track pending package claims within the `OnchainTxHandler`.
202+
type PackageID = [u8; 32];
203+
201204
/// OnchainTxHandler receives claiming requests, aggregates them if it's sound, broadcast and
202205
/// do RBF bumping if possible.
203206
pub struct OnchainTxHandler<ChannelSigner: Sign> {
@@ -225,11 +228,11 @@ pub struct OnchainTxHandler<ChannelSigner: Sign> {
225228
// us and is immutable until all outpoint of the claimable set are post-anti-reorg-delay solved.
226229
// Entry is cache of elements need to generate a bumped claiming transaction (see ClaimTxBumpMaterial)
227230
#[cfg(test)] // Used in functional_test to verify sanitization
228-
pub(crate) pending_claim_requests: HashMap<Txid, PackageTemplate>,
231+
pub(crate) pending_claim_requests: HashMap<PackageID, PackageTemplate>,
229232
#[cfg(not(test))]
230-
pending_claim_requests: HashMap<Txid, PackageTemplate>,
233+
pending_claim_requests: HashMap<PackageID, PackageTemplate>,
231234
#[cfg(anchors)]
232-
pending_claim_events: HashMap<Txid, ClaimEvent>,
235+
pending_claim_events: HashMap<PackageID, ClaimEvent>,
233236

234237
// Used to link outpoints claimed in a connected block to a pending claim request.
235238
// Key is outpoint than monitor parsing has detected we have keys/scripts to claim
@@ -238,9 +241,9 @@ pub struct OnchainTxHandler<ChannelSigner: Sign> {
238241
// post-anti-reorg-delay solved, confirmaiton_block is used to erase entry if
239242
// block with output gets disconnected.
240243
#[cfg(test)] // Used in functional_test to verify sanitization
241-
pub claimable_outpoints: HashMap<BitcoinOutPoint, (Txid, u32)>,
244+
pub claimable_outpoints: HashMap<BitcoinOutPoint, (PackageID, u32)>,
242245
#[cfg(not(test))]
243-
claimable_outpoints: HashMap<BitcoinOutPoint, (Txid, u32)>,
246+
claimable_outpoints: HashMap<BitcoinOutPoint, (PackageID, u32)>,
244247

245248
locktimed_packages: BTreeMap<u32, Vec<PackageTemplate>>,
246249

@@ -462,7 +465,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
462465
// since requests can have outpoints split off.
463466
if !self.onchain_events_awaiting_threshold_conf.iter()
464467
.any(|event_entry| if let OnchainEvent::Claim { claim_request } = event_entry.event {
465-
first_claim_txid_height.0 == claim_request
468+
first_claim_txid_height.0 == claim_request.into_inner()
466469
} else {
467470
// The onchain event is not a claim, keep seeking until we find one.
468471
false
@@ -628,27 +631,28 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
628631
if let Some((new_timer, new_feerate, claim)) = self.generate_claim(cur_height, &req, &*fee_estimator, &*logger) {
629632
req.set_timer(new_timer);
630633
req.set_feerate(new_feerate);
631-
let txid = match claim {
634+
let package_id = match claim {
632635
OnchainClaim::Tx(tx) => {
633636
log_info!(logger, "Broadcasting onchain {}", log_tx!(tx));
634637
broadcaster.broadcast_transaction(&tx);
635-
tx.txid()
638+
tx.txid().into_inner()
636639
},
637640
#[cfg(anchors)]
638641
OnchainClaim::Event(claim_event) => {
639642
log_info!(logger, "Yielding onchain event to spend inputs {:?}", req.outpoints());
640643
let txid = match claim_event {
641644
ClaimEvent::BumpCommitment { ref commitment_tx, .. } => commitment_tx.txid(),
642645
};
643-
self.pending_claim_events.insert(txid, claim_event);
644-
txid
646+
let package_id = txid.into_inner();
647+
self.pending_claim_events.insert(package_id, claim_event);
648+
package_id
645649
},
646650
};
647651
for k in req.outpoints() {
648652
log_info!(logger, "Registering claiming request for {}:{}", k.txid, k.vout);
649-
self.claimable_outpoints.insert(k.clone(), (txid, conf_height));
653+
self.claimable_outpoints.insert(k.clone(), (package_id, conf_height));
650654
}
651-
self.pending_claim_requests.insert(txid, req);
655+
self.pending_claim_requests.insert(package_id, req);
652656
}
653657
}
654658
}
@@ -698,7 +702,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
698702
txid: tx.txid(),
699703
height: conf_height,
700704
block_hash: Some(conf_hash),
701-
event: OnchainEvent::Claim { claim_request: first_claim_txid_height.0.clone() }
705+
event: OnchainEvent::Claim { claim_request: Txid::from_inner(first_claim_txid_height.0) }
702706
};
703707
if !self.onchain_events_awaiting_threshold_conf.contains(&entry) {
704708
self.onchain_events_awaiting_threshold_conf.push(entry);
@@ -754,14 +758,15 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
754758
if entry.has_reached_confirmation_threshold(cur_height) {
755759
match entry.event {
756760
OnchainEvent::Claim { claim_request } => {
761+
let package_id = claim_request.into_inner();
757762
// We may remove a whole set of claim outpoints here, as these one may have
758763
// been aggregated in a single tx and claimed so atomically
759-
if let Some(request) = self.pending_claim_requests.remove(&claim_request) {
764+
if let Some(request) = self.pending_claim_requests.remove(&package_id) {
760765
for outpoint in request.outpoints() {
761766
log_debug!(logger, "Removing claim tracking for {} due to maturation of claim tx {}.", outpoint, claim_request);
762767
self.claimable_outpoints.remove(&outpoint);
763768
#[cfg(anchors)]
764-
self.pending_claim_events.remove(&claim_request);
769+
self.pending_claim_events.remove(&package_id);
765770
}
766771
}
767772
},

0 commit comments

Comments
 (0)