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.
This commit is contained in:
		
							parent
							
								
									ae919061e2
								
							
						
					
					
						commit
						50af51da5a
					
				@ -1871,6 +1871,14 @@ pub(crate) mod test {
 | 
				
			|||||||
    use crate::signer::{SignOptions, SignerError};
 | 
					    use crate::signer::{SignOptions, SignerError};
 | 
				
			||||||
    use crate::wallet::AddressIndex::{LastUnused, New, Peek, Reset};
 | 
					    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]
 | 
					    #[test]
 | 
				
			||||||
    fn test_cache_addresses_fixed() {
 | 
					    fn test_cache_addresses_fixed() {
 | 
				
			||||||
        let db = MemoryDatabase::new();
 | 
					        let db = MemoryDatabase::new();
 | 
				
			||||||
@ -2007,7 +2015,7 @@ pub(crate) mod test {
 | 
				
			|||||||
            $(
 | 
					            $(
 | 
				
			||||||
                $( $add_signature )*
 | 
					                $( $add_signature )*
 | 
				
			||||||
                for txin in &mut tx.input {
 | 
					                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();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        // skip saving the new utxos, we know they can't be used anyways
 | 
					        // skip saving the new utxos, we know they can't be used anyways
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -3296,7 +3304,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        // skip saving the new utxos, we know they can't be used anyways
 | 
					        // skip saving the new utxos, we know they can't be used anyways
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -3362,7 +3370,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let mut tx = psbt.extract_tx();
 | 
					        let mut tx = psbt.extract_tx();
 | 
				
			||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -3406,7 +3414,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let mut tx = psbt.extract_tx();
 | 
					        let mut tx = psbt.extract_tx();
 | 
				
			||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -3462,7 +3470,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let mut tx = psbt.extract_tx();
 | 
					        let mut tx = psbt.extract_tx();
 | 
				
			||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -3519,7 +3527,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let mut tx = psbt.extract_tx();
 | 
					        let mut tx = psbt.extract_tx();
 | 
				
			||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -3560,7 +3568,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        // skip saving the new utxos, we know they can't be used anyways
 | 
					        // skip saving the new utxos, we know they can't be used anyways
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -3623,7 +3631,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        // skip saving the new utxos, we know they can't be used anyways
 | 
					        // skip saving the new utxos, we know they can't be used anyways
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -3694,7 +3702,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        // skip saving the new utxos, we know they can't be used anyways
 | 
					        // skip saving the new utxos, we know they can't be used anyways
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -3765,7 +3773,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        // skip saving the new utxos, we know they can't be used anyways
 | 
					        // skip saving the new utxos, we know they can't be used anyways
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -3826,7 +3834,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        // skip saving the new utxos, we know they can't be used anyways
 | 
					        // skip saving the new utxos, we know they can't be used anyways
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -3897,7 +3905,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        // skip saving the new utxos, we know they can't be used anyways
 | 
					        // skip saving the new utxos, we know they can't be used anyways
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -3976,7 +3984,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let mut tx = psbt.extract_tx();
 | 
					        let mut tx = psbt.extract_tx();
 | 
				
			||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
@ -4020,7 +4028,7 @@ pub(crate) mod test {
 | 
				
			|||||||
        let mut tx = psbt.extract_tx();
 | 
					        let mut tx = psbt.extract_tx();
 | 
				
			||||||
        let txid = tx.txid();
 | 
					        let txid = tx.txid();
 | 
				
			||||||
        for txin in &mut tx.input {
 | 
					        for txin in &mut tx.input {
 | 
				
			||||||
            txin.witness.push([0x00; 108]); // fake signature
 | 
					            txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
 | 
				
			||||||
            wallet
 | 
					            wallet
 | 
				
			||||||
                .database
 | 
					                .database
 | 
				
			||||||
                .borrow_mut()
 | 
					                .borrow_mut()
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user