Skip to content

Commit 8566bd6

Browse files
committed
f! consensus verify anchor_tx and htlc_tx
1 parent 64ab74d commit 8566bd6

File tree

1 file changed

+89
-19
lines changed

1 file changed

+89
-19
lines changed

lightning/src/ln/monitor_tests.rs

Lines changed: 89 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,27 @@ use crate::ln::msgs::ChannelMessageHandler;
2626
#[cfg(anchors)]
2727
use crate::util::config::UserConfig;
2828
#[cfg(anchors)]
29+
use crate::util::crypto::sign;
30+
#[cfg(anchors)]
2931
use crate::util::events::BumpTransactionEvent;
3032
use crate::util::events::{Event, MessageSendEvent, MessageSendEventsProvider, ClosureReason, HTLCDestination};
3133
#[cfg(anchors)]
3234
use crate::util::ser::Writeable;
3335
#[cfg(anchors)]
3436
use crate::util::test_utils;
3537

38+
#[cfg(anchors)]
39+
use bitcoin::blockdata::transaction::EcdsaSighashType;
3640
use bitcoin::blockdata::script::Builder;
3741
use bitcoin::blockdata::opcodes;
3842
use bitcoin::secp256k1::Secp256k1;
3943
#[cfg(anchors)]
40-
use bitcoin::{Amount, Script, TxIn, TxOut, PackedLockTime};
44+
use bitcoin::secp256k1::SecretKey;
45+
#[cfg(anchors)]
46+
use bitcoin::{Amount, PublicKey, Script, TxIn, TxOut, PackedLockTime, Witness};
4147
use bitcoin::Transaction;
48+
#[cfg(anchors)]
49+
use bitcoin::util::sighash::SighashCache;
4250

4351
use crate::prelude::*;
4452

