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

consensus: include nullifiers and spent coins when syncing consensus state

aggstam 3 лет назад
Родитель
Сommit
0f3d8e29b1

+ 9 - 1
src/consensus/proto/protocol_sync_consensus.rs

@@ -77,7 +77,15 @@ impl ProtocolSyncConsensus {
             let offset = lock.consensus.offset;
             let proposals = lock.consensus.proposals.clone();
             let unconfirmed_txs = lock.unconfirmed_txs.clone();
-            let response = ConsensusResponse { offset, proposals, unconfirmed_txs };
+            let leaders_nullifiers = lock.consensus.leaders_nullifiers.clone();
+            let leaders_spent_coins = lock.consensus.leaders_spent_coins.clone();
+            let response = ConsensusResponse {
+                offset,
+                proposals,
+                unconfirmed_txs,
+                leaders_nullifiers,
+                leaders_spent_coins,
+            };
             if let Err(e) = self.channel.send(response).await {
                 error!("ProtocolSyncConsensus::handle_receive_request() channel send fail: {}", e);
             };

+ 4 - 0
src/consensus/state.rs

@@ -132,6 +132,10 @@ pub struct ConsensusResponse {
     pub proposals: Vec<ProposalChain>,
     /// Pending transactions
     pub unconfirmed_txs: Vec<Transaction>,
+    /// Seen nullifiers from proposals
+    pub leaders_nullifiers: Vec<pallas::Base>,
+    /// Seen spent coins from proposals
+    pub leaders_spent_coins: Vec<(pallas::Base, pallas::Base)>,
 }
 
 impl net::Message for ConsensusResponse {

+ 3 - 1
src/consensus/task/consensus_sync.rs

@@ -49,7 +49,7 @@ pub async fn consensus_sync_task(p2p: P2pPtr, state: ValidatorStatePtr) -> Resul
             // Node verifies response came from a participating node.
             // Extra validations can be added here.
             let response = response_sub.receive().await?;
-            if response.proposals.is_empty() {
+            if response.leaders_nullifiers.is_empty() {
                 warn!("Retrieved consensus state from a new node, retrying...");
                 continue
             }
@@ -59,6 +59,8 @@ pub async fn consensus_sync_task(p2p: P2pPtr, state: ValidatorStatePtr) -> Resul
             lock.consensus.offset = response.offset;
             lock.consensus.proposals = response.proposals.clone();
             lock.unconfirmed_txs = response.unconfirmed_txs.clone();
+            lock.consensus.leaders_nullifiers = response.leaders_nullifiers.clone();
+            lock.consensus.leaders_spent_coins = response.leaders_spent_coins.clone();
 
             break
         }