#![allow(clippy::indexing_slicing)]
use tari_common::configuration::Network;
use tari_core::{
chain_storage::{BlockchainDatabase, BlockchainDatabaseConfig, Validators},
consensus::{BaseNodeConsensusManager, BaseNodeConsensusManagerBuilder},
test_helpers::blockchain::{TempDatabase, create_store_with_consensus},
validation::DifficultyCalculator,
};
use tari_node_components::blocks::ChainBlock;
use tari_transaction_components::{
consensus::{ConsensusConstants, ConsensusConstantsBuilder},
key_manager::KeyManager,
tari_amount::{T, uT},
transaction_components::WalletOutput,
txn_schema,
};
use crate::helpers::block_builders::{create_genesis_block, generate_new_block};
static EMISSION: [u64; 2] = [10, 10];
#[allow(clippy::identity_op)]
#[allow(dead_code)]
pub fn create_blockchain_db_no_cut_through() -> (
BlockchainDatabase<TempDatabase>,
Vec<ChainBlock>,
Vec<Vec<WalletOutput>>,
BaseNodeConsensusManager,
KeyManager,
) {
let network = Network::LocalNet;
let (mut db, mut blocks, mut outputs, consensus_manager, key_manager) = create_new_blockchain(network);
let txs = vec![txn_schema!(from: vec![outputs[0][0].clone()], to: vec![60*T], fee: 100*uT)];
generate_new_block(
&mut db,
&mut blocks,
&mut outputs,
txs,
&consensus_manager,
&key_manager,
)
.unwrap();
let txs = vec![
txn_schema!(from: vec![outputs[1][0].clone()], to: vec![20*T, 5*T, 1*T], fee: 120*uT),
txn_schema!(from: vec![outputs[1][1].clone()], to: vec![15*T], fee: 75*uT),
];
generate_new_block(
&mut db,
&mut blocks,
&mut outputs,
txs,
&consensus_manager,
&key_manager,
)
.unwrap();
let txs = vec![
txn_schema!(from: vec![outputs[2][1].clone(), outputs[2][2].clone()], to: vec![outputs[2][2].value()/2]),
txn_schema!(from: vec![outputs[2][4].clone(), outputs[2][3].clone()], to: vec![40*T], fee: 100*uT),
];
generate_new_block(
&mut db,
&mut blocks,
&mut outputs,
txs,
&consensus_manager,
&key_manager,
)
.unwrap();
let txs = vec![txn_schema!(
from: vec![outputs[2][0].clone()],
to: vec![1 * T, 2 * T, 3 * T, 4 * T]
)];
generate_new_block(
&mut db,
&mut blocks,
&mut outputs,
txs,
&consensus_manager,
&key_manager,
)
.unwrap();
let txs = vec![
txn_schema!(
from: vec![outputs[4][3].clone(), outputs[3][2].clone()],
to: vec![20 * T, 21 * T]
),
txn_schema!(
from: vec![outputs[4][1].clone()],
to: vec![500_000 * uT, 1_300_000 * uT]
),
txn_schema!(from: vec![outputs[3][3].clone()], to: vec![500_000 * uT]),
];
generate_new_block(
&mut db,
&mut blocks,
&mut outputs,
txs,
&consensus_manager,
&key_manager,
)
.unwrap();
(db, blocks, outputs, consensus_manager, key_manager)
}
pub fn consensus_constants(network: Network) -> ConsensusConstantsBuilder {
ConsensusConstantsBuilder::new(network)
.with_emission_amounts(100_000_000.into(), EMISSION.to_vec(), 10, 1000)
.with_coinbase_lockheight(1)
}
#[allow(dead_code)]
pub fn create_new_blockchain(
network: Network,
) -> (
BlockchainDatabase<TempDatabase>,
Vec<ChainBlock>,
Vec<Vec<WalletOutput>>,
BaseNodeConsensusManager,
KeyManager,
) {
let key_manager = KeyManager::new_random().unwrap();
let consensus_constants = consensus_constants(network).build();
let (block0, output) = create_genesis_block(&consensus_constants, &key_manager);
let consensus_manager = BaseNodeConsensusManagerBuilder::new(network)
.add_consensus_constants(consensus_constants)
.with_block(block0.clone())
.build()
.unwrap();
(
create_store_with_consensus(consensus_manager.clone()),
vec![block0],
vec![vec![output]],
consensus_manager,
key_manager,
)
}
#[allow(dead_code)]
pub fn create_new_blockchain_with_constants(
network: Network,
constants: ConsensusConstants,
) -> (
BlockchainDatabase<TempDatabase>,
Vec<ChainBlock>,
Vec<Vec<WalletOutput>>,
BaseNodeConsensusManager,
KeyManager,
) {
let key_manager = KeyManager::new_random().unwrap();
let (block0, output) = create_genesis_block(&constants, &key_manager);
let consensus_manager = BaseNodeConsensusManagerBuilder::new(network)
.add_consensus_constants(constants)
.with_block(block0.clone())
.build()
.unwrap();
(
create_store_with_consensus(consensus_manager.clone()),
vec![block0],
vec![vec![output]],
consensus_manager,
key_manager,
)
}
#[allow(dead_code)]
pub fn create_new_blockchain_lmdb(
network: Network,
validators: Validators<TempDatabase>,
config: BlockchainDatabaseConfig,
) -> (
BlockchainDatabase<TempDatabase>,
Vec<ChainBlock>,
Vec<Vec<WalletOutput>>,
BaseNodeConsensusManager,
KeyManager,
) {
let key_manager = KeyManager::new_random().unwrap();
let consensus_constants = consensus_constants(network).build();
let (block0, output) = create_genesis_block(&consensus_constants, &key_manager);
let consensus_manager = BaseNodeConsensusManagerBuilder::new(network)
.add_consensus_constants(consensus_constants)
.with_block(block0.clone())
.build()
.unwrap();
let db = TempDatabase::new();
let db = BlockchainDatabase::start_new(
db,
consensus_manager.clone(),
validators,
config,
DifficultyCalculator::new(consensus_manager.clone(), Default::default()),
)
.unwrap();
(db, vec![block0], vec![vec![output]], consensus_manager, key_manager)
}