Просмотр исходного кода

[consensus] root validation is WIP, and nullifier validation working

mohab metwally 3 лет назад
Родитель
Сommit
73222f17d8
3 измененных файлов с 22 добавлено и 2 удалено
  1. 3 2
      src/consensus/constants.rs
  2. 6 0
      src/consensus/leadcoin.rs
  3. 13 0
      src/consensus/validator.rs

+ 3 - 2
src/consensus/constants.rs

@@ -84,11 +84,12 @@ pub const LEADER_PROOF_K: u32 = 13;
 pub const RADIX_BITS: usize = 76;
 pub const RADIX_BITS: usize = 76;
 
 
 pub const P: &str = "28948022309329048855892746252171976963363056481941560715954676764349967630337";
 pub const P: &str = "28948022309329048855892746252171976963363056481941560715954676764349967630337";
-pub const LOTTERY_HEAD_START: u64 = 1;
+pub const LOTTERY_HEAD_START: u64 = 0;
 pub const PRF_NULLIFIER_PREFIX: u64 = 0;
 pub const PRF_NULLIFIER_PREFIX: u64 = 0;
-pub const PI_NULLIFIER_INDEX: usize = 7;
 pub const PI_COMMITMENT_X_INDEX: usize = 1;
 pub const PI_COMMITMENT_X_INDEX: usize = 1;
 pub const PI_COMMITMENT_Y_INDEX: usize = 2;
 pub const PI_COMMITMENT_Y_INDEX: usize = 2;
+pub const PI_COMMITMENT_ROOT: usize = 5;
+pub const PI_NULLIFIER_INDEX: usize = 7;
 pub const PI_MU_Y_INDEX: usize = 8;
 pub const PI_MU_Y_INDEX: usize = 8;
 pub const PI_MU_RHO_INDEX: usize = 10;
 pub const PI_MU_RHO_INDEX: usize = 10;
 pub const PI_SIGMA1_INDEX: usize = 12;
 pub const PI_SIGMA1_INDEX: usize = 12;

+ 6 - 0
src/consensus/leadcoin.rs

@@ -358,6 +358,12 @@ impl LeadCoin {
         }
         }
     }
     }
 
 
+    pub fn coin_commitment_base(&self) -> pallas::Base {
+        let c1_cm_coord = self.coin1_commitment.to_affine().coordinates().unwrap();
+        let c1_cm_msg = [*c1_cm_coord.x(), *c1_cm_coord.y()];
+        poseidon_hash(c1_cm_msg)
+    }
+
     /// Try to create a ZK proof of consensus leadership
     /// Try to create a ZK proof of consensus leadership
     pub fn create_lead_proof(
     pub fn create_lead_proof(
         &self,
         &self,

+ 13 - 0
src/consensus/validator.rs

@@ -244,6 +244,7 @@ impl ValidatorState {
         true
         true
     }
     }
 
 
+
     /// Generate a block proposal for the current slot, containing all
     /// Generate a block proposal for the current slot, containing all
     /// unconfirmed transactions. Proposal extends the longest fork
     /// unconfirmed transactions. Proposal extends the longest fork
     /// chain the node is holding.
     /// chain the node is holding.
@@ -460,10 +461,22 @@ impl ValidatorState {
             }
             }
         }
         }
 
 
+
         // TODO: Check if proposal coin commitments already spent
         // TODO: Check if proposal coin commitments already spent
         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];
 
 
+        // validate that this coin is already published.
+        /*
+        let tree_root: MerkleNode = self.consensus.coins_tree.root(0).unwrap();
+        let prop_cm_root: pallas::Base = lf.public_inputs[constants::PI_COMMITMENT_ROOT];
+        if tree_root.inner() <= prop_cm_root {
+            error!("validation of tree root failed");
+            info!("tree_root: {:?}", tree_root.inner());
+            info!("prop_root: {:?}", prop_cm_root);
+    }
+        */
+
         // Validate state transition against canonical state
         // Validate state transition against canonical state
         // TODO: This should be validated against fork state
         // TODO: This should be validated against fork state
         debug!("receive_proposal(): Starting state transition validation");
         debug!("receive_proposal(): Starting state transition validation");