Skip to content

Commit d6b4292

Browse files
author
Antoine Riard
committed
Underscore TxCreationKeys ownership
A TxCreationKeys set represents the key which will be embedded in output scripts of a party's commitment tx state. Among them there is a always a key belonging to counter-party, the HTLC pubkey. To dissociate strongly, prefix keys with broadcaster/countersignatory. A revocation keypair is attributed to the broadcaster as it's used to punish a fraudulent broadcast while minding that such keypair derivation method will be always used by countersignatory as it's its task to enforce punishement thanks to the release secret.
1 parent 463718f commit d6b4292

File tree

7 files changed

+44
-42
lines changed

7 files changed

+44
-42
lines changed

lightning/src/chain/keysinterface.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ impl ChannelKeys for InMemoryChannelKeys {
485485
let mut htlc_sigs = Vec::with_capacity(htlcs.len());
486486
for ref htlc in htlcs {
487487
if let Some(_) = htlc.transaction_output_index {
488-
let htlc_tx = chan_utils::build_htlc_transaction(&commitment_txid, feerate_per_kw, accepted_data.locally_selected_contest_delay, htlc, &keys.delayed_payment_key, &keys.revocation_key);
488+
let htlc_tx = chan_utils::build_htlc_transaction(&commitment_txid, feerate_per_kw, accepted_data.locally_selected_contest_delay, htlc, &keys.broadcaster_delayed_payment_key, &keys.revocation_key);
489489
let htlc_redeemscript = chan_utils::get_htlc_redeemscript(&htlc, &keys);
490490
let htlc_sighash = hash_to_message!(&bip143::SigHashCache::new(&htlc_tx).signature_hash(0, &htlc_redeemscript, htlc.amount_msat / 1000, SigHashType::All)[..]);
491491
let our_htlc_key = match chan_utils::derive_private_key(&secp_ctx, &keys.per_commitment_point, &self.htlc_base_key) {

lightning/src/ln/chan_utils.rs

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -217,32 +217,33 @@ pub fn derive_public_key<T: secp256k1::Signing>(secp_ctx: &Secp256k1<T>, per_com
217217

218218
/// Derives a per-commitment-transaction revocation key from its constituent parts.
219219
///
220+
/// Only the cheating participant owns a valid witness to propagate a revoked
221+
/// commitment transaction, thus per_commitment_secret always come from cheater
222+
/// and revocation_base_secret always come from punisher, which is the broadcaster
223+
/// of the transaction spending with this key knowledge.
224+
///
220225
/// Note that this is infallible iff we trust that at least one of the two input keys are randomly
221226
/// generated (ie our own).
222-
pub fn derive_private_revocation_key<T: secp256k1::Signing>(secp_ctx: &Secp256k1<T>, per_commitment_secret: &SecretKey, revocation_base_secret: &SecretKey) -> Result<SecretKey, secp256k1::Error> {
223-
let revocation_base_point = PublicKey::from_secret_key(&secp_ctx, &revocation_base_secret);
227+
pub fn derive_private_revocation_key<T: secp256k1::Signing>(secp_ctx: &Secp256k1<T>, per_commitment_secret: &SecretKey, countersignatory_revocation_base_secret: &SecretKey) -> Result<SecretKey, secp256k1::Error> {
228+
let countersignatory_revocation_base_point = PublicKey::from_secret_key(&secp_ctx, &countersignatory_revocation_base_secret);
224229
let per_commitment_point = PublicKey::from_secret_key(&secp_ctx, &per_commitment_secret);
225230

226231
let rev_append_commit_hash_key = {
227232
let mut sha = Sha256::engine();
228-
sha.input(&revocation_base_point.serialize());
233+
sha.input(&countersignatory_revocation_base_point.serialize());
229234
sha.input(&per_commitment_point.serialize());
230235

231236
Sha256::from_engine(sha).into_inner()
232237
};
233238
let commit_append_rev_hash_key = {
234239
let mut sha = Sha256::engine();
235240
sha.input(&per_commitment_point.serialize());
236-
sha.input(&revocation_base_point.serialize());
241+
sha.input(&countersignatory_revocation_base_point.serialize());
237242

238243
Sha256::from_engine(sha).into_inner()
239244
};
240245

241-
// Only the transaction broadcaster owns a valid witness to propagate
242-
// a revoked commitment transaction, thus per_commitment_secret always
243-
// come from broadcaster and revocation_base_secret always come
244-
// from countersignatory of the transaction.
245-
let mut countersignatory_contrib = revocation_base_secret.clone();
246+
let mut countersignatory_contrib = countersignatory_revocation_base_secret.clone();
246247
countersignatory_contrib.mul_assign(&rev_append_commit_hash_key)?;
247248
let mut broadcaster_contrib = per_commitment_secret.clone();
248249
broadcaster_contrib.mul_assign(&commit_append_rev_hash_key)?;
@@ -254,29 +255,30 @@ pub fn derive_private_revocation_key<T: secp256k1::Signing>(secp_ctx: &Secp256k1
254255
/// the public equivalend of derive_private_revocation_key - using only public keys to derive a
255256
/// public key instead of private keys.
256257
///
258+
/// Only the cheating participant owns a valid witness to propagate a revoked
259+
/// commitment transaction, thus per_commitment_point always come from cheater
260+
/// and revocation_base_point always come from punisher, which is the broadcaster
261+
/// of the transaction spending with this key knowledge.
262+
///
257263
/// Note that this is infallible iff we trust that at least one of the two input keys are randomly
258264
/// generated (ie our own).
259-
pub fn derive_public_revocation_key<T: secp256k1::Verification>(secp_ctx: &Secp256k1<T>, per_commitment_point: &PublicKey, revocation_base_point: &PublicKey) -> Result<PublicKey, secp256k1::Error> {
265+
pub fn derive_public_revocation_key<T: secp256k1::Verification>(secp_ctx: &Secp256k1<T>, per_commitment_point: &PublicKey, countersignatory_revocation_base_point: &PublicKey) -> Result<PublicKey, secp256k1::Error> {
260266
let rev_append_commit_hash_key = {
261267
let mut sha = Sha256::engine();
262-
sha.input(&revocation_base_point.serialize());
268+
sha.input(&countersignatory_revocation_base_point.serialize());
263269
sha.input(&per_commitment_point.serialize());
264270

265271
Sha256::from_engine(sha).into_inner()
266272
};
267273
let commit_append_rev_hash_key = {
268274
let mut sha = Sha256::engine();
269275
sha.input(&per_commitment_point.serialize());
270-
sha.input(&revocation_base_point.serialize());
276+
sha.input(&countersignatory_revocation_base_point.serialize());
271277

272278
Sha256::from_engine(sha).into_inner()
273279
};
274280

275-
// Only the transaction broadcaster owns a valid witness to propagate
276-
// a revoked commitment transaction, thus per_commitment_point always
277-
// come from broadcaster and revocation_base_point always come
278-
// from countersignatory of the transaction.
279-
let mut countersignatory_contrib = revocation_base_point.clone();
281+
let mut countersignatory_contrib = countersignatory_revocation_base_point.clone();
280282
countersignatory_contrib.mul_assign(&secp_ctx, &rev_append_commit_hash_key)?;
281283
let mut broadcaster_contrib = per_commitment_point.clone();
282284
broadcaster_contrib.mul_assign(&secp_ctx, &commit_append_rev_hash_key)?;
@@ -298,7 +300,7 @@ pub fn derive_public_revocation_key<T: secp256k1::Verification>(secp_ctx: &Secp2
298300
pub struct TxCreationKeys {
299301
/// The broadcaster's per-commitment public key which was used to derive the other keys.
300302
pub per_commitment_point: PublicKey,
301-
/// The broadcaster's revocation key which is used to allow the broadcaster of the commitment
303+
/// The revocation key which is used to allow the broadcaster of the commitment
302304
/// transaction to provide their counterparty the ability to punish them if they broadcast
303305
/// an old state.
304306
pub revocation_key: PublicKey,
@@ -307,10 +309,10 @@ pub struct TxCreationKeys {
307309
/// Countersignatory's HTLC Key
308310
pub countersignatory_htlc_key: PublicKey,
309311
/// Broadcaster's Payment Key (which isn't allowed to be spent from for some delay)
310-
pub delayed_payment_key: PublicKey,
312+
pub broadcaster_delayed_payment_key: PublicKey,
311313
}
312314
impl_writeable!(TxCreationKeys, 33*6,
313-
{ per_commitment_point, revocation_key, broadcaster_htlc_key, countersignatory_htlc_key, delayed_payment_key });
315+
{ per_commitment_point, revocation_key, broadcaster_htlc_key, countersignatory_htlc_key, broadcaster_delayed_payment_key });
314316

315317
/// The per-commitment point and a set of pre-calculated public keys used for transaction creation
316318
/// in the signer.
@@ -377,22 +379,22 @@ impl TxCreationKeys {
377379
revocation_key: derive_public_revocation_key(&secp_ctx, &per_commitment_point, &countersignatory_revocation_base)?,
378380
broadcaster_htlc_key: derive_public_key(&secp_ctx, &per_commitment_point, &broadcaster_htlc_base)?,
379381
countersignatory_htlc_key: derive_public_key(&secp_ctx, &per_commitment_point, &countersignatory_htlc_base)?,
380-
delayed_payment_key: derive_public_key(&secp_ctx, &per_commitment_point, &broadcaster_delayed_payment_base)?,
382+
broadcaster_delayed_payment_key: derive_public_key(&secp_ctx, &per_commitment_point, &broadcaster_delayed_payment_base)?,
381383
})
382384
}
383385
}
384386

385387
/// A script either spendable by the revocation
386-
/// key or the delayed_payment_key and satisfying the relative-locktime OP_CSV constrain.
388+
/// key or the broadcaster_delayed_payment_key and satisfying the relative-locktime OP_CSV constrain.
387389
/// Encumbering a `to_local` output on a commitment transaction or 2nd-stage HTLC transactions.
388-
pub fn get_revokeable_redeemscript(revocation_key: &PublicKey, contest_delay: u16, delayed_payment_key: &PublicKey) -> Script {
390+
pub fn get_revokeable_redeemscript(revocation_key: &PublicKey, contest_delay: u16, broadcaster_delayed_payment_key: &PublicKey) -> Script {
389391
Builder::new().push_opcode(opcodes::all::OP_IF)
390392
.push_slice(&revocation_key.serialize())
391393
.push_opcode(opcodes::all::OP_ELSE)
392394
.push_int(contest_delay as i64)
393395
.push_opcode(opcodes::all::OP_CSV)
394396
.push_opcode(opcodes::all::OP_DROP)
395-
.push_slice(&delayed_payment_key.serialize())
397+
.push_slice(&broadcaster_delayed_payment_key.serialize())
396398
.push_opcode(opcodes::all::OP_ENDIF)
397399
.push_opcode(opcodes::all::OP_CHECKSIG)
398400
.into_script()
@@ -428,12 +430,12 @@ impl_writeable!(HTLCOutputInCommitment, 1 + 8 + 4 + 32 + 5, {
428430
});
429431

430432
#[inline]
431-
pub(crate) fn get_htlc_redeemscript_with_explicit_keys(htlc: &HTLCOutputInCommitment, broadcaster_htlc_key: &PublicKey, countersignatory_htlc_key: &PublicKey, revocation_key: &PublicKey) -> Script {
433+
pub(crate) fn get_htlc_redeemscript_with_explicit_keys(htlc: &HTLCOutputInCommitment, broadcaster_htlc_key: &PublicKey, countersignatory_htlc_key: &PublicKey, broadcaster_revocation_key: &PublicKey) -> Script {
432434
let payment_hash160 = Ripemd160::hash(&htlc.payment_hash.0[..]).into_inner();
433435
if htlc.offered {
434436
Builder::new().push_opcode(opcodes::all::OP_DUP)
435437
.push_opcode(opcodes::all::OP_HASH160)
436-
.push_slice(&PubkeyHash::hash(&revocation_key.serialize())[..])
438+
.push_slice(&PubkeyHash::hash(&broadcaster_revocation_key.serialize())[..])
437439
.push_opcode(opcodes::all::OP_EQUAL)
438440
.push_opcode(opcodes::all::OP_IF)
439441
.push_opcode(opcodes::all::OP_CHECKSIG)
@@ -461,7 +463,7 @@ pub(crate) fn get_htlc_redeemscript_with_explicit_keys(htlc: &HTLCOutputInCommit
461463
} else {
462464
Builder::new().push_opcode(opcodes::all::OP_DUP)
463465
.push_opcode(opcodes::all::OP_HASH160)
464-
.push_slice(&PubkeyHash::hash(&revocation_key.serialize())[..])
466+
.push_slice(&PubkeyHash::hash(&broadcaster_revocation_key.serialize())[..])
465467
.push_opcode(opcodes::all::OP_EQUAL)
466468
.push_opcode(opcodes::all::OP_IF)
467469
.push_opcode(opcodes::all::OP_CHECKSIG)
@@ -492,7 +494,7 @@ pub(crate) fn get_htlc_redeemscript_with_explicit_keys(htlc: &HTLCOutputInCommit
492494
}
493495
}
494496

495-
/// note here that 'revocation_key' is generated using countersignatory_revocation_basepoint and broadcaster's
497+
/// note here that 'broadcaster_revocation_key' is generated using countersignatory_revocation_basepoint and broadcaster's
496498
/// commitment secret. 'htlc' does *not* need to have its previous_output_index filled.
497499
#[inline]
498500
pub fn get_htlc_redeemscript(htlc: &HTLCOutputInCommitment, keys: &TxCreationKeys) -> Script {
@@ -516,7 +518,7 @@ pub fn make_funding_redeemscript(broadcaster: &PublicKey, countersignatory: &Pub
516518
}
517519

518520
/// panics if htlc.transaction_output_index.is_none()!
519-
pub fn build_htlc_transaction(prev_hash: &Txid, feerate_per_kw: u32, contest_delay: u16, htlc: &HTLCOutputInCommitment, delayed_payment_key: &PublicKey, revocation_key: &PublicKey) -> Transaction {
521+
pub fn build_htlc_transaction(prev_hash: &Txid, feerate_per_kw: u32, contest_delay: u16, htlc: &HTLCOutputInCommitment, broadcaster_delayed_payment_key: &PublicKey, broadcaster_revocation_key: &PublicKey) -> Transaction {
520522
let mut txins: Vec<TxIn> = Vec::new();
521523
txins.push(TxIn {
522524
previous_output: OutPoint {
@@ -536,7 +538,7 @@ pub fn build_htlc_transaction(prev_hash: &Txid, feerate_per_kw: u32, contest_del
536538

537539
let mut txouts: Vec<TxOut> = Vec::new();
538540
txouts.push(TxOut {
539-
script_pubkey: get_revokeable_redeemscript(revocation_key, contest_delay, delayed_payment_key).to_v0_p2wsh(),
541+
script_pubkey: get_revokeable_redeemscript(broadcaster_revocation_key, contest_delay, broadcaster_delayed_payment_key).to_v0_p2wsh(),
540542
value: htlc.amount_msat / 1000 - total_fee //TODO: BOLT 3 does not specify if we should add amount_msat before dividing or if we should divide by 1000 before subtracting (as we do here)
541543
});
542544

@@ -605,7 +607,7 @@ impl LocalCommitmentTransaction {
605607
revocation_key: dummy_key.clone(),
606608
broadcaster_htlc_key: dummy_key.clone(),
607609
countersignatory_htlc_key: dummy_key.clone(),
608-
delayed_payment_key: dummy_key.clone(),
610+
broadcaster_delayed_payment_key: dummy_key.clone(),
609611
},
610612
feerate_per_kw: 0,
611613
per_htlc: Vec::new()
@@ -701,7 +703,7 @@ impl LocalCommitmentTransaction {
701703

702704
for this_htlc in self.per_htlc.iter() {
703705
if this_htlc.0.transaction_output_index.is_some() {
704-
let htlc_tx = build_htlc_transaction(&txid, self.feerate_per_kw, local_csv, &this_htlc.0, &self.local_keys.delayed_payment_key, &self.local_keys.revocation_key);
706+
let htlc_tx = build_htlc_transaction(&txid, self.feerate_per_kw, local_csv, &this_htlc.0, &self.local_keys.broadcaster_delayed_payment_key, &self.local_keys.revocation_key);
705707

706708
let htlc_redeemscript = get_htlc_redeemscript_with_explicit_keys(&this_htlc.0, &self.local_keys.broadcaster_htlc_key, &self.local_keys.countersignatory_htlc_key, &self.local_keys.revocation_key);
707709

@@ -724,7 +726,7 @@ impl LocalCommitmentTransaction {
724726
// Further, we should never be provided the preimage for an HTLC-Timeout transaction.
725727
if this_htlc.0.offered && preimage.is_some() { unreachable!(); }
726728

727-
let mut htlc_tx = build_htlc_transaction(&txid, self.feerate_per_kw, local_csv, &this_htlc.0, &self.local_keys.delayed_payment_key, &self.local_keys.revocation_key);
729+
let mut htlc_tx = build_htlc_transaction(&txid, self.feerate_per_kw, local_csv, &this_htlc.0, &self.local_keys.broadcaster_delayed_payment_key, &self.local_keys.revocation_key);
728730
// Channel should have checked that we have a remote signature for this HTLC at
729731
// creation, and we should have a sensible htlc transaction:
730732
assert!(this_htlc.1.is_some());

lightning/src/ln/channel.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
990990
txouts.push((TxOut {
991991
script_pubkey: chan_utils::get_revokeable_redeemscript(&keys.revocation_key,
992992
if local { self.counterparty_selected_contest_delay } else { self.holder_selected_contest_delay },
993-
&keys.delayed_payment_key).to_v0_p2wsh(),
993+
&keys.broadcaster_delayed_payment_key).to_v0_p2wsh(),
994994
value: value_to_a as u64
995995
}, None));
996996
}
@@ -1153,7 +1153,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
11531153
/// @local is used only to convert relevant internal structures which refer to remote vs local
11541154
/// to decide value of outputs and direction of HTLCs.
11551155
fn build_htlc_transaction(&self, prev_hash: &Txid, htlc: &HTLCOutputInCommitment, local: bool, keys: &TxCreationKeys, feerate_per_kw: u32) -> Transaction {
1156-
chan_utils::build_htlc_transaction(prev_hash, feerate_per_kw, if local { self.counterparty_selected_contest_delay } else { self.holder_selected_contest_delay }, htlc, &keys.delayed_payment_key, &keys.revocation_key)
1156+
chan_utils::build_htlc_transaction(prev_hash, feerate_per_kw, if local { self.counterparty_selected_contest_delay } else { self.holder_selected_contest_delay }, htlc, &keys.broadcaster_delayed_payment_key, &keys.revocation_key)
11571157
}
11581158

11591159
/// Per HTLC, only one get_update_fail_htlc or get_update_fulfill_htlc call may be made.
@@ -3883,7 +3883,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
38833883

38843884
for (ref htlc_sig, ref htlc) in htlc_signatures.iter().zip(htlcs) {
38853885
log_trace!(logger, "Signed remote HTLC tx {} with redeemscript {} with pubkey {} -> {}",
3886-
encode::serialize_hex(&chan_utils::build_htlc_transaction(&counterparty_commitment_tx.0.txid(), feerate_per_kw, self.holder_selected_contest_delay, htlc, &counterparty_keys.delayed_payment_key, &counterparty_keys.revocation_key)),
3886+
encode::serialize_hex(&chan_utils::build_htlc_transaction(&counterparty_commitment_tx.0.txid(), feerate_per_kw, self.holder_selected_contest_delay, htlc, &counterparty_keys.broadcaster_delayed_payment_key, &counterparty_keys.revocation_key)),
38873887
encode::serialize_hex(&chan_utils::get_htlc_redeemscript(&htlc, counterparty_keys)),
38883888
log_bytes!(counterparty_keys.broadcaster_htlc_key.serialize()),
38893889
log_bytes!(htlc_sig.serialize_compact()[..]));

lightning/src/ln/channelmonitor.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,7 +1160,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
11601160
revocation_key: initial_local_commitment_tx.local_keys.revocation_key,
11611161
a_htlc_key: initial_local_commitment_tx.local_keys.broadcaster_htlc_key,
11621162
b_htlc_key: initial_local_commitment_tx.local_keys.countersignatory_htlc_key,
1163-
delayed_payment_key: initial_local_commitment_tx.local_keys.delayed_payment_key,
1163+
delayed_payment_key: initial_local_commitment_tx.local_keys.broadcaster_delayed_payment_key,
11641164
per_commitment_point: initial_local_commitment_tx.local_keys.per_commitment_point,
11651165
feerate_per_kw: initial_local_commitment_tx.feerate_per_kw,
11661166
htlc_outputs: Vec::new(), // There are never any HTLCs in the initial commitment transactions
@@ -1336,7 +1336,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
13361336
revocation_key: commitment_tx.local_keys.revocation_key,
13371337
a_htlc_key: commitment_tx.local_keys.broadcaster_htlc_key,
13381338
b_htlc_key: commitment_tx.local_keys.countersignatory_htlc_key,
1339-
delayed_payment_key: commitment_tx.local_keys.delayed_payment_key,
1339+
delayed_payment_key: commitment_tx.local_keys.broadcaster_delayed_payment_key,
13401340
per_commitment_point: commitment_tx.local_keys.per_commitment_point,
13411341
feerate_per_kw: commitment_tx.feerate_per_kw,
13421342
htlc_outputs: htlc_outputs,

lightning/src/ln/functional_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1652,7 +1652,7 @@ fn test_fee_spike_violation_fails_htlc() {
16521652
let local_commit_tx_output = TxOut {
16531653
script_pubkey: chan_utils::get_revokeable_redeemscript(&commit_tx_keys.revocation_key,
16541654
BREAKDOWN_TIMEOUT,
1655-
&commit_tx_keys.delayed_payment_key).to_v0_p2wsh(),
1655+
&commit_tx_keys.broadcaster_delayed_payment_key).to_v0_p2wsh(),
16561656
value: 95000,
16571657
};
16581658

lightning/src/ln/onchaintx.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
588588
let witness_script = if let Some(ref htlc) = *htlc {
589589
chan_utils::get_htlc_redeemscript_with_explicit_keys(&htlc, &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key)
590590
} else {
591-
chan_utils::get_revokeable_redeemscript(&chan_keys.revocation_key, *on_remote_tx_csv, &chan_keys.delayed_payment_key)
591+
chan_utils::get_revokeable_redeemscript(&chan_keys.revocation_key, *on_remote_tx_csv, &chan_keys.broadcaster_delayed_payment_key)
592592
};
593593

594594
if let Ok(sig) = self.key_storage.sign_justice_transaction(&bumped_tx, i, *amount, &per_commitment_key, htlc, &self.secp_ctx) {

lightning/src/util/enforcing_trait_impls.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ impl ChannelKeys for EnforcingChannelKeys {
104104

105105
for this_htlc in local_commitment_tx.per_htlc.iter() {
106106
if this_htlc.0.transaction_output_index.is_some() {
107-
let htlc_tx = chan_utils::build_htlc_transaction(&commitment_txid, local_commitment_tx.feerate_per_kw, local_csv, &this_htlc.0, &local_commitment_tx.local_keys.delayed_payment_key, &local_commitment_tx.local_keys.revocation_key);
107+
let htlc_tx = chan_utils::build_htlc_transaction(&commitment_txid, local_commitment_tx.feerate_per_kw, local_csv, &this_htlc.0, &local_commitment_tx.local_keys.broadcaster_delayed_payment_key, &local_commitment_tx.local_keys.revocation_key);
108108

109109
let htlc_redeemscript = chan_utils::get_htlc_redeemscript(&this_htlc.0, &local_commitment_tx.local_keys);
110110

0 commit comments

Comments
 (0)