diff --git a/verification/src/chain_verifier.rs b/verification/src/chain_verifier.rs index e802e8fb..cd0bb5b7 100644 --- a/verification/src/chain_verifier.rs +++ b/verification/src/chain_verifier.rs @@ -174,7 +174,11 @@ impl Verify for ChainVerifier { } // verify transactions (except coinbase) - let mut block_sigops = 0; + let mut block_sigops = try!( + utils::transaction_sigops(&block.transactions()[0]) + .map_err(|e| Error::Transaction(1, TransactionError::SignatureMallformed(format!("{}", e)))) + ); + for (idx, transaction) in block.transactions().iter().skip(1).enumerate() { block_sigops += try!( diff --git a/verification/src/utils.rs b/verification/src/utils.rs index bee7f09f..32e0eae0 100644 --- a/verification/src/utils.rs +++ b/verification/src/utils.rs @@ -57,15 +57,17 @@ pub fn block_reward_satoshi(block_height: u32) -> u64 { pub fn transaction_sigops(transaction: &chain::Transaction) -> Result { let mut result = 0usize; - for input in transaction.inputs.iter() { - let input_script: Script = input.script_sig().to_vec().into(); - result += try!(input_script.sigop_count()); - } - for output in transaction.outputs.iter() { let output_script: Script = output.script_pubkey.to_vec().into(); // todo: not always allow malformed output? - result += output_script.sigop_count().unwrap_or(1); + result += output_script.sigop_count().unwrap_or(0); + } + + if transaction.is_coinbase() { return Ok(result); } + + for input in transaction.inputs.iter() { + let input_script: Script = input.script_sig().to_vec().into(); + result += try!(input_script.sigop_count()); } Ok(result)