@@ -1892,15 +1900,33 @@ fn test_anchors_aggregated_revoked_htlc_tx() {
18921900
assert_eq!(events.len(), 1);
18931901
let (revoked_commitment, anchor_tx) = match &events[0] {
18941902
Event::BumpTransaction(BumpTransactionEvent::ChannelClose { commitment_tx, anchor_descriptor, .. }) => {
1903+
let secret_key = SecretKey::from_slice(&[1; 32]).unwrap();
1904+
let public_key = PublicKey::new(secret_key.public_key(&secp));
1905+
let fee_utxo_script = Script::new_v0_p2wpkh(&public_key.wpubkey_hash().unwrap());
1906+
let coinbase_tx = Transaction {
1907+
version: 2,
1908+
lock_time: PackedLockTime::ZERO,
1909+
input: vec![TxIn { ..Default::default() }],
1910+
output: vec![TxOut { // UTXO to attach fees to `anchor_tx`
1911+
value: Amount::ONE_BTC.to_sat(),
1912+
script_pubkey: fee_utxo_script.clone(),
1913+
}],
1914+
};
18951915
let mut anchor_tx = Transaction {
18961916
version: 2,
18971917
lock_time: PackedLockTime::ZERO,
18981918
input: vec![
1899-
TxIn { previous_output: anchor_descriptor.outpoint, ..Default::default() },
1900-
TxIn { ..Default::default() },
1919+
TxIn { // Anchor input
1920+
previous_output: anchor_descriptor.outpoint,
1921+
..Default::default()
1922+
},
1923+
TxIn { // Fee input
1924+
previous_output: bitcoin::OutPoint { txid: coinbase_tx.txid(), vout: 0 },
1925+
..Default::default()
1926+
},
19011927
],
1902-
output: vec![TxOut {
1903-
value: Amount::ONE_BTC.to_sat(),
1928+
output: vec![TxOut { // Fee input change
1929+
value: coinbase_tx.output[0].value / 2 ,
19041930
script_pubkey: Script::new_op_return(&[]),
19051931
}],
19061932
};
@@ -1911,6 +1937,21 @@ fn test_anchors_aggregated_revoked_htlc_tx() {
19111937
anchor_tx.input[0].witness = chan_utils::build_anchor_input_witness(
19121938
&signer.pubkeys().funding_pubkey, &funding_sig
19131939
);
1940+
anchor_tx.input[0].witness = chan_utils::build_anchor_input_witness(
1941+
&signer.pubkeys().funding_pubkey, &funding_sig
1942+
);
1943+
let fee_utxo_sig = {
1944+
let witness_script = Script::new_p2pkh(&public_key.pubkey_hash());
1945+
let sighash = hash_to_message!(&SighashCache::new(&anchor_tx).segwit_signature_hash(
1946+
1, &witness_script, coinbase_tx.output[0].value, EcdsaSighashType::All
1947+
).unwrap()[..]);
1948+
let sig = sign(&secp, &sighash, &secret_key);
1949+
let mut sig = sig.serialize_der().to_vec();
1950+
sig.push(EcdsaSighashType::All as u8);
1951+
sig
1952+
};
1953+
anchor_tx.input[1].witness = Witness::from_vec(vec![fee_utxo_sig, public_key.to_bytes()]);
1954+
check_spends!(anchor_tx, commitment_tx, coinbase_tx);
19141955
(commitment_tx, anchor_tx)
19151956
},
19161957
_ => panic!("Unexpected event"),
@@ -1951,17 +1992,32 @@ fn test_anchors_aggregated_revoked_htlc_tx() {
19511992
},
19521993
_ => assert_eq!(events.len(), 1),
19531994
};
1954-
let mut htlc_tx = Transaction {
1955-
version: 2,
1956-
lock_time: PackedLockTime::ZERO,
1957-
input: vec![TxIn { ..Default::default() }], // Fee input
1958-
output: vec![TxOut { // Fee input change
1959-
value: Amount::ONE_BTC.to_sat(),
1960-
script_pubkey: Script::new_op_return(&[]),
1961-
}]
1962-
};
1963-
match &events[0] {
1964-
Event::BumpTransaction(BumpTransactionEvent::HTLCResolution { htlc_descriptors, .. }) => {
1995+
let htlc_tx = {
1996+
let secret_key = SecretKey::from_slice(&[1; 32]).unwrap();
1997+
let public_key = PublicKey::new(secret_key.public_key(&secp));
1998+
let fee_utxo_script = Script::new_v0_p2wpkh(&public_key.wpubkey_hash().unwrap());
1999+
let coinbase_tx = Transaction {
2000+
version: 2,
2001+
lock_time: PackedLockTime::ZERO,
2002+
input: vec![TxIn { ..Default::default() }],
2003+
output: vec![TxOut { // UTXO to attach fees to `htlc_tx`
2004+
value: Amount::ONE_BTC.to_sat(),
2005+
script_pubkey: fee_utxo_script.clone(),
2006+
}],
2007+
};
2008+
let mut htlc_tx = Transaction {
2009+
version: 2,
2010+
lock_time: PackedLockTime::ZERO,
2011+
input: vec![TxIn { // Fee input
2012+
previous_output: bitcoin::OutPoint { txid: coinbase_tx.txid(), vout: 0 },
2013+
..Default::default()
2014+
}],
2015+
output: vec![TxOut { // Fee input change
2016+
value: coinbase_tx.output[0].value / 2 ,
2017+
script_pubkey: Script::new_op_return(&[]),
2018+
}],
2019+
};
2020+
if let Event::BumpTransaction(BumpTransactionEvent::HTLCResolution { htlc_descriptors, .. }) = &events[0] {
19652021
assert_eq!(htlc_descriptors.len(), 2);
19662022
for htlc_descriptor in htlc_descriptors {
19672023
assert!(!htlc_descriptor.htlc.offered);
@@ -1982,9 +2038,23 @@ fn test_anchors_aggregated_revoked_htlc_tx() {
19822038
let witness_script = htlc_descriptor.witness_script(&per_commitment_point, &secp);
19832039
htlc_tx.input[htlc_input_idx].witness = htlc_descriptor.tx_input_witness(&our_sig, &witness_script);
19842040
}
1985-
},
1986-
_ => panic!("Unexpected event"),
1987-
}
2041+
} else {
2042+
panic!("Unexpected event");
2043+
}
2044+
let fee_utxo_sig = {
2045+
let witness_script = Script::new_p2pkh(&public_key.pubkey_hash());
2046+
let sighash = hash_to_message!(&SighashCache::new(&htlc_tx).segwit_signature_hash(
2047+
0, &witness_script, coinbase_tx.output[0].value, EcdsaSighashType::All
2048+
).unwrap()[..]);
2049+
let sig = sign(&secp, &sighash, &secret_key);
2050+
let mut sig = sig.serialize_der().to_vec();
2051+
sig.push(EcdsaSighashType::All as u8);
2052+
sig
2053+
};
2054+
htlc_tx.input[0].witness = Witness::from_vec(vec![fee_utxo_sig, public_key.to_bytes()]);
2055+
check_spends!(htlc_tx, coinbase_tx, revoked_commitment);
2056+
htlc_tx
2057+
};
19882058

19892059
for node in &nodes {
19902060
mine_transaction(node, &htlc_tx);

0 commit comments

Comments
 (0)