mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-01-09 14:48:08 -05:00
[consensus] reward for leaders
This commit is contained in:
@@ -25,6 +25,7 @@ contract "Lead" {
|
|||||||
circuit "Lead" {
|
circuit "Lead" {
|
||||||
ZERO = witness_base(0);
|
ZERO = witness_base(0);
|
||||||
ONE = witness_base(1);
|
ONE = witness_base(1);
|
||||||
|
REWARD = witness_base(420);
|
||||||
PREFIX_EVL = witness_base(2);
|
PREFIX_EVL = witness_base(2);
|
||||||
PREFIX_SEED = witness_base(3);
|
PREFIX_SEED = witness_base(3);
|
||||||
PREFIX_CM = witness_base(4);
|
PREFIX_CM = witness_base(4);
|
||||||
@@ -47,7 +48,9 @@ circuit "Lead" {
|
|||||||
constrain_instance(c1_cm_x);
|
constrain_instance(c1_cm_x);
|
||||||
constrain_instance(c1_cm_y);
|
constrain_instance(c1_cm_y);
|
||||||
# coin (2) cm/commitment
|
# coin (2) cm/commitment
|
||||||
c2_cm_msg = poseidon_hash(PREFIX_CM, pk, value, c2_rho);
|
# reward
|
||||||
|
c2_value = base_add(value, REWARD);
|
||||||
|
c2_cm_msg = poseidon_hash(PREFIX_CM, pk, c2_value, c2_rho);
|
||||||
c2_cm_v = ec_mul_base(c2_cm_msg, NULLIFIER_K);
|
c2_cm_v = ec_mul_base(c2_cm_msg, NULLIFIER_K);
|
||||||
c2_cm_r = ec_mul(c2_opening, VALUE_COMMIT_RANDOM);
|
c2_cm_r = ec_mul(c2_opening, VALUE_COMMIT_RANDOM);
|
||||||
c2_cm = ec_add(c2_cm_v, c2_cm_r);
|
c2_cm = ec_add(c2_cm_v, c2_cm_r);
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ use rand::rngs::OsRng;
|
|||||||
|
|
||||||
use super::constants::EPOCH_LENGTH;
|
use super::constants::EPOCH_LENGTH;
|
||||||
use crate::{
|
use crate::{
|
||||||
consensus::{TransferStx, TxRcpt},
|
consensus::{TransferStx, TxRcpt, constants},
|
||||||
crypto::{proof::ProvingKey, Proof},
|
crypto::{proof::ProvingKey, Proof},
|
||||||
zk::{vm::ZkCircuit, vm_stack::Witness},
|
zk::{vm::ZkCircuit, vm_stack::Witness},
|
||||||
zkas::ZkBinary,
|
zkas::ZkBinary,
|
||||||
@@ -139,7 +139,7 @@ impl LeadCoin {
|
|||||||
// Create commitment to coin2
|
// Create commitment to coin2
|
||||||
let coin2_commitment = Self::commitment(
|
let coin2_commitment = Self::commitment(
|
||||||
pk,
|
pk,
|
||||||
pallas::Base::from(value),
|
pallas::Base::from(value+constants::REWARD),
|
||||||
pallas::Base::from(coin2_seed),
|
pallas::Base::from(coin2_seed),
|
||||||
coin2_blind,
|
coin2_blind,
|
||||||
);
|
);
|
||||||
@@ -317,6 +317,7 @@ impl LeadCoin {
|
|||||||
derived.coin2_commitment = cm;
|
derived.coin2_commitment = cm;
|
||||||
derived.coin1_blind = derived.coin2_blind;
|
derived.coin1_blind = derived.coin2_blind;
|
||||||
derived.coin2_blind = blind;
|
derived.coin2_blind = blind;
|
||||||
|
derived.value = self.value + constants::REWARD;
|
||||||
derived
|
derived
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -417,9 +417,11 @@ impl ValidatorState {
|
|||||||
return Ok(false)
|
return Ok(false)
|
||||||
}
|
}
|
||||||
let eta = self.get_eta();
|
let eta = self.get_eta();
|
||||||
// TODO: slot parameter should be absolute slot, not relative.
|
|
||||||
// At start of epoch, relative slot is 0.
|
// At start of epoch, relative slot is 0.
|
||||||
self.consensus.coins = self.create_epoch_coins(eta, epoch).await?;
|
if self.consensus.coins.len() == 0 {
|
||||||
|
//TODO: DRK coin need to be burned, and consensus coin to be minted.
|
||||||
|
self.consensus.coins = self.create_epoch_coins(eta, epoch).await?;
|
||||||
|
}
|
||||||
self.consensus.epoch = epoch;
|
self.consensus.epoch = epoch;
|
||||||
self.consensus.epoch_eta = eta;
|
self.consensus.epoch_eta = eta;
|
||||||
|
|
||||||
@@ -907,15 +909,19 @@ impl ValidatorState {
|
|||||||
return Err(Error::ProposalIsSpent)
|
return Err(Error::ProposalIsSpent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// cm
|
// cm
|
||||||
|
|
||||||
let prop_cm_x: pallas::Base = lf.public_inputs[constants::PI_COMMITMENT_X_INDEX];
|
let prop_cm_x: pallas::Base = lf.public_inputs[constants::PI_COMMITMENT_X_INDEX];
|
||||||
let prop_cm_y: pallas::Base = lf.public_inputs[constants::PI_COMMITMENT_Y_INDEX];
|
let prop_cm_y: pallas::Base = lf.public_inputs[constants::PI_COMMITMENT_Y_INDEX];
|
||||||
|
/*
|
||||||
for cm in &self.consensus.leaders_spent_coins {
|
for cm in &self.consensus.leaders_spent_coins {
|
||||||
if *cm == (prop_cm_x, prop_cm_y) {
|
if *cm == (prop_cm_x, prop_cm_y) {
|
||||||
error!("receive_proposal(): Proposal coin already spent.");
|
error!("receive_proposal(): Proposal coin already spent.");
|
||||||
return Err(Error::ProposalIsSpent)
|
return Err(Error::ProposalIsSpent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// Check if proposal extends any existing fork chains
|
// Check if proposal extends any existing fork chains
|
||||||
let index = self.find_extended_chain_index(proposal)?;
|
let index = self.find_extended_chain_index(proposal)?;
|
||||||
|
|||||||
@@ -98,7 +98,6 @@ pub async fn proposal_task(consensus_p2p: P2pPtr, sync_p2p: P2pPtr, state: Valid
|
|||||||
|
|
||||||
// Retrieve slot sigmas
|
// Retrieve slot sigmas
|
||||||
let (sigma1, sigma2) = state.write().await.sigmas();
|
let (sigma1, sigma2) = state.write().await.sigmas();
|
||||||
|
|
||||||
// Node checks if epoch has changed, to generate new epoch coins
|
// Node checks if epoch has changed, to generate new epoch coins
|
||||||
let epoch_changed = state.write().await.epoch_changed(sigma1, sigma2).await;
|
let epoch_changed = state.write().await.epoch_changed(sigma1, sigma2).await;
|
||||||
match epoch_changed {
|
match epoch_changed {
|
||||||
|
|||||||
Reference in New Issue
Block a user