From 83721459d46981bb276011c85db1defc58dec231 Mon Sep 17 00:00:00 2001 From: Jos Dehaes Date: Tue, 17 Oct 2023 15:27:20 +0200 Subject: [PATCH 1/4] fix: update simple_node --- node/bft/examples/simple_node.rs | 101 ++++++++++++++++++++++++++++--- 1 file changed, 92 insertions(+), 9 deletions(-) diff --git a/node/bft/examples/simple_node.rs b/node/bft/examples/simple_node.rs index 528293cc53..edb7d8a323 100644 --- a/node/bft/examples/simple_node.rs +++ b/node/bft/examples/simple_node.rs @@ -23,20 +23,32 @@ use snarkos_node_bft::{ MAX_GC_ROUNDS, MEMORY_POOL_PORT, }; -use snarkos_node_bft_ledger_service::MockLedgerService; +use snarkos_node_bft_ledger_service::TranslucentLedgerService; use snarkos_node_bft_storage_service::BFTMemoryService; use snarkvm::{ + console::algorithms::BHP256, ledger::{ committee::{Committee, MIN_VALIDATOR_STAKE}, narwhal::Data, }, prelude::{ - block::Transaction, + block::{Block, Transaction}, coinbase::{ProverSolution, PuzzleCommitment}, + store::{helpers::memory::ConsensusMemory, ConsensusStore}, + Address, Field, + FromBytes, + Hash, + Ledger, Network, + PrivateKey, + TestRng, + ToBits, + ToBytes, Uniform, + VM, }, + utilities::to_bytes_le, }; use ::bytes::Bytes; @@ -51,8 +63,15 @@ use axum::{ use axum_extra::response::ErasedJson; use clap::{Parser, ValueEnum}; use indexmap::IndexMap; -use rand::{Rng, SeedableRng}; -use std::{collections::HashMap, net::SocketAddr, path::PathBuf, str::FromStr, sync::Arc}; +use parking_lot::Mutex; +use rand::{CryptoRng, Rng, SeedableRng}; +use std::{ + collections::HashMap, + net::SocketAddr, + path::PathBuf, + str::FromStr, + sync::{Arc, OnceLock}, +}; use tokio::sync::oneshot; use tracing_subscriber::{ layer::{Layer, SubscriberExt}, @@ -113,8 +132,17 @@ pub async fn start_bft( let (sender, receiver) = init_primary_channels(); // Initialize the components. let (committee, account) = initialize_components(node_id, num_nodes)?; - // Initialize the mock ledger service. - let ledger = Arc::new(MockLedgerService::new(committee)); + // Initialize the translucent ledger service. + let gen_key = account.private_key(); + let public_balance_per_validator = + (1_500_000_000_000_000 - (num_nodes as u64) * 1_000_000_000_000) / (num_nodes as u64); + let mut balances = IndexMap::, u64>::new(); + for address in committee.members().keys() { + balances.insert(*address, public_balance_per_validator); + } + let mut rng = TestRng::default(); + let gen_ledger = genesis_ledger(*gen_key, committee.clone(), balances.clone(), &mut rng); + let ledger = Arc::new(TranslucentLedgerService::new(gen_ledger)); // Initialize the storage. let storage = Storage::new(ledger.clone(), Arc::new(BFTMemoryService::new()), MAX_GC_ROUNDS); // Initialize the gateway IP and dev mode. @@ -142,10 +170,11 @@ pub async fn start_bft( /// Starts the primary instance. pub async fn start_primary( - node_id: u16, - num_nodes: u16, - peers: HashMap, + _node_id: u16, + _num_nodes: u16, + _peers: HashMap, ) -> Result<(Primary, PrimarySender)> { + /* // Initialize the primary channels. let (sender, receiver) = init_primary_channels(); // Initialize the components. @@ -169,6 +198,60 @@ pub async fn start_primary( handle_signals(&primary); // Return the primary instance. Ok((primary, sender)) + */ + todo!() +} + +pub type CurrentLedger = Ledger>; + +fn genesis_cache() -> &'static Mutex, Block>> { + static CACHE: OnceLock, Block>>> = OnceLock::new(); + CACHE.get_or_init(|| Mutex::new(HashMap::new())) +} + +fn genesis_block( + genesis_private_key: PrivateKey, + committee: Committee, + public_balances: IndexMap, u64>, + rng: &mut (impl Rng + CryptoRng), +) -> Block { + // Initialize the store. + let store = ConsensusStore::<_, ConsensusMemory<_>>::open(None).unwrap(); + // Initialize a new VM. + let vm = VM::from(store).unwrap(); + // Initialize the genesis block. + vm.genesis_quorum(&genesis_private_key, committee, public_balances, rng).unwrap() +} + +fn genesis_ledger( + genesis_private_key: PrivateKey, + committee: Committee, + public_balances: IndexMap, u64>, + rng: &mut (impl Rng + CryptoRng), +) -> CurrentLedger { + let cache_key = + to_bytes_le![genesis_private_key, committee, public_balances.iter().collect::>()].unwrap(); + // Initialize the genesis block on the first call; other callers + // will wait for it on the mutex. + let block = genesis_cache() + .lock() + .entry(cache_key.clone()) + .or_insert_with(|| { + let hasher = BHP256::::setup("aleo.dev.block").unwrap(); + let file_name = hasher.hash(&cache_key.to_bits_le()).unwrap().to_string() + ".genesis"; + let file_path = std::env::temp_dir().join(file_name); + if file_path.exists() { + let buffer = std::fs::read(file_path).unwrap(); + return Block::from_bytes_le(&buffer).unwrap(); + } + + let block = genesis_block(genesis_private_key, committee, public_balances, rng); + std::fs::write(&file_path, block.to_bytes_le().unwrap()).unwrap(); + block + }) + .clone(); + // Initialize the ledger with the genesis block. + CurrentLedger::load(block, None).unwrap() } /// Initializes the components of the node. From d4122b07baab41eeea28bf3a22995971876be861 Mon Sep 17 00:00:00 2001 From: Jos Dehaes Date: Mon, 23 Oct 2023 09:17:04 +0200 Subject: [PATCH 2/4] fix: start_primary --- node/bft/examples/simple_node.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/node/bft/examples/simple_node.rs b/node/bft/examples/simple_node.rs index edb7d8a323..225c692ac2 100644 --- a/node/bft/examples/simple_node.rs +++ b/node/bft/examples/simple_node.rs @@ -170,17 +170,24 @@ pub async fn start_bft( /// Starts the primary instance. pub async fn start_primary( - _node_id: u16, - _num_nodes: u16, - _peers: HashMap, + node_id: u16, + num_nodes: u16, + peers: HashMap, ) -> Result<(Primary, PrimarySender)> { - /* // Initialize the primary channels. let (sender, receiver) = init_primary_channels(); // Initialize the components. let (committee, account) = initialize_components(node_id, num_nodes)?; - // Initialize the mock ledger service. - let ledger = Arc::new(MockLedgerService::new(committee)); + let gen_key = account.private_key(); + let public_balance_per_validator = + (1_500_000_000_000_000 - (num_nodes as u64) * 1_000_000_000_000) / (num_nodes as u64); + let mut balances = IndexMap::, u64>::new(); + for address in committee.members().keys() { + balances.insert(*address, public_balance_per_validator); + } + let mut rng = TestRng::default(); + let gen_ledger = genesis_ledger(*gen_key, committee.clone(), balances.clone(), &mut rng); + let ledger = Arc::new(TranslucentLedgerService::new(gen_ledger)); // Initialize the storage. let storage = Storage::new(ledger.clone(), Arc::new(BFTMemoryService::new()), MAX_GC_ROUNDS); // Initialize the gateway IP and dev mode. @@ -198,8 +205,6 @@ pub async fn start_primary( handle_signals(&primary); // Return the primary instance. Ok((primary, sender)) - */ - todo!() } pub type CurrentLedger = Ledger>; From d5c824611d416b5c0415452abe832e4c7b14f31c Mon Sep 17 00:00:00 2001 From: Jos Dehaes Date: Wed, 13 Mar 2024 09:36:55 +0100 Subject: [PATCH 3/4] fix: abstract common code --- node/bft/examples/simple_node.rs | 42 +++++++++++++++++--------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/node/bft/examples/simple_node.rs b/node/bft/examples/simple_node.rs index 1dac1b80de..5fbf68b9dd 100644 --- a/node/bft/examples/simple_node.rs +++ b/node/bft/examples/simple_node.rs @@ -120,16 +120,7 @@ pub async fn start_bft( // Initialize the components. let (committee, account) = initialize_components(node_id, num_nodes)?; // Initialize the translucent ledger service. - let gen_key = account.private_key(); - let public_balance_per_validator = - (1_500_000_000_000_000 - (num_nodes as u64) * 1_000_000_000_000) / (num_nodes as u64); - let mut balances = IndexMap::, u64>::new(); - for address in committee.members().keys() { - balances.insert(*address, public_balance_per_validator); - } - let mut rng = TestRng::default(); - let gen_ledger = genesis_ledger(*gen_key, committee.clone(), balances.clone(), node_id, &mut rng); - let ledger = Arc::new(TranslucentLedgerService::new(gen_ledger, Arc::new(AtomicBool::new(false)))); + let ledger = create_ledger(&account, num_nodes, committee, node_id); // Initialize the storage. let storage = Storage::new( ledger.clone(), @@ -169,16 +160,8 @@ pub async fn start_primary( let (sender, receiver) = init_primary_channels(); // Initialize the components. let (committee, account) = initialize_components(node_id, num_nodes)?; - let gen_key = account.private_key(); - let public_balance_per_validator = - (1_500_000_000_000_000 - (num_nodes as u64) * 1_000_000_000_000) / (num_nodes as u64); - let mut balances = IndexMap::, u64>::new(); - for address in committee.members().keys() { - balances.insert(*address, public_balance_per_validator); - } - let mut rng = TestRng::default(); - let gen_ledger = genesis_ledger(*gen_key, committee.clone(), balances.clone(), node_id, &mut rng); - let ledger = Arc::new(TranslucentLedgerService::new(gen_ledger, Arc::new(AtomicBool::new(false)))); + // Initialize the translucent ledger service. + let ledger = create_ledger(&account, num_nodes, committee, node_id); // Initialize the storage. let storage = Storage::new( ledger.clone(), @@ -202,6 +185,25 @@ pub async fn start_primary( Ok((primary, sender)) } +/// Initialize the translucent ledger service. +fn create_ledger( + account: &Account, + num_nodes: u16, + committee: Committee, + node_id: u16, +) -> Arc>> { + let gen_key = account.private_key(); + let public_balance_per_validator = + (1_500_000_000_000_000 - (num_nodes as u64) * 1_000_000_000_000) / (num_nodes as u64); + let mut balances = IndexMap::, u64>::new(); + for address in committee.members().keys() { + balances.insert(*address, public_balance_per_validator); + } + let mut rng = TestRng::default(); + let gen_ledger = genesis_ledger(*gen_key, committee.clone(), balances.clone(), node_id, &mut rng); + Arc::new(TranslucentLedgerService::new(gen_ledger, Arc::new(AtomicBool::new(false)))) +} + pub type CurrentLedger = Ledger>; fn genesis_cache() -> &'static Mutex, Block>> { From 0eb6ee562cf6ff4616f70acacf9d89beae784add Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 22 Mar 2024 12:41:00 -0700 Subject: [PATCH 4/4] Fix public balance in simple node --- node/bft/examples/simple_node.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/bft/examples/simple_node.rs b/node/bft/examples/simple_node.rs index 340540fc55..1af54fcd55 100644 --- a/node/bft/examples/simple_node.rs +++ b/node/bft/examples/simple_node.rs @@ -194,7 +194,7 @@ fn create_ledger( ) -> Arc>> { let gen_key = account.private_key(); let public_balance_per_validator = - (1_500_000_000_000_000 - (num_nodes as u64) * 1_000_000_000_000) / (num_nodes as u64); + (CurrentNetwork::STARTING_SUPPLY - (num_nodes as u64) * MIN_VALIDATOR_STAKE) / (num_nodes as u64); let mut balances = IndexMap::, u64>::new(); for address in committee.members().keys() { balances.insert(*address, public_balance_per_validator);