From f2c9e5611965c03c961f95cfaa9607582102600e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marin=20Ver=C5=A1i=C4=87?= Date: Mon, 27 May 2024 09:40:24 +0300 Subject: [PATCH] refactor: remove public key from transaction and query MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marin Veršić --- cli/src/main.rs | 3 + client/src/client.rs | 18 +- client/tests/integration/asset.rs | 2 +- .../integration/domain_owner_permissions.rs | 8 +- client/tests/integration/permissions.rs | 10 +- client/tests/integration/roles.rs | 8 +- client/tests/integration/tx_chain_id.rs | 5 +- client/tests/integration/upgrade.rs | 13 +- .../pytests/src/client_cli/client_cli.py | 2 +- client_cli/src/main.rs | 1 + configs/swarm/executor.wasm | Bin 511696 -> 514262 bytes core/benches/blocks/apply_blocks.rs | 2 +- core/benches/blocks/common.rs | 8 +- core/benches/blocks/validate_blocks.rs | 8 +- core/benches/kura.rs | 4 +- core/benches/validation.rs | 16 +- core/src/block.rs | 120 ++++--- core/src/gossiper.rs | 2 +- core/src/queue.rs | 18 +- core/src/smartcontracts/isi/mod.rs | 4 +- core/src/smartcontracts/isi/query.rs | 20 +- core/src/state.rs | 2 +- core/src/sumeragi/main_loop.rs | 323 +++++++++++------- core/src/sumeragi/message.rs | 79 ++++- core/src/sumeragi/mod.rs | 28 +- core/src/sumeragi/network_topology.rs | 23 +- core/src/sumeragi/view_change.rs | 56 ++- core/src/tx.rs | 21 +- core/test_network/src/lib.rs | 3 - crypto/src/lib.rs | 6 - data_model/src/block.rs | 26 +- data_model/src/events/pipeline.rs | 4 +- data_model/src/lib.rs | 12 +- data_model/src/query/mod.rs | 18 +- data_model/src/transaction.rs | 26 +- docs/source/references/schema.json | 34 +- genesis/src/lib.rs | 2 +- smart_contract/executor/src/permission.rs | 2 +- torii/src/lib.rs | 2 - torii/src/routing.rs | 2 +- 40 files changed, 533 insertions(+), 408 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index f8033d61680..c34acb2f520 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -44,6 +44,9 @@ async fn main() -> error_stack::Result<(), MainError> { iroha_logger::info!( version = env!("CARGO_PKG_VERSION"), git_commit_sha = env!("VERGEN_GIT_SHA"), + peer = %config.common.peer, + chain = %config.common.chain, + listening_on = %config.torii.address.value(), "Hyperledgerいろは2にようこそ!(translation) Welcome to Hyperledger Iroha!" ); diff --git a/client/src/client.rs b/client/src/client.rs index de722f4b38f..c97eda480e9 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -469,7 +469,9 @@ impl Client { tx_builder.set_nonce(nonce); }; - tx_builder.with_metadata(metadata).sign(&self.key_pair) + tx_builder + .with_metadata(metadata) + .sign(self.key_pair.private_key()) } /// Signs transaction @@ -477,7 +479,7 @@ impl Client { /// # Errors /// Fails if signature generation fails pub fn sign_transaction(&self, transaction: TransactionBuilder) -> SignedTransaction { - transaction.sign(&self.key_pair) + transaction.sign(self.key_pair.private_key()) } /// Signs query @@ -1664,20 +1666,12 @@ mod tests { use http::Response; use super::*; - use crate::data_model::{asset::Asset, query::error::QueryExecutionFail, ValidationFail}; + use crate::data_model::{asset::Asset, ValidationFail}; #[test] fn certain_errors() -> Result<()> { let mut sut = QueryResponseHandler::>::new(QueryRequest::dummy()); - let responses = vec![ - ( - StatusCode::UNAUTHORIZED, - ValidationFail::QueryFailed(QueryExecutionFail::Signature( - "whatever".to_owned(), - )), - ), - (StatusCode::UNPROCESSABLE_ENTITY, ValidationFail::TooComplex), - ]; + let responses = vec![(StatusCode::UNPROCESSABLE_ENTITY, ValidationFail::TooComplex)]; for (status_code, err) in responses { let resp = Response::builder().status(status_code).body(err.encode())?; diff --git a/client/tests/integration/asset.rs b/client/tests/integration/asset.rs index d76f6dcc6c7..f0fe33e8fd9 100644 --- a/client/tests/integration/asset.rs +++ b/client/tests/integration/asset.rs @@ -307,7 +307,7 @@ fn find_rate_and_make_exchange_isi_should_succeed() { asset_id.account().clone(), ) .with_instructions([instruction]) - .sign(&owner_key_pair); + .sign(owner_key_pair.private_key()); test_client .submit_transaction_blocking(&transaction) diff --git a/client/tests/integration/domain_owner_permissions.rs b/client/tests/integration/domain_owner_permissions.rs index 58d7991a200..e23303089ea 100644 --- a/client/tests/integration/domain_owner_permissions.rs +++ b/client/tests/integration/domain_owner_permissions.rs @@ -26,7 +26,7 @@ fn domain_owner_domain_permissions() -> Result<()> { // Asset definitions can't be registered by "bob@kingdom" by default let transaction = TransactionBuilder::new(chain_id.clone(), bob_id.clone()) .with_instructions([Register::asset_definition(coin.clone())]) - .sign(&bob_keypair); + .sign(bob_keypair.private_key()); let err = test_client .submit_transaction_blocking(&transaction) .expect_err("Tx should fail due to permissions"); @@ -52,7 +52,7 @@ fn domain_owner_domain_permissions() -> Result<()> { test_client.submit_blocking(Grant::permission(token.clone(), bob_id.clone()))?; let transaction = TransactionBuilder::new(chain_id, bob_id.clone()) .with_instructions([Register::asset_definition(coin)]) - .sign(&bob_keypair); + .sign(bob_keypair.private_key()); test_client.submit_transaction_blocking(&transaction)?; test_client.submit_blocking(Revoke::permission(token, bob_id.clone()))?; @@ -148,7 +148,7 @@ fn domain_owner_asset_definition_permissions() -> Result<()> { let coin = AssetDefinition::numeric(coin_id.clone()); let transaction = TransactionBuilder::new(chain_id, bob_id.clone()) .with_instructions([Register::asset_definition(coin)]) - .sign(&bob_keypair); + .sign(bob_keypair.private_key()); test_client.submit_transaction_blocking(&transaction)?; // check that "alice@wonderland" as owner of domain can transfer asset definitions in her domain @@ -217,7 +217,7 @@ fn domain_owner_asset_permissions() -> Result<()> { Register::asset_definition(coin), Register::asset_definition(store), ]) - .sign(&bob_keypair); + .sign(bob_keypair.private_key()); test_client.submit_transaction_blocking(&transaction)?; // check that "alice@wonderland" as owner of domain can register and unregister assets in her domain diff --git a/client/tests/integration/permissions.rs b/client/tests/integration/permissions.rs index 975c5862fd5..a48f55ecf6e 100644 --- a/client/tests/integration/permissions.rs +++ b/client/tests/integration/permissions.rs @@ -102,7 +102,7 @@ fn permissions_disallow_asset_transfer() { ); let transfer_tx = TransactionBuilder::new(chain_id, mouse_id) .with_instructions([transfer_asset]) - .sign(&mouse_keypair); + .sign(mouse_keypair.private_key()); let err = iroha .submit_transaction_blocking(&transfer_tx) .expect_err("Transaction was not rejected."); @@ -151,7 +151,7 @@ fn permissions_disallow_asset_burn() { ); let burn_tx = TransactionBuilder::new(chain_id, mouse_id) .with_instructions([burn_asset]) - .sign(&mouse_keypair); + .sign(mouse_keypair.private_key()); let err = iroha .submit_transaction_blocking(&burn_tx) @@ -239,7 +239,7 @@ fn permissions_differ_not_only_by_names() { let grant_hats_access_tx = TransactionBuilder::new(chain_id.clone(), mouse_id.clone()) .with_instructions([allow_alice_to_set_key_value_in_hats]) - .sign(&mouse_keypair); + .sign(mouse_keypair.private_key()); client .submit_transaction_blocking(&grant_hats_access_tx) .expect("Failed grant permission to modify Mouse's hats"); @@ -275,7 +275,7 @@ fn permissions_differ_not_only_by_names() { let grant_shoes_access_tx = TransactionBuilder::new(chain_id, mouse_id) .with_instructions([allow_alice_to_set_key_value_in_shoes]) - .sign(&mouse_keypair); + .sign(mouse_keypair.private_key()); client .submit_transaction_blocking(&grant_shoes_access_tx) @@ -328,7 +328,7 @@ fn stored_vs_granted_token_payload() -> Result<()> { let transaction = TransactionBuilder::new(chain_id, mouse_id) .with_instructions([allow_alice_to_set_key_value_in_mouse_asset]) - .sign(&mouse_keypair); + .sign(mouse_keypair.private_key()); iroha .submit_transaction_blocking(&transaction) .expect("Failed to grant permission to alice."); diff --git a/client/tests/integration/roles.rs b/client/tests/integration/roles.rs index 242535f360e..13cf7afb95f 100644 --- a/client/tests/integration/roles.rs +++ b/client/tests/integration/roles.rs @@ -76,7 +76,7 @@ fn register_and_grant_role_for_metadata_access() -> Result<()> { let grant_role = Grant::role(role_id.clone(), alice_id.clone()); let grant_role_tx = TransactionBuilder::new(chain_id, mouse_id.clone()) .with_instructions([grant_role]) - .sign(&mouse_keypair); + .sign(mouse_keypair.private_key()); test_client.submit_transaction_blocking(&grant_role_tx)?; // Alice modifies Mouse's metadata @@ -236,7 +236,7 @@ fn grant_revoke_role_permissions() -> Result<()> { let grant_role = Grant::role(role_id.clone(), alice_id.clone()); let grant_role_tx = TransactionBuilder::new(chain_id.clone(), mouse_id.clone()) .with_instructions([grant_role]) - .sign(&mouse_keypair); + .sign(mouse_keypair.private_key()); test_client.submit_transaction_blocking(&grant_role_tx)?; let set_key_value = SetKeyValue::account( @@ -263,7 +263,7 @@ fn grant_revoke_role_permissions() -> Result<()> { // Alice can modify Mouse's metadata after permission token is granted to role let grant_role_permission_tx = TransactionBuilder::new(chain_id.clone(), mouse_id.clone()) .with_instructions([grant_role_permission]) - .sign(&mouse_keypair); + .sign(mouse_keypair.private_key()); test_client.submit_transaction_blocking(&grant_role_permission_tx)?; let found_permissions = test_client .request(FindPermissionsByAccountId::new(alice_id.clone()))? @@ -274,7 +274,7 @@ fn grant_revoke_role_permissions() -> Result<()> { // Alice can't modify Mouse's metadata after permission token is removed from role let revoke_role_permission_tx = TransactionBuilder::new(chain_id.clone(), mouse_id.clone()) .with_instructions([revoke_role_permission]) - .sign(&mouse_keypair); + .sign(mouse_keypair.private_key()); test_client.submit_transaction_blocking(&revoke_role_permission_tx)?; let found_permissions = test_client .request(FindPermissionsByAccountId::new(alice_id.clone()))? diff --git a/client/tests/integration/tx_chain_id.rs b/client/tests/integration/tx_chain_id.rs index c92723c0cf6..2b3113ae806 100644 --- a/client/tests/integration/tx_chain_id.rs +++ b/client/tests/integration/tx_chain_id.rs @@ -1,5 +1,4 @@ use iroha::data_model::prelude::*; -use iroha_data_model::asset::AssetDefinitionId; use iroha_primitives::numeric::numeric; use test_network::*; use test_samples::gen_account_in; @@ -45,10 +44,10 @@ fn send_tx_with_different_chain_id() { ); let asset_transfer_tx_0 = TransactionBuilder::new(chain_id_0, sender_id.clone()) .with_instructions([transfer_instruction.clone()]) - .sign(&sender_keypair); + .sign(sender_keypair.private_key()); let asset_transfer_tx_1 = TransactionBuilder::new(chain_id_1, sender_id.clone()) .with_instructions([transfer_instruction]) - .sign(&sender_keypair); + .sign(sender_keypair.private_key()); test_client .submit_transaction_blocking(&asset_transfer_tx_0) .unwrap(); diff --git a/client/tests/integration/upgrade.rs b/client/tests/integration/upgrade.rs index 4ecebbf685f..2d06f4a8a75 100644 --- a/client/tests/integration/upgrade.rs +++ b/client/tests/integration/upgrade.rs @@ -4,7 +4,6 @@ use eyre::Result; use futures_util::TryStreamExt as _; use iroha::{ client::{self, Client, QueryResult}, - crypto::KeyPair, data_model::prelude::*, }; use iroha_data_model::parameter::{default::EXECUTOR_FUEL_LIMIT, ParametersBuilder}; @@ -24,11 +23,9 @@ fn executor_upgrade_should_work() -> Result<()> { let admin_id: AccountId = format!("{ADMIN_PUBLIC_KEY_MULTIHASH}@admin") .parse() .unwrap(); - let admin_keypair = KeyPair::new( - admin_id.signatory().clone(), - ADMIN_PRIVATE_KEY_MULTIHASH.parse().unwrap(), - ) - .unwrap(); + let admin_private_key = ADMIN_PRIVATE_KEY_MULTIHASH + .parse::() + .unwrap(); let (_rt, _peer, client) = ::new().with_port(10_795).start_with_runtime(); wait_for_genesis_committed(&vec![client.clone()], 0); @@ -49,7 +46,7 @@ fn executor_upgrade_should_work() -> Result<()> { let transfer_alice_rose = Transfer::asset_numeric(alice_rose, 1u32, admin_id.clone()); let transfer_rose_tx = TransactionBuilder::new(chain_id.clone(), admin_id.clone()) .with_instructions([transfer_alice_rose.clone()]) - .sign(&admin_keypair); + .sign(&admin_private_key); let _ = client .submit_transaction_blocking(&transfer_rose_tx) .expect_err("Should fail"); @@ -63,7 +60,7 @@ fn executor_upgrade_should_work() -> Result<()> { // Creating new transaction instead of cloning, because we need to update it's creation time let transfer_rose_tx = TransactionBuilder::new(chain_id, admin_id.clone()) .with_instructions([transfer_alice_rose]) - .sign(&admin_keypair); + .sign(&admin_private_key); client .submit_transaction_blocking(&transfer_rose_tx) .expect("Should succeed"); diff --git a/client_cli/pytests/src/client_cli/client_cli.py b/client_cli/pytests/src/client_cli/client_cli.py index 6ebcdadafba..27087ac7592 100644 --- a/client_cli/pytests/src/client_cli/client_cli.py +++ b/client_cli/pytests/src/client_cli/client_cli.py @@ -34,7 +34,7 @@ def __init__(self, config: Config): self.stdout = None self.stderr = None self.transaction_hash = None - self._timeout = 20 + self._timeout = 40 def __enter__(self): """ diff --git a/client_cli/src/main.rs b/client_cli/src/main.rs index 50b7bdaba9b..3a2ea0caa3e 100644 --- a/client_cli/src/main.rs +++ b/client_cli/src/main.rs @@ -84,6 +84,7 @@ impl FromStr for MetadataValueArg { struct Args { /// Path to the configuration file #[arg(short, long, value_name("PATH"), value_hint(clap::ValueHint::FilePath))] + #[clap(default_value = "client.toml")] config: PathBuf, /// More verbose output #[arg(short, long)] diff --git a/configs/swarm/executor.wasm b/configs/swarm/executor.wasm index 0ec7ad328a42afcbeca654224357fc084bd00824..c3d58d763d5a5db0669f99cdb72bf826d455750e 100644 GIT binary patch delta 178310 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%0APCU<_zz6vb{yRKR_> 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 N;HsCydArnC{~xgN4>14$ diff --git a/core/benches/blocks/apply_blocks.rs b/core/benches/blocks/apply_blocks.rs index 28daef9e720..eef0b25d7dd 100644 --- a/core/benches/blocks/apply_blocks.rs +++ b/core/benches/blocks/apply_blocks.rs @@ -44,7 +44,7 @@ impl StateApplyBlocks { &mut state_block, instructions, alice_id.clone(), - &alice_keypair, + alice_keypair.private_key(), ); let _events = state_block.apply_without_execution(&block); state_block.commit(); diff --git a/core/benches/blocks/common.rs b/core/benches/blocks/common.rs index 6cf22c3fee7..297bbed5d42 100644 --- a/core/benches/blocks/common.rs +++ b/core/benches/blocks/common.rs @@ -25,25 +25,25 @@ pub fn create_block( state: &mut StateBlock<'_>, instructions: Vec, account_id: AccountId, - key_pair: &KeyPair, + private_key: &PrivateKey, ) -> CommittedBlock { let chain_id = ChainId::from("00000000-0000-0000-0000-000000000000"); let transaction = TransactionBuilder::new(chain_id.clone(), account_id) .with_instructions(instructions) - .sign(key_pair); + .sign(private_key); let limits = state.transaction_executor().transaction_limits; let (peer_public_key, _) = KeyPair::random().into_parts(); let peer_id = PeerId::new("127.0.0.1:8080".parse().unwrap(), peer_public_key); let topology = Topology::new(vec![peer_id]); let block = BlockBuilder::new( - vec![AcceptedTransaction::accept(transaction, &chain_id, &limits).unwrap()], + vec![AcceptedTransaction::accept(transaction, &chain_id, limits).unwrap()], topology.clone(), Vec::new(), ) .chain(0, state) - .sign(key_pair.private_key()) + .sign(private_key) .unpack(|_| {}) .commit(&topology) .unpack(|_| {}) diff --git a/core/benches/blocks/validate_blocks.rs b/core/benches/blocks/validate_blocks.rs index 0d26e9ed407..c9e7e082ab4 100644 --- a/core/benches/blocks/validate_blocks.rs +++ b/core/benches/blocks/validate_blocks.rs @@ -10,7 +10,7 @@ use common::*; pub struct StateValidateBlocks { state: State, instructions: Vec>, - key_pair: KeyPair, + private_key: PrivateKey, account_id: AccountId, } @@ -41,7 +41,7 @@ impl StateValidateBlocks { Self { state, instructions, - key_pair: alice_keypair, + private_key: alice_keypair.private_key().clone(), account_id: alice_id, } } @@ -58,7 +58,7 @@ impl StateValidateBlocks { Self { state, instructions, - key_pair, + private_key, account_id, }: Self, ) { @@ -68,7 +68,7 @@ impl StateValidateBlocks { &mut state_block, instructions, account_id.clone(), - &key_pair, + &private_key, ); let _events = state_block.apply_without_execution(&block); assert_eq!(state_block.height(), i); diff --git a/core/benches/kura.rs b/core/benches/kura.rs index 7f15ed8d8be..bc3b55a49e6 100644 --- a/core/benches/kura.rs +++ b/core/benches/kura.rs @@ -28,12 +28,12 @@ async fn measure_block_size_for_n_executors(n_executors: u32) { let transfer = Transfer::asset_numeric(alice_xor_id, 10u32, bob_id); let tx = TransactionBuilder::new(chain_id.clone(), alice_id.clone()) .with_instructions([transfer]) - .sign(&alice_keypair); + .sign(alice_keypair.private_key()); let transaction_limits = TransactionLimits { max_instruction_number: 4096, max_wasm_size_bytes: 0, }; - let tx = AcceptedTransaction::accept(tx, &chain_id, &transaction_limits) + let tx = AcceptedTransaction::accept(tx, &chain_id, transaction_limits) .expect("Failed to accept Transaction."); let dir = tempfile::tempdir().expect("Could not create tempfile."); let cfg = Config { diff --git a/core/benches/validation.rs b/core/benches/validation.rs index a4c43460399..009e39fe00a 100644 --- a/core/benches/validation.rs +++ b/core/benches/validation.rs @@ -80,12 +80,12 @@ fn build_test_and_transient_state() -> State { fn accept_transaction(criterion: &mut Criterion) { let chain_id = ChainId::from("00000000-0000-0000-0000-000000000000"); - let transaction = build_test_transaction(chain_id.clone()).sign(&STARTER_KEYPAIR); + let transaction = build_test_transaction(chain_id.clone()).sign(STARTER_KEYPAIR.private_key()); let mut success_count = 0; let mut failures_count = 0; let _ = criterion.bench_function("accept", |b| { b.iter(|| { - match AcceptedTransaction::accept(transaction.clone(), &chain_id, &TRANSACTION_LIMITS) { + match AcceptedTransaction::accept(transaction.clone(), &chain_id, TRANSACTION_LIMITS) { Ok(_) => success_count += 1, Err(_) => failures_count += 1, } @@ -98,13 +98,13 @@ fn sign_transaction(criterion: &mut Criterion) { let chain_id = ChainId::from("00000000-0000-0000-0000-000000000000"); let transaction = build_test_transaction(chain_id); - let key_pair = KeyPair::random(); + let (_, private_key) = KeyPair::random().into_parts(); let mut count = 0; let _ = criterion.bench_function("sign", |b| { b.iter_batched( || transaction.clone(), |transaction| { - let _: SignedTransaction = transaction.sign(&key_pair); + let _: SignedTransaction = transaction.sign(&private_key); count += 1; }, BatchSize::SmallInput, @@ -117,9 +117,9 @@ fn validate_transaction(criterion: &mut Criterion) { let chain_id = ChainId::from("00000000-0000-0000-0000-000000000000"); let transaction = AcceptedTransaction::accept( - build_test_transaction(chain_id.clone()).sign(&STARTER_KEYPAIR), + build_test_transaction(chain_id.clone()).sign(STARTER_KEYPAIR.private_key()), &chain_id, - &TRANSACTION_LIMITS, + TRANSACTION_LIMITS, ) .expect("Failed to accept transaction."); let mut success_count = 0; @@ -142,9 +142,9 @@ fn sign_blocks(criterion: &mut Criterion) { let chain_id = ChainId::from("00000000-0000-0000-0000-000000000000"); let transaction = AcceptedTransaction::accept( - build_test_transaction(chain_id.clone()).sign(&STARTER_KEYPAIR), + build_test_transaction(chain_id.clone()).sign(STARTER_KEYPAIR.private_key()), &chain_id, - &TRANSACTION_LIMITS, + TRANSACTION_LIMITS, ) .expect("Failed to accept transaction."); let kura = iroha_core::kura::Kura::blank_kura_for_testing(); diff --git a/core/src/block.rs b/core/src/block.rs index 63dd1ee9ee0..19d2fd2487e 100644 --- a/core/src/block.rs +++ b/core/src/block.rs @@ -131,8 +131,6 @@ mod pending { commit_topology: Topology, event_recommendations: Vec, ) -> Self { - assert!(!transactions.is_empty(), "Empty block created"); - Self(Pending { commit_topology, transactions, @@ -158,14 +156,17 @@ mod pending { .iter() .map(|value| value.as_ref().hash()) .collect::>() - .hash(), + .hash() + .expect("INTERNAL BUG: Empty block created"), timestamp_ms: SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .expect("INTERNAL BUG: Failed to get the current system time") .as_millis() .try_into() - .expect("INTERNAL BUG: Time should fit into u64"), - view_change_index: view_change_index as u32, + .expect("Time should fit into u64"), + view_change_index: view_change_index + .try_into() + .expect("View change index should fit into u32"), consensus_estimation_ms: consensus_estimation .as_millis() .try_into() @@ -244,7 +245,7 @@ mod chained { mod valid { use indexmap::IndexMap; - use iroha_data_model::ChainId; + use iroha_data_model::{account::AccountId, ChainId}; use super::*; use crate::{state::StateBlock, sumeragi::network_topology::Role}; @@ -294,24 +295,14 @@ mod valid { block: &SignedBlock, topology: &Topology, ) -> Result<(), SignatureVerificationError> { - // TODO: ? - //let roles: &[Role] = if topology.view_change_index() >= 1 { - // &[Role::ValidatingPeer, Role::ObservingPeer] - //} else { - // if topology - // .filter_signatures_by_roles(&[Role::ObservingPeer], block.signatures()) - // .next() - // .is_some() - // { - // return Err(SignatureVerificationError::UnknownSignatory); - // } - - // &[Role::ValidatingPeer] - //}; - let roles = &[Role::ValidatingPeer, Role::ObservingPeer]; + let valid_roles: &[Role] = if topology.view_change_index() >= 1 { + &[Role::ValidatingPeer, Role::ObservingPeer] + } else { + &[Role::ValidatingPeer] + }; topology - .filter_signatures_by_roles(roles, block.signatures()) + .filter_signatures_by_roles(valid_roles, block.signatures()) .try_fold(IndexMap::::default(), |mut acc, signature| { let signatory_idx = usize::try_from(signature.0) .map_err(|_err| SignatureVerificationError::UnknownSignatory)?; @@ -338,6 +329,13 @@ mod valid { Ok(()) })?; + Ok(()) + } + + fn verify_no_undefined_signatures( + block: &SignedBlock, + topology: &Topology, + ) -> Result<(), SignatureVerificationError> { if topology .filter_signatures_by_roles(&[Role::Undefined], block.signatures()) .next() @@ -403,7 +401,7 @@ mod valid { block: SignedBlock, topology: &Topology, expected_chain_id: &ChainId, - genesis_public_key: &PublicKey, + genesis_account: &AccountId, state_block: &mut StateBlock<'_>, ) -> WithEvents> { let expected_block_height = state_block.height() + 1; @@ -439,6 +437,7 @@ mod valid { if !block.header().is_genesis() { if let Err(err) = Self::verify_leader_signature(&block, topology) .and_then(|()| Self::verify_validator_signatures(&block, topology)) + .and_then(|()| Self::verify_no_undefined_signatures(&block, topology)) { return WithEvents::new(Err((block, err.into()))); } @@ -469,12 +468,9 @@ mod valid { ))); } - if let Err(error) = Self::validate_transactions( - &block, - expected_chain_id, - genesis_public_key, - state_block, - ) { + if let Err(error) = + Self::validate_transactions(&block, expected_chain_id, genesis_account, state_block) + { return WithEvents::new(Err((block, error.into()))); } @@ -484,7 +480,7 @@ mod valid { fn validate_transactions( block: &SignedBlock, expected_chain_id: &ChainId, - genesis_public_key: &PublicKey, + genesis_account: &AccountId, state_block: &mut StateBlock<'_>, ) -> Result<(), TransactionValidationError> { let is_genesis = block.header().is_genesis(); @@ -495,16 +491,19 @@ mod valid { .cloned() .try_for_each(|CommittedTransaction { value, error }| { let transaction_executor = state_block.transaction_executor(); - let limits = &transaction_executor.transaction_limits; let tx = if is_genesis { AcceptedTransaction::accept_genesis( GenesisTransaction(value), expected_chain_id, - genesis_public_key, + genesis_account, ) } else { - AcceptedTransaction::accept(value, expected_chain_id, limits) + AcceptedTransaction::accept( + value, + expected_chain_id, + transaction_executor.transaction_limits, + ) }?; if error.is_some() { @@ -531,9 +530,21 @@ mod valid { &mut self, signature: BlockSignature, topology: &Topology, - ) -> Result<(), iroha_crypto::Error> { - let signatory = &topology.as_ref()[signature.0 as usize]; - self.0.add_signature(signature, signatory.public_key()) + ) -> Result<(), SignatureVerificationError> { + let signatory_idx = usize::try_from(signature.0) + .expect("INTERNAL BUG: Number of peers exceeds usize::MAX"); + let signatory = &topology.as_ref()[signatory_idx]; + + assert_ne!(Role::Leader, topology.role(signatory)); + if topology.view_change_index() == 0 { + assert_ne!(Role::ObservingPeer, topology.role(signatory),); + } + assert_ne!(Role::Undefined, topology.role(signatory)); + assert_ne!(Role::ProxyTail, topology.role(signatory)); + + self.0 + .add_signature(signature, signatory.public_key()) + .map_err(|_err| SignatureVerificationError::UnknownSignature) } /// Replace block's signatures. Returns previous block signatures @@ -553,6 +564,7 @@ mod valid { if let Err(err) = Self::verify_leader_signature(self.as_ref(), topology) .and_then(|()| Self::verify_validator_signatures(self.as_ref(), topology)) + .and_then(|()| Self::verify_no_undefined_signatures(self.as_ref(), topology)) { self.0.replace_signatures_unchecked(prev_signatures); WithEvents::new(Err(err)) @@ -613,7 +625,9 @@ mod valid { header: BlockHeader { height: 2, prev_block_hash: None, - transactions_hash: None, + transactions_hash: HashOf::from_untyped_unchecked(Hash::prehashed( + [1; Hash::LENGTH], + )), timestamp_ms: 0, view_change_index: 0, consensus_estimation_ms: 4_000, @@ -644,13 +658,9 @@ mod valid { #[cfg(test)] mod tests { use iroha_crypto::SignatureOf; - use iroha_primitives::unique_vec::UniqueVec; use super::*; - use crate::{ - kura::Kura, query::store::LiveQueryStore, state::State, - sumeragi::network_topology::test_peers, - }; + use crate::sumeragi::network_topology::test_peers; #[test] fn signature_verification_ok() { @@ -901,7 +911,7 @@ mod tests { use iroha_data_model::prelude::*; use iroha_genesis::GENESIS_DOMAIN_ID; use iroha_primitives::unique_vec::UniqueVec; - use test_samples::gen_account_in; + use test_samples::{gen_account_in, SAMPLE_GENESIS_ACCOUNT_ID}; use super::*; use crate::{ @@ -946,10 +956,10 @@ mod tests { Register::asset_definition(AssetDefinition::numeric(asset_definition_id)); // Making two transactions that have the same instruction - let transaction_limits = &state_block.transaction_executor().transaction_limits; + let transaction_limits = state_block.transaction_executor().transaction_limits; let tx = TransactionBuilder::new(chain_id.clone(), alice_id) .with_instructions([create_asset_definition]) - .sign(&alice_keypair); + .sign(alice_keypair.private_key()); let tx = AcceptedTransaction::accept(tx, &chain_id, transaction_limits).expect("Valid"); // Creating a block of two identical transactions and validating it @@ -1003,10 +1013,10 @@ mod tests { Register::asset_definition(AssetDefinition::numeric(asset_definition_id.clone())); // Making two transactions that have the same instruction - let transaction_limits = &state_block.transaction_executor().transaction_limits; + let transaction_limits = state_block.transaction_executor().transaction_limits; let tx = TransactionBuilder::new(chain_id.clone(), alice_id.clone()) .with_instructions([create_asset_definition]) - .sign(&alice_keypair); + .sign(alice_keypair.private_key()); let tx = AcceptedTransaction::accept(tx, &chain_id, transaction_limits).expect("Valid"); let fail_mint = Mint::asset_numeric( @@ -1019,12 +1029,12 @@ mod tests { let tx0 = TransactionBuilder::new(chain_id.clone(), alice_id.clone()) .with_instructions([fail_mint]) - .sign(&alice_keypair); + .sign(alice_keypair.private_key()); let tx0 = AcceptedTransaction::accept(tx0, &chain_id, transaction_limits).expect("Valid"); let tx2 = TransactionBuilder::new(chain_id.clone(), alice_id) .with_instructions([succeed_mint]) - .sign(&alice_keypair); + .sign(alice_keypair.private_key()); let tx2 = AcceptedTransaction::accept(tx2, &chain_id, transaction_limits).expect("Valid"); // Creating a block of two identical transactions and validating it @@ -1074,7 +1084,7 @@ mod tests { let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura, query_handle); let mut state_block = state.block(); - let transaction_limits = &state_block.transaction_executor().transaction_limits; + let transaction_limits = state_block.transaction_executor().transaction_limits; let domain_id = DomainId::from_str("domain").expect("Valid"); let create_domain = Register::domain(Domain::new(domain_id)); @@ -1088,12 +1098,12 @@ mod tests { let instructions_accept: [InstructionBox; 2] = [create_domain.into(), create_asset.into()]; let tx_fail = TransactionBuilder::new(chain_id.clone(), alice_id.clone()) .with_instructions(instructions_fail) - .sign(&alice_keypair); + .sign(alice_keypair.private_key()); let tx_fail = AcceptedTransaction::accept(tx_fail, &chain_id, transaction_limits).expect("Valid"); let tx_accept = TransactionBuilder::new(chain_id.clone(), alice_id) .with_instructions(instructions_accept) - .sign(&alice_keypair); + .sign(alice_keypair.private_key()); let tx_accept = AcceptedTransaction::accept(tx_accept, &chain_id, transaction_limits).expect("Valid"); @@ -1168,11 +1178,11 @@ mod tests { // Sign with `genesis_wrong_key` as peer which has incorrect genesis key pair let tx = TransactionBuilder::new(chain_id.clone(), genesis_wrong_account_id.clone()) .with_instructions([isi]) - .sign(&genesis_wrong_key); + .sign(genesis_wrong_key.private_key()); let tx = AcceptedTransaction::accept_genesis( iroha_genesis::GenesisTransaction(tx), &chain_id, - genesis_wrong_key.public_key(), + &SAMPLE_GENESIS_ACCOUNT_ID, ) .expect("Valid"); @@ -1193,7 +1203,7 @@ mod tests { block, &topology, &chain_id, - genesis_correct_key.public_key(), + &SAMPLE_GENESIS_ACCOUNT_ID, &mut state_block, ) .unpack(|_| {}) diff --git a/core/src/gossiper.rs b/core/src/gossiper.rs index c964bbb151f..4f5018aa9f6 100644 --- a/core/src/gossiper.rs +++ b/core/src/gossiper.rs @@ -110,7 +110,7 @@ impl TransactionGossiper { let state_view = self.state.view(); for tx in txs { - let transaction_limits = &state_view.config.transaction_limits; + let transaction_limits = state_view.config.transaction_limits; match AcceptedTransaction::accept(tx, &self.chain_id, transaction_limits) { Ok(tx) => match self.queue.push(tx, &state_view) { diff --git a/core/src/queue.rs b/core/src/queue.rs index 1fb321da655..1e343eb4033 100644 --- a/core/src/queue.rs +++ b/core/src/queue.rs @@ -22,12 +22,6 @@ use crate::{prelude::*, EventsSender}; impl AcceptedTransaction { // TODO: We should have another type of transaction like `CheckedTransaction` in the type system? - fn is_signatory_consistent(&self) -> bool { - let authority = self.as_ref().authority(); - let signatory = &self.as_ref().signature().0; - authority.signatory_matches(signatory) - } - /// Check if [`self`] is committed or rejected. fn is_in_blockchain(&self, state_view: &StateView<'_>) -> bool { state_view.has_transaction(self.as_ref().hash()) @@ -77,8 +71,6 @@ pub enum Error { MaximumTransactionsPerUser, /// The transaction is already in the queue IsInQueue, - /// Signatories in signature and payload mismatch - SignatoryInconsistent, } /// Failure that can pop up when pushing transaction into the queue @@ -175,8 +167,6 @@ impl Queue { Err(Error::Expired) } else if tx.is_in_blockchain(state_view) { Err(Error::InBlockchain) - } else if !tx.is_signatory_consistent() { - Err(Error::SignatoryInconsistent) } else { Ok(()) } @@ -436,12 +426,12 @@ pub mod tests { let tx = TransactionBuilder::new_with_time_source(chain_id.clone(), account_id, time_source) .with_instructions(instructions) - .sign(key_pair); + .sign(key_pair.private_key()); let limits = TransactionLimits { max_instruction_number: 4096, max_wasm_size_bytes: 0, }; - AcceptedTransaction::accept(tx, &chain_id, &limits).expect("Failed to accept Transaction.") + AcceptedTransaction::accept(tx, &chain_id, limits).expect("Failed to accept Transaction.") } pub fn world_with_test_domains() -> World { @@ -687,13 +677,13 @@ pub mod tests { TransactionBuilder::new_with_time_source(chain_id.clone(), alice_id, &time_source) .with_instructions(instructions); tx.set_ttl(Duration::from_millis(TTL_MS)); - let tx = tx.sign(&alice_keypair); + let tx = tx.sign(alice_keypair.private_key()); let limits = TransactionLimits { max_instruction_number: 4096, max_wasm_size_bytes: 0, }; let tx_hash = tx.hash(); - let tx = AcceptedTransaction::accept(tx, &chain_id, &limits) + let tx = AcceptedTransaction::accept(tx, &chain_id, limits) .expect("Failed to accept Transaction."); queue .push(tx.clone(), &state_view) diff --git a/core/src/smartcontracts/isi/mod.rs b/core/src/smartcontracts/isi/mod.rs index 46acb4a1fc0..e5746fdb1c3 100644 --- a/core/src/smartcontracts/isi/mod.rs +++ b/core/src/smartcontracts/isi/mod.rs @@ -496,8 +496,8 @@ mod tests { let instructions: [InstructionBox; 0] = []; let tx = TransactionBuilder::new(chain_id.clone(), SAMPLE_GENESIS_ACCOUNT_ID.clone()) .with_instructions(instructions) - .sign(&SAMPLE_GENESIS_ACCOUNT_KEYPAIR); - let tx_limits = &state_block.transaction_executor().transaction_limits; + .sign(SAMPLE_GENESIS_ACCOUNT_KEYPAIR.private_key()); + let tx_limits = state_block.transaction_executor().transaction_limits; assert!(matches!( AcceptedTransaction::accept(tx, &chain_id, tx_limits), Err(AcceptTransactionFail::UnexpectedGenesisAccountSignature) diff --git a/core/src/smartcontracts/isi/query.rs b/core/src/smartcontracts/isi/query.rs index 5129709d5aa..fcd6e87a5f4 100644 --- a/core/src/smartcontracts/isi/query.rs +++ b/core/src/smartcontracts/isi/query.rs @@ -187,12 +187,6 @@ impl ValidQueryRequest { query: SignedQuery, state_ro: &impl StateReadOnly, ) -> Result { - if !query.authority().signatory_matches(&query.signature().0) { - return Err(Error::Signature(String::from( - "Signature public key doesn't correspond to the account.", - )) - .into()); - } state_ro.world().executor().validate_query( state_ro, query.authority(), @@ -401,15 +395,15 @@ mod tests { let instructions: [InstructionBox; 0] = []; let tx = TransactionBuilder::new(chain_id.clone(), ALICE_ID.clone()) .with_instructions(instructions) - .sign(&ALICE_KEYPAIR); - AcceptedTransaction::accept(tx, &chain_id, &limits)? + .sign(ALICE_KEYPAIR.private_key()); + AcceptedTransaction::accept(tx, &chain_id, limits)? }; let invalid_tx = { let isi = Fail::new("fail".to_owned()); let tx = TransactionBuilder::new(chain_id.clone(), ALICE_ID.clone()) .with_instructions([isi.clone(), isi]) - .sign(&ALICE_KEYPAIR); - AcceptedTransaction::accept(tx, &chain_id, &huge_limits)? + .sign(ALICE_KEYPAIR.private_key()); + AcceptedTransaction::accept(tx, &chain_id, huge_limits)? }; let mut transactions = vec![valid_tx; valid_tx_per_block]; @@ -566,9 +560,9 @@ mod tests { let instructions: [InstructionBox; 0] = []; let tx = TransactionBuilder::new(chain_id.clone(), ALICE_ID.clone()) .with_instructions(instructions) - .sign(&ALICE_KEYPAIR); + .sign(ALICE_KEYPAIR.private_key()); - let tx_limits = &state_block.transaction_executor().transaction_limits; + let tx_limits = state_block.transaction_executor().transaction_limits; let va_tx = AcceptedTransaction::accept(tx, &chain_id, tx_limits)?; let (peer_public_key, _) = KeyPair::random().into_parts(); @@ -590,7 +584,7 @@ mod tests { let unapplied_tx = TransactionBuilder::new(chain_id, ALICE_ID.clone()) .with_instructions([Unregister::account(gen_account_in("domain").0)]) - .sign(&ALICE_KEYPAIR); + .sign(ALICE_KEYPAIR.private_key()); let wrong_hash = unapplied_tx.hash(); let not_found = FindTransactionByHash::new(wrong_hash).execute(&state_view); assert!(matches!( diff --git a/core/src/state.rs b/core/src/state.rs index d869a2ed17c..03625f53dc0 100644 --- a/core/src/state.rs +++ b/core/src/state.rs @@ -1360,7 +1360,7 @@ impl StateTransaction<'_, '_> { ) -> Self { if let Some(param) = self.0 { if param.id().name().as_ref() == id { - if let Some(value) = param.val.try_into().ok() { + if let Ok(value) = param.val.try_into() { fun(value); } Self(None) diff --git a/core/src/sumeragi/main_loop.rs b/core/src/sumeragi/main_loop.rs index a10e32125ef..9d78225e19c 100644 --- a/core/src/sumeragi/main_loop.rs +++ b/core/src/sumeragi/main_loop.rs @@ -1,5 +1,5 @@ //! The main event loop that powers sumeragi. -use std::sync::mpsc; +use std::{collections::BTreeSet, sync::mpsc}; use iroha_crypto::{HashOf, KeyPair}; use iroha_data_model::{block::*, events::pipeline::PipelineEventBox, peer::PeerId}; @@ -211,7 +211,7 @@ impl Sumeragi { fn init_listen_for_genesis( &mut self, - genesis_public_key: &PublicKey, + genesis_account: &AccountId, state: &State, shutdown_receiver: &mut tokio::sync::oneshot::Receiver<()>, ) -> Result<(), EarlyReturn> { @@ -244,7 +244,7 @@ impl Sumeragi { block, &self.topology, &self.chain_id, - genesis_public_key, + genesis_account, &mut state_block, ) .unpack(|e| self.send_event(e)) @@ -288,10 +288,10 @@ impl Sumeragi { } } - fn sumeragi_init_commit_genesis( + fn init_commit_genesis( &mut self, genesis_transaction: GenesisTransaction, - genesis_public_key: &PublicKey, + genesis_account: &AccountId, state: &State, ) { std::thread::sleep(Duration::from_millis(250)); // TODO: Why this sleep? @@ -305,7 +305,7 @@ impl Sumeragi { let transaction = AcceptedTransaction::accept_genesis( genesis_transaction, &self.chain_id, - genesis_public_key, + genesis_account, ) .expect("Genesis invalid"); let transactions = vec![transaction]; @@ -356,14 +356,18 @@ impl Sumeragi { .block_committed(block.as_ref(), state_block.world.peers().cloned()); self.connect_peers(&self.topology); + let block_hash = block.as_ref().hash(); + let block_height = block.as_ref().header().height(); + Strategy::kura_store_block(&self.kura, block); + // Commit new block making it's effect visible for the rest of application state_block.commit(); info!( peer_id=%self.peer_id, %prev_role, next_role=%self.role(), - block_hash=%block.as_ref().hash(), - new_height=%block.as_ref().header().height, + block_hash=%block_hash, + new_height=%block_height, "{}", Strategy::LOG_MESSAGE, ); #[cfg(debug_assertions)] @@ -374,8 +378,6 @@ impl Sumeragi { "Topology after commit" ); - Strategy::kura_store_block(&self.kura, block); - // NOTE: This sends `BlockStatus::Applied` event, // so it should be done AFTER public facing state update state_events.into_iter().for_each(|e| self.send_event(e)); @@ -400,7 +402,7 @@ impl Sumeragi { &self, state: &'state State, topology: &Topology, - genesis_public_key: &PublicKey, + genesis_account: &AccountId, BlockCreated { block }: BlockCreated, ) -> Option> { let mut state_block = state.block(); @@ -409,7 +411,7 @@ impl Sumeragi { block, topology, &self.chain_id, - genesis_public_key, + genesis_account, &mut state_block, ) .unpack(|e| self.send_event(e)) @@ -436,14 +438,15 @@ impl Sumeragi { } #[allow(clippy::too_many_lines)] + #[allow(clippy::too_many_arguments)] fn handle_message<'state>( &mut self, message: BlockMessage, state: &'state State, voting_block: &mut Option>, view_change_index: usize, - genesis_public_key: &PublicKey, - voting_signatures: &mut Vec, + genesis_account: &AccountId, + voting_signatures: &mut BTreeSet, #[cfg_attr(not(debug_assertions), allow(unused_variables))] is_genesis_peer: bool, ) { #[allow(clippy::suspicious_operation_groupings)] @@ -459,9 +462,10 @@ impl Sumeragi { // Release block writer before creating new one // FIX: Restore `voting_block` if `handle_block_sync` returns Err // Currently it's not possible because block writer needs to be released + // Look at https://github.com/hyperledger/iroha/issues/4643 let _ = voting_block.take(); - match handle_block_sync(&self.chain_id, block, state, genesis_public_key, &|e| { + match handle_block_sync(&self.chain_id, block, state, genesis_account, &|e| { self.send_event(e) }) { Ok(BlockSyncOk::CommitBlock(block, state_block, topology)) => { @@ -548,7 +552,7 @@ impl Sumeragi { let _ = voting_block.take(); if let Some(mut v_block) = - self.validate_block(state, topology, genesis_public_key, block_created) + self.validate_block(state, topology, genesis_account, block_created) { v_block.block.sign(&self.key_pair, topology); @@ -559,6 +563,7 @@ impl Sumeragi { } else { // FIX: Restore `voting_block` // Currently it's not possible because block writer needs to be released + // Look at https://github.com/hyperledger/iroha/issues/4643 } } (BlockMessage::BlockCreated(block_created), Role::ObservingPeer) => { @@ -571,7 +576,7 @@ impl Sumeragi { let _ = voting_block.take(); if let Some(mut v_block) = - self.validate_block(state, topology, genesis_public_key, block_created) + self.validate_block(state, topology, genesis_account, block_created) { if view_change_index >= 1 { v_block.block.sign(&self.key_pair, topology); @@ -591,6 +596,7 @@ impl Sumeragi { } else { // FIX: Restore `voting_block` // Currently it's not possible because block writer needs to be released + // Look at https://github.com/hyperledger/iroha/issues/4643 } } (BlockMessage::BlockCreated(block_created), Role::ProxyTail) => { @@ -605,98 +611,165 @@ impl Sumeragi { let _ = voting_block.take(); if let Some(mut valid_block) = - self.validate_block(state, &self.topology, genesis_public_key, block_created) + self.validate_block(state, &self.topology, genesis_account, block_created) { // NOTE: Up until this point it was unknown which block is expected to be received, // therefore all the signatures (of any hash) were collected and will now be pruned - add_signatures::( - &mut valid_block, - voting_signatures.drain(..), - &self.topology, - ); + + for signature in core::mem::take(voting_signatures) { + if let Err(error) = + valid_block.block.add_signature(signature, &self.topology) + { + debug!(?error, "Signature not valid"); + } + } *voting_block = self.try_commit_block(valid_block, is_genesis_peer); } else { // FIX: Restore `voting_block` // Currently it's not possible because block writer needs to be released + // Look at https://github.com/hyperledger/iroha/issues/4643 } } - (BlockMessage::BlockSigned(BlockSigned { signatures }), Role::ProxyTail) => { + (BlockMessage::BlockSigned(BlockSigned { hash, signature }), Role::ProxyTail) => { info!( peer_id=%self.peer_id, role=%self.role(), "Received block signatures" ); - let roles: &[Role] = if view_change_index >= 1 { - &[Role::ValidatingPeer, Role::ObservingPeer] - } else { - &[Role::ValidatingPeer] - }; - let valid_signatures = self - .topology - .filter_signatures_by_roles(roles, &signatures) - .cloned(); + if let Ok(signatory_idx) = usize::try_from(signature.0) { + let signatory = &self.topology.as_ref()[signatory_idx]; - if let Some(mut voted_block) = voting_block.take() { - add_signatures::(&mut voted_block, valid_signatures, &self.topology); - *voting_block = self.try_commit_block(voted_block, is_genesis_peer); + match self.topology.role(signatory) { + Role::Leader => error!( + peer_id=%self.peer_id, + role=%self.role(), + "Signatory is leader" + ), + Role::Undefined => error!( + peer_id=%self.peer_id, + role=%self.role(), + "Unknown signatory" + ), + Role::ObservingPeer if view_change_index == 0 => error!( + peer_id=%self.peer_id, + role=%self.role(), + "Signatory is observing peer" + ), + Role::ProxyTail => error!( + peer_id=%self.peer_id, + role=%self.role(), + "Signatory is proxy tail" + ), + _ => { + if let Some(mut voted_block) = voting_block.take() { + let actual_hash = voted_block.block.as_ref().hash_of_payload(); + + if hash != actual_hash { + error!( + peer_id=%self.peer_id, + role=%self.role(), + expected_hash=?hash, + ?actual_hash, + "Block hash mismatch" + ); + } else if let Err(err) = + voted_block.block.add_signature(signature, &self.topology) + { + error!( + peer_id=%self.peer_id, + role=%self.role(), + ?err, + "Signature not valid" + ); + } else { + *voting_block = + self.try_commit_block(voted_block, is_genesis_peer); + } + } else { + // NOTE: Due to the nature of distributed systems, signatures can sometimes be received before + // the block (sent by the leader). Collect the signatures and wait for the block to be received + if !voting_signatures.insert(signature) { + error!( + peer_id=%self.peer_id, + role=%self.role(), + "Duplicate signature" + ); + } + } + } + } } else { - // NOTE: Due to the nature of distributed systems, signatures can sometimes be received before - // the block (sent by the leader). Collect the signatures and wait for the block to be received - voting_signatures.extend(valid_signatures); + error!( + peer_id=%self.peer_id, + role=%self.role(), + "Signatory index exceeds usize::MAX" + ); } } (BlockMessage::BlockCommitted(BlockCommitted { .. }), Role::Leader) if self.topology.is_consensus_required().is_none() => {} ( - BlockMessage::BlockCommitted(BlockCommitted { signatures }), + BlockMessage::BlockCommitted(BlockCommitted { hash, signatures }), Role::Leader | Role::ValidatingPeer | Role::ObservingPeer, ) => { if let Some(mut voted_block) = voting_block.take() { - match voted_block - .block - // NOTE: The manipulation of the topology relies upon all peers seeing the same signature set. - // Therefore we must clear the signatures and accept what the proxy tail giveth. - .replace_signatures(signatures, &self.topology) - .unpack(|e| self.send_event(e)) - { - Ok(prev_signatures) => { - match voted_block - .block - .commit(&self.topology) - .unpack(|e| self.send_event(e)) - { - Ok(committed_block) => { - self.commit_block(committed_block, voted_block.block_state) - } - Err((mut block, error)) => { - error!( - peer_id=%self.peer_id, - role=%self.role(), - ?error, - "Block failed to be committed" - ); - - block - .replace_signatures(prev_signatures, &self.topology) - .unpack(|e| self.send_event(e)) - .expect("INTERNAL BUG: Failed to replace signatures"); - voted_block.block = block; - *voting_block = Some(voted_block); + let actual_hash = voted_block.block.as_ref().hash(); + + if actual_hash == hash { + match voted_block + .block + // NOTE: The manipulation of the topology relies upon all peers seeing the same signature set. + // Therefore we must clear the signatures and accept what the proxy tail has giveth. + .replace_signatures(signatures, &self.topology) + .unpack(|e| self.send_event(e)) + { + Ok(prev_signatures) => { + match voted_block + .block + .commit(&self.topology) + .unpack(|e| self.send_event(e)) + { + Ok(committed_block) => { + self.commit_block(committed_block, voted_block.state_block) + } + Err((mut block, error)) => { + error!( + peer_id=%self.peer_id, + role=%self.role(), + ?error, + "Block failed to be committed" + ); + + block + .replace_signatures(prev_signatures, &self.topology) + .unpack(|e| self.send_event(e)) + .expect("INTERNAL BUG: Failed to replace signatures"); + voted_block.block = block; + *voting_block = Some(voted_block); + } } } + Err(error) => { + error!( + peer_id=%self.peer_id, + role=%self.role(), + ?error, + "Received incorrect signatures" + ); + + *voting_block = Some(voted_block); + } } - Err(error) => { - error!( - peer_id=%self.peer_id, - role=%self.role(), - ?error, - "Received incorrect signatures" - ); - - *voting_block = Some(voted_block); - } + } else { + error!( + peer_id=%self.peer_id, + role=%self.role(), + expected_hash=?hash, + ?actual_hash, + "Block hash mismatch" + ); } } else { error!( @@ -749,7 +822,7 @@ impl Sumeragi { self.broadcast_packet(msg); } - self.commit_block(committed_block, voting_block.block_state); + self.commit_block(committed_block, voting_block.state_block); return None; } @@ -828,7 +901,7 @@ fn reset_state( was_commit: &mut bool, topology: &mut Topology, voting_block: &mut Option, - voting_signatures: &mut Vec, + voting_signatures: &mut BTreeSet, last_view_change_time: &mut Instant, view_change_time: &mut Duration, ) { @@ -891,26 +964,30 @@ pub(crate) fn run( // Connect peers with initial topology sumeragi.connect_peers(&sumeragi.topology); + let genesis_account = AccountId::new( + iroha_genesis::GENESIS_DOMAIN_ID.clone(), + genesis_network.public_key.clone(), + ); + let span = span!(tracing::Level::TRACE, "genesis").entered(); - let is_genesis_peer = - if state.view().height() == 0 || state.view().latest_block_hash().is_none() { - if let Some(genesis) = genesis_network.genesis { - sumeragi.sumeragi_init_commit_genesis(genesis, &genesis_network.public_key, &state); - true - } else { - if let Err(err) = sumeragi.init_listen_for_genesis( - &genesis_network.public_key, - &state, - &mut shutdown_receiver, - ) { - info!(?err, "Sumeragi Thread is being shut down."); - return; - } - false - } + let is_genesis_peer = if state.view().height() == 0 + || state.view().latest_block_hash().is_none() + { + if let Some(genesis) = genesis_network.genesis { + sumeragi.init_commit_genesis(genesis, &genesis_account, &state); + true } else { + if let Err(err) = + sumeragi.init_listen_for_genesis(&genesis_account, &state, &mut shutdown_receiver) + { + info!(?err, "Sumeragi Thread is being shut down."); + return; + } false - }; + } + } else { + false + }; span.exit(); info!( @@ -921,7 +998,7 @@ pub(crate) fn run( let mut voting_block = None; // Proxy tail collection of voting block signatures - let mut voting_signatures = Vec::new(); + let mut voting_signatures = BTreeSet::new(); let mut should_sleep = false; let mut view_change_proof_chain = ProofChain::default(); // Duration after which a view change is suggested @@ -996,7 +1073,7 @@ pub(crate) fn run( &state, &mut voting_block, view_change_index, - &genesis_network.public_key, + &genesis_account, &mut voting_signatures, is_genesis_peer, ); @@ -1077,24 +1154,6 @@ pub(crate) fn run( } } -fn add_signatures( - block: &mut VotingBlock, - signatures: impl IntoIterator, - topology: &Topology, -) { - for signature in signatures { - if let Err(error) = block.block.add_signature(signature, topology) { - let err_msg = "Signature not valid"; - - if EXPECT_VALID { - error!(?error, err_msg); - } else { - debug!(?error, err_msg); - } - } - } -} - /// Type enumerating early return types to reduce cyclomatic /// complexity of the main loop items and allow direct short /// circuiting with the `?` operator. Candidate for `impl @@ -1176,7 +1235,7 @@ fn handle_block_sync<'state, F: Fn(PipelineEventBox)>( chain_id: &ChainId, block: SignedBlock, state: &'state State, - genesis_public_key: &PublicKey, + genesis_account: &AccountId, handle_events: &F, ) -> Result, (SignedBlock, BlockSyncError)> { let block_height = block @@ -1231,7 +1290,7 @@ fn handle_block_sync<'state, F: Fn(PipelineEventBox)>( block, &topology, chain_id, - genesis_public_key, + genesis_account, &mut state_block, ) .unpack(handle_events) @@ -1262,6 +1321,7 @@ fn handle_block_sync<'state, F: Fn(PipelineEventBox)>( #[cfg(test)] mod tests { + use iroha_genesis::GENESIS_DOMAIN_ID; use test_samples::gen_account_in; use tokio::test; @@ -1284,10 +1344,13 @@ mod tests { chain_id: &ChainId, topology: &Topology, leader_private_key: &PrivateKey, - ) -> (State, Arc, SignedBlock, PublicKey) { + ) -> (State, Arc, SignedBlock, AccountId) { // Predefined world state let (alice_id, alice_keypair) = gen_account_in("wonderland"); - let genesis_public_key = alice_keypair.public_key().clone(); + let genesis_account = AccountId::new( + GENESIS_DOMAIN_ID.clone(), + alice_keypair.public_key().clone(), + ); let account = Account::new(alice_id.clone()).build(&alice_id); let domain_id = "wonderland".parse().expect("Valid"); let mut domain = Domain::new(domain_id).build(&alice_id); @@ -1305,11 +1368,11 @@ mod tests { // Making two transactions that have the same instruction let tx = TransactionBuilder::new(chain_id.clone(), alice_id.clone()) .with_instructions([fail_box]) - .sign(&alice_keypair); + .sign(alice_keypair.private_key()); let tx = AcceptedTransaction::accept( tx, chain_id, - &state_block.transaction_executor().transaction_limits, + state_block.transaction_executor().transaction_limits, ) .expect("Valid"); @@ -1339,21 +1402,21 @@ mod tests { let tx1 = TransactionBuilder::new(chain_id.clone(), alice_id.clone()) .with_instructions([create_asset_definition1]) - .sign(&alice_keypair); + .sign(alice_keypair.private_key()); let tx1 = AcceptedTransaction::accept( tx1, chain_id, - &state_block.transaction_executor().transaction_limits, + state_block.transaction_executor().transaction_limits, ) .map(Into::into) .expect("Valid"); let tx2 = TransactionBuilder::new(chain_id.clone(), alice_id) .with_instructions([create_asset_definition2]) - .sign(&alice_keypair); + .sign(alice_keypair.private_key()); let tx2 = AcceptedTransaction::accept( tx2, chain_id, - &state_block.transaction_executor().transaction_limits, + state_block.transaction_executor().transaction_limits, ) .map(Into::into) .expect("Valid"); @@ -1365,7 +1428,7 @@ mod tests { .unpack(|_| {}) }; - (state, kura, block.into(), genesis_public_key) + (state, kura, block.into(), genesis_account) } #[test] diff --git a/core/src/sumeragi/message.rs b/core/src/sumeragi/message.rs index 390763094f7..30bb1ae3ea3 100644 --- a/core/src/sumeragi/message.rs +++ b/core/src/sumeragi/message.rs @@ -1,5 +1,6 @@ //! Contains message structures for p2p communication during consensus. -use iroha_data_model::block::{BlockSignature, SignedBlock}; +use iroha_crypto::HashOf; +use iroha_data_model::block::{BlockPayload, BlockSignature, SignedBlock}; use iroha_macro::*; use parity_scale_codec::{Decode, Encode}; @@ -37,7 +38,6 @@ impl ControlFlowMessage { /// `BlockCreated` message structure. #[derive(Debug, Clone, Decode, Encode)] -#[non_exhaustive] pub struct BlockCreated { /// The corresponding block. pub block: SignedBlock, @@ -54,24 +54,32 @@ impl From<&ValidBlock> for BlockCreated { /// `BlockSigned` message structure. #[derive(Debug, Clone, Decode, Encode)] -#[non_exhaustive] pub struct BlockSigned { - /// Set of signatures. - pub signatures: Vec, + /// Hash of the block being signed. + pub hash: HashOf, + /// Signature of the block + pub signature: BlockSignature, } impl From<&ValidBlock> for BlockSigned { fn from(block: &ValidBlock) -> Self { Self { - signatures: block.as_ref().signatures().cloned().collect(), + hash: block.as_ref().hash_of_payload(), + signature: block + .as_ref() + .signatures() + .last() + .cloned() + .expect("INTERNAL BUG: Block must have at least one signature"), } } } /// `BlockCommitted` message structure. -#[derive(Debug, Clone, Decode, Encode)] -#[non_exhaustive] +#[derive(Debug, Clone, Encode)] pub struct BlockCommitted { + /// Hash of the block being signed. + pub hash: HashOf, /// Set of signatures. pub signatures: Vec, } @@ -79,6 +87,7 @@ pub struct BlockCommitted { impl From<&CommittedBlock> for BlockCommitted { fn from(block: &CommittedBlock) -> Self { Self { + hash: block.as_ref().hash(), signatures: block.as_ref().signatures().cloned().collect(), } } @@ -86,7 +95,6 @@ impl From<&CommittedBlock> for BlockCommitted { /// `BlockSyncUpdate` message structure #[derive(Debug, Clone, Decode, Encode)] -#[non_exhaustive] pub struct BlockSyncUpdate { /// The corresponding block. pub block: SignedBlock, @@ -100,3 +108,56 @@ impl From<&SignedBlock> for BlockSyncUpdate { } } } + +mod candidate { + use indexmap::IndexSet; + use parity_scale_codec::Input; + + use super::*; + + #[derive(Decode)] + struct BlockCommittedCandidate { + /// Hash of the block being signed. + pub hash: HashOf, + /// Set of signatures. + pub signatures: Vec, + } + + impl BlockCommittedCandidate { + fn validate(self) -> Result { + self.validate_signatures()?; + + Ok(BlockCommitted { + hash: self.hash, + signatures: self.signatures, + }) + } + + fn validate_signatures(&self) -> Result<(), &'static str> { + if self.signatures.is_empty() { + return Err("No signatures in block"); + } + + self.signatures + .iter() + .map(|signature| &signature.0) + .try_fold(IndexSet::new(), |mut acc, elem| { + if !acc.insert(elem) { + return Err("Duplicate signature"); + } + + Ok(acc) + })?; + + Ok(()) + } + } + + impl Decode for BlockCommitted { + fn decode(input: &mut I) -> Result { + BlockCommittedCandidate::decode(input)? + .validate() + .map_err(Into::into) + } + } +} diff --git a/core/src/sumeragi/mod.rs b/core/src/sumeragi/mod.rs index 0592d6221ec..fc9c4b332c8 100644 --- a/core/src/sumeragi/mod.rs +++ b/core/src/sumeragi/mod.rs @@ -10,7 +10,7 @@ use std::{ use eyre::Result; use iroha_config::parameters::actual::{Common as CommonConfig, Sumeragi as SumeragiConfig}; -use iroha_data_model::{block::SignedBlock, prelude::*}; +use iroha_data_model::{account::AccountId, block::SignedBlock, prelude::*}; use iroha_genesis::GenesisTransaction; use iroha_logger::prelude::*; use network_topology::{Role, Topology}; @@ -73,7 +73,7 @@ impl SumeragiHandle { fn replay_block( chain_id: &ChainId, - genesis_public_key: &PublicKey, + genesis_account: &AccountId, block: &SignedBlock, state_block: &mut StateBlock<'_>, events_sender: &EventsSender, @@ -86,18 +86,18 @@ impl SumeragiHandle { block.clone(), topology, chain_id, - genesis_public_key, + genesis_account, state_block, ) .unpack(|e| { let _ = events_sender.send(e.into()); }) - .expect("Kura: Invalid block") + .expect("INTERNAL BUG: Invalid block stored in Kura") .commit(topology) .unpack(|e| { let _ = events_sender.send(e.into()); }) - .expect("Kura: Invalid block"); + .expect("INTERNAL BUG: Invalid block stored in Kura"); if block.as_ref().header().is_genesis() { *state_block.world.trusted_peers_ids = @@ -147,10 +147,7 @@ impl SumeragiHandle { { let state_view = state.view(); - let skip_block_count: usize = state_view - .height() - .try_into() - .expect("Blockchain height should fit into usize"); + let skip_block_count = state_view.height(); blocks_iter = (skip_block_count + 1..=block_count).map(|block_height| { NonZeroUsize::new(block_height).and_then(|height| kura.get_block_by_height(height)).expect( "Sumeragi should be able to load the block that was reported as presented. \ @@ -181,11 +178,16 @@ impl SumeragiHandle { }; } + let genesis_account = AccountId::new( + iroha_genesis::GENESIS_DOMAIN_ID.clone(), + genesis_network.public_key.clone(), + ); + for block in blocks_iter { let mut state_block = state.block(); Self::replay_block( &common_config.chain, - &genesis_network.public_key, + &genesis_account, &block, &mut state_block, &events_sender, @@ -234,7 +236,7 @@ impl SumeragiHandle { .spawn(move || { main_loop::run(genesis_network, sumeragi, shutdown_receiver, state); }) - .expect("Sumeragi thread spawn should not fail.") + .expect("INTERNAL BUG: Sumeragi thread spawn failed") }; let shutdown = move || { @@ -270,7 +272,7 @@ pub struct VotingBlock<'state> { /// At what time has this peer voted for this block pub voted_at: Instant, /// [`WorldState`] after applying transactions to it but before it was committed - pub block_state: StateBlock<'state>, + pub state_block: StateBlock<'state>, } impl AsRef for VotingBlock<'_> { @@ -285,7 +287,7 @@ impl VotingBlock<'_> { VotingBlock { block, voted_at: Instant::now(), - block_state: state_block, + state_block, } } } diff --git a/core/src/sumeragi/network_topology.rs b/core/src/sumeragi/network_topology.rs index 0b7ec997c4b..4b58d52a5b3 100644 --- a/core/src/sumeragi/network_topology.rs +++ b/core/src/sumeragi/network_topology.rs @@ -20,7 +20,12 @@ use iroha_data_model::{ /// /// Above is an illustration of how the various operations work for a f = 2 topology. #[derive(Debug, Clone, PartialEq, Eq)] -pub struct Topology(Vec, usize); +pub struct Topology( + /// Ordered set of peers + Vec, + /// Current view change index. Reset to 0 after every block commit + usize, +); /// Topology with at least one peer #[derive(Debug, Clone, PartialEq, Eq, derive_more::Deref)] @@ -147,9 +152,11 @@ impl Topology { }; } - signatures - .into_iter() - .filter(move |signature| filtered.contains(&(signature.0 as usize))) + signatures.into_iter().filter(move |signature| { + filtered.contains( + &(usize::try_from(signature.0).expect("Peer index should fit into usize")), + ) + }) } /// What role does this peer have in the topology. @@ -209,13 +216,17 @@ impl Topology { self.0 = topology.into_iter().map(|(_, peer)| peer).collect(); } - /// Recreate topology for given block + /// Rotate topology after a block has been committed pub fn block_committed( &mut self, block: &SignedBlock, new_peers: impl IntoIterator, ) { - self.lift_up_peers(block.signatures().map(|s| s.0 as usize)); + self.lift_up_peers( + block + .signatures() + .map(|s| s.0.try_into().expect("Peer index should fit into usize")), + ); self.rotate_set_a(); self.update_peer_list(new_peers); self.1 = 0; diff --git a/core/src/sumeragi/view_change.rs b/core/src/sumeragi/view_change.rs index 52ea5b859f8..fb698c72eb5 100644 --- a/core/src/sumeragi/view_change.rs +++ b/core/src/sumeragi/view_change.rs @@ -2,6 +2,7 @@ //! Where view change is a process of changing topology due to some faulty network behavior. use eyre::Result; +use indexmap::IndexSet; use iroha_crypto::{HashOf, PublicKey, SignatureOf}; use iroha_data_model::block::SignedBlock; use parity_scale_codec::{Decode, Encode}; @@ -43,7 +44,9 @@ pub struct ProofBuilder(SignedViewChangeProof); impl ProofBuilder { /// Constructor from index. pub fn new(latest_block: HashOf, view_change_index: usize) -> Self { - let view_change_index = view_change_index as u32; + let view_change_index = view_change_index + .try_into() + .expect("INTERNAL BUG: Blockchain height should fit into usize"); let proof = SignedViewChangeProof { payload: ViewChangeProofPayload { @@ -67,13 +70,21 @@ impl ProofBuilder { impl SignedViewChangeProof { /// Verify the signatures of `other` and add them to this proof. fn merge_signatures(&mut self, other: Vec, topology: &Topology) { - for (public_key, signature) in other { - if topology.position(&public_key).is_none() { - continue; - } - - self.signatures.push((public_key, signature)); - } + let signatures = core::mem::take(&mut self.signatures) + .into_iter() + .collect::>(); + + self.signatures = other + .into_iter() + .fold(signatures, |mut acc, (public_key, signature)| { + if topology.position(&public_key).is_some() { + acc.insert((public_key, signature)); + } + + acc + }) + .into_iter() + .collect(); } /// Verify if the proof is valid, given the peers in `topology`. @@ -104,8 +115,10 @@ impl ProofChain { .iter() .enumerate() .take_while(|(i, proof)| { + let view_change_index = proof.payload.view_change_index as usize; + proof.payload.latest_block == latest_block - && proof.payload.view_change_index as usize == *i + && view_change_index == *i && proof.verify(topology) }) .count() @@ -118,8 +131,8 @@ impl ProofChain { .iter() .enumerate() .take_while(|(i, proof)| { - proof.payload.latest_block == latest_block - && proof.payload.view_change_index as usize == *i + let view_change_index = proof.payload.view_change_index as usize; + proof.payload.latest_block == latest_block && view_change_index == *i }) .count(); self.0.truncate(valid_count); @@ -216,17 +229,28 @@ mod candidate { fn validate(self) -> Result { self.validate_signatures()?; - // TODO: If it is possible, we should instead reject decoding proofs that - // have duplicated signatures. This would require change in the code as well - let unique_signatures = self.signatures.into_iter().collect::>(); - Ok(SignedViewChangeProof { + signatures: self.signatures, payload: self.payload, - signatures: unique_signatures.into_iter().collect(), }) } fn validate_signatures(&self) -> Result<(), &'static str> { + if self.signatures.is_empty() { + return Err("Proof missing signatures"); + } + + self.signatures + .iter() + .map(|signature| &signature.0) + .try_fold(IndexSet::new(), |mut acc, elem| { + if !acc.insert(elem) { + return Err("Duplicate signature"); + } + + Ok(acc) + })?; + self.signatures .iter() .try_for_each(|(public_key, payload)| { diff --git a/core/src/tx.rs b/core/src/tx.rs index 89ae6700f41..1bad2077dd4 100644 --- a/core/src/tx.rs +++ b/core/src/tx.rs @@ -14,9 +14,7 @@ pub use iroha_data_model::prelude::*; use iroha_data_model::{ isi::error::Mismatch, query::error::FindError, - transaction::{ - error::TransactionLimitError, TransactionLimits, TransactionPayload, TransactionSignature, - }, + transaction::{error::TransactionLimitError, TransactionLimits, TransactionPayload}, }; use iroha_genesis::GenesisTransaction; use iroha_logger::{debug, error}; @@ -71,7 +69,7 @@ impl AcceptedTransaction { pub fn accept_genesis( tx: GenesisTransaction, expected_chain_id: &ChainId, - genesis_public_key: &PublicKey, + genesis_account: &AccountId, ) -> Result { let actual_chain_id = tx.0.chain(); @@ -82,13 +80,8 @@ impl AcceptedTransaction { })); } - let TransactionSignature(public_key, signature) = tx.0.signature(); - if public_key != genesis_public_key { - return Err(SignatureVerificationFail { - signature: signature.clone(), - reason: "Signature doesn't correspond to genesis public key".to_string(), - } - .into()); + if genesis_account != tx.0.authority() { + return Err(AcceptTransactionFail::UnexpectedGenesisAccountSignature); } Ok(Self(tx.0)) @@ -102,7 +95,7 @@ impl AcceptedTransaction { pub fn accept( tx: SignedTransaction, expected_chain_id: &ChainId, - limits: &TransactionLimits, + limits: TransactionLimits, ) -> Result { let actual_chain_id = tx.chain(); @@ -113,10 +106,6 @@ impl AcceptedTransaction { })); } - if *iroha_genesis::GENESIS_DOMAIN_ID == *tx.authority().domain() { - return Err(AcceptTransactionFail::UnexpectedGenesisAccountSignature); - } - match &tx.instructions() { Executable::Instructions(instructions) => { let instruction_count = instructions.len(); diff --git a/core/test_network/src/lib.rs b/core/test_network/src/lib.rs index 3dd3f4b3e8b..3ef68c196b4 100644 --- a/core/test_network/src/lib.rs +++ b/core/test_network/src/lib.rs @@ -1,6 +1,5 @@ //! Module for starting peers and networks. Used only for tests use core::{fmt::Debug, str::FromStr as _, time::Duration}; -#[cfg(debug_assertions)] use std::{collections::BTreeMap, ops::Deref, path::Path, sync::Arc, thread}; use eyre::Result; @@ -342,7 +341,6 @@ pub fn wait_for_genesis_committed_with_max_retries( let ready_peers = clients .iter() .map(|client| { - println!("KITA: {:?}", client.get_status().unwrap()); let is_ready = match client.get_status() { Ok(status) => status.blocks >= 1, Err(error) => { @@ -354,7 +352,6 @@ pub fn wait_for_genesis_committed_with_max_retries( }) .sum::(); - println!("Ready peers: {ready_peers}"); let without_genesis_peers = clients.len() as u32 - ready_peers; if without_genesis_peers <= offline_peers { return; diff --git a/crypto/src/lib.rs b/crypto/src/lib.rs index aa7270b6e00..dfe5fa32471 100755 --- a/crypto/src/lib.rs +++ b/crypto/src/lib.rs @@ -839,12 +839,6 @@ pub mod error { /// Returned when an error occurs during key generation #[display(fmt = "Key generation failed. {_0}")] KeyGen(String), - /// Returned when an error occurs during digest generation - #[display(fmt = "Digest generation failed. {_0}")] - DigestGen(String), - /// Returned when an error occurs during creation of [`SignaturesOf`] - #[display(fmt = "`SignaturesOf` must contain at least one signature")] - EmptySignatureIter, /// A General purpose error message that doesn't fit in any category #[display(fmt = "General error. {_0}")] // This is going to cause a headache Other(String), diff --git a/data_model/src/block.rs b/data_model/src/block.rs index 4df24e59d32..1f601d9e4d1 100644 --- a/data_model/src/block.rs +++ b/data_model/src/block.rs @@ -54,12 +54,11 @@ mod model { #[getset(get_copy = "pub")] pub height: u64, /// Hash of the previous block in the chain. - #[getset(get = "pub")] + #[getset(get_copy = "pub")] pub prev_block_hash: Option>, /// Hash of merkle tree root of transactions' hashes. - #[getset(get = "pub")] - // TODO: How can it be `None`??? - pub transactions_hash: Option>>, + #[getset(get_copy = "pub")] + pub transactions_hash: HashOf>, /// Creation timestamp (unix time in milliseconds). #[getset(skip)] pub timestamp_ms: u64, @@ -236,6 +235,12 @@ impl SignedBlock { signature: BlockSignature, public_key: &iroha_crypto::PublicKey, ) -> Result<(), iroha_crypto::Error> { + if self.signatures().any(|s| signature.0 == s.0) { + return Err(iroha_crypto::Error::Signing( + "Duplicate signature".to_owned(), + )); + } + signature.1.verify(public_key, self.payload())?; let SignedBlock::V1(block) = self; @@ -297,10 +302,6 @@ mod candidate { self.validate_signatures()?; self.validate_header()?; - if self.payload.transactions.is_empty() { - return Err("Block is empty"); - } - Ok(SignedBlockV1 { signatures: self.signatures, payload: self.payload, @@ -308,8 +309,13 @@ mod candidate { } fn validate_signatures(&self) -> Result<(), &'static str> { + if self.signatures.is_empty() { + return Err("Block missing signatures"); + } + self.signatures .iter() + .map(|signature| signature.0) .try_fold(BTreeSet::new(), |mut acc, elem| { if !acc.insert(elem) { return Err("Duplicate signature in block"); @@ -320,6 +326,7 @@ mod candidate { Ok(()) } + fn validate_header(&self) -> Result<(), &'static str> { let actual_txs_hash = self.payload.header.transactions_hash; @@ -329,7 +336,8 @@ mod candidate { .iter() .map(|value| value.as_ref().hash()) .collect::>() - .hash(); + .hash() + .ok_or("Block is empty")?; if expected_txs_hash != actual_txs_hash { return Err("Transactions' hash incorrect. Expected: {expected_txs_hash:?}, actual: {actual_txs_hash:?}"); diff --git a/data_model/src/events/pipeline.rs b/data_model/src/events/pipeline.rs index 9d1b5b5b260..731e194c505 100644 --- a/data_model/src/events/pipeline.rs +++ b/data_model/src/events/pipeline.rs @@ -354,7 +354,9 @@ mod tests { Self { height, prev_block_hash: None, - transactions_hash: None, + transactions_hash: HashOf::from_untyped_unchecked(Hash::prehashed( + [1_u8; Hash::LENGTH], + )), timestamp_ms: 0, view_change_index: 0, consensus_estimation_ms: 0, diff --git a/data_model/src/lib.rs b/data_model/src/lib.rs index e46b5daaf5f..aecffef2df4 100644 --- a/data_model/src/lib.rs +++ b/data_model/src/lib.rs @@ -623,7 +623,17 @@ mod model { /// Unique id of blockchain #[derive( - Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Encode, Deserialize, Serialize, IntoSchema, + Debug, + Display, + Clone, + PartialEq, + Eq, + PartialOrd, + Ord, + Encode, + Deserialize, + Serialize, + IntoSchema, )] #[repr(transparent)] #[serde(transparent)] diff --git a/data_model/src/query/mod.rs b/data_model/src/query/mod.rs index 4be2e03295d..1c89b0afa79 100644 --- a/data_model/src/query/mod.rs +++ b/data_model/src/query/mod.rs @@ -1280,7 +1280,7 @@ pub mod http { Serialize, IntoSchema, )] - pub struct QuerySignature(pub PublicKey, pub SignatureOf); + pub struct QuerySignature(pub SignatureOf); /// I/O ready structure to send queries. #[derive(Debug, Clone, Encode, Serialize, IntoSchema)] @@ -1323,11 +1323,11 @@ pub mod http { impl SignedQueryCandidate { fn validate(self) -> Result { - let QuerySignature(public_key, signature) = &self.signature; + let QuerySignature(signature) = &self.signature; - if signature.verify(public_key, &self.payload).is_err() { - return Err("Query signature not valid"); - } + signature + .verify(&self.payload.authority.signatory, &self.payload) + .map_err(|_| "Query signature is not valid")?; Ok(SignedQueryV1 { payload: self.payload, @@ -1450,7 +1450,7 @@ pub mod http { let signature = SignatureOf::new(key_pair.private_key(), &self.payload); SignedQueryV1 { - signature: QuerySignature(key_pair.public_key().clone(), signature), + signature: QuerySignature(signature), payload: self.payload, } .into() @@ -1500,12 +1500,6 @@ pub mod error { )] #[cfg_attr(feature = "std", derive(thiserror::Error))] pub enum QueryExecutionFail { - /// Query has the wrong signature: {0} - Signature( - #[skip_from] - #[skip_try_from] - String, - ), /// {0} #[cfg_attr(feature = "std", error(transparent))] Find(FindError), diff --git a/data_model/src/transaction.rs b/data_model/src/transaction.rs index 7245db6fb61..0ed738a7398 100644 --- a/data_model/src/transaction.rs +++ b/data_model/src/transaction.rs @@ -158,10 +158,7 @@ mod model { Serialize, IntoSchema, )] - pub struct TransactionSignature( - pub iroha_crypto::PublicKey, - pub SignatureOf, - ); + pub struct TransactionSignature(pub SignatureOf); /// Transaction that contains a signature /// @@ -263,6 +260,13 @@ declare_versioned!(SignedTransaction 1..2, Debug, Display, Clone, PartialEq, Eq, declare_versioned!(SignedTransaction 1..2, Debug, Display, Clone, PartialEq, Eq, PartialOrd, Ord, FromVariant, IntoSchema); impl SignedTransaction { + /// Transaction payload. Used for tests + #[cfg(feature = "transparent_api")] + pub fn payload(&self) -> &TransactionPayload { + let SignedTransaction::V1(tx) = self; + &tx.payload + } + /// Return transaction instructions #[inline] pub fn instructions(&self) -> &Executable { @@ -383,10 +387,11 @@ mod candidate { } fn validate_signature(&self) -> Result<(), &'static str> { - let TransactionSignature(public_key, signature) = &self.signature; + let TransactionSignature(signature) = &self.signature; + signature - .verify(public_key, &self.payload) - .map_err(|_| "Transaction contains invalid signatures")?; + .verify(&self.payload.authority.signatory, &self.payload) + .map_err(|_| "Transaction signature is invalid")?; Ok(()) } @@ -757,11 +762,8 @@ mod http { /// Sign transaction with provided key pair. #[must_use] - pub fn sign(self, key_pair: &iroha_crypto::KeyPair) -> SignedTransaction { - let signature = TransactionSignature( - key_pair.public_key().clone(), - SignatureOf::new(key_pair.private_key(), &self.payload), - ); + pub fn sign(self, private_key: &iroha_crypto::PrivateKey) -> SignedTransaction { + let signature = TransactionSignature(SignatureOf::new(private_key, &self.payload)); SignedTransactionV1 { signature, diff --git a/docs/source/references/schema.json b/docs/source/references/schema.json index 177acd2bc8a..3cb73c6c563 100644 --- a/docs/source/references/schema.json +++ b/docs/source/references/schema.json @@ -612,7 +612,7 @@ }, { "name": "transactions_hash", - "type": "Option>>" + "type": "HashOf>" }, { "name": "timestamp_ms", @@ -2498,9 +2498,6 @@ "Option": { "Option": "Duration" }, - "Option>>": { - "Option": "HashOf>" - }, "Option>": { "Option": "HashOf" }, @@ -2938,32 +2935,27 @@ }, "QueryExecutionFail": { "Enum": [ - { - "tag": "Signature", - "discriminant": 0, - "type": "String" - }, { "tag": "Find", - "discriminant": 1, + "discriminant": 0, "type": "FindError" }, { "tag": "Conversion", - "discriminant": 2, + "discriminant": 1, "type": "String" }, { "tag": "UnknownCursor", - "discriminant": 3 + "discriminant": 2 }, { "tag": "FetchSizeTooBig", - "discriminant": 4 + "discriminant": 3 }, { "tag": "InvalidSingularParameters", - "discriminant": 5 + "discriminant": 4 } ] }, @@ -3054,12 +3046,7 @@ } ] }, - "QuerySignature": { - "Tuple": [ - "PublicKey", - "SignatureOf" - ] - }, + "QuerySignature": "SignatureOf", "Register": { "Struct": [ { @@ -3937,12 +3924,7 @@ } ] }, - "TransactionSignature": { - "Tuple": [ - "PublicKey", - "SignatureOf" - ] - }, + "TransactionSignature": "SignatureOf", "TransactionStatus": { "Enum": [ { diff --git a/genesis/src/lib.rs b/genesis/src/lib.rs index acc6c491b1a..b2939b83319 100644 --- a/genesis/src/lib.rs +++ b/genesis/src/lib.rs @@ -99,7 +99,7 @@ fn build_and_sign_genesis( ); let transaction = TransactionBuilder::new(chain_id, genesis_account_id) .with_instructions(instructions) - .sign(genesis_key_pair); + .sign(genesis_key_pair.private_key()); GenesisTransaction(transaction) } diff --git a/smart_contract/executor/src/permission.rs b/smart_contract/executor/src/permission.rs index 6aa5c7d2a13..a6ead932324 100644 --- a/smart_contract/executor/src/permission.rs +++ b/smart_contract/executor/src/permission.rs @@ -117,7 +117,7 @@ pub mod asset_definition { /// Check if `authority` is the owner of asset definition - /// `authority` is owner of asset_definition if: + /// `authority` is owner of asset definition if: /// - `asset_definition.owned_by` is `authority` /// - `asset_definition.domain_id` domain is owned by `authority` /// diff --git a/torii/src/lib.rs b/torii/src/lib.rs index a987608ee3f..4db82d4c7f1 100644 --- a/torii/src/lib.rs +++ b/torii/src/lib.rs @@ -338,7 +338,6 @@ impl Error { Config(_) | StatusSegmentNotFound(_) => StatusCode::NOT_FOUND, PushIntoQueue(err) => match **err { queue::Error::Full => StatusCode::INTERNAL_SERVER_ERROR, - queue::Error::SignatoryInconsistent => StatusCode::UNAUTHORIZED, _ => StatusCode::BAD_REQUEST, }, #[cfg(feature = "telemetry")] @@ -363,7 +362,6 @@ impl Error { Conversion(_) | UnknownCursor | FetchSizeTooBig | InvalidSingularParameters => { StatusCode::BAD_REQUEST } - Signature(_) => StatusCode::UNAUTHORIZED, Find(_) => StatusCode::NOT_FOUND, }, TooComplex => StatusCode::UNPROCESSABLE_ENTITY, diff --git a/torii/src/routing.rs b/torii/src/routing.rs index 623619422e4..87c2381673e 100644 --- a/torii/src/routing.rs +++ b/torii/src/routing.rs @@ -53,7 +53,7 @@ pub async fn handle_transaction( ) -> Result { let state_view = state.view(); let transaction_limits = state_view.config.transaction_limits; - let transaction = AcceptedTransaction::accept(transaction, &chain_id, &transaction_limits) + let transaction = AcceptedTransaction::accept(transaction, &chain_id, transaction_limits) .map_err(Error::AcceptTransaction)?; queue .push(transaction, &state_view)