Jelajahi Sumber

[consensus] reward for leaders

mohab metwally 3 tahun lalu
induk
melakukan
da64f6115b
4 mengubah file dengan 15 tambahan dan 6 penghapusan
  1. 4 1
      proof/lead.zk
  2. 3 2
      src/consensus/leadcoin.rs
  3. 8 2
      src/consensus/state.rs
  4. 0 1
      src/consensus/task/proposal.rs

+ 4 - 1
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);

+ 3 - 2
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
     }
 

+ 8 - 2
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)?;

+ 0 - 1
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 {