Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions src/consensus/malachite/read_sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ use informalsystems_malachitebft_engine::util::ticker::ticker;
use informalsystems_malachitebft_engine::util::timers::{TimeoutElapsed, TimerScheduler};

use crate::core::types::SnapchainValidatorContext;
use crate::core::CommitsExt;
use crate::proto::{self, Height};

use super::read_host::{ReadHostMsg, ReadHostRef};
Expand Down Expand Up @@ -345,14 +346,18 @@ impl ReadSync {
let decided_value = value_response.value.as_ref().unwrap();
let value_bytes =
value_response.value.as_ref().unwrap().value_bytes.as_ref();

let commits =
proto::Commits::from_commit_certificate(&decided_value.certificate);

let value = if decided_value.certificate.value_id.shard_index == 0 {
proto::decided_value::Value::Block(
proto::Block::decode(value_bytes).unwrap(),
)
let mut block = proto::Block::decode(value_bytes).unwrap();
block.commits = Some(commits);
proto::decided_value::Value::Block(block)
} else {
proto::decided_value::Value::Shard(
proto::ShardChunk::decode(value_bytes).unwrap(),
)
let mut shard_chunk = proto::ShardChunk::decode(value_bytes).unwrap();
shard_chunk.commits = Some(commits);
proto::decided_value::Value::Shard(shard_chunk)
};
debug!(peer_id = %peer, height = %decided_value.certificate.height, "Received sync value response");
self.host.cast(ReadHostMsg::ProcessDecidedValue {
Expand Down
16 changes: 15 additions & 1 deletion src/consensus/malachite/spawn_read_node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,24 @@ pub async fn spawn_read_host(
config: Config,
) -> Result<ReadHostRef, ractor::SpawnErr> {
let validator_set_config = config.get_validator_set_config(shard_id);
let validator_sets = validator_set_config
let validator_sets: Vec<StoredValidatorSet> = validator_set_config
.iter()
.map(|config| StoredValidatorSet::new(ShardId::new(shard_id), &config))
.collect();

tracing::info!(
shard_id,
validator_sets = ?validator_sets.iter().map(|vs| {
format!(
"effective_at: {}, validators: {:#?}, shard_ids: {:?}",
vs.effective_at,
vs.validators.validators.iter().map(|v| hex::encode(v.public_key.to_bytes())).collect::<Vec<_>>(),
vs.shard_ids
)
}).collect::<Vec<_>>(),
"Initializing read node with validator sets"
);

let state = ReadHostState {
validator: read_validator::ReadValidator {
shard_id,
Expand Down
1 change: 1 addition & 0 deletions src/consensus/read_validator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ impl ReadValidator {
}

pub async fn process_decided_value(&mut self, value: DecidedValue) -> u64 {
info!("Processing decided value {:#?}", value);
let height = Self::get_decided_value_height(&value);
let verified = self.verify_signatures(&value);
if !verified {
Expand Down
35 changes: 28 additions & 7 deletions src/core/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ use crate::consensus::validator::StoredValidatorSets;
use crate::core::error::HubError;
use crate::core::types::{CommitsExt, Vote, FARCASTER_EPOCH};
use crate::proto::{self};
use itertools::Itertools;
use tracing::error;

#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord)]
Expand Down Expand Up @@ -104,23 +103,39 @@ pub fn verify_signatures(commits: &proto::Commits, validator_sets: &StoredValida

let validator_set = validator_sets.get_validator_set(certificate.height.as_u64());

let mut expected_pubkeys = validator_set
let expected_pubkeys: Vec<[u8; 32]> = validator_set
.validators
.iter()
.map(|validator| validator.public_key.to_bytes());
.map(|validator| validator.public_key.to_bytes())
.collect();

if !ThresholdParams::default().quorum.is_met(
certificate.aggregated_signature.signatures.len() as u64,
expected_pubkeys.len() as u64,
) {
error!(%certificate.height, "Block did not have quorum");
error!(
%certificate.height,
num_signatures_in_commits = commits.signatures.len(),
num_signatures_in_certificate = certificate.aggregated_signature.signatures.len(),
num_validators = expected_pubkeys.len(),
expected_validators = ?expected_pubkeys.iter().map(|v| hex::encode(v)).collect::<Vec<_>>(),
actual_signers_in_commits = ?commits.signatures.iter().map(|s| hex::encode(&s.signer)).collect::<Vec<_>>(),
actual_signers_in_certificate = ?certificate.aggregated_signature.signatures.iter().map(|s| hex::encode(&s.address.0)).collect::<Vec<_>>(),
"Block did not have quorum"
);
return false;
}

for signature in certificate.aggregated_signature.signatures {
for signature in &certificate.aggregated_signature.signatures {
let address_bytes = &signature.address.0;
if !expected_pubkeys.contains(address_bytes) {
error!(%certificate.height, "Block contained signatures from unexpected signers");
error!(
%certificate.height,
unexpected_signer = hex::encode(address_bytes),
expected_validators = ?expected_pubkeys.iter().map(|v| hex::encode(v)).collect::<Vec<_>>(),
actual_signers = ?certificate.aggregated_signature.signatures.iter().map(|s| hex::encode(&s.address.0)).collect::<Vec<_>>(),
"Block contained signatures from unexpected signers"
);
return false;
}

Expand All @@ -133,7 +148,13 @@ pub fn verify_signatures(commits: &proto::Commits, validator_sets: &StoredValida

let public_key = PublicKey::try_from_bytes(address_bytes).unwrap();
if !public_key.verify(&vote.to_sign_bytes(), &signature.signature.0) {
error!(%certificate.height, "Block contained invalid signatures");
error!(
%certificate.height,
invalid_signer = hex::encode(address_bytes),
expected_validators = ?expected_pubkeys.iter().map(|v| hex::encode(v)).collect::<Vec<_>>(),
actual_signers = ?certificate.aggregated_signature.signatures.iter().map(|s| hex::encode(&s.address.0)).collect::<Vec<_>>(),
"Block contained invalid signatures"
);
return false;
}
}
Expand Down
Loading