From a39834577e9129ed930affb9f3488fa26e0685ea Mon Sep 17 00:00:00 2001 From: Stan Bondi Date: Mon, 29 Jan 2024 11:57:22 +0400 Subject: [PATCH] add network to vn node hash and block --- Cargo.lock | 5 +++++ .../src/base_layer_scanner.rs | 8 +++++++- applications/tari_indexer/src/bootstrap.rs | 2 ++ .../tari_validator_node/src/bootstrap.rs | 14 ++++++++++---- .../tari_validator_node/src/consensus/mod.rs | 5 ++++- dan_layer/common_types/Cargo.toml | 2 ++ dan_layer/common_types/src/hashing.rs | 7 +------ .../common_types/src/validator_metadata.rs | 5 +++-- dan_layer/consensus/Cargo.toml | 3 ++- dan_layer/consensus/src/block_validations.rs | 14 +++++++++++++- dan_layer/consensus/src/hotstuff/common.rs | 3 +++ dan_layer/consensus/src/hotstuff/error.rs | 6 ++++++ .../src/hotstuff/on_inbound_message.rs | 13 ++++++++++++- .../consensus/src/hotstuff/on_propose.rs | 5 +++++ .../on_ready_to_vote_on_local_block.rs | 6 +++++- .../src/hotstuff/on_receive_local_proposal.rs | 6 ++++++ .../src/hotstuff/on_receive_new_view.rs | 14 ++++++++++++-- .../consensus/src/hotstuff/vote_receiver.rs | 6 +++++- dan_layer/consensus/src/hotstuff/worker.rs | 11 ++++++++++- .../src/support/validator/builder.rs | 1 + dan_layer/epoch_manager/Cargo.toml | 1 + .../base_layer/base_layer_epoch_manager.rs | 8 ++++++-- .../src/base_layer/epoch_manager_service.rs | 11 ++++++++++- .../src/base_layer/initializer.rs | 3 +++ dan_layer/p2p/proto/consensus.proto | 19 ++++++++++--------- dan_layer/p2p/src/conversions/consensus.rs | 6 ++++++ dan_layer/rpc_state_sync/Cargo.toml | 1 + dan_layer/rpc_state_sync/src/manager.rs | 9 +++++++-- .../up.sql | 2 ++ dan_layer/state_store_sqlite/src/schema.rs | 2 ++ .../src/sql_models/block.rs | 14 ++++++++++++++ dan_layer/state_store_sqlite/src/writer.rs | 2 ++ dan_layer/state_store_sqlite/tests/tests.rs | 4 +++- dan_layer/storage/Cargo.toml | 1 + .../storage/src/consensus_models/block.rs | 19 +++++++++++++++++-- .../src/global/models/validator_node.rs | 5 +++-- 36 files changed, 202 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index de7a9d8283..c342b02da5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8931,6 +8931,7 @@ dependencies = [ "indexmap 2.1.0", "log", "serde", + "tari_common", "tari_common_types", "tari_dan_common_types", "tari_dan_storage", @@ -9126,6 +9127,7 @@ dependencies = [ "tari_core", "tari_crypto", "tari_engine_types", + "tari_hash_domains", "tari_mmr", ] @@ -9193,6 +9195,7 @@ dependencies = [ "log", "rand", "serde", + "tari_common", "tari_common_types", "tari_core", "tari_crypto", @@ -9394,6 +9397,7 @@ dependencies = [ "async-trait", "log", "tari_base_node_client", + "tari_common", "tari_common_types", "tari_core", "tari_dan_common_types", @@ -9675,6 +9679,7 @@ dependencies = [ "async-trait", "futures 0.3.29", "log", + "tari_common", "tari_consensus", "tari_dan_common_types", "tari_dan_p2p", diff --git a/applications/tari_dan_app_utilities/src/base_layer_scanner.rs b/applications/tari_dan_app_utilities/src/base_layer_scanner.rs index 988fbd7491..04e2aac035 100644 --- a/applications/tari_dan_app_utilities/src/base_layer_scanner.rs +++ b/applications/tari_dan_app_utilities/src/base_layer_scanner.rs @@ -29,6 +29,7 @@ use tari_base_node_client::{ BaseNodeClient, BaseNodeClientError, }; +use tari_common::configuration::Network; use tari_common_types::types::{Commitment, FixedHash, FixedHashSizeError}; use tari_core::transactions::transaction_components::{ CodeTemplateRegistration, @@ -63,6 +64,7 @@ use crate::{ const LOG_TARGET: &str = "tari::dan::base_layer_scanner"; pub fn spawn( + network: Network, global_db: GlobalDb>, base_node_client: GrpcBaseNodeClient, epoch_manager: EpochManagerHandle, @@ -75,6 +77,7 @@ pub fn spawn( ) -> JoinHandle> { task::spawn(async move { let base_layer_scanner = BaseLayerScanner::new( + network, global_db, base_node_client, epoch_manager, @@ -92,6 +95,7 @@ pub fn spawn( } pub struct BaseLayerScanner { + network: Network, global_db: GlobalDb>, last_scanned_height: u64, last_scanned_tip: Option, @@ -110,6 +114,7 @@ pub struct BaseLayerScanner { impl BaseLayerScanner { pub fn new( + network: Network, global_db: GlobalDb>, base_node_client: GrpcBaseNodeClient, epoch_manager: EpochManagerHandle, @@ -121,6 +126,7 @@ impl BaseLayerScanner { base_layer_scanning_interval: Duration, ) -> Self { Self { + network, global_db, last_scanned_tip: None, last_scanned_height: 0, @@ -374,7 +380,7 @@ impl BaseLayerScanner { }); self.state_store .with_write_tx(|tx| { - let genesis = Block::genesis(); + let genesis = Block::genesis(self.network); // TODO: This should be proposed in a block... SubstateRecord { diff --git a/applications/tari_indexer/src/bootstrap.rs b/applications/tari_indexer/src/bootstrap.rs index c41a183d1f..1f09048fb5 100644 --- a/applications/tari_indexer/src/bootstrap.rs +++ b/applications/tari_indexer/src/bootstrap.rs @@ -112,6 +112,7 @@ pub async fn spawn_services( // Epoch manager let validator_node_client_factory = TariValidatorNodeRpcClientFactory::new(networking.clone()); let (epoch_manager, _) = tari_epoch_manager::base_layer::spawn_service( + config.network, EpochManagerConfig { base_layer_confirmations: consensus_constants.base_layer_confirmations, committee_size: consensus_constants.committee_size, @@ -129,6 +130,7 @@ pub async fn spawn_services( // Base Node scanner base_layer_scanner::spawn( + config.network, global_db, base_node_client.clone(), epoch_manager.clone(), diff --git a/applications/tari_validator_node/src/bootstrap.rs b/applications/tari_validator_node/src/bootstrap.rs index 87949009a0..e946610e37 100644 --- a/applications/tari_validator_node/src/bootstrap.rs +++ b/applications/tari_validator_node/src/bootstrap.rs @@ -31,7 +31,10 @@ use serde::Serialize; use sqlite_message_logger::SqliteMessageLogger; use tari_base_node_client::grpc::GrpcBaseNodeClient; use tari_common::{ - configuration::bootstrap::{grpc_default_port, ApplicationType}, + configuration::{ + bootstrap::{grpc_default_port, ApplicationType}, + Network, + }, exit_codes::{ExitCode, ExitError}, }; use tari_common_types::types::PublicKey; @@ -182,10 +185,11 @@ pub async fn spawn_services( // Connect to shard db let state_store = SqliteStateStore::connect(&format!("sqlite://{}", config.validator_node.state_db_path().display()))?; - state_store.with_write_tx(|tx| bootstrap_state(tx))?; + state_store.with_write_tx(|tx| bootstrap_state(tx, config.network))?; // Epoch manager let (epoch_manager, join_handle) = tari_epoch_manager::base_layer::spawn_service( + config.network, // TODO: We should be able to pass consensus constants here. However, these are currently located in dan_core // which depends on epoch_manager, so would be a circular dependency. EpochManagerConfig { @@ -238,6 +242,7 @@ pub async fn spawn_services( ConsensusOutboundMessaging::new(loopback_sender, networking.clone(), message_logger.clone()); let (consensus_join_handle, consensus_handle, rx_consensus_to_mempool) = consensus::spawn( + config.network, state_store.clone(), keypair.clone(), epoch_manager.clone(), @@ -291,6 +296,7 @@ pub async fn spawn_services( // Base Node scanner let join_handle = base_layer_scanner::spawn( + config.network, global_db.clone(), base_node_client.clone(), epoch_manager.clone(), @@ -433,13 +439,13 @@ async fn spawn_p2p_rpc( } // TODO: Figure out the best way to have the engine shard store mirror these bootstrapped states. -fn bootstrap_state(tx: &mut TTx) -> Result<(), StorageError> +fn bootstrap_state(tx: &mut TTx, network: Network) -> Result<(), StorageError> where TTx: StateStoreWriteTransaction + DerefMut, TTx::Target: StateStoreReadTransaction, TTx::Addr: NodeAddressable + Serialize, { - let genesis_block = Block::genesis(); + let genesis_block = Block::genesis(network); let substate_id = SubstateId::Resource(PUBLIC_IDENTITY_RESOURCE_ADDRESS); let substate_address = SubstateAddress::from_address(&substate_id, 0); let mut metadata: Metadata = Default::default(); diff --git a/applications/tari_validator_node/src/consensus/mod.rs b/applications/tari_validator_node/src/consensus/mod.rs index b6175a8962..d2e4e64a04 100644 --- a/applications/tari_validator_node/src/consensus/mod.rs +++ b/applications/tari_validator_node/src/consensus/mod.rs @@ -1,6 +1,7 @@ // Copyright 2023 The Tari Project // SPDX-License-Identifier: BSD-3-Clause +use tari_common::configuration::Network; use tari_consensus::hotstuff::{ConsensusWorker, ConsensusWorkerContext, HotstuffWorker}; use tari_dan_storage::consensus_models::TransactionPool; use tari_epoch_manager::base_layer::EpochManagerHandle; @@ -38,6 +39,7 @@ use tari_rpc_state_sync::RpcStateSyncManager; use crate::p2p::services::messaging::{ConsensusInboundMessaging, ConsensusOutboundMessaging}; pub async fn spawn( + network: Network, store: SqliteStateStore, keypair: RistrettoKeypair, epoch_manager: EpochManagerHandle, @@ -62,6 +64,7 @@ pub async fn spawn( let hotstuff_worker = HotstuffWorker::::new( validator_addr, + network, inbound_messaging, outbound_messaging, rx_new_transactions, @@ -80,7 +83,7 @@ pub async fn spawn( let context = ConsensusWorkerContext { epoch_manager: epoch_manager.clone(), hotstuff: hotstuff_worker, - state_sync: RpcStateSyncManager::new(epoch_manager, store, leader_strategy, client_factory), + state_sync: RpcStateSyncManager::new(network, epoch_manager, store, leader_strategy, client_factory), tx_current_state, }; diff --git a/dan_layer/common_types/Cargo.toml b/dan_layer/common_types/Cargo.toml index a7e3dfc9c6..3bace8595e 100644 --- a/dan_layer/common_types/Cargo.toml +++ b/dan_layer/common_types/Cargo.toml @@ -7,9 +7,11 @@ repository.workspace = true license.workspace = true [dependencies] +tari_common = { workspace = true } tari_common_types = { workspace = true } tari_crypto = { workspace = true, features = ["borsh"] } tari_engine_types = { workspace = true } +tari_hash_domains = { workspace = true } tari_bor = { workspace = true, default-features = true } tari_mmr = { workspace = true } tari_core = { workspace = true, default-features = false, features = [ diff --git a/dan_layer/common_types/src/hashing.rs b/dan_layer/common_types/src/hashing.rs index 87916be8ee..76bcd7fd3e 100644 --- a/dan_layer/common_types/src/hashing.rs +++ b/dan_layer/common_types/src/hashing.rs @@ -25,6 +25,7 @@ use blake2::{digest::consts::U32, Blake2b}; use tari_crypto::{hash_domain, hashing::DomainSeparatedHasher}; +use tari_hash_domains::ValidatorNodeBmtHashDomain; use tari_mmr::{BalancedBinaryMerkleProof, BalancedBinaryMerkleTree, MergedBalancedBinaryMerkleProof}; use crate::hasher::{tari_hasher, TariHasher}; @@ -55,12 +56,6 @@ fn dan_hasher(label: &'static str) -> TariHasher { tari_hasher::(label) } -// From tari_core -hash_domain!( - ValidatorNodeBmtHashDomain, - "com.tari.base_layer.core.validator_node_mmr", - 1 -); pub type ValidatorNodeBmtHasherBlake2b = DomainSeparatedHasher, ValidatorNodeBmtHashDomain>; pub type ValidatorNodeBalancedMerkleTree = BalancedBinaryMerkleTree; pub type ValidatorNodeMerkleProof = BalancedBinaryMerkleProof; diff --git a/dan_layer/common_types/src/validator_metadata.rs b/dan_layer/common_types/src/validator_metadata.rs index 202133cb39..5171bf7045 100644 --- a/dan_layer/common_types/src/validator_metadata.rs +++ b/dan_layer/common_types/src/validator_metadata.rs @@ -3,6 +3,7 @@ use blake2::{digest::consts::U32, Blake2b}; use serde::{Deserialize, Serialize}; +use tari_common::configuration::Network; use tari_common_types::types::{FixedHash, PublicKey, Signature}; use tari_core::{consensus::DomainSeparatedConsensusHasher, transactions::TransactionHashDomain}; @@ -25,8 +26,8 @@ impl ValidatorMetadata { } } -pub fn vn_node_hash(public_key: &PublicKey, substate_address: &SubstateAddress) -> FixedHash { - DomainSeparatedConsensusHasher::>::new("validator_node") +pub fn vn_node_hash(network: Network, public_key: &PublicKey, substate_address: &SubstateAddress) -> FixedHash { + DomainSeparatedConsensusHasher::>::new_with_network("validator_node", network) .chain(public_key) .chain(&substate_address.0) .finalize() diff --git a/dan_layer/consensus/Cargo.toml b/dan_layer/consensus/Cargo.toml index 526b19dbbc..7fdaef8642 100644 --- a/dan_layer/consensus/Cargo.toml +++ b/dan_layer/consensus/Cargo.toml @@ -13,7 +13,8 @@ tari_dan_storage = { workspace = true } tari_transaction = { workspace = true } tari_epoch_manager = { workspace = true } -# Used for PublicKey and Signature +# Used for PublicKey and Signature and Network enum +tari_common = { workspace = true } tari_common_types = { workspace = true } tari_mmr = { workspace = true } tari_shutdown = { workspace = true } diff --git a/dan_layer/consensus/src/block_validations.rs b/dan_layer/consensus/src/block_validations.rs index 5b04089ff1..1919d82a40 100644 --- a/dan_layer/consensus/src/block_validations.rs +++ b/dan_layer/consensus/src/block_validations.rs @@ -1,6 +1,7 @@ // Copyright 2023 The Tari Project // SPDX-License-Identifier: BSD-3-Clause +use tari_common::configuration::Network; use tari_dan_common_types::{committee::Committee, DerivableFromPublicKey}; use tari_dan_storage::consensus_models::Block; use tari_epoch_manager::EpochManagerReader; @@ -10,6 +11,17 @@ use crate::{ traits::{ConsensusSpec, LeaderStrategy, VoteSignatureService}, }; +pub fn check_network(candidate_block: &Block, network: Network) -> Result<(), ProposalValidationError> { + if candidate_block.network() != network { + return Err(ProposalValidationError::InvalidNetwork { + block_network: candidate_block.network().to_string(), + expected_network: network.to_string(), + block_id: *candidate_block.id(), + }); + } + Ok(()) +} + pub fn check_hash_and_height(candidate_block: &Block) -> Result<(), ProposalValidationError> { if candidate_block.height().is_zero() || candidate_block.is_genesis() { return Err(ProposalValidationError::ProposingGenesisBlock { @@ -91,7 +103,7 @@ pub async fn check_quorum_certificate( let vn = epoch_manager .get_validator_node_by_public_key(candidate_block.justify().epoch(), signature.public_key()) .await?; - vns.push(vn.node_hash()); + vns.push(vn.get_node_hash(candidate_block.network())); } let merkle_root = epoch_manager .get_validator_node_merkle_root(candidate_block.justify().epoch()) diff --git a/dan_layer/consensus/src/hotstuff/common.rs b/dan_layer/consensus/src/hotstuff/common.rs index de1601d30f..dde7131cea 100644 --- a/dan_layer/consensus/src/hotstuff/common.rs +++ b/dan_layer/consensus/src/hotstuff/common.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: BSD-3-Clause use log::*; +use tari_common::configuration::Network; use tari_dan_common_types::{committee::Committee, Epoch, NodeAddressable, NodeHeight}; use tari_dan_storage::consensus_models::{Block, QuorumCertificate}; @@ -15,6 +16,7 @@ const LOG_TARGET: &str = "tari::dan::consensus::hotstuff::common"; pub const EXHAUST_DIVISOR: u64 = 0; pub fn calculate_dummy_blocks>( + network: Network, epoch: Epoch, high_qc: &QuorumCertificate, new_height: NodeHeight, @@ -44,6 +46,7 @@ pub fn calculate_dummy_blocks = Result, NeedsSync>; pub struct OnInboundMessage { + network: Network, store: TConsensusSpec::StateStore, epoch_manager: TConsensusSpec::EpochManager, leader_strategy: TConsensusSpec::LeaderStrategy, @@ -42,6 +50,7 @@ impl OnInboundMessage where TConsensusSpec: ConsensusSpec { pub fn new( + network: Network, store: TConsensusSpec::StateStore, epoch_manager: TConsensusSpec::EpochManager, leader_strategy: TConsensusSpec::LeaderStrategy, @@ -50,6 +59,7 @@ where TConsensusSpec: ConsensusSpec ) -> Self { let (tx_msg_ready, rx_msg_ready) = mpsc::unbounded_channel(); Self { + network, store, epoch_manager, leader_strategy, @@ -97,6 +107,7 @@ where TConsensusSpec: ConsensusSpec } async fn check_proposal(&mut self, block: Block) -> Result, HotStuffError> { + check_network(&block, self.network)?; check_hash_and_height(&block)?; let committee_for_block = self .epoch_manager diff --git a/dan_layer/consensus/src/hotstuff/on_propose.rs b/dan_layer/consensus/src/hotstuff/on_propose.rs index 9b8efab8ea..6502280303 100644 --- a/dan_layer/consensus/src/hotstuff/on_propose.rs +++ b/dan_layer/consensus/src/hotstuff/on_propose.rs @@ -5,6 +5,7 @@ use std::{collections::BTreeSet, num::NonZeroU64, ops::DerefMut}; use indexmap::IndexMap; use log::*; +use tari_common::configuration::Network; use tari_common_types::types::PublicKey; use tari_dan_common_types::{ committee::{Committee, CommitteeShard}, @@ -39,6 +40,7 @@ use crate::{ const LOG_TARGET: &str = "tari::dan::consensus::hotstuff::on_propose_locally"; pub struct OnPropose { + network: Network, store: TConsensusSpec::StateStore, epoch_manager: TConsensusSpec::EpochManager, transaction_pool: TransactionPool, @@ -50,6 +52,7 @@ impl OnPropose where TConsensusSpec: ConsensusSpec { pub fn new( + network: Network, store: TConsensusSpec::StateStore, epoch_manager: TConsensusSpec::EpochManager, transaction_pool: TransactionPool, @@ -57,6 +60,7 @@ where TConsensusSpec: ConsensusSpec outbound_messaging: TConsensusSpec::OutboundMessaging, ) -> Self { Self { + network, store, epoch_manager, transaction_pool, @@ -257,6 +261,7 @@ where TConsensusSpec: ConsensusSpec foreign_indexes.sort_keys(); let mut next_block = Block::new( + self.network, *parent_block.block_id(), high_qc, parent_block.height() + NodeHeight(1), diff --git a/dan_layer/consensus/src/hotstuff/on_ready_to_vote_on_local_block.rs b/dan_layer/consensus/src/hotstuff/on_ready_to_vote_on_local_block.rs index 5c392cb6c1..13349d5dee 100644 --- a/dan_layer/consensus/src/hotstuff/on_ready_to_vote_on_local_block.rs +++ b/dan_layer/consensus/src/hotstuff/on_ready_to_vote_on_local_block.rs @@ -4,6 +4,7 @@ use std::{collections::HashSet, num::NonZeroU64, ops::DerefMut}; use log::*; +use tari_common::configuration::Network; use tari_dan_common_types::{ committee::{Committee, CommitteeShard}, optional::Optional, @@ -56,6 +57,7 @@ pub struct OnReadyToVoteOnLocalBlock { outbound_messaging: TConsensusSpec::OutboundMessaging, tx_events: broadcast::Sender, proposer: Proposer, + network: Network, } impl OnReadyToVoteOnLocalBlock @@ -72,6 +74,7 @@ where TConsensusSpec: ConsensusSpec outbound_messaging: TConsensusSpec::OutboundMessaging, tx_events: broadcast::Sender, proposer: Proposer, + network: Network, ) -> Self { Self { validator_addr, @@ -84,6 +87,7 @@ where TConsensusSpec: ConsensusSpec outbound_messaging, tx_events, proposer, + network, } } @@ -849,7 +853,7 @@ where TConsensusSpec: ConsensusSpec .epoch_manager .get_validator_node(block.epoch(), &self.validator_addr) .await?; - let leaf_hash = vn.node_hash(); + let leaf_hash = vn.get_node_hash(self.network); let signature = self.vote_signing_service.sign_vote(&leaf_hash, block.id(), &decision); diff --git a/dan_layer/consensus/src/hotstuff/on_receive_local_proposal.rs b/dan_layer/consensus/src/hotstuff/on_receive_local_proposal.rs index 897c0c1dd7..506eaf2f9c 100644 --- a/dan_layer/consensus/src/hotstuff/on_receive_local_proposal.rs +++ b/dan_layer/consensus/src/hotstuff/on_receive_local_proposal.rs @@ -8,6 +8,7 @@ use std::ops::DerefMut; use log::*; +use tari_common::configuration::Network; use tari_dan_common_types::{ committee::{Committee, CommitteeShard}, optional::Optional, @@ -37,6 +38,7 @@ use crate::{ const LOG_TARGET: &str = "tari::dan::consensus::hotstuff::on_receive_local_proposal"; pub struct OnReceiveLocalProposalHandler { + network: Network, store: TConsensusSpec::StateStore, epoch_manager: TConsensusSpec::EpochManager, leader_strategy: TConsensusSpec::LeaderStrategy, @@ -57,8 +59,10 @@ impl OnReceiveLocalProposalHandler, tx_events: broadcast::Sender, proposer: Proposer, + network: Network, ) -> Self { Self { + network, store: store.clone(), epoch_manager: epoch_manager.clone(), leader_strategy: leader_strategy.clone(), @@ -74,6 +78,7 @@ impl OnReceiveLocalProposalHandler OnReceiveLocalProposalHandler { + network: Network, store: TConsensusSpec::StateStore, leader_strategy: TConsensusSpec::LeaderStrategy, epoch_manager: TConsensusSpec::EpochManager, @@ -36,6 +38,7 @@ impl OnReceiveNewViewHandler where TConsensusSpec: ConsensusSpec { pub fn new( + network: Network, store: TConsensusSpec::StateStore, leader_strategy: TConsensusSpec::LeaderStrategy, epoch_manager: TConsensusSpec::EpochManager, @@ -43,6 +46,7 @@ where TConsensusSpec: ConsensusSpec vote_receiver: VoteReceiver, ) -> Self { Self { + network, store, leader_strategy, epoch_manager, @@ -188,8 +192,14 @@ where TConsensusSpec: ConsensusSpec // Determine how many missing blocks we must fill without actually creating them. // This node, as well as all other replicas, will create the blocks in on_receive_proposal. - let dummy_blocks = - calculate_dummy_blocks(epoch, &high_qc, new_height, &self.leader_strategy, &local_committee); + let dummy_blocks = calculate_dummy_blocks( + self.network, + epoch, + &high_qc, + new_height, + &self.leader_strategy, + &local_committee, + ); // Set the last voted block so that we do not vote on other conflicting blocks if let Some(last_dummy) = dummy_blocks.last() { debug!(target: LOG_TARGET, "🍼 dummy leaf block {}", last_dummy); diff --git a/dan_layer/consensus/src/hotstuff/vote_receiver.rs b/dan_layer/consensus/src/hotstuff/vote_receiver.rs index 74ac6e2e62..540708675f 100644 --- a/dan_layer/consensus/src/hotstuff/vote_receiver.rs +++ b/dan_layer/consensus/src/hotstuff/vote_receiver.rs @@ -4,6 +4,7 @@ use std::ops::DerefMut; use log::*; +use tari_common::configuration::Network; use tari_common_types::types::FixedHash; use tari_dan_common_types::{committee::CommitteeShard, hashing::MergedValidatorNodeMerkleProof, optional::Optional}; use tari_dan_storage::{ @@ -22,6 +23,7 @@ const LOG_TARGET: &str = "tari::dan::consensus::hotstuff::on_receive_vote"; #[derive(Clone)] pub struct VoteReceiver { + network: Network, store: TConsensusSpec::StateStore, leader_strategy: TConsensusSpec::LeaderStrategy, epoch_manager: TConsensusSpec::EpochManager, @@ -33,6 +35,7 @@ impl VoteReceiver where TConsensusSpec: ConsensusSpec { pub fn new( + network: Network, store: TConsensusSpec::StateStore, leader_strategy: TConsensusSpec::LeaderStrategy, epoch_manager: TConsensusSpec::EpochManager, @@ -40,6 +43,7 @@ where TConsensusSpec: ConsensusSpec pacemaker: PaceMakerHandle, ) -> Self { Self { + network, store, leader_strategy, epoch_manager, @@ -109,7 +113,7 @@ where TConsensusSpec: ConsensusSpec }); } - let sender_leaf_hash = sender_vn.node_hash(); + let sender_leaf_hash = sender_vn.get_node_hash(self.network); self.validate_vote_message(&message, &sender_leaf_hash)?; diff --git a/dan_layer/consensus/src/hotstuff/worker.rs b/dan_layer/consensus/src/hotstuff/worker.rs index 29329a956d..22b633ec66 100644 --- a/dan_layer/consensus/src/hotstuff/worker.rs +++ b/dan_layer/consensus/src/hotstuff/worker.rs @@ -8,6 +8,7 @@ use std::{ }; use log::*; +use tari_common::configuration::Network; use tari_dan_common_types::{optional::Optional, NodeHeight}; use tari_dan_storage::{ consensus_models::{Block, HighQc, LastSentVote, LastVoted, LeafBlock, TransactionPool}, @@ -45,6 +46,7 @@ const LOG_TARGET: &str = "tari::dan::consensus::hotstuff::worker"; pub struct HotstuffWorker { validator_addr: TConsensusSpec::Addr, + network: Network, tx_events: broadcast::Sender, outbound_messaging: TConsensusSpec::OutboundMessaging, @@ -75,6 +77,7 @@ impl HotstuffWorker { #[allow(clippy::too_many_arguments)] pub fn new( validator_addr: TConsensusSpec::Addr, + network: Network, inbound_messaging: TConsensusSpec::InboundMessaging, outbound_messaging: TConsensusSpec::OutboundMessaging, rx_new_transactions: mpsc::Receiver<(TransactionId, usize)>, @@ -90,6 +93,7 @@ impl HotstuffWorker { ) -> Self { let pacemaker = PaceMaker::new(); let vote_receiver = VoteReceiver::new( + network, state_store.clone(), leader_strategy.clone(), epoch_manager.clone(), @@ -100,12 +104,14 @@ impl HotstuffWorker { Proposer::::new(state_store.clone(), epoch_manager.clone(), outbound_messaging.clone()); Self { validator_addr: validator_addr.clone(), + network, tx_events: tx_events.clone(), outbound_messaging: outbound_messaging.clone(), inbound_messaging, rx_new_transactions, on_inbound_message: OnInboundMessage::new( + network, state_store.clone(), epoch_manager.clone(), leader_strategy.clone(), @@ -131,6 +137,7 @@ impl HotstuffWorker { transaction_pool.clone(), tx_events, proposer.clone(), + network, ), on_receive_foreign_proposal: OnReceiveForeignProposalHandler::new( state_store.clone(), @@ -140,6 +147,7 @@ impl HotstuffWorker { ), on_receive_vote: OnReceiveVoteHandler::new(vote_receiver.clone()), on_receive_new_view: OnReceiveNewViewHandler::new( + network, state_store.clone(), leader_strategy.clone(), epoch_manager.clone(), @@ -152,6 +160,7 @@ impl HotstuffWorker { ), on_receive_requested_txs: OnReceiveRequestedTransactions::new(tx_mempool), on_propose: OnPropose::new( + network, state_store.clone(), epoch_manager.clone(), transaction_pool.clone(), @@ -528,7 +537,7 @@ where TConsensusSpec: ConsensusSpec let mut tx = self.state_store.create_write_tx()?; // The parent for genesis blocks refer to this zero block - let zero_block = Block::zero_block(); + let zero_block = Block::zero_block(self.network); if !zero_block.exists(tx.deref_mut())? { debug!(target: LOG_TARGET, "Creating zero block"); zero_block.justify().insert(&mut tx)?; diff --git a/dan_layer/consensus_tests/src/support/validator/builder.rs b/dan_layer/consensus_tests/src/support/validator/builder.rs index 4052dee275..be029ad1fa 100644 --- a/dan_layer/consensus_tests/src/support/validator/builder.rs +++ b/dan_layer/consensus_tests/src/support/validator/builder.rs @@ -99,6 +99,7 @@ impl ValidatorBuilder { .clone_for(self.address.clone(), self.public_key.clone(), self.shard); let worker = HotstuffWorker::::new( self.address.clone(), + Default::default(), inbound_messaging, outbound_messaging, rx_new_transactions, diff --git a/dan_layer/epoch_manager/Cargo.toml b/dan_layer/epoch_manager/Cargo.toml index b8ad013314..46f8bf1549 100644 --- a/dan_layer/epoch_manager/Cargo.toml +++ b/dan_layer/epoch_manager/Cargo.toml @@ -9,6 +9,7 @@ license.workspace = true [dependencies] tari_core = { workspace = true } +tari_common = { workspace = true } tari_common_types = { workspace = true } tari_shutdown = { workspace = true } tari_dan_common_types = { workspace = true } diff --git a/dan_layer/epoch_manager/src/base_layer/base_layer_epoch_manager.rs b/dan_layer/epoch_manager/src/base_layer/base_layer_epoch_manager.rs index 0ccf755921..f04bd0bb64 100644 --- a/dan_layer/epoch_manager/src/base_layer/base_layer_epoch_manager.rs +++ b/dan_layer/epoch_manager/src/base_layer/base_layer_epoch_manager.rs @@ -28,6 +28,7 @@ use std::{ use log::*; use tari_base_node_client::{grpc::GrpcBaseNodeClient, types::BaseLayerConsensusConstants, BaseNodeClient}; +use tari_common::configuration::Network; use tari_common_types::types::{FixedHash, PublicKey}; use tari_core::{blocks::BlockHeader, transactions::transaction_components::ValidatorNodeRegistration}; use tari_dan_common_types::{ @@ -51,6 +52,7 @@ const LOG_TARGET: &str = "tari::dan::epoch_manager::base_layer"; #[derive(Clone)] pub struct BaseLayerEpochManager { + network: Network, global_db: GlobalDb, base_node_client: TBaseNodeClient, config: EpochManagerConfig, @@ -67,6 +69,7 @@ impl BaseLayerEpochManager, GrpcBaseNodeClient> { pub fn new( + network: Network, config: EpochManagerConfig, global_db: GlobalDb>, base_node_client: GrpcBaseNodeClient, @@ -74,6 +77,7 @@ impl node_public_key: PublicKey, ) -> Self { Self { + network, global_db, base_node_client, config, @@ -496,7 +500,7 @@ impl } let vns = self.get_validator_nodes_per_epoch(epoch)?; - let vn_bmt_leaves = vns.iter().map(|vn| vn.node_hash().to_vec()).collect(); + let vn_bmt_leaves = vns.iter().map(|vn| vn.get_node_hash(self.network).to_vec()).collect(); let vn_bmt = ValidatorNodeBalancedMerkleTree::create(vn_bmt_leaves); let mut tx = self.global_db.create_transaction()?; self.global_db.bmt(&mut tx).insert_bmt(epoch.as_u64(), vn_bmt.clone())?; @@ -519,7 +523,7 @@ impl address: TAddr::derive_from_public_key(validator).to_string(), epoch, })?; - let leaf_index = bmt.find_leaf_index_for_hash(&vn.node_hash().to_vec())?; + let leaf_index = bmt.find_leaf_index_for_hash(&vn.get_node_hash(self.network).to_vec())?; let proof = ValidatorNodeMerkleProof::generate_proof(&bmt, leaf_index as usize)?; proofs.push(proof); diff --git a/dan_layer/epoch_manager/src/base_layer/epoch_manager_service.rs b/dan_layer/epoch_manager/src/base_layer/epoch_manager_service.rs index 89a72b0b31..0f7b43882d 100644 --- a/dan_layer/epoch_manager/src/base_layer/epoch_manager_service.rs +++ b/dan_layer/epoch_manager/src/base_layer/epoch_manager_service.rs @@ -22,6 +22,7 @@ use log::error; use tari_base_node_client::grpc::GrpcBaseNodeClient; +use tari_common::configuration::Network; use tari_common_types::types::PublicKey; use tari_dan_common_types::{DerivableFromPublicKey, NodeAddressable}; use tari_dan_storage::global::GlobalDb; @@ -54,6 +55,7 @@ impl EpochManagerService, GrpcBaseNodeClient> { pub fn spawn( + network: Network, config: EpochManagerConfig, rx_request: Receiver>, shutdown: ShutdownSignal, @@ -65,7 +67,14 @@ impl let (tx, _) = broadcast::channel(100); EpochManagerService { rx_request, - inner: BaseLayerEpochManager::new(config, global_db, base_node_client, tx.clone(), node_public_key), + inner: BaseLayerEpochManager::new( + network, + config, + global_db, + base_node_client, + tx.clone(), + node_public_key, + ), events: tx, } .run(shutdown) diff --git a/dan_layer/epoch_manager/src/base_layer/initializer.rs b/dan_layer/epoch_manager/src/base_layer/initializer.rs index a47bc3e2e2..bc9a5434f1 100644 --- a/dan_layer/epoch_manager/src/base_layer/initializer.rs +++ b/dan_layer/epoch_manager/src/base_layer/initializer.rs @@ -21,6 +21,7 @@ // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. use tari_base_node_client::grpc::GrpcBaseNodeClient; +use tari_common::configuration::Network; use tari_common_types::types::PublicKey; use tari_dan_common_types::{DerivableFromPublicKey, NodeAddressable}; use tari_dan_storage::global::GlobalDb; @@ -31,6 +32,7 @@ use tokio::{sync::mpsc, task::JoinHandle}; use crate::base_layer::{config::EpochManagerConfig, epoch_manager_service::EpochManagerService, EpochManagerHandle}; pub fn spawn_service( + network: Network, config: EpochManagerConfig, global_db: GlobalDb>, base_node_client: GrpcBaseNodeClient, @@ -40,6 +42,7 @@ pub fn spawn_service( let (tx_request, rx_request) = mpsc::channel(10); let epoch_manager = EpochManagerHandle::new(tx_request); let handle = EpochManagerService::spawn( + network, config, rx_request, shutdown, diff --git a/dan_layer/p2p/proto/consensus.proto b/dan_layer/p2p/proto/consensus.proto index b134369f9a..1aeb8bccd8 100644 --- a/dan_layer/p2p/proto/consensus.proto +++ b/dan_layer/p2p/proto/consensus.proto @@ -42,15 +42,16 @@ message VoteMessage { message Block { bytes parent_id = 1; - QuorumCertificate justify = 2; - uint64 height = 3; - uint64 epoch = 4; - bytes proposed_by = 6; - bytes merkle_root = 7; - repeated Command commands = 8; - uint64 total_leader_fee = 9; - bytes foreign_indexes = 10; - tari.dan.common.Signature signature = 11; + int32 network = 2; + QuorumCertificate justify = 3; + uint64 height = 4; + uint64 epoch = 5; + bytes proposed_by = 7; + bytes merkle_root = 8; + repeated Command commands = 9; + uint64 total_leader_fee = 10; + bytes foreign_indexes = 11; + tari.dan.common.Signature signature = 12; } message Command { diff --git a/dan_layer/p2p/src/conversions/consensus.rs b/dan_layer/p2p/src/conversions/consensus.rs index 1419e90919..4be5dd6e32 100644 --- a/dan_layer/p2p/src/conversions/consensus.rs +++ b/dan_layer/p2p/src/conversions/consensus.rs @@ -250,6 +250,7 @@ impl TryFrom for RequestedTransac impl From<&tari_dan_storage::consensus_models::Block> for proto::consensus::Block { fn from(value: &tari_dan_storage::consensus_models::Block) -> Self { Self { + network: value.network().as_byte().into(), height: value.height().as_u64(), epoch: value.epoch().as_u64(), parent_id: value.parent().as_bytes().to_vec(), @@ -268,7 +269,12 @@ impl TryFrom for tari_dan_storage::consensus_models::Bl type Error = anyhow::Error; fn try_from(value: proto::consensus::Block) -> Result { + let network = u8::try_from(value.network) + .map_err(|_| anyhow!("Block conversion: Invalid network byte {}", value.network))? + .try_into()?; + Ok(Self::new( + network, value.parent_id.try_into()?, value .justify diff --git a/dan_layer/rpc_state_sync/Cargo.toml b/dan_layer/rpc_state_sync/Cargo.toml index 45cadc6864..aad981e7ce 100644 --- a/dan_layer/rpc_state_sync/Cargo.toml +++ b/dan_layer/rpc_state_sync/Cargo.toml @@ -8,6 +8,7 @@ repository.workspace = true license.workspace = true [dependencies] +tari_common = { workspace = true } tari_epoch_manager = { workspace = true } tari_dan_storage = { workspace = true } tari_validator_node_rpc = { workspace = true } diff --git a/dan_layer/rpc_state_sync/src/manager.rs b/dan_layer/rpc_state_sync/src/manager.rs index 094b564ebb..c8d2fa96bd 100644 --- a/dan_layer/rpc_state_sync/src/manager.rs +++ b/dan_layer/rpc_state_sync/src/manager.rs @@ -6,6 +6,7 @@ use std::{fmt::Display, ops::DerefMut}; use async_trait::async_trait; use futures::StreamExt; use log::*; +use tari_common::configuration::Network; use tari_consensus::{ hotstuff::ProposalValidationError, traits::{ConsensusSpec, LeaderStrategy, SyncManager, SyncStatus}, @@ -42,6 +43,7 @@ const LOG_TARGET: &str = "tari::dan::comms_rpc_state_sync"; const MAX_SUBSTATE_UPDATES: usize = 10000; pub struct RpcStateSyncManager { + network: Network, epoch_manager: TConsensusSpec::EpochManager, state_store: TConsensusSpec::StateStore, leader_strategy: TConsensusSpec::LeaderStrategy, @@ -52,12 +54,14 @@ impl RpcStateSyncManager where TConsensusSpec: ConsensusSpec { pub fn new( + network: Network, epoch_manager: TConsensusSpec::EpochManager, state_store: TConsensusSpec::StateStore, leader_strategy: TConsensusSpec::LeaderStrategy, client_factory: TariValidatorNodeRpcClientFactory, ) -> Self { Self { + network, epoch_manager, state_store, leader_strategy, @@ -92,7 +96,7 @@ where TConsensusSpec: ConsensusSpec fn create_zero_block_if_required(&self) -> Result<(), CommsRpcConsensusSyncError> { let mut tx = self.state_store.create_write_tx()?; - let zero_block = Block::zero_block(); + let zero_block = Block::zero_block(self.network); if !zero_block.exists(tx.deref_mut())? { debug!(target: LOG_TARGET, "Creating zero block"); zero_block.justify().insert(&mut tx)?; @@ -280,6 +284,7 @@ where TConsensusSpec: ConsensusSpec let leader = self.leader_strategy.get_leader_public_key(&local_committee, next_height); let dummy_block = Block::dummy_block( + self.network, last_dummy_block.id, leader.clone(), next_height, @@ -456,7 +461,7 @@ where TConsensusSpec: ConsensusSpec + Send + Sync + 'static let locked_block = self .state_store .with_read_tx(|tx| LockedBlock::get(tx).optional())? - .unwrap_or_else(|| Block::zero_block().as_locked_block()); + .unwrap_or_else(|| Block::zero_block(self.network).as_locked_block()); match self.sync_with_peer(member, &locked_block).await { Ok(()) => { diff --git a/dan_layer/state_store_sqlite/migrations/2023-06-08-091819_create_state_store/up.sql b/dan_layer/state_store_sqlite/migrations/2023-06-08-091819_create_state_store/up.sql index 441eecfbcc..c893167879 100644 --- a/dan_layer/state_store_sqlite/migrations/2023-06-08-091819_create_state_store/up.sql +++ b/dan_layer/state_store_sqlite/migrations/2023-06-08-091819_create_state_store/up.sql @@ -15,6 +15,7 @@ create table blocks id integer not null primary key AUTOINCREMENT, block_id text not NULL, parent_block_id text not NULL, + network text not NULL, height bigint not NULL, epoch bigint not NULL, proposed_by text not NULL, @@ -39,6 +40,7 @@ create table parked_blocks id integer not null primary key AUTOINCREMENT, block_id text not NULL, parent_block_id text not NULL, + network text not NULL, height bigint not NULL, epoch bigint not NULL, proposed_by text not NULL, diff --git a/dan_layer/state_store_sqlite/src/schema.rs b/dan_layer/state_store_sqlite/src/schema.rs index 3ae2673e1d..bcd4f28173 100644 --- a/dan_layer/state_store_sqlite/src/schema.rs +++ b/dan_layer/state_store_sqlite/src/schema.rs @@ -5,6 +5,7 @@ diesel::table! { id -> Integer, block_id -> Text, parent_block_id -> Text, + network -> Text, height -> BigInt, epoch -> BigInt, proposed_by -> Text, @@ -142,6 +143,7 @@ diesel::table! { id -> Integer, block_id -> Text, parent_block_id -> Text, + network -> Text, height -> BigInt, epoch -> BigInt, proposed_by -> Text, diff --git a/dan_layer/state_store_sqlite/src/sql_models/block.rs b/dan_layer/state_store_sqlite/src/sql_models/block.rs index 477d85e166..87d0e1bbcb 100644 --- a/dan_layer/state_store_sqlite/src/sql_models/block.rs +++ b/dan_layer/state_store_sqlite/src/sql_models/block.rs @@ -19,6 +19,7 @@ pub struct Block { pub id: i32, pub block_id: String, pub parent_block_id: String, + pub network: String, pub height: i64, pub epoch: i64, pub proposed_by: String, @@ -36,8 +37,14 @@ pub struct Block { impl Block { pub fn try_convert(self, qc: sql_models::QuorumCertificate) -> Result { + let network = self.network.parse().map_err(|_| StorageError::DecodingError { + operation: "try_convert", + item: "block", + details: format!("Block #{} network byte is not a valid Network", self.id), + })?; Ok(consensus_models::Block::load( deserialize_hex_try_from(&self.block_id)?, + network, deserialize_hex_try_from(&self.parent_block_id)?, qc.try_into()?, NodeHeight(self.height as u64), @@ -66,6 +73,7 @@ pub struct ParkedBlock { pub id: i32, pub block_id: String, pub parent_block_id: String, + pub network: String, pub height: i64, pub epoch: i64, pub proposed_by: String, @@ -82,8 +90,14 @@ impl TryFrom for consensus_models::Block { type Error = StorageError; fn try_from(value: ParkedBlock) -> Result { + let network = value.network.parse().map_err(|_| StorageError::DecodingError { + operation: "try_convert", + item: "block", + details: format!("Block #{} network byte is not a valid Network", value.id), + })?; Ok(consensus_models::Block::load( deserialize_hex_try_from(&value.block_id)?, + network, deserialize_hex_try_from(&value.parent_block_id)?, deserialize_json(&value.justify)?, NodeHeight(value.height as u64), diff --git a/dan_layer/state_store_sqlite/src/writer.rs b/dan_layer/state_store_sqlite/src/writer.rs index 0a68e1e036..16d9ad2acd 100644 --- a/dan_layer/state_store_sqlite/src/writer.rs +++ b/dan_layer/state_store_sqlite/src/writer.rs @@ -139,6 +139,7 @@ impl<'a, TAddr: NodeAddressable> SqliteStateStoreWriteTransaction<'a, TAddr> { let insert = ( parked_blocks::block_id.eq(&block_id), parked_blocks::parent_block_id.eq(serialize_hex(block.parent())), + parked_blocks::network.eq(block.network().to_string()), parked_blocks::height.eq(block.height().as_u64() as i64), parked_blocks::epoch.eq(block.epoch().as_u64() as i64), parked_blocks::proposed_by.eq(serialize_hex(block.proposed_by().as_bytes())), @@ -182,6 +183,7 @@ impl StateStoreWriteTransaction for SqliteStateStoreWrit let insert = ( blocks::block_id.eq(serialize_hex(block.id())), blocks::parent_block_id.eq(serialize_hex(block.parent())), + blocks::network.eq(block.network().to_string()), blocks::height.eq(block.height().as_u64() as i64), blocks::epoch.eq(block.epoch().as_u64() as i64), blocks::proposed_by.eq(serialize_hex(block.proposed_by().as_bytes())), diff --git a/dan_layer/state_store_sqlite/tests/tests.rs b/dan_layer/state_store_sqlite/tests/tests.rs index 56c0694628..b59db37175 100644 --- a/dan_layer/state_store_sqlite/tests/tests.rs +++ b/dan_layer/state_store_sqlite/tests/tests.rs @@ -43,9 +43,11 @@ mod confirm_all_transitions { let atom2 = create_tx_atom(); let atom3 = create_tx_atom(); - let zero_block = Block::zero_block(); + let network = Default::default(); + let zero_block = Block::zero_block(network); zero_block.insert(&mut tx).unwrap(); let block1 = Block::new( + network, *zero_block.id(), zero_block.justify().clone(), NodeHeight(1), diff --git a/dan_layer/storage/Cargo.toml b/dan_layer/storage/Cargo.toml index 8d2ec25da7..1cda035e95 100644 --- a/dan_layer/storage/Cargo.toml +++ b/dan_layer/storage/Cargo.toml @@ -9,6 +9,7 @@ license.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +tari_common = { workspace = true } tari_common_types = { workspace = true } tari_dan_common_types = { workspace = true } diff --git a/dan_layer/storage/src/consensus_models/block.rs b/dan_layer/storage/src/consensus_models/block.rs index 3830d64e83..21429f0967 100644 --- a/dan_layer/storage/src/consensus_models/block.rs +++ b/dan_layer/storage/src/consensus_models/block.rs @@ -11,6 +11,7 @@ use std::{ use indexmap::IndexMap; use log::*; use serde::{Deserialize, Serialize}; +use tari_common::configuration::Network; use tari_common_types::types::{FixedHash, FixedHashSizeError, PublicKey}; use tari_dan_common_types::{ hashing, @@ -51,6 +52,7 @@ const LOG_TARGET: &str = "tari::dan::storage::consensus_models::block"; pub struct Block { // Header id: BlockId, + network: Network, parent: BlockId, justify: QuorumCertificate, height: NodeHeight, @@ -79,6 +81,7 @@ pub struct Block { impl Block { pub fn new( + network: Network, parent: BlockId, justify: QuorumCertificate, height: NodeHeight, @@ -91,6 +94,7 @@ impl Block { ) -> Self { let mut block = Self { id: BlockId::genesis(), + network, parent, justify, height, @@ -113,6 +117,7 @@ impl Block { pub fn load( id: BlockId, + network: Network, parent: BlockId, justify: QuorumCertificate, height: NodeHeight, @@ -129,6 +134,7 @@ impl Block { ) -> Self { Self { id, + network, parent, justify, height, @@ -147,8 +153,9 @@ impl Block { } } - pub fn genesis() -> Self { + pub fn genesis(network: Network) -> Self { Self::new( + network, BlockId::genesis(), QuorumCertificate::genesis(), NodeHeight(0), @@ -162,8 +169,9 @@ impl Block { } /// This is the parent block for all genesis blocks. Its block ID is always zero. - pub fn zero_block() -> Self { + pub fn zero_block(network: Network) -> Self { Self { + network, id: BlockId::genesis(), parent: BlockId::genesis(), justify: QuorumCertificate::genesis(), @@ -183,6 +191,7 @@ impl Block { } pub fn dummy_block( + network: Network, parent: BlockId, proposed_by: PublicKey, node_height: NodeHeight, @@ -190,6 +199,7 @@ impl Block { epoch: Epoch, ) -> Self { let mut block = Self::new( + network, parent, high_qc, node_height, @@ -207,6 +217,7 @@ impl Block { pub fn calculate_hash(&self) -> FixedHash { hashing::block_hasher() + .chain(&self.network) .chain(&self.parent) .chain(&self.justify) .chain(&self.height) @@ -275,6 +286,10 @@ impl Block { &self.id } + pub fn network(&self) -> Network { + self.network + } + pub fn parent(&self) -> &BlockId { &self.parent } diff --git a/dan_layer/storage/src/global/models/validator_node.rs b/dan_layer/storage/src/global/models/validator_node.rs index 6b41bfdfc8..5e79d8969c 100644 --- a/dan_layer/storage/src/global/models/validator_node.rs +++ b/dan_layer/storage/src/global/models/validator_node.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: BSD-3-Clause use serde::{Deserialize, Serialize}; +use tari_common::configuration::Network; use tari_common_types::types::{FixedHash, PublicKey}; use tari_dan_common_types::{shard::Shard, vn_node_hash, Epoch, NodeAddressable, SubstateAddress}; @@ -16,8 +17,8 @@ pub struct ValidatorNode { } impl ValidatorNode { - pub fn node_hash(&self) -> FixedHash { - vn_node_hash(&self.public_key, &self.shard_key) + pub fn get_node_hash(&self, network: Network) -> FixedHash { + vn_node_hash(network, &self.public_key, &self.shard_key) } }