Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Verify candidate block header #1252

Merged
merged 12 commits into from
Jan 12, 2024
2 changes: 1 addition & 1 deletion consensus/src/consensus.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

use crate::commons::{ConsensusError, Database, QuorumMsgSender, RoundUpdate};
use crate::config::CONSENSUS_MAX_ITER;
use crate::contract_state::Operations;
use crate::operations::Operations;
use crate::phase::Phase;

use node_data::ledger::Block;
Expand Down
2 changes: 1 addition & 1 deletion consensus/src/execution_ctx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@

use crate::commons::{ConsensusError, Database, QuorumMsgSender, RoundUpdate};

use crate::contract_state::Operations;
use crate::iteration_ctx::IterationCtx;
use crate::msg_handler::HandleMsgOutput::{Pending, Ready};
use crate::msg_handler::MsgHandler;
use crate::operations::Operations;
use crate::queue::Queue;
use crate::step_votes_reg::SafeCertificateInfoRegistry;
use crate::user::committee::Committee;
Expand Down
2 changes: 1 addition & 1 deletion consensus/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ pub mod user;

mod aggregator;
pub mod config;
pub mod contract_state;
mod execution_ctx;
mod msg_handler;
pub mod operations;
mod phase;
mod proposal;
mod queue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

use std::fmt;

use node_data::ledger::{SpentTransaction, Transaction};
use node_data::ledger::{Header, SpentTransaction, Transaction};

