Skip to content

Commit 41eeb00

Browse files
committed
Optimize check_spend_remote HTLC a tad by avoiding indirections
Instead of hopping a pointer, we're only ever going to return one Transaction at max, so skip the Vec. Also avoid re-pubkey-converting the revocation key.
1 parent 383bd90 commit 41eeb00

File tree

1 file changed

+11
-13
lines changed

1 file changed

+11
-13
lines changed

src/ln/channelmonitor.rs

+11-13
Original file line numberDiff line numberDiff line change
@@ -1210,35 +1210,32 @@ impl ChannelMonitor {
12101210
}
12111211

12121212
/// Attempst to claim a remote HTLC-Success/HTLC-Timeout s outputs using the revocation key
1213-
fn check_spend_remote_htlc(&self, tx: &Transaction, commitment_number: u64) -> Vec<Transaction> {
1214-
let mut txn_to_broadcast = Vec::new();
1215-
1213+
fn check_spend_remote_htlc(&self, tx: &Transaction, commitment_number: u64) -> Option<Transaction> {
12161214
let htlc_txid = tx.txid(); //TODO: This is gonna be a performance bottleneck for watchtowers!
12171215

12181216
macro_rules! ignore_error {
12191217
( $thing : expr ) => {
12201218
match $thing {
12211219
Ok(a) => a,
1222-
Err(_) => return txn_to_broadcast
1220+
Err(_) => return None
12231221
}
12241222
};
12251223
}
12261224

12271225
let secret = self.get_secret(commitment_number).unwrap();
12281226
let per_commitment_key = ignore_error!(SecretKey::from_slice(&self.secp_ctx, &secret));
1227+
let per_commitment_point = PublicKey::from_secret_key(&self.secp_ctx, &per_commitment_key);
12291228
let revocation_pubkey = match self.key_storage {
12301229
KeyStorage::PrivMode { ref revocation_base_key, .. } => {
1231-
let per_commitment_point = PublicKey::from_secret_key(&self.secp_ctx, &per_commitment_key);
12321230
ignore_error!(chan_utils::derive_public_revocation_key(&self.secp_ctx, &per_commitment_point, &PublicKey::from_secret_key(&self.secp_ctx, &revocation_base_key)))
12331231
},
12341232
KeyStorage::SigsMode { ref revocation_base_key, .. } => {
1235-
let per_commitment_point = PublicKey::from_secret_key(&self.secp_ctx, &per_commitment_key);
12361233
ignore_error!(chan_utils::derive_public_revocation_key(&self.secp_ctx, &per_commitment_point, &revocation_base_key))
12371234
},
12381235
};
12391236
let delayed_key = match self.their_delayed_payment_base_key {
1240-
None => return txn_to_broadcast,
1241-
Some(their_delayed_payment_base_key) => ignore_error!(chan_utils::derive_public_key(&self.secp_ctx, &PublicKey::from_secret_key(&self.secp_ctx, &per_commitment_key), &their_delayed_payment_base_key)),
1237+
None => return None,
1238+
Some(their_delayed_payment_base_key) => ignore_error!(chan_utils::derive_public_key(&self.secp_ctx, &per_commitment_point, &their_delayed_payment_base_key)),
12421239
};
12431240
let redeemscript = chan_utils::get_revokeable_redeemscript(&revocation_pubkey, self.their_to_self_delay.unwrap(), &delayed_key);
12441241
let revokeable_p2wsh = redeemscript.to_v0_p2wsh();
@@ -1290,9 +1287,8 @@ impl ChannelMonitor {
12901287
spend_tx.input[0].witness.push(vec!(1));
12911288
spend_tx.input[0].witness.push(redeemscript.into_bytes());
12921289

1293-
txn_to_broadcast.push(spend_tx);
1294-
}
1295-
txn_to_broadcast
1290+
Some(spend_tx)
1291+
} else { None }
12961292
}
12971293

12981294
fn broadcast_by_local_state(&self, local_tx: &LocalSignedTx) -> Vec<Transaction> {
@@ -1369,8 +1365,10 @@ impl ChannelMonitor {
13691365
}
13701366
} else {
13711367
let remote_commitment_txn_on_chain = self.remote_commitment_txn_on_chain.lock().unwrap();
1372-
for commitment_number in remote_commitment_txn_on_chain.get(&txin.previous_output.txid) {
1373-
txn = self.check_spend_remote_htlc(tx, *commitment_number);
1368+
if let Some(commitment_number) = remote_commitment_txn_on_chain.get(&prevout.txid) {
1369+
if let Some(tx) = self.check_spend_remote_htlc(tx, *commitment_number) {
1370+
txn.push(tx);
1371+
}
13741372
}
13751373
}
13761374
for tx in txn.iter() {

0 commit comments

Comments
 (0)