1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
use std::error::Error; use crate::common::address::Address; use crate::traits::ValidAddress; use crate::util::hash::hash; use secp256k1::{Error as SecpError, Message, RecoverableSignature, Secp256k1}; pub fn verify_tx( encoding: Vec<u8>, signer: Address, signature: RecoverableSignature, ) -> Result<(), Box<Error>> { let message = Message::from_slice(&hash(&encoding, 32))?; let secp = Secp256k1::verification_only(); let pubkey = secp.recover(&message, &signature)?; let address = Address::from_pubkey(pubkey); if address != signer { return Err(Box::new(SecpError::IncorrectSignature)); } let standard_signature = signature.to_standard(&secp); Ok(secp.verify(&message, &standard_signature, &pubkey)?) }