diff --git a/proof/lead.zk b/proof/lead.zk index 0931325d0..cef3fbd1e 100644 --- a/proof/lead.zk +++ b/proof/lead.zk @@ -25,6 +25,7 @@ contract "Lead" { circuit "Lead" { ZERO = witness_base(0); ONE = witness_base(1); + REWARD = witness_base(420); PREFIX_EVL = witness_base(2); PREFIX_SEED = witness_base(3); PREFIX_CM = witness_base(4); @@ -47,7 +48,9 @@ circuit "Lead" { constrain_instance(c1_cm_x); constrain_instance(c1_cm_y); # 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_r = ec_mul(c2_opening, VALUE_COMMIT_RANDOM); c2_cm = ec_add(c2_cm_v, c2_cm_r); diff --git a/src/consensus/leadcoin.rs b/src/consensus/leadcoin.rs index e2318bf79..b79fe2a41 100644 --- a/src/consensus/leadcoin.rs +++ b/src/consensus/leadcoin.rs @@ -32,7 +32,7 @@ use rand::rngs::OsRng; use super::constants::EPOCH_LENGTH; use crate::{ - consensus::{TransferStx, TxRcpt}, + consensus::{TransferStx, TxRcpt, constants}, crypto::{proof::ProvingKey, Proof}, zk::{vm::ZkCircuit, vm_stack::Witness}, zkas::ZkBinary, @@ -139,7 +139,7 @@ impl LeadCoin { // Create commitment to coin2 let coin2_commitment = Self::commitment( pk, - pallas::Base::from(value), + pallas::Base::from(value+constants::REWARD), pallas::Base::from(coin2_seed), coin2_blind, ); @@ -317,6 +317,7 @@ impl LeadCoin { derived.coin2_commitment = cm; derived.coin1_blind = derived.coin2_blind; derived.coin2_blind = blind; + derived.value = self.value + constants::REWARD; derived } diff --git a/src/consensus/state.rs b/src/consensus/state.rs index 4ce1603a1..70def9e49 100644 --- a/src/consensus/state.rs +++ b/src/consensus/state.rs @@ -417,9 +417,11 @@ impl ValidatorState { return Ok(false) } let eta = self.get_eta(); - // TODO: slot parameter should be absolute slot, not relative. // 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_eta = eta; @@ -907,15 +909,19 @@ impl ValidatorState { return Err(Error::ProposalIsSpent) } } + // cm + 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]; + /* for cm in &self.consensus.leaders_spent_coins { if *cm == (prop_cm_x, prop_cm_y) { error!("receive_proposal(): Proposal coin already spent."); return Err(Error::ProposalIsSpent) } } + */ // Check if proposal extends any existing fork chains let index = self.find_extended_chain_index(proposal)?; diff --git a/src/consensus/task/proposal.rs b/src/consensus/task/proposal.rs index 0fa438006..4046f6eb0 100644 --- a/src/consensus/task/proposal.rs +++ b/src/consensus/task/proposal.rs @@ -98,7 +98,6 @@ pub async fn proposal_task(consensus_p2p: P2pPtr, sync_p2p: P2pPtr, state: Valid // Retrieve slot sigmas let (sigma1, sigma2) = state.write().await.sigmas(); - // Node checks if epoch has changed, to generate new epoch coins let epoch_changed = state.write().await.epoch_changed(sigma1, sigma2).await; match epoch_changed {