mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-04-28 03:00:18 -04:00
consensus: Move constants into own module.
This commit is contained in:
@@ -24,7 +24,10 @@ use incrementalmerkletree::{bridgetree::BridgeTree, Tree};
|
||||
use log::debug;
|
||||
use pasta_curves::pallas;
|
||||
|
||||
use super::{Metadata, BLOCK_MAGIC_BYTES, BLOCK_VERSION};
|
||||
use super::{
|
||||
constants::{BLOCK_MAGIC_BYTES, BLOCK_VERSION},
|
||||
Metadata,
|
||||
};
|
||||
use crate::{net, tx::Transaction, util::time::Timestamp};
|
||||
|
||||
/// This struct represents a tuple of the form (version, previous, epoch, slot, timestamp, merkle_root).
|
||||
@@ -52,7 +55,7 @@ impl Header {
|
||||
timestamp: Timestamp,
|
||||
root: MerkleNode,
|
||||
) -> Self {
|
||||
let version = *BLOCK_VERSION;
|
||||
let version = BLOCK_VERSION;
|
||||
Self { version, previous, epoch, slot, timestamp, root }
|
||||
}
|
||||
|
||||
@@ -112,7 +115,7 @@ impl Block {
|
||||
root: MerkleNode,
|
||||
metadata: Metadata,
|
||||
) -> Self {
|
||||
let magic = *BLOCK_MAGIC_BYTES;
|
||||
let magic = BLOCK_MAGIC_BYTES;
|
||||
let timestamp = Timestamp::current_time();
|
||||
let header = Header::new(previous, epoch, slot, timestamp, root);
|
||||
let header = header.headerhash();
|
||||
@@ -121,7 +124,7 @@ impl Block {
|
||||
|
||||
/// Generate the genesis block.
|
||||
pub fn genesis_block(genesis_ts: Timestamp, genesis_data: blake3::Hash) -> Self {
|
||||
let magic = *BLOCK_MAGIC_BYTES;
|
||||
let magic = BLOCK_MAGIC_BYTES;
|
||||
let header = Header::genesis_header(genesis_ts, genesis_data);
|
||||
let header = header.headerhash();
|
||||
let metadata = Metadata::default();
|
||||
@@ -164,7 +167,7 @@ pub struct BlockInfo {
|
||||
|
||||
impl Default for BlockInfo {
|
||||
fn default() -> Self {
|
||||
let magic = *BLOCK_MAGIC_BYTES;
|
||||
let magic = BLOCK_MAGIC_BYTES;
|
||||
Self { magic, header: Header::default(), txs: vec![], metadata: Metadata::default() }
|
||||
}
|
||||
}
|
||||
@@ -177,7 +180,7 @@ impl net::Message for BlockInfo {
|
||||
|
||||
impl BlockInfo {
|
||||
pub fn new(header: Header, txs: Vec<Transaction>, metadata: Metadata) -> Self {
|
||||
let magic = *BLOCK_MAGIC_BYTES;
|
||||
let magic = BLOCK_MAGIC_BYTES;
|
||||
Self { magic, header, txs, metadata }
|
||||
}
|
||||
|
||||
|
||||
@@ -37,8 +37,10 @@ use log::info;
|
||||
use rand::{rngs::OsRng, thread_rng, Rng};
|
||||
|
||||
use super::{
|
||||
leadcoin::LeadCoin, utils::fbig2base, Float10, EPOCH_LENGTH, LOTTERY_HEAD_START, P, RADIX_BITS,
|
||||
REWARD,
|
||||
constants::{EPOCH_LENGTH, LOTTERY_HEAD_START, P, RADIX_BITS, REWARD},
|
||||
leadcoin::LeadCoin,
|
||||
utils::fbig2base,
|
||||
Float10,
|
||||
};
|
||||
use crate::{
|
||||
crypto::{
|
||||
@@ -55,16 +57,16 @@ const MERKLE_DEPTH: u8 = MERKLE_DEPTH_ORCHARD as u8;
|
||||
/// Retrieve previous epoch competing coins frequency.
|
||||
fn get_frequency() -> Float10 {
|
||||
//TODO: Actually retrieve frequency of coins from the previous epoch.
|
||||
let one: Float10 = Float10::from_str_native("1").unwrap().with_precision(*RADIX_BITS).value();
|
||||
let two: Float10 = Float10::from_str_native("2").unwrap().with_precision(*RADIX_BITS).value();
|
||||
let one: Float10 = Float10::from_str_native("1").unwrap().with_precision(RADIX_BITS).value();
|
||||
let two: Float10 = Float10::from_str_native("2").unwrap().with_precision(RADIX_BITS).value();
|
||||
one / two
|
||||
}
|
||||
|
||||
/// Calculate nodes total stake for specific epoch and slot.
|
||||
fn total_stake(_epoch: u64, _slot: u64) -> u64 {
|
||||
// TODO: fix this
|
||||
//(epoch * *EPOCH_LENGTH + slot + 1) * *REWARD
|
||||
*REWARD
|
||||
//(epoch * EPOCH_LENGTH + slot + 1) * REWARD
|
||||
REWARD
|
||||
}
|
||||
|
||||
/// Generate epoch competing coins.
|
||||
@@ -77,16 +79,16 @@ pub fn create_epoch_coins(
|
||||
info!("Creating coins for epoch: {}", epoch);
|
||||
|
||||
// Retrieve previous epoch competing coins frequency
|
||||
let frequency = get_frequency().with_precision(*RADIX_BITS).value();
|
||||
let frequency = get_frequency().with_precision(RADIX_BITS).value();
|
||||
info!("Previous epoch frequency: {}", frequency);
|
||||
|
||||
// Generating sigmas
|
||||
let total_stake = total_stake(epoch, slot); // only used for fine tunning
|
||||
info!("Node total stake: {}", total_stake);
|
||||
let one: Float10 = Float10::from_str_native("1").unwrap().with_precision(*RADIX_BITS).value();
|
||||
let two: Float10 = Float10::from_str_native("2").unwrap().with_precision(*RADIX_BITS).value();
|
||||
let field_p = Float10::from_str_native(*P).unwrap().with_precision(*RADIX_BITS).value();
|
||||
let total_sigma = Float10::try_from(total_stake).unwrap().with_precision(*RADIX_BITS).value();
|
||||
let one: Float10 = Float10::from_str_native("1").unwrap().with_precision(RADIX_BITS).value();
|
||||
let two: Float10 = Float10::from_str_native("2").unwrap().with_precision(RADIX_BITS).value();
|
||||
let field_p = Float10::from_str_native(P).unwrap().with_precision(RADIX_BITS).value();
|
||||
let total_sigma = Float10::try_from(total_stake).unwrap().with_precision(RADIX_BITS).value();
|
||||
let x = one - frequency;
|
||||
info!("x: {}", x);
|
||||
let c = x.ln();
|
||||
@@ -113,18 +115,18 @@ fn create_coins(
|
||||
) -> Vec<Vec<LeadCoin>> {
|
||||
let mut rng = thread_rng();
|
||||
let mut seeds: Vec<u64> = vec![];
|
||||
for _i in 0..*EPOCH_LENGTH {
|
||||
for _i in 0..EPOCH_LENGTH {
|
||||
let rho: u64 = rng.gen();
|
||||
seeds.push(rho);
|
||||
}
|
||||
let (sks, root_sks, path_sks) = create_coins_sks();
|
||||
let mut tree_cm = BridgeTree::<MerkleNode, MERKLE_DEPTH>::new(*EPOCH_LENGTH as usize);
|
||||
let mut tree_cm = BridgeTree::<MerkleNode, MERKLE_DEPTH>::new(EPOCH_LENGTH as usize);
|
||||
// Leadcoins matrix were each row represents a slot and contains its competing coins.
|
||||
let mut coins: Vec<Vec<LeadCoin>> = vec![];
|
||||
|
||||
// Use existing stake
|
||||
if !owned.is_empty() {
|
||||
for i in 0..*EPOCH_LENGTH {
|
||||
for i in 0..EPOCH_LENGTH {
|
||||
let index = i as usize;
|
||||
let mut slot_coins = vec![];
|
||||
for elem in owned {
|
||||
@@ -146,14 +148,14 @@ fn create_coins(
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
for i in 0..*EPOCH_LENGTH {
|
||||
for i in 0..EPOCH_LENGTH {
|
||||
let index = i as usize;
|
||||
// Compete with zero stake
|
||||
let coin = LeadCoin::new(
|
||||
eta,
|
||||
sigma1,
|
||||
sigma2,
|
||||
*LOTTERY_HEAD_START,
|
||||
LOTTERY_HEAD_START,
|
||||
index,
|
||||
root_sks[index],
|
||||
path_sks[index],
|
||||
@@ -178,12 +180,12 @@ fn create_coins(
|
||||
fn create_coins_sks() -> (Vec<SecretKey>, Vec<MerkleNode>, Vec<[MerkleNode; MERKLE_DEPTH_ORCHARD]>)
|
||||
{
|
||||
let mut rng = thread_rng();
|
||||
let mut tree = BridgeTree::<MerkleNode, MERKLE_DEPTH>::new(*EPOCH_LENGTH as usize);
|
||||
let mut tree = BridgeTree::<MerkleNode, MERKLE_DEPTH>::new(EPOCH_LENGTH as usize);
|
||||
let mut sks: Vec<SecretKey> = vec![];
|
||||
let mut root_sks: Vec<MerkleNode> = vec![];
|
||||
let mut path_sks: Vec<[MerkleNode; MERKLE_DEPTH_ORCHARD]> = vec![];
|
||||
let mut prev_sk_base: pallas::Base = pallas::Base::one();
|
||||
for _i in 0..*EPOCH_LENGTH {
|
||||
for _i in 0..EPOCH_LENGTH {
|
||||
let base: pallas::Point = if _i == 0 {
|
||||
pedersen_commitment_u64(1, pallas::Scalar::random(&mut rng))
|
||||
} else {
|
||||
|
||||
62
src/consensus/constants.rs
Normal file
62
src/consensus/constants.rs
Normal file
@@ -0,0 +1,62 @@
|
||||
/* This file is part of DarkFi (https://dark.fi)
|
||||
*
|
||||
* Copyright (C) 2020-2022 Dyne.org foundation
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use lazy_static::lazy_static;
|
||||
|
||||
use crate::util::time::Timestamp;
|
||||
|
||||
lazy_static! {
|
||||
/// Genesis hash for the mainnet chain
|
||||
pub static ref MAINNET_GENESIS_HASH_BYTES: blake3::Hash = blake3::hash(b"darkfi_mainnet");
|
||||
|
||||
/// Genesis timestamp for the mainnet chain
|
||||
pub static ref MAINNET_GENESIS_TIMESTAMP: Timestamp = Timestamp(1650887115);
|
||||
|
||||
/// Genesis hash for the testnet chain
|
||||
pub static ref TESTNET_GENESIS_HASH_BYTES: blake3::Hash = blake3::hash(b"darkfi_testnet");
|
||||
|
||||
/// Genesis timestamp for the testnet chain
|
||||
pub static ref TESTNET_GENESIS_TIMESTAMP: Timestamp = Timestamp(1650887115);
|
||||
}
|
||||
|
||||
/// Block version number
|
||||
pub const BLOCK_VERSION: u8 = 1;
|
||||
|
||||
/// Block magic bytes
|
||||
pub const BLOCK_MAGIC_BYTES: [u8; 4] = [0x11, 0x6d, 0x75, 0x1f];
|
||||
|
||||
/// Block info magic bytes
|
||||
pub const BLOCK_INFO_MAGIC_BYTES: [u8; 4] = [0x90, 0x44, 0xf1, 0xf6];
|
||||
|
||||
/// Number of slots in one epoch
|
||||
pub const EPOCH_LENGTH: u64 = 10;
|
||||
|
||||
/// Block leader reward
|
||||
pub const REWARD: u64 = 420;
|
||||
|
||||
/// `2 * DELTA` represents slot time
|
||||
pub const DELTA: u64 = 20;
|
||||
|
||||
/// Leader proofs k for zk proof rows (rows=2^k)
|
||||
pub const LEADER_PROOF_K: u32 = 11;
|
||||
|
||||
// TODO: Describe these constants
|
||||
pub const RADIX_BITS: usize = 76;
|
||||
pub const P: &str = "28948022309329048855892746252171976963363056481941560715954676764349967630337";
|
||||
pub const LOTTERY_HEAD_START: u64 = 1;
|
||||
pub const PRF_NULLIFIER_PREFIX: u64 = 0;
|
||||
@@ -15,6 +15,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use darkfi_sdk::{
|
||||
crypto::{
|
||||
pedersen::pedersen_commitment_base, poseidon_hash, util::mod_r_p, MerkleNode, PublicKey,
|
||||
@@ -27,7 +28,7 @@ use incrementalmerkletree::{bridgetree::BridgeTree, Tree};
|
||||
use log::debug;
|
||||
use rand::rngs::OsRng;
|
||||
|
||||
use super::PRF_NULLIFIER_PREFIX;
|
||||
use super::constants::PRF_NULLIFIER_PREFIX;
|
||||
use crate::{
|
||||
crypto::{proof::ProvingKey, Proof},
|
||||
zk::circuit::LeadContract,
|
||||
@@ -130,7 +131,7 @@ impl LeadCoin {
|
||||
|
||||
// Derive input for the commitment of coin1
|
||||
let coin1_commit_msg = [
|
||||
pallas::Base::from(*PRF_NULLIFIER_PREFIX),
|
||||
pallas::Base::from(PRF_NULLIFIER_PREFIX),
|
||||
coin_pk_x,
|
||||
coin_pk_y,
|
||||
pallas::Base::from(value),
|
||||
@@ -165,7 +166,7 @@ impl LeadCoin {
|
||||
|
||||
// Derive input for the commitment of coin2
|
||||
let coin2_commit_msg = [
|
||||
pallas::Base::from(*PRF_NULLIFIER_PREFIX),
|
||||
pallas::Base::from(PRF_NULLIFIER_PREFIX),
|
||||
coin_pk_x,
|
||||
coin_pk_y,
|
||||
pallas::Base::from(value),
|
||||
@@ -268,7 +269,6 @@ impl LeadCoin {
|
||||
rho: Value::known(rho),
|
||||
};
|
||||
|
||||
let proof = Proof::create(pk, &[circuit], &self.public_inputs(), &mut OsRng)?;
|
||||
Ok(proof)
|
||||
Ok(Proof::create(pk, &[circuit], &self.public_inputs(), &mut OsRng)?)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
pub mod block;
|
||||
pub use block::{Block, BlockInfo, BlockProposal, Header, ProposalChain};
|
||||
|
||||
/// Constants
|
||||
pub mod constants;
|
||||
|
||||
/// Consensus metadata
|
||||
pub mod metadata;
|
||||
pub use metadata::{LeadProof, Metadata};
|
||||
@@ -32,9 +35,6 @@ pub use participant::Participant;
|
||||
pub mod state;
|
||||
pub use state::{ValidatorState, ValidatorStatePtr};
|
||||
|
||||
/// Utility functions and types
|
||||
use crate::util::time::Timestamp;
|
||||
|
||||
/// P2P net protocols
|
||||
pub mod proto;
|
||||
|
||||
@@ -45,12 +45,12 @@ pub mod task;
|
||||
pub mod clock;
|
||||
pub use clock::{Clock, Ticks};
|
||||
|
||||
/// Ouroboros simulation
|
||||
pub mod ouroboros;
|
||||
|
||||
/// Ouroboros consensus coins functions
|
||||
/// Ouroboros Crypsinous consensus coins functions
|
||||
pub mod coins;
|
||||
|
||||
/// Consensus participation coin functions and definitions
|
||||
pub mod leadcoin;
|
||||
|
||||
/// Utility types
|
||||
pub mod types;
|
||||
pub use types::Float10;
|
||||
@@ -58,46 +58,5 @@ pub use types::Float10;
|
||||
/// Utility functions
|
||||
pub mod utils;
|
||||
|
||||
use lazy_static::lazy_static;
|
||||
lazy_static! {
|
||||
/// Genesis hash for the mainnet chain
|
||||
pub static ref MAINNET_GENESIS_HASH_BYTES: blake3::Hash = blake3::hash(b"darkfi_mainnet");
|
||||
|
||||
/// Genesis timestamp for the mainnet chain
|
||||
pub static ref MAINNET_GENESIS_TIMESTAMP: Timestamp = Timestamp(1650887115);
|
||||
|
||||
/// Genesis hash for the testnet chain
|
||||
pub static ref TESTNET_GENESIS_HASH_BYTES: blake3::Hash = blake3::hash(b"darkfi_testnet");
|
||||
|
||||
/// Genesis timestamp for the testnet chain
|
||||
pub static ref TESTNET_GENESIS_TIMESTAMP: Timestamp = Timestamp(1650887115);
|
||||
|
||||
/// Block version number
|
||||
pub static ref BLOCK_VERSION: u8 = 1;
|
||||
|
||||
/// Block magic bytes
|
||||
pub static ref BLOCK_MAGIC_BYTES: [u8; 4] = [0x11, 0x6d, 0x75, 0x1f];
|
||||
|
||||
/// Block info magic bytes
|
||||
pub static ref BLOCK_INFO_MAGIC_BYTES: [u8; 4] = [0x90, 0x44, 0xf1, 0xf6];
|
||||
|
||||
// Epoch configuration
|
||||
/// Slots in an epoch
|
||||
pub static ref EPOCH_LENGTH: u64 = 10;
|
||||
|
||||
/// Block leader reward
|
||||
pub static ref REWARD: u64 = 420;
|
||||
|
||||
/// `2 * DELTA` represents slot time
|
||||
pub static ref DELTA: u64 = 20;
|
||||
|
||||
/// Leader proof rows number
|
||||
pub static ref LEADER_PROOF_K: u32 = 11;
|
||||
|
||||
// TODO: Describe constants meaning in comment
|
||||
pub static ref RADIX_BITS: usize = 76;
|
||||
pub static ref P: &'static str = "28948022309329048855892746252171976963363056481941560715954676764349967630337";
|
||||
pub static ref LOTTERY_HEAD_START: u64 = 1;
|
||||
pub static ref PRF_NULLIFIER_PREFIX: u64 = 0;
|
||||
|
||||
}
|
||||
// Wallet functions
|
||||
//pub mod wallet;
|
||||
|
||||
@@ -270,18 +270,18 @@ impl ValidatorState {
|
||||
/// Calculates the epoch of the provided slot.
|
||||
/// Epoch duration is configured using the `EPOCH_LENGTH` value.
|
||||
pub fn slot_epoch(&self, slot: u64) -> u64 {
|
||||
slot / *EPOCH_LENGTH
|
||||
slot / EPOCH_LENGTH
|
||||
}
|
||||
|
||||
/// Calculates current slot, based on elapsed time from the genesis block.
|
||||
/// Slot duration is configured using the `DELTA` value.
|
||||
pub fn current_slot(&self) -> u64 {
|
||||
self.consensus.genesis_ts.elapsed() / (2 * *DELTA)
|
||||
self.consensus.genesis_ts.elapsed() / (2 * DELTA)
|
||||
}
|
||||
|
||||
/// Calculates the relative number of the provided slot.
|
||||
pub fn relative_slot(&self, slot: u64) -> u64 {
|
||||
slot % *EPOCH_LENGTH
|
||||
slot % EPOCH_LENGTH
|
||||
}
|
||||
|
||||
/// Finds the last slot a proposal or block was generated.
|
||||
@@ -311,7 +311,7 @@ impl ValidatorState {
|
||||
assert!(n > 0);
|
||||
let start_time = NaiveDateTime::from_timestamp(self.consensus.genesis_ts.0, 0);
|
||||
let current_slot = self.current_slot() + n;
|
||||
let next_slot_start = (current_slot * (2 * *DELTA)) + (start_time.timestamp() as u64);
|
||||
let next_slot_start = (current_slot * (2 * DELTA)) + (start_time.timestamp() as u64);
|
||||
let next_slot_start = NaiveDateTime::from_timestamp(next_slot_start as i64, 0);
|
||||
let current_time = NaiveDateTime::from_timestamp(Utc::now().timestamp(), 0);
|
||||
let diff = next_slot_start - current_time;
|
||||
@@ -323,8 +323,8 @@ impl ValidatorState {
|
||||
/// Epoch duration is configured using the EPOCH_LENGTH value.
|
||||
pub fn slots_to_next_n_epoch(&self, n: u64) -> u64 {
|
||||
assert!(n > 0);
|
||||
let slots_till_next_epoch = *EPOCH_LENGTH - self.relative_slot(self.current_slot());
|
||||
((n - 1) * *EPOCH_LENGTH) + slots_till_next_epoch
|
||||
let slots_till_next_epoch = EPOCH_LENGTH - self.relative_slot(self.current_slot());
|
||||
((n - 1) * EPOCH_LENGTH) + slots_till_next_epoch
|
||||
}
|
||||
|
||||
/// Calculates seconds until next Nth epoch starting time.
|
||||
|
||||
Reference in New Issue
Block a user