From 3a999a6dbe427f1846964bd8ee005dced7862625 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson <niklasadolfsson1@gmail.com> Date: Wed, 13 Mar 2019 12:22:24 +0100 Subject: [PATCH] fix(clique utils): make use of errors --- ethcore/src/engines/clique/util.rs | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/ethcore/src/engines/clique/util.rs b/ethcore/src/engines/clique/util.rs index 9c294f3f028..c0c8938567a 100644 --- a/ethcore/src/engines/clique/util.rs +++ b/ethcore/src/engines/clique/util.rs @@ -14,14 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>. +use engines::EngineError; +use engines::clique::{ADDRESS_LENGTH, SIGNATURE_LENGTH, VANITY_LENGTH, NULL_NONCE, NULL_MIXHASH}; +use error::Error; use ethereum_types::{Address, H256}; +use ethkey::{public_to_address, recover as ec_recover, Signature}; use lru_cache::LruCache; use parking_lot::RwLock; use rlp::encode; - -use engines::clique::{ADDRESS_LENGTH, SIGNATURE_LENGTH, VANITY_LENGTH, NULL_NONCE, NULL_MIXHASH}; -use error::Error; -use ethkey::{public_to_address, recover as ec_recover, Signature}; use types::header::Header; /// How many recovered signature to cache in the memory. @@ -42,13 +42,16 @@ pub fn recover_creator(header: &Header) -> Result<Address, Error> { } let data = header.extra_data(); + if data.len() < VANITY_LENGTH { + Err(EngineError::CliqueMissingVanity)? + } + if data.len() < VANITY_LENGTH + SIGNATURE_LENGTH { - return Err(From::from("extra_data length is not enough!")); + Err(EngineError::CliqueMissingSignature)? } - // Get vanity and signature data from `header.extra_data` - // Note, this shouldn't have a list of signers because this is only called on `non-checkpoints` - let (vanity_slice, signature_slice) = data.split_at(data.len() - SIGNATURE_LENGTH); + // Split `signed_extra data` and `signature` + let (signed_data_slice, signature_slice) = data.split_at(data.len() - SIGNATURE_LENGTH); // convert `&[u8]` to `[u8; 65]` let signature = { @@ -59,7 +62,7 @@ pub fn recover_creator(header: &Header) -> Result<Address, Error> { // modify header and hash it let unsigned_header = &mut header.clone(); - unsigned_header.set_extra_data(vanity_slice.to_vec()); + unsigned_header.set_extra_data(signed_data_slice.to_vec()); let msg = unsigned_header.hash(); let pubkey = ec_recover(&Signature::from(signature), &msg)?; @@ -81,14 +84,14 @@ pub fn extract_signers(header: &Header) -> Result<Vec<Address>, Error> { let data = header.extra_data(); if data.len() <= VANITY_LENGTH + SIGNATURE_LENGTH { - return Err(Box::new("Invalid extra_data size.").into()); + Err(EngineError::CliqueCheckpointNoSigner)? } // extract only the portion of extra_data which includes the signer list let signers_raw = &data[(VANITY_LENGTH)..data.len() - (SIGNATURE_LENGTH)]; if signers_raw.len() % ADDRESS_LENGTH != 0 { - return Err(Box::new("bad signer list.").into()); + Err(EngineError::CliqueCheckpointInvalidSigners(signers_raw.len()))? } let num_signers = signers_raw.len() / 20;