Skip to content

Commit f5a2162

Browse files
committed
Share all Cancel transactions' signatures with the watchtowers
1 parent 74c2f1c commit f5a2162

3 files changed

Lines changed: 64 additions & 30 deletions

File tree

src/commands/mod.rs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -559,20 +559,39 @@ impl DaemonControl {
559559
let emer_tx = db_emer_transaction(&db_path, db_vault.id)
560560
.expect("Database must be available")
561561
.ok_or(CommandError::Race)?;
562-
let cancel_tx = db_cancel_transaction(&db_path, db_vault.id)
563-
.expect("Database must be available")
564-
.ok_or(CommandError::Race)?;
562+
let (_, cancel_batch) = transaction_chain_manager(
563+
db_vault.deposit_outpoint,
564+
db_vault.amount,
565+
&revaultd.deposit_descriptor,
566+
&revaultd.unvault_descriptor,
567+
&revaultd.cpfp_descriptor,
568+
db_vault.derivation_index,
569+
&revaultd.secp_ctx,
570+
)
571+
.expect("We wouldn't have put a vault with an invalid chain in DB");
572+
let cancel_txs = cancel_batch
573+
.feerates_map()
574+
.into_iter()
575+
.map(|(amount, cancel_tx)| {
576+
db_cancel_transaction_by_txid(&db_path, &cancel_tx.txid())
577+
.expect("Database must be available")
578+
.ok_or(CommandError::Race)
579+
.map(|tx| (amount, tx))
580+
})
581+
.collect::<Result<BTreeMap<_, _>, CommandError>>()?;
565582
let unemer_tx = db_unvault_emer_transaction(&db_path, db_vault.id)
566583
.expect("Database must be available")
567584
.ok_or(CommandError::Race)?;
568585
let all_rev_fully_signed = emer_tx
569586
.psbt
570587
.unwrap_emer()
571588
.is_finalizable(&revaultd.secp_ctx)
572-
&& cancel_tx
573-
.psbt
574-
.unwrap_cancel()
575-
.is_finalizable(&revaultd.secp_ctx)
589+
&& cancel_txs.iter().all(|(_, cancel_tx)| {
590+
cancel_tx
591+
.psbt
592+
.unwrap_cancel()
593+
.is_finalizable(&revaultd.secp_ctx)
594+
})
576595
&& unemer_tx
577596
.psbt
578597
.unwrap_unvault_emer()
@@ -587,7 +606,7 @@ impl DaemonControl {
587606
db_vault.deposit_outpoint,
588607
db_vault.derivation_index,
589608
&emer_tx,
590-
&cancel_tx,
609+
&cancel_txs,
591610
&unemer_tx,
592611
)?;
593612
}

