[consensus] reward for leaders

This commit is contained in:
mohab metwally
2022-11-27 17:33:29 +02:00
parent 931e1dd3cc
commit da64f6115b
4 changed files with 15 additions and 6 deletions

View File

@@ -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);

View File

@@ -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
} }

View File

@@ -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)?;

View File

@@ -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 {