From 50af51da5a5c906d8bf660d35a4f922ceb996068 Mon Sep 17 00:00:00 2001 From: Daniela Brozzoni Date: Tue, 2 Aug 2022 11:24:23 +0200 Subject: [PATCH] test: Fix P2WPKH_FAKE_WITNESS_SIZE We would previously push 108 bytes on a P2WPKH witness to simulate signature + pubkey. This was wrong: we should push 106 bytes instead. The max satisfaction size for a P2WPKH is 112 WU: elements in witness (1 byte, 1WU) + OP_PUSH (1 byte, 1WU) + pk (33 bytes, 33 WU) + OP_PUSH (1 byte, 1WU) + signature and sighash (72 bytes, 72 WU) + scriptsig len (1 byte, 4WU) We should push on the witness pk + signature and sighash. This is 105 WU. Since we push just once instead of twice, we add 1WU for the OP_PUSH we are omitting. --- src/wallet/mod.rs | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index a56fdadf..8084756b 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -1871,6 +1871,14 @@ pub(crate) mod test { use crate::signer::{SignOptions, SignerError}; use crate::wallet::AddressIndex::{LastUnused, New, Peek, Reset}; + // The satisfaction size of a P2WPKH is 112 WU = + // 1 (elements in witness) + 1 (OP_PUSH) + 33 (pk) + 1 (OP_PUSH) + 72 (signature + sighash) + 1*4 (script len) + // On the witness itself, we have to push once for the pk (33WU) and once for signature + sighash (72WU), for + // a total of 105 WU. + // Here, we push just once for simplicity, so we have to add an extra byte for the missing + // OP_PUSH. + const P2WPKH_FAKE_WITNESS_SIZE: usize = 106; + #[test] fn test_cache_addresses_fixed() { let db = MemoryDatabase::new(); @@ -2007,7 +2015,7 @@ pub(crate) mod test { $( $( $add_signature )* for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature } )* @@ -3236,7 +3244,7 @@ pub(crate) mod test { let txid = tx.txid(); // skip saving the new utxos, we know they can't be used anyways for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -3296,7 +3304,7 @@ pub(crate) mod test { let txid = tx.txid(); // skip saving the new utxos, we know they can't be used anyways for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -3362,7 +3370,7 @@ pub(crate) mod test { let mut tx = psbt.extract_tx(); let txid = tx.txid(); for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -3406,7 +3414,7 @@ pub(crate) mod test { let mut tx = psbt.extract_tx(); let txid = tx.txid(); for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -3462,7 +3470,7 @@ pub(crate) mod test { let mut tx = psbt.extract_tx(); let txid = tx.txid(); for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -3519,7 +3527,7 @@ pub(crate) mod test { let mut tx = psbt.extract_tx(); let txid = tx.txid(); for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -3560,7 +3568,7 @@ pub(crate) mod test { let txid = tx.txid(); // skip saving the new utxos, we know they can't be used anyways for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -3623,7 +3631,7 @@ pub(crate) mod test { let txid = tx.txid(); // skip saving the new utxos, we know they can't be used anyways for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -3694,7 +3702,7 @@ pub(crate) mod test { let txid = tx.txid(); // skip saving the new utxos, we know they can't be used anyways for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -3765,7 +3773,7 @@ pub(crate) mod test { let txid = tx.txid(); // skip saving the new utxos, we know they can't be used anyways for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -3826,7 +3834,7 @@ pub(crate) mod test { let txid = tx.txid(); // skip saving the new utxos, we know they can't be used anyways for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -3897,7 +3905,7 @@ pub(crate) mod test { let txid = tx.txid(); // skip saving the new utxos, we know they can't be used anyways for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -3976,7 +3984,7 @@ pub(crate) mod test { let mut tx = psbt.extract_tx(); let txid = tx.txid(); for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut() @@ -4020,7 +4028,7 @@ pub(crate) mod test { let mut tx = psbt.extract_tx(); let txid = tx.txid(); for txin in &mut tx.input { - txin.witness.push([0x00; 108]); // fake signature + txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature wallet .database .borrow_mut()