src/communication.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,13 @@ fn send_wt_sigs_msg(
9595
deposit_outpoint: OutPoint,
9696
derivation_index: ChildNumber,
9797
emer_tx: &DbTransaction,
98-
cancel_tx: &DbTransaction,
98+
cancel_txs: &BTreeMap<Amount, DbTransaction>,
9999
unemer_tx: &DbTransaction,
100100
) -> Result<(), CommunicationError> {
101-
let cancel_sigs = [(
102-
watchtower::CancelFeerate(Amount::from_sat(22)),
103-
cancel_tx.psbt.signatures(),
104-
)]
105-
.iter()
106-
.cloned()
107-
.collect();
101+
let cancel_sigs = cancel_txs
102+
.iter()
103+
.map(|(amount, tx)| (watchtower::CancelFeerate(*amount), tx.psbt.signatures()))
104+
.collect();
108105
let signatures = watchtower::Signatures {
109106
emergency: emer_tx.psbt.signatures(),
110107
cancel: cancel_sigs,
@@ -169,7 +166,7 @@ pub fn wts_share_rev_signatures(
169166
deposit_outpoint: OutPoint,
170167
derivation_index: ChildNumber,
171168
emer_tx: &DbTransaction,
172-
cancel_tx: &DbTransaction,
169+
cancel_txs: &BTreeMap<Amount, DbTransaction>,
173170
unemer_tx: &DbTransaction,
174171
) -> Result<(), CommunicationError> {
175172
for (wt_host, wt_noisekey) in watchtowers {
@@ -180,7 +177,7 @@ pub fn wts_share_rev_signatures(
180177
deposit_outpoint,
181178
derivation_index,
182179
emer_tx,
183-
cancel_tx,
180+
&cancel_txs,
184181
unemer_tx,
185182
)?;
186183
}

src/sigfetcher.rs

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ use crate::{
77
actions::{db_update_presigned_txs, db_update_vault_status},
88
bitcointx::RevaultTx,
99
interface::{
10-
db_cancel_transaction, db_emer_transaction, db_sig_missing, db_unvault_emer_transaction,
10+
db_cancel_transaction_by_txid, db_emer_transaction, db_sig_missing,
11+
db_unvault_emer_transaction,
1112
},
1213
schema::{DbTransaction, DbVault},
1314
DatabaseError,
@@ -18,7 +19,7 @@ use crate::{
1819
use revault_net::transport::KKTransport;
1920
use revault_tx::{
2021
bitcoin::{secp256k1, PublicKey as BitcoinPubKey},
21-
transactions::RevaultTransaction,
22+
transactions::{transaction_chain_manager, RevaultTransaction},
2223
};
2324

2425
use std::{
@@ -156,7 +157,7 @@ fn maybe_wt_share_signatures(
156157
None => return Ok(()),
157158
};
158159

159-
// They should always be there, apart from a very edgy race condition.
160+
// The revocation txs should always be there, apart from a very edgy race condition.
160161
let emer_tx = db_emer_transaction(db_path, db_vault.id)?
161162
.ok_or(SignatureFetcherError::MissingTransaction)?;
162163
if !emer_tx
@@ -166,15 +167,32 @@ fn maybe_wt_share_signatures(
166167
{
167168
return Ok(());
168169
}
169-
let cancel_tx = db_cancel_transaction(db_path, db_vault.id)?
170-
.ok_or(SignatureFetcherError::MissingTransaction)?;
171-
if !cancel_tx
172-
.psbt
173-
.unwrap_cancel()
174-
.is_finalizable(&revaultd.secp_ctx)
175-
{
176-
return Ok(());
170+
171+
let (_, cancel_batch) = transaction_chain_manager(
172+
db_vault.deposit_outpoint,
173+
db_vault.amount,
174+
&revaultd.deposit_descriptor,
175+
&revaultd.unvault_descriptor,
176+
&revaultd.cpfp_descriptor,
177+
db_vault.derivation_index,
178+
&revaultd.secp_ctx,
179+
)
180+
.expect("We wouldn't have put a vault with an invalid chain in DB");
181+
let mut cancel_txs = BTreeMap::new();
182+
for (amount, cancel_tx) in cancel_batch.feerates_map() {
183+
let cancel_tx = db_cancel_transaction_by_txid(db_path, &cancel_tx.txid())
184+
.expect("Database must always be available")
185+
.ok_or(SignatureFetcherError::MissingTransaction)?;
186+
if !cancel_tx
187+
.psbt
188+
.unwrap_cancel()
189+
.is_finalizable(&revaultd.secp_ctx)
190+
{
191+
return Ok(());
192+
}
193+
cancel_txs.insert(amount, cancel_tx);
177194
}
195+
178196
let unemer_tx = db_unvault_emer_transaction(db_path, db_vault.id)?
179197
.ok_or(SignatureFetcherError::MissingTransaction)?;
180198
if !unemer_tx
@@ -195,7 +213,7 @@ fn maybe_wt_share_signatures(
195213
db_vault.deposit_outpoint,
196214
db_vault.derivation_index,
197215
&emer_tx,
198-
&cancel_tx,
216+
&cancel_txs,
199217
&unemer_tx,
200218
)?;
201219

0 commit comments

Comments
 (0)