pub type StateRoot = [u8; 32];
pub type EventHash = [u8; 32];
Expand Down Expand Up @@ -49,6 +49,12 @@ impl fmt::Display for VerificationOutput {

#[async_trait::async_trait]
pub trait Operations: Send + Sync {
async fn verify_block_header(
&self,
candidate_header: &Header,
disable_winning_cert_check: bool,
) -> Result<(), Error>;

async fn verify_state_transition(
&self,
params: CallParams,
Expand Down
2 changes: 1 addition & 1 deletion consensus/src/phase.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
// Copyright (c) DUSK NETWORK. All rights reserved.

use crate::commons::{ConsensusError, Database};
use crate::contract_state::Operations;
use crate::execution_ctx::ExecutionCtx;
use crate::operations::Operations;

use node_data::message::Message;
use node_data::StepName;
Expand Down
8 changes: 4 additions & 4 deletions consensus/src/proposal/block_generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
// Copyright (c) DUSK NETWORK. All rights reserved.

use crate::commons::RoundUpdate;
use crate::contract_state::CallParams;
use crate::operations::CallParams;
use node_data::ledger::{to_str, Block, Certificate, IterationsInfo, Seed};

use crate::config;
use crate::contract_state::Operations;
use crate::merkle::merkle_root;
use crate::operations::Operations;

use dusk_bytes::Serializable;
use node_data::ledger;
Expand All @@ -35,7 +35,7 @@ impl<T: Operations> Generator<T> {
ru: &RoundUpdate,
iteration: u8,
failed_iterations: Vec<Option<Certificate>>,
) -> Result<Message, crate::contract_state::Error> {
) -> Result<Message, crate::operations::Error> {
// Sign seed
let seed = ru
.secret_key
Expand Down Expand Up @@ -82,7 +82,7 @@ impl<T: Operations> Generator<T> {
seed: Seed,
iteration: u8,
failed_iterations: Vec<Option<Certificate>>,
) -> Result<Block, crate::contract_state::Error> {
) -> Result<Block, crate::operations::Error> {
let start_time = Instant::now();

let call_params = CallParams {
Expand Down
4 changes: 2 additions & 2 deletions consensus/src/proposal/step.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
// Copyright (c) DUSK NETWORK. All rights reserved.

use crate::commons::{ConsensusError, Database};
use crate::contract_state::Operations;
use crate::execution_ctx::ExecutionCtx;
use crate::msg_handler::{HandleMsgOutput, MsgHandler};
use crate::operations::Operations;
use node_data::message::Message;
use std::cmp;
use std::sync::Arc;
Expand Down Expand Up @@ -44,7 +44,7 @@ impl<T: Operations + 'static, D: Database> ProposalStep<T, D> {
round: u64,
iteration: u8,
) {
debug!(event = "init", name = self.name(), round, iteration,)
debug!(event = "init", name = self.name(), round, iter = iteration,)
}

pub async fn run(
Expand Down
4 changes: 2 additions & 2 deletions consensus/src/ratification/step.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
// Copyright (c) DUSK NETWORK. All rights reserved.

use crate::commons::{ConsensusError, Database, RoundUpdate};
use crate::contract_state::Operations;
use crate::execution_ctx::ExecutionCtx;
use crate::operations::Operations;
use std::marker::PhantomData;

use crate::msg_handler::{HandleMsgOutput, MsgHandler};
Expand Down Expand Up @@ -106,7 +106,7 @@ impl<T: Operations + 'static, DB: Database> RatificationStep<T, DB> {
event = "init",
name = self.name(),
round = round,
iteration = iteration,
iter = iteration,
hash = to_str(&handler.validation_result().hash),
fsv_bitset = handler.validation_result().sv.bitset,
quorum_type = format!("{:?}", handler.validation_result().quorum)
Expand Down
45 changes: 33 additions & 12 deletions consensus/src/validation/step.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

use crate::commons::{ConsensusError, Database, RoundUpdate};
use crate::config;
use crate::contract_state::{CallParams, Operations};
use crate::execution_ctx::ExecutionCtx;
use crate::operations::{CallParams, Operations};
use crate::validation::handler;
use anyhow::anyhow;
use dusk_bytes::DeserializableSlice;
Expand Down Expand Up @@ -54,20 +54,41 @@ impl<T: Operations + 'static> ValidationStep<T> {
inbound: AsyncQueue<Message>,
executor: Arc<Mutex<T>>,
) {
// TODO: Verify Block Header
let hash = candidate.header().hash;

// Call VST for non-empty blocks
if hash != [0u8; 32] {
if let Err(err) = Self::call_vst(candidate, ru, executor).await {
error!(
event = "failed_vst_call",
reason = format!("{:?}", err)
);
return;
}
// A Validation step with empty/default Block produces a Nil Vote
if hash == [0u8; 32] {
Self::cast_vote([0u8; 32], ru, iteration, outbound, inbound).await;
return;
}

// Verify candidate header all fields except the winning certificate
goshawk-3 marked this conversation as resolved.
Show resolved Hide resolved
// NB: Winning certificate is produced only on reaching consensus
if let Err(err) = executor
.lock()
.await
.verify_block_header(candidate.header(), true)
.await
{
error!(event = "invalid_header", ?err);
return;
};

// Call Verify State Transition to make sure transactions set is valid
if let Err(err) = Self::call_vst(candidate, ru, executor).await {
error!(event = "failed_vst_call", ?err);
goshawk-3 marked this conversation as resolved.
Show resolved Hide resolved
}

Self::cast_vote(hash, ru, iteration, outbound, inbound).await;
}

async fn cast_vote(
hash: [u8; 32],
ru: &RoundUpdate,
iteration: u8,
outbound: AsyncQueue<Message>,
inbound: AsyncQueue<Message>,
) {
let hdr = message::Header {
pubkey_bls: ru.pubkey_bls.clone(),
round: ru.round,
Expand Down Expand Up @@ -183,7 +204,7 @@ impl<T: Operations + 'static> ValidationStep<T> {
event = "init",
name = self.name(),
round,
iteration,
iter = iteration,
hash = to_str(&handler.candidate.header().hash),
)
}
Expand Down
3 changes: 2 additions & 1 deletion node/src/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ mod fallback;
mod fsm;
mod genesis;

mod header_validation;

use self::acceptor::Acceptor;
use self::fsm::SimpleFSM;
use crate::database::Ledger;
use crate::{database, vm, Network};
use crate::{LongLivedService, Message};
pub use acceptor::verify_block_cert;
use anyhow::Result;
use async_trait::async_trait;
use dusk_consensus::commons::ConsensusError;
Expand Down
Loading