From 5e8f204581c3afb72efdf05e2f66c1f142111b33 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Thu, 25 Jan 2024 18:34:16 +1100 Subject: [PATCH] Pass sigs and associated types by value We should pass `Copy` types by value not by reference. Currently this is not done in secp, but lets do it here in bitcoin. Pass by value: - `SerializedSignature` - bitcoin sigs - secp sigs - secp `Message` --- bitcoin/examples/ecdsa-psbt-simple.rs | 2 +- bitcoin/examples/sighash.rs | 2 +- bitcoin/examples/sign-tx-segwit-v0.rs | 2 +- bitcoin/src/blockdata/witness.rs | 6 +++--- bitcoin/src/crypto/key.rs | 12 ++++++------ bitcoin/src/taproot/serialized_signature.rs | 6 +++--- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/bitcoin/examples/ecdsa-psbt-simple.rs b/bitcoin/examples/ecdsa-psbt-simple.rs index fe436d9ea..cb8efe2a2 100644 --- a/bitcoin/examples/ecdsa-psbt-simple.rs +++ b/bitcoin/examples/ecdsa-psbt-simple.rs @@ -221,7 +221,7 @@ fn main() { .enumerate() .map(|(idx, input)| { let (_, sig) = input.partial_sigs.iter().next().expect("we have one sig"); - Witness::p2wpkh(sig, pk_inputs[idx].0) + Witness::p2wpkh(*sig, pk_inputs[idx].0) }) .collect(); psbt.inputs.iter_mut().enumerate().for_each(|(idx, input)| { diff --git a/bitcoin/examples/sighash.rs b/bitcoin/examples/sighash.rs index 40ec9a70f..7a13ac4ff 100644 --- a/bitcoin/examples/sighash.rs +++ b/bitcoin/examples/sighash.rs @@ -47,7 +47,7 @@ fn compute_sighash_p2wpkh(raw_tx: &[u8], inp_idx: usize, value: u64) { let msg = secp256k1::Message::from(sighash); println!("Message is {:x}", msg); let secp = secp256k1::Secp256k1::verification_only(); - pk.verify(&secp, &msg, &sig).unwrap() + pk.verify(&secp, msg, sig).unwrap() } /// Computes sighash for a legacy multisig transaction input that spends either a p2sh or a p2ms output. diff --git a/bitcoin/examples/sign-tx-segwit-v0.rs b/bitcoin/examples/sign-tx-segwit-v0.rs index c0d625863..8eef26a7a 100644 --- a/bitcoin/examples/sign-tx-segwit-v0.rs +++ b/bitcoin/examples/sign-tx-segwit-v0.rs @@ -75,7 +75,7 @@ fn main() { // Update the witness stack. let signature = bitcoin::ecdsa::Signature { signature, sighash_type }; let pk = sk.public_key(&secp); - *sighasher.witness_mut(input_index).unwrap() = Witness::p2wpkh(&signature, pk); + *sighasher.witness_mut(input_index).unwrap() = Witness::p2wpkh(signature, pk); // Get the signed transaction. let tx = sighasher.into_transaction(); diff --git a/bitcoin/src/blockdata/witness.rs b/bitcoin/src/blockdata/witness.rs index 6054a8434..ae58cae75 100644 --- a/bitcoin/src/blockdata/witness.rs +++ b/bitcoin/src/blockdata/witness.rs @@ -243,7 +243,7 @@ impl Witness { /// serialized public key. Also useful for spending a P2SH-P2WPKH output. /// /// It is expected that `pubkey` is related to the secret key used to create `signature`. - pub fn p2wpkh(signature: &ecdsa::Signature, pubkey: secp256k1::PublicKey) -> Witness { + pub fn p2wpkh(signature: ecdsa::Signature, pubkey: secp256k1::PublicKey) -> Witness { let mut witness = Witness::new(); witness.push_slice(&signature.serialize()); witness.push_slice(&pubkey.serialize()); @@ -355,7 +355,7 @@ impl Witness { /// Pushes, as a new element on the witness, an ECDSA signature. /// /// Pushes the DER encoded signature + sighash_type, requires an allocation. - pub fn push_ecdsa_signature(&mut self, signature: &ecdsa::Signature) { + pub fn push_ecdsa_signature(&mut self, signature: ecdsa::Signature) { self.push_slice(&signature.serialize()) } @@ -657,7 +657,7 @@ mod test { let signature = secp256k1::ecdsa::Signature::from_der(&sig_bytes).unwrap(); let mut witness = Witness::default(); let signature = crate::ecdsa::Signature { signature, sighash_type: EcdsaSighashType::All }; - witness.push_ecdsa_signature(&signature); + witness.push_ecdsa_signature(signature); let expected_witness = vec![hex!( "304402207c800d698f4b0298c5aac830b822f011bb02df41eb114ade9a6702f364d5e39c0220366900d2a60cab903e77ef7dd415d46509b1f78ac78906e3296f495aa1b1b54101") ]; diff --git a/bitcoin/src/crypto/key.rs b/bitcoin/src/crypto/key.rs index 11e0dbc54..9438223c0 100644 --- a/bitcoin/src/crypto/key.rs +++ b/bitcoin/src/crypto/key.rs @@ -203,10 +203,10 @@ impl PublicKey { pub fn verify( &self, secp: &Secp256k1, - msg: &secp256k1::Message, - sig: &ecdsa::Signature, + msg: secp256k1::Message, + sig: ecdsa::Signature, ) -> Result<(), secp256k1::Error> { - secp.verify_ecdsa(msg, &sig.signature, &self.inner) + secp.verify_ecdsa(&msg, &sig.signature, &self.inner) } } @@ -336,10 +336,10 @@ impl CompressedPublicKey { pub fn verify( &self, secp: &Secp256k1, - msg: &secp256k1::Message, - sig: &ecdsa::Signature, + msg: secp256k1::Message, + sig: ecdsa::Signature, ) -> Result<(), secp256k1::Error> { - Ok(secp.verify_ecdsa(msg, &sig.signature, &self.0)?) + Ok(secp.verify_ecdsa(&msg, &sig.signature, &self.0)?) } } diff --git a/bitcoin/src/taproot/serialized_signature.rs b/bitcoin/src/taproot/serialized_signature.rs index 290a16da7..4fd66fae2 100644 --- a/bitcoin/src/taproot/serialized_signature.rs +++ b/bitcoin/src/taproot/serialized_signature.rs @@ -109,11 +109,11 @@ impl<'a> IntoIterator for &'a SerializedSignature { } impl From for SerializedSignature { - fn from(value: Signature) -> Self { Self::from_signature(&value) } + fn from(value: Signature) -> Self { Self::from_signature(value) } } impl<'a> From<&'a Signature> for SerializedSignature { - fn from(value: &'a Signature) -> Self { Self::from_signature(value) } + fn from(value: &'a Signature) -> Self { Self::from_signature(*value) } } impl TryFrom for Signature { @@ -162,7 +162,7 @@ impl SerializedSignature { /// Create a SerializedSignature from a Signature. /// (this serializes it) #[inline] - pub fn from_signature(sig: &Signature) -> SerializedSignature { sig.serialize() } + pub fn from_signature(sig: Signature) -> SerializedSignature { sig.serialize() } /// Writes this serialized signature to a `writer`. #[inline]