From 22f2a4531d80d6828a2235930c53a767753d045c Mon Sep 17 00:00:00 2001 From: Keyao Shen Date: Thu, 7 Sep 2023 15:38:22 -0700 Subject: [PATCH 01/66] Rename Block to BlockPayload --- crates/hotshot/src/demos/sdemo.rs | 16 ++++--- crates/hotshot/src/tasks/mod.rs | 2 +- crates/hotshot/src/traits.rs | 2 +- .../src/traits/storage/atomic_storage.rs | 16 +++---- .../atomic_storage/dual_key_value_store.rs | 6 +-- .../src/traits/storage/memory_storage.rs | 4 +- crates/task-impls/src/consensus.rs | 4 +- crates/task-impls/src/da.rs | 2 +- crates/testing/src/task_helpers.rs | 2 +- crates/testing/tests/atomic_storage.rs | 2 +- crates/types/src/data.rs | 42 +++++++++---------- crates/types/src/traits.rs | 2 +- crates/types/src/traits/block_contents.rs | 27 ++++++------ crates/types/src/traits/election.rs | 8 ++-- .../types/src/traits/node_implementation.rs | 16 +++---- crates/types/src/traits/state.rs | 10 ++--- crates/types/src/traits/storage.rs | 6 +-- justfile | 2 +- testing-macros/src/lib.rs | 2 +- 19 files changed, 89 insertions(+), 82 deletions(-) diff --git a/crates/hotshot/src/demos/sdemo.rs b/crates/hotshot/src/demos/sdemo.rs index 97117347a9..f8264ab612 100644 --- a/crates/hotshot/src/demos/sdemo.rs +++ b/crates/hotshot/src/demos/sdemo.rs @@ -26,7 +26,7 @@ use hotshot_types::{ election::Membership, node_implementation::NodeType, state::{ConsensusTime, TestableBlock, TestableState}, - Block, State, + BlockPayload, State, }, }; use rand::Rng; @@ -82,7 +82,7 @@ pub struct SDemoGenesisBlock {} /// Any block after genesis #[derive(PartialEq, Eq, Hash, Serialize, Deserialize, Clone, Debug)] pub struct SDemoNormalBlock { - /// Block state commitment + /// BlockPayload state commitment pub previous_state: (), /// Transaction vector pub transactions: Vec, @@ -174,10 +174,14 @@ impl Display for SDemoBlock { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { SDemoBlock::Genesis(_) => { - write!(f, "SDemo Genesis Block") + write!(f, "SDemo Genesis BlockPayload") } SDemoBlock::Normal(block) => { - write!(f, "SDemo Normal Block #txns={}", block.transactions.len()) + write!( + f, + "SDemo Normal BlockPayload #txns={}", + block.transactions.len() + ) } } } @@ -196,7 +200,7 @@ impl TestableBlock for SDemoBlock { } } -impl Block for SDemoBlock { +impl BlockPayload for SDemoBlock { type Error = SDemoError; type Transaction = SDemoTransaction; @@ -278,7 +282,7 @@ impl TestableState for SDemoState { _state: Option<&Self>, rng: &mut dyn rand::RngCore, padding: u64, - ) -> ::Transaction { + ) -> ::Transaction { SDemoTransaction { id: rng.gen_range(0..10), padding: vec![0; padding as usize], diff --git a/crates/hotshot/src/tasks/mod.rs b/crates/hotshot/src/tasks/mod.rs index 55e430cbe4..9d3b95bbdb 100644 --- a/crates/hotshot/src/tasks/mod.rs +++ b/crates/hotshot/src/tasks/mod.rs @@ -37,7 +37,7 @@ use hotshot_types::{ CommitteeEx, ExchangesType, NodeImplementation, NodeType, ViewSyncEx, }, state::ConsensusTime, - Block, + BlockPayload, }, vote::{ViewSyncData, VoteType}, }; diff --git a/crates/hotshot/src/traits.rs b/crates/hotshot/src/traits.rs index 0f751912c5..a0e56cf86d 100644 --- a/crates/hotshot/src/traits.rs +++ b/crates/hotshot/src/traits.rs @@ -4,7 +4,7 @@ mod networking; mod node_implementation; mod storage; -pub use hotshot_types::traits::{Block, State}; +pub use hotshot_types::traits::{BlockPayload, State}; pub use networking::{NetworkError, NetworkReliability}; pub use node_implementation::{NodeImplementation, TestableNodeImplementation}; pub use storage::{Result as StorageResult, Storage}; diff --git a/crates/hotshot/src/traits/storage/atomic_storage.rs b/crates/hotshot/src/traits/storage/atomic_storage.rs index 9d054fe1ac..4654d65ca7 100644 --- a/crates/hotshot/src/traits/storage/atomic_storage.rs +++ b/crates/hotshot/src/traits/storage/atomic_storage.rs @@ -33,7 +33,7 @@ where atomic_store: Mutex, /// The Blocks stored by this [`AtomicStorage`] - blocks: HashMapStore, STATE::Block>, + blocks: HashMapStore, STATE::BlockPayload>, /// The [`QuorumCertificate`]s stored by this [`AtomicStorage`] qcs: DualKeyValueStore>, @@ -142,15 +142,15 @@ impl Storage for AtomicStorage { #[instrument(name = "AtomicStorage::get_block", skip_all)] async fn get_block( &self, - hash: &Commitment, - ) -> StorageResult> { + hash: &Commitment, + ) -> StorageResult> { Ok(self.inner.blocks.get(hash).await) } #[instrument(name = "AtomicStorage::get_qc", skip_all)] async fn get_qc( &self, - hash: &Commitment, + hash: &Commitment, ) -> StorageResult>> { Ok(self.inner.qcs.load_by_key_1_ref(hash).await) } @@ -176,7 +176,7 @@ impl Storage for AtomicStorage { #[instrument(name = "AtomicStorage::get_leaf_by_block", skip_all)] async fn get_leaf_by_block( &self, - hash: &Commitment, + hash: &Commitment, ) -> StorageResult>> { Ok(self.inner.leaves.load_by_key_2_ref(hash).await) } @@ -187,7 +187,7 @@ impl Storage for AtomicStorage { } async fn get_internal_state(&self) -> StorageState { - let mut blocks: Vec<(Commitment, STATE::Block)> = + let mut blocks: Vec<(Commitment, STATE::BBlockPayloadlock)> = self.inner.blocks.load_all().await.into_iter().collect(); blocks.sort_by_key(|(hash, _)| *hash); @@ -226,8 +226,8 @@ impl<'a, STATE: StateContents + 'static> StorageUpdater<'a, STATE> #[instrument(name = "AtomicStorage::get_block", skip_all)] async fn insert_block( &mut self, - hash: Commitment, - block: STATE::Block, + hash: Commitment, + block: STATE::BlockPayload, ) -> StorageResult { trace!(?block, "inserting block"); self.inner diff --git a/crates/hotshot/src/traits/storage/atomic_storage/dual_key_value_store.rs b/crates/hotshot/src/traits/storage/atomic_storage/dual_key_value_store.rs index 70431af012..84cf8c76a2 100644 --- a/crates/hotshot/src/traits/storage/atomic_storage/dual_key_value_store.rs +++ b/crates/hotshot/src/traits/storage/atomic_storage/dual_key_value_store.rs @@ -181,7 +181,7 @@ pub trait DualKeyValue: Serialize + DeserializeOwned + Clone { } impl DualKeyValue for QuorumCertificate { - type Key1 = Commitment; + type Key1 = Commitment; type Key2 = ViewNumber; const KEY_1_NAME: &'static str = "block_commitment"; @@ -200,7 +200,7 @@ where STATE: StateContents, { type Key1 = Commitment>; - type Key2 = Commitment; + type Key2 = Commitment; const KEY_1_NAME: &'static str = "leaf_commitment"; const KEY_2_NAME: &'static str = "block_commitment"; @@ -210,6 +210,6 @@ where } fn key_2(&self) -> Self::Key2 { - ::commit(&self.deltas) + ::commit(&self.deltas) } } diff --git a/crates/hotshot/src/traits/storage/memory_storage.rs b/crates/hotshot/src/traits/storage/memory_storage.rs index 2a9e570a76..a8727ee79b 100644 --- a/crates/hotshot/src/traits/storage/memory_storage.rs +++ b/crates/hotshot/src/traits/storage/memory_storage.rs @@ -126,7 +126,7 @@ mod test { block_contents::dummy::{DummyBlock, DummyState}, node_implementation::NodeType, state::ConsensusTime, - Block, + BlockPayload, }, }; use std::{fmt::Debug, hash::Hash}; @@ -152,7 +152,7 @@ mod test { type BlockType = DummyBlock; type SignatureKey = BN254Pub; type VoteTokenType = StaticVoteToken; - type Transaction = ::Transaction; + type Transaction = ::Transaction; type ElectionConfigType = StaticElectionConfig; type StateType = DummyState; } diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index 03fcc387a8..dc1d170116 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -31,7 +31,7 @@ use hotshot_types::{ node_implementation::{CommitteeEx, NodeImplementation, NodeType, SequencingQuorumEx}, signature_key::SignatureKey, state::ConsensusTime, - Block, + BlockPayload, }, utils::{Terminator, ViewInner}, vote::{QuorumVote, VoteAccumulator, VoteType}, @@ -1160,7 +1160,7 @@ where let block_commitment = self.block.commit(); if block_commitment == TYPES::BlockType::new().commit() { - debug!("Block is generic block! {:?}", self.cur_view); + debug!("BlockPayload is generic block! {:?}", self.cur_view); } let leaf = SequencingLeaf { diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index c7d20786ab..a0011ad8af 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -27,7 +27,7 @@ use hotshot_types::{ node_implementation::{CommitteeEx, NodeImplementation, NodeType}, signature_key::SignatureKey, state::ConsensusTime, - Block, State, + BlockPayload, State, }, utils::ViewInner, vote::VoteAccumulator, diff --git a/crates/testing/src/task_helpers.rs b/crates/testing/src/task_helpers.rs index 13868721d4..6bba6f8d87 100644 --- a/crates/testing/src/task_helpers.rs +++ b/crates/testing/src/task_helpers.rs @@ -6,7 +6,7 @@ use commit::Committable; use either::Right; use hotshot::{ certificate::QuorumCertificate, - traits::{Block, NodeImplementation, TestableNodeImplementation}, + traits::{BlockPayload, NodeImplementation, TestableNodeImplementation}, types::{bn254::BN254Pub, SignatureKey, SystemContextHandle}, HotShotInitializer, HotShotSequencingConsensusApi, SystemContext, }; diff --git a/crates/testing/tests/atomic_storage.rs b/crates/testing/tests/atomic_storage.rs index 3b97a60c9c..c8183af164 100644 --- a/crates/testing/tests/atomic_storage.rs +++ b/crates/testing/tests/atomic_storage.rs @@ -6,7 +6,7 @@ use hotshot::{ random_quorom_certificate, random_transaction, random_validating_leaf, VDemoBlock, VDemoState, }, - traits::{Block, State, Storage}, + traits::{BlockPayload, State, Storage}, }; use hotshot_types::{data::ViewNumber, traits::state::TestableState}; use rand::thread_rng; diff --git a/crates/types/src/data.rs b/crates/types/src/data.rs index 68fc0ec064..4a79038703 100644 --- a/crates/types/src/data.rs +++ b/crates/types/src/data.rs @@ -15,7 +15,7 @@ use crate::{ signature_key::{EncodedPublicKey, SignatureKey}, state::{ConsensusTime, TestableBlock, TestableState}, storage::StoredView, - Block, State, + BlockPayload, State, }, }; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Read, SerializationError, Write}; @@ -101,7 +101,7 @@ impl std::ops::Sub for ViewNumber { } /// The `Transaction` type associated with a `State`, as a syntactic shortcut -pub type Transaction = <::BlockType as Block>::Transaction; +pub type Transaction = <::BlockType as BlockPayload>::Transaction; /// `Commitment` to the `Transaction` type associated with a `State`, as a syntactic shortcut pub type TxnCommitment = Commitment>; @@ -131,14 +131,14 @@ where #[debug(skip)] pub parent_commitment: Commitment, - /// Block leaf wants to apply + /// BlockPayload leaf wants to apply pub deltas: TYPES::BlockType, /// What the state should be after applying `self.deltas` pub state_commitment: Commitment, /// Transactions that were marked for rejection while collecting deltas - pub rejected: Vec<::Transaction>, + pub rejected: Vec<::Transaction>, /// the propser id pub proposer_id: EncodedPublicKey, @@ -147,7 +147,7 @@ where /// A proposal to start providing data availability for a block. #[derive(custom_debug::Debug, Serialize, Deserialize, Clone, Eq, PartialEq, Hash)] pub struct DAProposal { - /// Block leaf wants to apply + /// BlockPayload leaf wants to apply pub deltas: TYPES::BlockType, /// View this proposal applies to pub view_number: TYPES::Time, @@ -233,14 +233,14 @@ pub trait ProposalType: /// full. It is guaranteed to contain, at least, a cryptographic commitment to the block, and it /// provides an interface for resolving the commitment to a full block if the full block is /// available. -pub trait DeltasType: +pub trait DeltasType: Clone + Debug + for<'a> Deserialize<'a> + PartialEq + Eq + std::hash::Hash + Send + Serialize + Sync { /// Errors reported by this type. type Error: std::error::Error; /// Get a cryptographic commitment to the block represented by this delta. - fn block_commitment(&self) -> Commitment; + fn block_commitment(&self) -> Commitment; /// Get the full block if it is available, otherwise return this object unchanged. /// @@ -248,7 +248,7 @@ pub trait DeltasType: /// /// Returns the original [`DeltasType`], unchanged, in an [`Err`] variant in the case where the /// full block is not currently available. - fn try_resolve(self) -> Result; + fn try_resolve(self) -> Result; /// Fill this [`DeltasType`] by providing a complete block. /// @@ -259,7 +259,7 @@ pub trait DeltasType: /// /// Fails if `block` does not match `self.block_commitment()`, or if the block is not able to be /// stored for some implementation-defined reason. - fn fill(&mut self, block: Block) -> Result<(), Self::Error>; + fn fill(&mut self, block: BlockPayload) -> Result<(), Self::Error>; } /// Error which occurs when [`DeltasType::fill`] is called with a block that does not match the @@ -442,10 +442,10 @@ pub type LeafDeltasError = as DeltasType pub type LeafNode = ::NodeType; /// The [`StateType`] in a [`LeafType`]. pub type LeafState = as NodeType>::StateType; -/// The [`Block`] in a [`LeafType`]. +/// The [`BlockPayload`] in a [`LeafType`]. pub type LeafBlock = as NodeType>::BlockType; /// The [`Transaction`] in a [`LeafType`]. -pub type LeafTransaction = as Block>::Transaction; +pub type LeafTransaction = as BlockPayload>::Transaction; /// The [`ConsensusTime`] used by a [`LeafType`]. pub type LeafTime = as NodeType>::Time; @@ -459,12 +459,12 @@ pub trait TestableLeaf { &self, rng: &mut dyn rand::RngCore, padding: u64, - ) -> <::BlockType as Block>::Transaction; + ) -> <::BlockType as BlockPayload>::Transaction; } /// This is the consensus-internal analogous concept to a block, and it contains the block proper, /// as well as the hash of its parent `Leaf`. -/// NOTE: `State` is constrained to implementing `BlockContents`, is `TypeMap::Block` +/// NOTE: `State` is constrained to implementing `BlockContents`, is `TypeMap::BlockPayload` #[derive(Serialize, Deserialize, Clone, Debug, Derivative)] #[serde(bound(deserialize = ""))] #[derivative(Hash, PartialEq, Eq)] @@ -482,14 +482,14 @@ pub struct ValidatingLeaf { /// So we can ask if it extends pub parent_commitment: Commitment>, - /// Block leaf wants to apply + /// BlockPayload leaf wants to apply pub deltas: TYPES::BlockType, /// What the state should be AFTER applying `self.deltas` pub state: TYPES::StateType, /// Transactions that were marked for rejection while collecting deltas - pub rejected: Vec<::Transaction>, + pub rejected: Vec<::Transaction>, /// the timestamp the leaf was constructed at, in nanoseconds. Only exposed for dashboard stats #[derivative(PartialEq = "ignore")] @@ -504,7 +504,7 @@ pub struct ValidatingLeaf { /// This is the consensus-internal analogous concept to a block, and it contains the block proper, /// as well as the hash of its parent `Leaf`. -/// NOTE: `State` is constrained to implementing `BlockContents`, is `TypeMap::Block` +/// NOTE: `State` is constrained to implementing `BlockContents`, is `TypeMap::BlockPayload` #[derive(Serialize, Deserialize, Clone, Debug, Derivative, Eq)] #[serde(bound(deserialize = ""))] pub struct SequencingLeaf { @@ -525,7 +525,7 @@ pub struct SequencingLeaf { pub deltas: Either>, /// Transactions that were marked for rejection while collecting deltas - pub rejected: Vec<::Transaction>, + pub rejected: Vec<::Transaction>, /// the timestamp the leaf was constructed at, in nanoseconds. Only exposed for dashboard stats pub timestamp: i128, @@ -642,7 +642,7 @@ impl LeafType for ValidatingLeaf { self.state.clone() } - fn get_rejected(&self) -> Vec<::Transaction> { + fn get_rejected(&self) -> Vec<::Transaction> { self.rejected.clone() } @@ -680,7 +680,7 @@ where &self, rng: &mut dyn rand::RngCore, padding: u64, - ) -> <::BlockType as Block>::Transaction { + ) -> <::BlockType as BlockPayload>::Transaction { ::create_random_transaction( Some(&self.state), rng, @@ -757,7 +757,7 @@ impl LeafType for SequencingLeaf { // The Sequencing Leaf doesn't have a state. fn get_state(&self) -> Self::MaybeState {} - fn get_rejected(&self) -> Vec<::Transaction> { + fn get_rejected(&self) -> Vec<::Transaction> { self.rejected.clone() } @@ -794,7 +794,7 @@ where &self, rng: &mut dyn rand::RngCore, padding: u64, - ) -> <::BlockType as Block>::Transaction { + ) -> <::BlockType as BlockPayload>::Transaction { TYPES::StateType::create_random_transaction(None, rng, padding) } } diff --git a/crates/types/src/traits.rs b/crates/types/src/traits.rs index c6a76acea3..9c25e5fcb8 100644 --- a/crates/types/src/traits.rs +++ b/crates/types/src/traits.rs @@ -11,5 +11,5 @@ pub mod stake_table; pub mod state; pub mod storage; -pub use block_contents::Block; +pub use block_contents::BlockPayload; pub use state::State; diff --git a/crates/types/src/traits/block_contents.rs b/crates/types/src/traits/block_contents.rs index b7d9b4da44..076914e8c7 100644 --- a/crates/types/src/traits/block_contents.rs +++ b/crates/types/src/traits/block_contents.rs @@ -1,7 +1,7 @@ //! Abstraction over the contents of a block //! -//! This module provides the [`Block`] trait, which describes the behaviors that a block is -//! expected to have. +//! This module provides the [`BlockPayload`] and [`BlockHeader`] traits, which describe the +//! behaviors that a block is expected to have. use commit::{Commitment, Committable}; use serde::{de::DeserializeOwned, Deserialize, Serialize}; @@ -15,14 +15,15 @@ use std::{ /// Abstraction over the full contents of a block /// -/// This trait encapsulates the behaviors that a block must have in order to be used by consensus: -/// * Must have a predefined error type ([`Block::Error`]) +/// This trait encapsulates the behaviors that the transactions of a block must have in order to be +/// used by consensus +/// * Must have a predefined error type ([`BlockPayload::Error`]) /// * Must have a transaction type that can be compared for equality, serialized and serialized, /// sent between threads, and can have a hash produced of it /// * Must be able to be produced incrementally by appending transactions -/// ([`add_transaction_raw`](Block::add_transaction_raw)) +/// ([`add_transaction_raw`](BlockPayload::add_transaction_raw)) /// * Must be hashable -pub trait Block: +pub trait BlockPayload: Serialize + Clone + Debug @@ -61,19 +62,19 @@ pub trait Block: /// Commitment to a block, used by data availibity #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Ord)] #[serde(bound(deserialize = ""), transparent)] -pub struct BlockCommitment(pub Commitment); +pub struct BlockCommitment(pub Commitment); -/// Abstraction over any type of transaction. Used by [`Block`]. +/// Abstraction over any type of transaction. Used by [`BlockPayload`]. pub trait Transaction: Clone + Serialize + DeserializeOwned + Debug + PartialEq + Eq + Sync + Send + Committable + Hash { } -/// Dummy implementation of `BlockContents` for unit tests +/// Dummy implementation of `BlockPayload` for unit tests pub mod dummy { use std::fmt::Display; - use super::{Block, Commitment, Committable, Debug, Hash, HashSet, Serialize}; + use super::{BlockPayload, Commitment, Committable, Debug, Hash, HashSet, Serialize}; use rand::Rng; use serde::Deserialize; @@ -107,7 +108,7 @@ pub mod dummy { impl Committable for DummyTransaction { fn commit(&self) -> commit::Commitment { - commit::RawCommitmentBuilder::new("Dummy Block Comm") + commit::RawCommitmentBuilder::new("Dummy BlockPayload Comm") .u64_field("Dummy Field", 0) .finalize() } @@ -132,7 +133,7 @@ pub mod dummy { } } - impl Block for DummyBlock { + impl BlockPayload for DummyBlock { type Error = DummyError; type Transaction = DummyTransaction; @@ -167,7 +168,7 @@ pub mod dummy { impl Committable for DummyBlock { fn commit(&self) -> commit::Commitment { - commit::RawCommitmentBuilder::new("Dummy Block Comm") + commit::RawCommitmentBuilder::new("Dummy BlockPayload Comm") .u64_field("Nonce", self.nonce) .finalize() } diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 81a173e954..adb3386bdc 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -93,9 +93,11 @@ pub enum VoteData { impl Committable for VoteData { fn commit(&self) -> Commitment { match self { - VoteData::DA(block_commitment) => commit::RawCommitmentBuilder::new("DA Block Commit") - .field("block_commitment", *block_commitment) - .finalize(), + VoteData::DA(block_commitment) => { + commit::RawCommitmentBuilder::new("DA BlockPayload Commit") + .field("block_commitment", *block_commitment) + .finalize() + } VoteData::Yes(leaf_commitment) => commit::RawCommitmentBuilder::new("Yes Vote Commit") .field("leaf_commitment", *leaf_commitment) .finalize(), diff --git a/crates/types/src/traits/node_implementation.rs b/crates/types/src/traits/node_implementation.rs index 8ba5abdebb..e7a52675b0 100644 --- a/crates/types/src/traits/node_implementation.rs +++ b/crates/types/src/traits/node_implementation.rs @@ -19,7 +19,7 @@ use crate::{ message::{ConsensusMessageType, Message, SequencingMessage}, traits::{ election::Membership, network::TestableChannelImplementation, signature_key::SignatureKey, - storage::Storage, Block, + storage::Storage, BlockPayload, }, }; use async_compatibility_layer::channel::{unbounded, UnboundedReceiver, UnboundedSender}; @@ -184,7 +184,7 @@ pub trait ExchangesType, MESSA /// Get the view sync exchange. fn view_sync_exchange(&self) -> &Self::ViewSyncExchange; - /// Block the underlying networking interfaces until node is successfully initialized into the + /// BlockPayload the underlying networking interfaces until node is successfully initialized into the /// networks. async fn wait_for_networks_ready(&self); @@ -363,7 +363,7 @@ pub trait TestableNodeImplementation: NodeImplementation state: Option<&TYPES::StateType>, rng: &mut dyn rand::RngCore, padding: u64, - ) -> ::Transaction; + ) -> ::Transaction; /// Creates random transaction if possible /// otherwise panics @@ -372,7 +372,7 @@ pub trait TestableNodeImplementation: NodeImplementation leaf: &Self::Leaf, rng: &mut dyn rand::RngCore, padding: u64, - ) -> ::Transaction; + ) -> ::Transaction; /// generate a genesis block fn block_genesis() -> TYPES::BlockType; @@ -438,7 +438,7 @@ where state: Option<&TYPES::StateType>, rng: &mut dyn rand::RngCore, padding: u64, - ) -> ::Transaction { + ) -> ::Transaction { ::create_random_transaction(state, rng, padding) } @@ -446,7 +446,7 @@ where leaf: &Self::Leaf, rng: &mut dyn rand::RngCore, padding: u64, - ) -> ::Transaction { + ) -> ::Transaction { ::create_random_transaction(leaf, rng, padding) } @@ -565,14 +565,14 @@ pub trait NodeType: /// The block type that this hotshot setup is using. /// /// This should be the same block that `StateType::BlockType` is using. - type BlockType: Block; + type BlockType: BlockPayload; /// The signature key that this hotshot setup is using. type SignatureKey: SignatureKey; /// The vote token that this hotshot setup is using. type VoteTokenType: VoteToken; /// The transaction type that this hotshot setup is using. /// - /// This should be equal to `Block::Transaction` + /// This should be equal to `BlockPayload::Transaction` type Transaction: Transaction; /// The election config type that this hotshot setup is using. type ElectionConfigType: ElectionConfig; diff --git a/crates/types/src/traits/state.rs b/crates/types/src/traits/state.rs index 83fb250442..93ff3e6603 100644 --- a/crates/types/src/traits/state.rs +++ b/crates/types/src/traits/state.rs @@ -3,7 +3,7 @@ //! This module provides the [`State`] trait, which serves as an compatibility over the current //! network state, which is modified by the transactions contained within blocks. -use crate::traits::Block; +use crate::traits::BlockPayload; use commit::Committable; use espresso_systems_common::hotshot::tag; use serde::{de::DeserializeOwned, Serialize}; @@ -19,7 +19,7 @@ use std::{ /// /// This trait represents the behaviors that the 'global' ledger state must have: /// * A defined error type ([`Error`](State::Error)) -/// * The type of block that modifies this type of state ([`Block`](State::BlockType)) +/// * The type of block that modifies this type of state ([`BlockPayload`](State::BlockType)) /// * A method to get a template (empty) next block from the current state /// ([`next_block`](State::next_block)) /// * The ability to validate that a block is actually a valid extension of this state @@ -42,7 +42,7 @@ pub trait State: /// The error type for this particular type of ledger state type Error: Error + Debug + Send + Sync; /// The type of block this state is associated with - type BlockType: Block; + type BlockType: BlockPayload; /// Time compatibility needed for reward collection type Time: ConsensusTime; @@ -109,11 +109,11 @@ where state: Option<&Self>, rng: &mut dyn rand::RngCore, padding: u64, - ) -> ::Transaction; + ) -> ::Transaction; } /// extra functions required on block to be usable by hotshot-testing -pub trait TestableBlock: Block + Debug { +pub trait TestableBlock: BlockPayload + Debug { /// generate a genesis block fn genesis() -> Self; diff --git a/crates/types/src/traits/storage.rs b/crates/types/src/traits/storage.rs index 41b7cc225a..20c8f87f9a 100644 --- a/crates/types/src/traits/storage.rs +++ b/crates/types/src/traits/storage.rs @@ -4,7 +4,7 @@ use super::{node_implementation::NodeType, signature_key::EncodedPublicKey}; use crate::{ certificate::QuorumCertificate, data::LeafType, - traits::{election::SignedCertificate, Block}, + traits::{election::SignedCertificate, BlockPayload}, }; use async_trait::async_trait; use commit::Commitment; @@ -152,7 +152,7 @@ where TYPES: NodeType, LEAF: LeafType, { - /// Create a new `StoredView` from the given QC, Block and State. + /// Create a new `StoredView` from the given QC, `BlockPayload` and State. /// /// Note that this will set the `parent` to `LeafHash::default()`, so this will not have a parent. pub fn from_qc_block_and_state( @@ -161,7 +161,7 @@ where state: LEAF::MaybeState, height: u64, parent_commitment: Commitment, - rejected: Vec<::Transaction>, + rejected: Vec<::Transaction>, proposer_id: EncodedPublicKey, ) -> Self { Self { diff --git a/justfile b/justfile index 4291300d1b..9be6eaed77 100644 --- a/justfile +++ b/justfile @@ -54,7 +54,7 @@ test_da_task: test_view_sync_task: echo Testing the view sync task with async std executor - ASYNC_STD_THREAD_COUNT=1 cargo test --features=full-ci --lib --bins --tests --benches --workspace --no-fail-fast test_view_sync_task -- --test-threads=1 --nocapture + ASYNC_STD_THREAD_COUNT=1 cargo test --lib --bins --tests --benches --workspace --no-fail-fast test_view_sync_task -- --test-threads=1 --nocapture test_pkg := "hotshot" diff --git a/testing-macros/src/lib.rs b/testing-macros/src/lib.rs index db68144a72..8057569da7 100644 --- a/testing-macros/src/lib.rs +++ b/testing-macros/src/lib.rs @@ -310,7 +310,7 @@ impl TestData { type Time = #time_type; type BlockType = <#demo_state as hotshot_types::traits::State>::BlockType; type SignatureKey = #signature_key_type; - type Transaction = <<#demo_state as hotshot_types::traits::State>::BlockType as hotshot_types::traits::Block>::Transaction; + type Transaction = <<#demo_state as hotshot_types::traits::State>::BlockType as hotshot_types::traits::BlockPayload>::Transaction; type StateType = #demo_state; type VoteTokenType = hotshot::traits::election::static_committee::StaticVoteToken; type ElectionConfigType = hotshot::traits::election::static_committee::StaticElectionConfig; From 3d55cbd86d7925a7c1ef6caf201acdf879d76e6a Mon Sep 17 00:00:00 2001 From: Keyao Shen Date: Thu, 7 Sep 2023 16:06:40 -0700 Subject: [PATCH 02/66] Add commitment function --- crates/hotshot/src/demos/sdemo.rs | 6 ++++++ crates/types/src/traits/block_contents.rs | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/crates/hotshot/src/demos/sdemo.rs b/crates/hotshot/src/demos/sdemo.rs index f8264ab612..55ce5c1f3e 100644 --- a/crates/hotshot/src/demos/sdemo.rs +++ b/crates/hotshot/src/demos/sdemo.rs @@ -233,6 +233,12 @@ impl BlockPayload for SDemoBlock { .collect(), } } + + fn commitment(&self) -> Commitment { + // TODO: Get the payload commitment after VID is added. + // https://github.com/EspressoSystems/HotShot/issues/1673 + unimplemented!(); + } } impl State for SDemoState { diff --git a/crates/types/src/traits/block_contents.rs b/crates/types/src/traits/block_contents.rs index 076914e8c7..4a1bd0a4e1 100644 --- a/crates/types/src/traits/block_contents.rs +++ b/crates/types/src/traits/block_contents.rs @@ -57,6 +57,9 @@ pub trait BlockPayload: /// returns hashes of all the transactions in this block /// TODO make this ordered with a vec fn contained_transactions(&self) -> HashSet>; + + /// Compute the VID payload commitment. + fn commitment(&self) -> Commitment; } /// Commitment to a block, used by data availibity @@ -154,6 +157,12 @@ pub mod dummy { fn contained_transactions(&self) -> HashSet> { HashSet::new() } + + fn commitment(&self) -> Commitment { + // TODO: Get the payload commitment after VID is added. + // https://github.com/EspressoSystems/HotShot/issues/1673 + unimplemented!(); + } } impl TestableBlock for DummyBlock { From ec8f187857428e439db53820261cf78849025460 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Mon, 11 Sep 2023 14:22:42 -0400 Subject: [PATCH 03/66] Accumulator2 trait: updated generics so trait is over TYPES, VOTE --- crates/types/src/certificate.rs | 8 +++++++- crates/types/src/traits/election.rs | 5 +++++ crates/types/src/vote.rs | 22 ++++++++++++++++++++-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/crates/types/src/certificate.rs b/crates/types/src/certificate.rs index 47720eba75..ee19e96e39 100644 --- a/crates/types/src/certificate.rs +++ b/crates/types/src/certificate.rs @@ -8,7 +8,7 @@ use crate::{ signature_key::{EncodedPublicKey, EncodedSignature, SignatureKey}, state::ConsensusTime, }, - vote::ViewSyncData, + vote::{ViewSyncData, VoteAccumulator}, }; use bincode::Options; use commit::{Commitment, Committable}; @@ -20,6 +20,8 @@ use std::{ ops::Deref, }; use tracing::debug; +use crate::vote::QuorumVote; +use crate::vote::AccumulatorPlaceholder; /// A `DACertificate` is a threshold signature that some data is available. /// It is signed by the members of the DA committee, not the entire network. It is used @@ -113,6 +115,7 @@ pub struct ViewSyncCertificateInternal { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)] #[serde(bound(deserialize = ""))] /// Enum representing whether a signatures is for a 'Yes' or 'No' or 'DA' or 'Genesis' certificate +// TODO ED Should this be a trait? pub enum AssembledSignature { // (enum, signature) /// These signatures are for a 'Yes' certificate @@ -154,6 +157,9 @@ impl> SignedCertificate for QuorumCertificate { + type Vote = QuorumVote; + type VoteAccumulator = AccumulatorPlaceholder; + fn from_signatures_and_commitment( view_number: TYPES::Time, signatures: AssembledSignature, diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 81a173e954..3c2136bc57 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -42,6 +42,7 @@ use serde::{Deserialize, Serialize}; use snafu::Snafu; use std::{collections::BTreeSet, fmt::Debug, hash::Hash, marker::PhantomData, num::NonZeroU64}; use tracing::error; +use crate::vote::Accumulator2; /// Error for election problems #[derive(Snafu, Debug)] @@ -181,6 +182,10 @@ where COMMITTABLE: Committable + Serialize + Clone, TOKEN: VoteToken, { + type Vote: VoteType; + + type VoteAccumulator: Accumulator2; + /// Build a QC from the threshold signature and commitment fn from_signatures_and_commitment( view_number: TIME, diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index cdbb8cb03f..d71dc18f25 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -7,7 +7,7 @@ use crate::{ certificate::{AssembledSignature, QuorumCertificate}, data::LeafType, traits::{ - election::{VoteData, VoteToken}, + election::{SignedCertificate, VoteData, VoteToken}, node_implementation::NodeType, signature_key::{EncodedPublicKey, EncodedSignature, SignatureKey}, }, @@ -25,7 +25,7 @@ use serde::{Deserialize, Serialize}; use std::{ collections::{BTreeMap, HashMap}, fmt::Debug, - num::NonZeroU64, + num::NonZeroU64, marker::PhantomData, }; use tracing::error; @@ -187,6 +187,7 @@ pub enum QuorumVote> { /// Negative vote. No(YesOrNoVote), /// Timeout vote. + // TODO ED Remove this and make it it's own vote type, since it is not part of the QC type Timeout(TimeoutVote), } @@ -255,6 +256,22 @@ pub trait Accumulator: Sized { fn append(self, val: T) -> Either; } + +pub trait Accumulator2>: Sized +{ + fn append(self, vote: VOTE) -> Either>; +} + +pub struct AccumulatorPlaceholder> { + phantom: PhantomData<(TYPES, VOTE)> +} + +impl > Accumulator2 for AccumulatorPlaceholder { + fn append(self, vote: VOTE) -> Either> { + either::Left(self) + } +} + /// Mapping of commitments to vote tokens by key. type VoteMap = HashMap< Commitment, @@ -314,6 +331,7 @@ where #![allow(clippy::too_many_lines)] fn append( mut self, + // TODO ED Make this its own type to avoid extra long type signature val: ( Commitment, ( From 463bbbbe8ef892af470697000b79b26d5db6334d Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Mon, 11 Sep 2023 14:32:13 -0400 Subject: [PATCH 04/66] Placeholder accumulator in place for each certificate type --- crates/types/src/certificate.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/types/src/certificate.rs b/crates/types/src/certificate.rs index ee19e96e39..b59a180255 100644 --- a/crates/types/src/certificate.rs +++ b/crates/types/src/certificate.rs @@ -8,7 +8,7 @@ use crate::{ signature_key::{EncodedPublicKey, EncodedSignature, SignatureKey}, state::ConsensusTime, }, - vote::{ViewSyncData, VoteAccumulator}, + vote::{ViewSyncData, VoteAccumulator, DAVote, ViewSyncVote}, }; use bincode::Options; use commit::{Commitment, Committable}; @@ -230,6 +230,9 @@ impl> Committable impl SignedCertificate for DACertificate { + type Vote = DAVote; + type VoteAccumulator = AccumulatorPlaceholder; + fn from_signatures_and_commitment( view_number: TYPES::Time, signatures: AssembledSignature, @@ -318,6 +321,8 @@ impl SignedCertificate> for ViewSyncCertificate { + type Vote = ViewSyncVote; + type VoteAccumulator = AccumulatorPlaceholder; /// Build a QC from the threshold signature and commitment fn from_signatures_and_commitment( view_number: TYPES::Time, From cd9539d53435fcf7962befb886fea66f00f0124c Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Mon, 11 Sep 2023 11:44:25 -0700 Subject: [PATCH 05/66] init --- Cargo.lock | 202 ++++++++++++++++++++++++++--------------------------- 1 file changed, 101 insertions(+), 101 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c53eaaeff0..bda6587bdd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -178,9 +178,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" +checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46" [[package]] name = "anstyle-parse" @@ -801,7 +801,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -818,7 +818,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -854,7 +854,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4057f2c32adbb2fc158e22fb38433c8e9bbf76b75a4732c7c0cbaf695fb65568" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "futures-sink", "futures-util", "memchr", @@ -893,7 +893,7 @@ dependencies = [ "async-trait", "axum-core", "bitflags 1.3.2", - "bytes 1.4.0", + "bytes 1.5.0", "futures-util", "http", "http-body", @@ -919,7 +919,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" dependencies = [ "async-trait", - "bytes 1.4.0", + "bytes 1.5.0", "futures-util", "http", "http-body", @@ -964,9 +964,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.3" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" +checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" [[package]] name = "base64ct" @@ -1121,9 +1121,9 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" dependencies = [ "serde", ] @@ -1194,9 +1194,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.28" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ed24df0632f708f5f6d8082675bef2596f7084dee3dd55f632290bf35bfe0f" +checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1265,7 +1265,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -1572,7 +1572,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "704722d1d929489c8528bb1882805700f1ba20f54325704973e786352320b1ed" dependencies = [ "blake2", - "curve25519-dalek 4.0.0", + "curve25519-dalek 4.1.0", "rand_core 0.6.4", "serdect", ] @@ -1658,9 +1658,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f711ade317dd348950a9910f81c5947e3d8907ebd2b83f76203ff1807e6a2bc2" +checksum = "622178105f911d937a42cdb140730ba4a3ed2becd8ae6ce39c7d28b5d75d4588" dependencies = [ "cfg-if", "cpufeatures", @@ -1681,7 +1681,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -1749,7 +1749,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -1771,7 +1771,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core 0.20.3", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -1865,7 +1865,7 @@ checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -1987,7 +1987,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -2046,7 +2046,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" dependencies = [ - "curve25519-dalek 4.0.0", + "curve25519-dalek 4.1.0", "ed25519", "rand_core 0.6.4", "serde", @@ -2202,9 +2202,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.1.20" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" +checksum = "d0870c84016d4b481be5c9f323c24f65e31e901ae618f0e80f4308fb00de1d2d" [[package]] name = "fixed-hash" @@ -2344,7 +2344,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -2489,7 +2489,7 @@ version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "fnv", "futures-core", "futures-sink", @@ -2656,7 +2656,7 @@ dependencies = [ "surf-disco", "time 0.3.28", "tokio", - "toml 0.7.7", + "toml 0.7.8", "tracing", "typenum", ] @@ -2914,7 +2914,7 @@ dependencies = [ "tide", "tide-disco 0.4.1 (git+https://github.com/EspressoSystems/tide-disco.git?tag=v0.4.1)", "tokio", - "toml 0.7.7", + "toml 0.7.8", "tracing", ] @@ -2924,7 +2924,7 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "fnv", "itoa 1.0.9", ] @@ -2935,7 +2935,7 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "http", "pin-project-lite 0.2.13", ] @@ -3000,7 +3000,7 @@ version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "futures-channel", "futures-core", "futures-util", @@ -3216,7 +3216,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f97967975f448f1a7ddb12b0bc41069d09ed6a1c161a92687e057325db35d413" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", ] [[package]] @@ -3245,7 +3245,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.3", + "socket2 0.5.4", "widestring", "windows-sys", "winreg", @@ -3463,7 +3463,7 @@ version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32d07d1502a027366d55afe187621c2d7895dc111a3df13b35fed698049681d7" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "futures", "futures-timer", "getrandom 0.2.10", @@ -3626,9 +3626,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d157562dba6017193e5285acf6b1054759e83540bfd79f75b69d6ce774c88da" dependencies = [ "asynchronous-codec", - "base64 0.21.3", + "base64 0.21.4", "byteorder", - "bytes 1.4.0", + "bytes 1.5.0", "either", "fnv", "futures", @@ -3703,7 +3703,7 @@ checksum = "fc125f83d8f75322c79e4ade74677d299b34aa5c9d9b5251c03ec28c683cb765" dependencies = [ "arrayvec", "asynchronous-codec", - "bytes 1.4.0", + "bytes 1.5.0", "either", "fnv", "futures", @@ -3740,7 +3740,7 @@ dependencies = [ "log", "rand 0.8.5", "smallvec", - "socket2 0.5.3", + "socket2 0.5.4", "tokio", "trust-dns-proto", "void", @@ -3812,8 +3812,8 @@ version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71ce70757f2c0d82e9a3ef738fb10ea0723d16cec37f078f719e2c247704c1bb" dependencies = [ - "bytes 1.4.0", - "curve25519-dalek 4.0.0", + "bytes 1.5.0", + "curve25519-dalek 4.1.0", "futures", "libp2p-core", "libp2p-identity", @@ -3856,7 +3856,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37266c683a757df713f7dcda0cdcb5ad4681355ffa1b37b77c113c176a531195" dependencies = [ "asynchronous-codec", - "bytes 1.4.0", + "bytes 1.5.0", "futures", "libp2p-core", "libp2p-identity", @@ -3886,7 +3886,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cb763e88f9a043546bfebd3575f340e7dd3d6c1b2cf2629600ec8965360c63a" dependencies = [ "async-std", - "bytes 1.4.0", + "bytes 1.5.0", "futures", "futures-timer", "if-watch", @@ -3898,7 +3898,7 @@ dependencies = [ "quinn", "rand 0.8.5", "rustls", - "socket2 0.5.3", + "socket2 0.5.4", "thiserror", "tokio", ] @@ -3910,7 +3910,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb07202cdf103486709fda5d9d10a0297a8ba01c212b1e19b7943c45c1bd7d6" dependencies = [ "asynchronous-codec", - "bytes 1.4.0", + "bytes 1.5.0", "either", "futures", "futures-timer", @@ -4003,7 +4003,7 @@ dependencies = [ "proc-macro-warning", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -4020,7 +4020,7 @@ dependencies = [ "libp2p-core", "libp2p-identity", "log", - "socket2 0.5.3", + "socket2 0.5.4", "tokio", ] @@ -4404,9 +4404,9 @@ dependencies = [ [[package]] name = "multihash" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd59dcc2bbe70baabeac52cd22ae52c55eefe6c38ff11a9439f16a350a939f2" +checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" dependencies = [ "core2", "serde", @@ -4419,7 +4419,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea0df8e5eec2298a62b326ee4f0d7fe1a6b90a09dfcf9df37b38f947a8c42f19" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "futures", "log", "pin-project", @@ -4528,7 +4528,7 @@ name = "netlink-proto" version = "0.9.2" source = "git+https://github.com/espressosystems/netlink.git#1347bed011eeae7ece9851773906c4a3c80a5d77" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "futures", "log", "netlink-packet-core 0.4.2 (git+https://github.com/espressosystems/netlink.git)", @@ -4542,7 +4542,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "futures", "log", "netlink-packet-core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4557,7 +4557,7 @@ version = "0.8.2" source = "git+https://github.com/espressosystems/netlink.git#1347bed011eeae7ece9851773906c4a3c80a5d77" dependencies = [ "async-io", - "bytes 1.4.0", + "bytes 1.5.0", "futures", "libc", "log", @@ -4570,7 +4570,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" dependencies = [ "async-io", - "bytes 1.4.0", + "bytes 1.5.0", "futures", "libc", "log", @@ -4721,9 +4721,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.92" +version = "0.9.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db7e971c2c2bba161b2d2fdf37080177eff520b3bc044787c7f1f5f9e78d869b" +checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" dependencies = [ "cc", "libc", @@ -4761,9 +4761,9 @@ checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" [[package]] name = "parity-scale-codec" -version = "3.6.5" +version = "3.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +checksum = "f88eaac72ead1b9bd4ce747d577dbd2ad31fb0a56a9a20c611bf27bd1b97fbed" dependencies = [ "arrayvec", "bitvec", @@ -4775,9 +4775,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.5" +version = "3.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +checksum = "33bdcd446e9400b6ad9fc85b4aea68846c258b07c3efb994679ae82707b133f0" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4872,7 +4872,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -4903,7 +4903,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -5089,7 +5089,7 @@ checksum = "3d1eaa7fa0aa1929ffdf7eeb6eac234dde6268914a14ad44d23521ab6a9b258e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -5121,7 +5121,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -5130,7 +5130,7 @@ version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "prost-derive", ] @@ -5178,7 +5178,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ededb1cd78531627244d51dd0c7139fbe736c7d57af0092a76f0ffb2f56e98" dependencies = [ "asynchronous-codec", - "bytes 1.4.0", + "bytes 1.5.0", "quick-protobuf", "thiserror", "unsigned-varint", @@ -5203,7 +5203,7 @@ checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" dependencies = [ "async-io", "async-std", - "bytes 1.4.0", + "bytes 1.5.0", "futures-io", "pin-project-lite 0.2.13", "quinn-proto", @@ -5221,7 +5221,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13f81c9a9d574310b8351f8666f5a93ac3b0069c45c28ad52c10291389a7cf9" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "rand 0.8.5", "ring", "rustc-hash", @@ -5238,9 +5238,9 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "libc", - "socket2 0.5.3", + "socket2 0.5.4", "tracing", "windows-sys", ] @@ -5469,7 +5469,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "rustc-hex", ] @@ -5726,7 +5726,7 @@ checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -5803,7 +5803,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ca3b16a3d82c4088f343b7480a93550b3eabe1a358569c2dfe38bbcead07237" dependencies = [ - "base64 0.21.3", + "base64 0.21.4", "chrono", "hex", "indexmap 1.9.3", @@ -5823,7 +5823,7 @@ dependencies = [ "darling 0.20.3", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -5835,7 +5835,7 @@ dependencies = [ "darling 0.20.3", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -6078,7 +6078,7 @@ dependencies = [ "aes-gcm 0.9.2", "blake2", "chacha20poly1305 0.9.1", - "curve25519-dalek 4.0.0", + "curve25519-dalek 4.1.0", "rand_core 0.6.4", "ring", "rustc_version 0.4.0", @@ -6098,9 +6098,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" dependencies = [ "libc", "windows-sys", @@ -6113,7 +6113,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" dependencies = [ "base64 0.13.1", - "bytes 1.4.0", + "bytes 1.5.0", "futures", "httparse", "log", @@ -6260,7 +6260,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -6390,9 +6390,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.31" +version = "2.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" +checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" dependencies = [ "proc-macro2", "quote", @@ -6534,7 +6534,7 @@ checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -6651,7 +6651,7 @@ dependencies = [ "tagged-base64 0.2.4", "tide", "tide-websockets", - "toml 0.7.7", + "toml 0.7.8", "tracing", "tracing-distributed", "tracing-futures", @@ -6775,14 +6775,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ "backtrace", - "bytes 1.4.0", + "bytes 1.5.0", "libc", "mio", "num_cpus", "parking_lot", "pin-project-lite 0.2.13", "signal-hook-registry", - "socket2 0.5.3", + "socket2 0.5.4", "tokio-macros", "tracing", "windows-sys", @@ -6806,7 +6806,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -6826,7 +6826,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "futures-core", "futures-sink", "pin-project-lite 0.2.13", @@ -6845,9 +6845,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0a3ab2091e52d7299a39d098e200114a972df0a7724add02a273aa9aada592" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", "serde_spanned", @@ -6885,8 +6885,8 @@ checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" dependencies = [ "async-trait", "axum", - "base64 0.21.3", - "bytes 1.4.0", + "base64 0.21.4", + "bytes 1.5.0", "futures-core", "futures-util", "h2", @@ -6958,7 +6958,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] [[package]] @@ -7105,7 +7105,7 @@ checksum = "5fe8dada8c1a3aeca77d6b51a4f1314e0f4b8e438b7b1b71e3ddaca8080e4093" dependencies = [ "base64 0.13.1", "byteorder", - "bytes 1.4.0", + "bytes 1.5.0", "http", "httparse", "input_buffer", @@ -7125,7 +7125,7 @@ checksum = "983d40747bce878d2fb67d910dcb8bd3eca2b2358540c3cc1b98c027407a3ae3" dependencies = [ "base64 0.13.1", "byteorder", - "bytes 1.4.0", + "bytes 1.5.0", "http", "httparse", "log", @@ -7218,12 +7218,12 @@ dependencies = [ [[package]] name = "unsigned-varint" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" dependencies = [ "asynchronous-codec", - "bytes 1.4.0", + "bytes 1.5.0", ] [[package]] @@ -7366,7 +7366,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", "wasm-bindgen-shared", ] @@ -7400,7 +7400,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7679,5 +7679,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.32", ] From 5d7284dab7d814141f32eafb64f20abd6c490e7a Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Mon, 11 Sep 2023 14:55:48 -0400 Subject: [PATCH 06/66] Placeholder accumulator in DA task --- crates/task-impls/src/da.rs | 17 +++++++++++++++++ crates/types/src/vote.rs | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index c7d20786ab..9d0cc36e88 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -15,6 +15,8 @@ use hotshot_task::{ task::{FilterEvent, HandleEvent, HotShotTaskCompleted, HotShotTaskTypes, TS}, task_impls::{HSTWithEvent, TaskBuilder}, }; +use hotshot_types::traits::election::SignedCertificate; +use hotshot_types::vote::AccumulatorPlaceholder; use hotshot_types::{ certificate::DACertificate, consensus::{Consensus, View}, @@ -34,6 +36,7 @@ use hotshot_types::{ }; use hotshot_utils::bincode::bincode_opts; use snafu::Snafu; +use std::marker::PhantomData; use std::{ collections::{HashMap, HashSet}, sync::Arc, @@ -104,6 +107,16 @@ pub struct DAVoteCollectionTaskState< /// the vote accumulator pub accumulator: Either, DACertificate>, + + pub accumulator2: Either< + as SignedCertificate< + TYPES, + TYPES::Time, + TYPES::VoteTokenType, + TYPES::BlockType, + >>::VoteAccumulator, + DACertificate, + >, // TODO ED Make this just "view" since it is only for this task /// the current view pub cur_view: TYPES::Time, @@ -379,10 +392,14 @@ where acc, None, ); + let accumulator2 = AccumulatorPlaceholder { + phantom: PhantomData::default(), + }; if view > collection_view { let state = DAVoteCollectionTaskState { committee_exchange: self.committee_exchange.clone(), accumulator, + accumulator2: either::Left(accumulator2), cur_view: view, event_stream: self.event_stream.clone(), id: self.id, diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index d71dc18f25..55804d1a02 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -263,7 +263,7 @@ pub trait Accumulator2>: Sized } pub struct AccumulatorPlaceholder> { - phantom: PhantomData<(TYPES, VOTE)> + pub phantom: PhantomData<(TYPES, VOTE)> } impl > Accumulator2 for AccumulatorPlaceholder { From f0197f98c0de5915ce3b7c45b9e1dc3424864891 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Mon, 11 Sep 2023 15:30:46 -0400 Subject: [PATCH 07/66] Added get_view, get_signature, and get_key functions to Vote trait --- crates/task-impls/src/consensus.rs | 12 ++++----- crates/task-impls/src/network.rs | 2 +- crates/types/src/certificate.rs | 10 +++++--- crates/types/src/message.rs | 4 +-- crates/types/src/traits/election.rs | 17 +++++++++++++ crates/types/src/vote.rs | 39 ++++++++++++++++++++++++++--- 6 files changed, 67 insertions(+), 17 deletions(-) diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index 03fcc387a8..9462b389c4 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -368,7 +368,7 @@ where if let GeneralConsensusMessage::Vote(vote) = message { debug!( "Sending vote to next quorum leader {:?}", - vote.current_view() + vote.get_view() ); self.event_stream .publish(SequencingHotShotEvent::QuorumVoteSend(vote)) @@ -446,7 +446,7 @@ where if let GeneralConsensusMessage::Vote(vote) = message { debug!( "Sending vote to next quorum leader {:?}", - vote.current_view() + vote.get_view() ); self.event_stream .publish(SequencingHotShotEvent::QuorumVoteSend(vote)) @@ -890,13 +890,13 @@ where } } SequencingHotShotEvent::QuorumVoteRecv(vote) => { - debug!("Received quroum vote: {:?}", vote.current_view()); + debug!("Received quroum vote: {:?}", vote.get_view()); - if !self.quorum_exchange.is_leader(vote.current_view() + 1) { + if !self.quorum_exchange.is_leader(vote.get_view() + 1) { error!( "We are not the leader for view {} are we the leader for view + 1? {}", - *vote.current_view() + 1, - self.quorum_exchange.is_leader(vote.current_view() + 2) + *vote.get_view() + 1, + self.quorum_exchange.is_leader(vote.get_view() + 2) ); return; } diff --git a/crates/task-impls/src/network.rs b/crates/task-impls/src/network.rs index a4b083ba37..b50a4143ea 100644 --- a/crates/task-impls/src/network.rs +++ b/crates/task-impls/src/network.rs @@ -208,7 +208,7 @@ impl< GeneralConsensusMessage::Vote(vote.clone()), ))), TransmitType::Direct, - Some(membership.get_leader(vote.current_view() + 1)), + Some(membership.get_leader(vote.get_view() + 1)), ), SequencingHotShotEvent::DAProposalSend(proposal, sender) => ( diff --git a/crates/types/src/certificate.rs b/crates/types/src/certificate.rs index b59a180255..dea84d01f1 100644 --- a/crates/types/src/certificate.rs +++ b/crates/types/src/certificate.rs @@ -1,5 +1,8 @@ //! Provides two types of cerrtificates and their accumulators. +use crate::vote::Accumulator; +use crate::vote::AccumulatorPlaceholder; +use crate::vote::QuorumVote; use crate::{ data::{fake_commitment, serialize_signature, LeafType}, traits::{ @@ -8,10 +11,11 @@ use crate::{ signature_key::{EncodedPublicKey, EncodedSignature, SignatureKey}, state::ConsensusTime, }, - vote::{ViewSyncData, VoteAccumulator, DAVote, ViewSyncVote}, + vote::{DAVote, ViewSyncData, ViewSyncVote, VoteAccumulator}, }; use bincode::Options; use commit::{Commitment, Committable}; +use either::Either; use espresso_systems_common::hotshot::tag; use hotshot_utils::bincode::bincode_opts; use serde::{Deserialize, Serialize}; @@ -20,8 +24,6 @@ use std::{ ops::Deref, }; use tracing::debug; -use crate::vote::QuorumVote; -use crate::vote::AccumulatorPlaceholder; /// A `DACertificate` is a threshold signature that some data is available. /// It is signed by the members of the DA committee, not the entire network. It is used @@ -115,7 +117,7 @@ pub struct ViewSyncCertificateInternal { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)] #[serde(bound(deserialize = ""))] /// Enum representing whether a signatures is for a 'Yes' or 'No' or 'DA' or 'Genesis' certificate -// TODO ED Should this be a trait? +// TODO ED Should this be a trait? pub enum AssembledSignature { // (enum, signature) /// These signatures are for a 'Yes' certificate diff --git a/crates/types/src/message.rs b/crates/types/src/message.rs index 89d2864aa9..16d542551c 100644 --- a/crates/types/src/message.rs +++ b/crates/types/src/message.rs @@ -359,7 +359,7 @@ impl< // this should match replica upon receipt p.data.get_view_number() } - GeneralConsensusMessage::Vote(vote_message) => vote_message.current_view(), + GeneralConsensusMessage::Vote(vote_message) => vote_message.get_view(), GeneralConsensusMessage::InternalTrigger(trigger) => match trigger { InternalTrigger::Timeout(time) => *time, }, @@ -376,7 +376,7 @@ impl< // this should match replica upon receipt p.data.get_view_number() } - CommitteeConsensusMessage::DAVote(vote_message) => vote_message.current_view(), + CommitteeConsensusMessage::DAVote(vote_message) => vote_message.get_view(), CommitteeConsensusMessage::DACertificate(cert) => cert.view_number, } } diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 3c2136bc57..cdc47b1898 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -186,7 +186,24 @@ where type VoteAccumulator: Accumulator2; + fn accumulate_vote(accumulator: Self::VoteAccumulator, vote: Self::Vote, commit: COMMITTABLE) -> Either { + // if !self.is_valid_vote( + // &vote.encoded_key, + // &vote.encoded_signature, + // vote.data.clone(), + // // Ignoring deserialization errors below since we are getting rid of it soon + // Checked::Unchecked(vote.vote_token.clone()), + // ) { + // error!("Invalid vote!"); + // return Either::Left(accumulator); + // } + // Call append + + todo!() + } + /// Build a QC from the threshold signature and commitment + // TODO ED Rename this function fn from_signatures_and_commitment( view_number: TIME, signatures: AssembledSignature, diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index 55804d1a02..d4c697508e 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -34,7 +34,12 @@ pub trait VoteType: Debug + Clone + 'static + Serialize + for<'a> Deserialize<'a> + Send + Sync + PartialEq { /// The view this vote was cast for. - fn current_view(&self) -> TYPES::Time; + fn get_view(&self) -> TYPES::Time; + fn get_key(self) -> TYPES::SignatureKey; + fn get_signature(self) -> EncodedSignature; + fn get_data(self) -> TYPES::SignatureKey { + todo!() + } } /// A vote on DA proposal. @@ -192,15 +197,25 @@ pub enum QuorumVote> { } impl VoteType for DAVote { - fn current_view(&self) -> TYPES::Time { + fn get_view(&self) -> TYPES::Time { self.current_view } + fn get_key(self) -> ::SignatureKey { + self.signature_key() + } + fn get_signature(self) -> EncodedSignature { + // TODO ED Revisit this function + self.signature.1 + } } +#[deprecated] +// TODO ED Remove this impl DAVote { /// Get the signature key. /// # Panics /// If the deserialization fails. + #[deprecated] pub fn signature_key(&self) -> TYPES::SignatureKey { ::from_bytes(&self.signature.0).unwrap() } @@ -209,16 +224,24 @@ impl DAVote { impl> VoteType for QuorumVote { - fn current_view(&self) -> TYPES::Time { + fn get_view(&self) -> TYPES::Time { match self { QuorumVote::Yes(v) | QuorumVote::No(v) => v.current_view, QuorumVote::Timeout(v) => v.current_view, } } + + fn get_key(self) -> ::SignatureKey { + self.signature_key() + } + fn get_signature(self) -> EncodedSignature { + self.signature() + } } impl> QuorumVote { /// Get the encoded signature. + #[deprecated] pub fn signature(&self) -> EncodedSignature { match &self { Self::Yes(vote) | Self::No(vote) => vote.signature.1.clone(), @@ -228,6 +251,7 @@ impl> QuorumVote /// Get the signature key. /// # Panics /// If the deserialization fails. + #[deprecated] pub fn signature_key(&self) -> TYPES::SignatureKey { let encoded = match &self { Self::Yes(vote) | Self::No(vote) => vote.signature.0.clone(), @@ -238,13 +262,20 @@ impl> QuorumVote } impl VoteType for ViewSyncVote { - fn current_view(&self) -> TYPES::Time { + fn get_view(&self) -> TYPES::Time { match self { ViewSyncVote::PreCommit(v) | ViewSyncVote::Commit(v) | ViewSyncVote::Finalize(v) => { v.round } } } + fn get_key(self) -> ::SignatureKey { + self.signature_key() + } + + fn get_signature(self) -> EncodedSignature { + self.signature() + } } /// The aggreation of votes, implemented by `VoteAccumulator`. From 99e4277505062cf55f5c44916372b9f302cb82ee Mon Sep 17 00:00:00 2001 From: Keyao Shen Date: Mon, 11 Sep 2023 17:42:15 -0700 Subject: [PATCH 08/66] Modify the return type of commit --- Cargo.lock | 1 + crates/hotshot/Cargo.toml | 1 + crates/hotshot/src/demos/sdemo.rs | 8 +++++--- crates/types/src/traits/block_contents.rs | 18 ++++++++---------- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c53eaaeff0..6c783b7ff1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2644,6 +2644,7 @@ dependencies = [ "hotshot-types", "hotshot-utils", "hotshot-web-server", + "jf-primitives", "libp2p", "libp2p-identity", "libp2p-networking", diff --git a/crates/hotshot/Cargo.toml b/crates/hotshot/Cargo.toml index 7edc7363c5..e37d6a90b5 100644 --- a/crates/hotshot/Cargo.toml +++ b/crates/hotshot/Cargo.toml @@ -95,6 +95,7 @@ hotshot-types = { path = "../types", version = "0.1.0", default-features = false hotshot-utils = { path = "../utils" } hotshot-task = { path = "../task", version = "0.1.0", default-features = false } hotshot-task-impls = { path = "../task-impls", version = "0.1.0", default-features = false } +jf-primitives = { workspace = true } libp2p = { workspace = true } libp2p-identity = { workspace = true } libp2p-networking = { workspace = true } diff --git a/crates/hotshot/src/demos/sdemo.rs b/crates/hotshot/src/demos/sdemo.rs index 55ce5c1f3e..de8858cfbe 100644 --- a/crates/hotshot/src/demos/sdemo.rs +++ b/crates/hotshot/src/demos/sdemo.rs @@ -29,6 +29,7 @@ use hotshot_types::{ BlockPayload, State, }, }; +use jf_primitives::vid::VidResult; use rand::Rng; use serde::{Deserialize, Serialize}; use snafu::Snafu; @@ -234,9 +235,10 @@ impl BlockPayload for SDemoBlock { } } - fn commitment(&self) -> Commitment { - // TODO: Get the payload commitment after VID is added. - // https://github.com/EspressoSystems/HotShot/issues/1673 + fn commitment(&self) -> VidResult> { + // TODO: Get the payload commitment after VID integration. + // + // unimplemented!(); } } diff --git a/crates/types/src/traits/block_contents.rs b/crates/types/src/traits/block_contents.rs index 4a1bd0a4e1..444767fb09 100644 --- a/crates/types/src/traits/block_contents.rs +++ b/crates/types/src/traits/block_contents.rs @@ -4,7 +4,8 @@ //! behaviors that a block is expected to have. use commit::{Commitment, Committable}; -use serde::{de::DeserializeOwned, Deserialize, Serialize}; +use jf_primitives::vid::VidResult; +use serde::{de::DeserializeOwned, Serialize}; use std::{ collections::HashSet, @@ -59,14 +60,9 @@ pub trait BlockPayload: fn contained_transactions(&self) -> HashSet>; /// Compute the VID payload commitment. - fn commitment(&self) -> Commitment; + fn commitment(&self) -> VidResult>; } -/// Commitment to a block, used by data availibity -#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Ord)] -#[serde(bound(deserialize = ""), transparent)] -pub struct BlockCommitment(pub Commitment); - /// Abstraction over any type of transaction. Used by [`BlockPayload`]. pub trait Transaction: Clone + Serialize + DeserializeOwned + Debug + PartialEq + Eq + Sync + Send + Committable + Hash @@ -78,6 +74,7 @@ pub mod dummy { use std::fmt::Display; use super::{BlockPayload, Commitment, Committable, Debug, Hash, HashSet, Serialize}; + use jf_primitives::vid::VidResult; use rand::Rng; use serde::Deserialize; @@ -158,9 +155,10 @@ pub mod dummy { HashSet::new() } - fn commitment(&self) -> Commitment { - // TODO: Get the payload commitment after VID is added. - // https://github.com/EspressoSystems/HotShot/issues/1673 + fn commitment(&self) -> VidResult> { + // TODO: Get the payload commitment after VID integration. + // + // unimplemented!(); } } From a1430c594cd82e180e62742ff8d64f7085ac7196 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Tue, 12 Sep 2023 10:17:23 -0400 Subject: [PATCH 09/66] In process of adding COMMITTABLE as generic to VoteType trait --- crates/types/src/certificate.rs | 6 +++--- crates/types/src/traits/consensus_api.rs | 7 ++++--- crates/types/src/traits/election.rs | 4 ++-- crates/types/src/traits/network.rs | 2 ++ crates/types/src/vote.rs | 16 ++++++++-------- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/crates/types/src/certificate.rs b/crates/types/src/certificate.rs index dea84d01f1..51dd5b4206 100644 --- a/crates/types/src/certificate.rs +++ b/crates/types/src/certificate.rs @@ -160,7 +160,7 @@ impl> for QuorumCertificate { type Vote = QuorumVote; - type VoteAccumulator = AccumulatorPlaceholder; + type VoteAccumulator = AccumulatorPlaceholder; fn from_signatures_and_commitment( view_number: TYPES::Time, @@ -233,7 +233,7 @@ impl SignedCertificate { type Vote = DAVote; - type VoteAccumulator = AccumulatorPlaceholder; + type VoteAccumulator = AccumulatorPlaceholder; fn from_signatures_and_commitment( view_number: TYPES::Time, @@ -324,7 +324,7 @@ impl for ViewSyncCertificate { type Vote = ViewSyncVote; - type VoteAccumulator = AccumulatorPlaceholder; + type VoteAccumulator = AccumulatorPlaceholder, Self::Vote>; /// Build a QC from the threshold signature and commitment fn from_signatures_and_commitment( view_number: TYPES::Time, diff --git a/crates/types/src/traits/consensus_api.rs b/crates/types/src/traits/consensus_api.rs index 2687107886..1f83df69f1 100644 --- a/crates/types/src/traits/consensus_api.rs +++ b/crates/types/src/traits/consensus_api.rs @@ -128,9 +128,10 @@ pub trait SequencingConsensusApi< LEAF: LeafType, I: NodeImplementation>, >: ConsensusSharedApi +// TODO ED VoteType should not always be over LEAF, but for the API it doesn't matter and we are removing it soon anyway { /// Send a direct message to the given recipient - async fn send_direct_message, VOTE: VoteType>( + async fn send_direct_message, VOTE: VoteType>( &self, recipient: TYPES::SignatureKey, message: SequencingMessage, @@ -139,7 +140,7 @@ pub trait SequencingConsensusApi< /// send a direct message using the DA communication channel async fn send_direct_da_message< PROPOSAL: ProposalType, - VOTE: VoteType, + VOTE: VoteType, >( &self, recipient: TYPES::SignatureKey, @@ -149,7 +150,7 @@ pub trait SequencingConsensusApi< /// Send a broadcast message to the entire network. async fn send_broadcast_message< PROPOSAL: ProposalType, - VOTE: VoteType, + VOTE: VoteType, >( &self, message: SequencingMessage, diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index cdc47b1898..715e9c0050 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -182,9 +182,9 @@ where COMMITTABLE: Committable + Serialize + Clone, TOKEN: VoteToken, { - type Vote: VoteType; + type Vote: VoteType; - type VoteAccumulator: Accumulator2; + type VoteAccumulator: Accumulator2; fn accumulate_vote(accumulator: Self::VoteAccumulator, vote: Self::Vote, commit: COMMITTABLE) -> Either { // if !self.is_valid_vote( diff --git a/crates/types/src/traits/network.rs b/crates/types/src/traits/network.rs index ee2d09672d..b82d896d8a 100644 --- a/crates/types/src/traits/network.rs +++ b/crates/types/src/traits/network.rs @@ -195,6 +195,7 @@ pub trait ViewMessage { /// API for interacting directly with a consensus committee /// intended to be implemented for both DA and for validating consensus committees +// TODO ED Why is this generic over VOTE? #[async_trait] pub trait CommunicationChannel< TYPES: NodeType, @@ -332,6 +333,7 @@ pub trait TestableNetworkingImplementation { fn in_flight_message_count(&self) -> Option; } /// Describes additional functionality needed by the test communication channel +// TODO ED Why is this generic over VOTE? pub trait TestableChannelImplementation< TYPES: NodeType, M: NetworkMsg, diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index d4c697508e..e7f6fa9b7c 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -30,14 +30,14 @@ use std::{ use tracing::error; /// The vote sent by consensus messages. -pub trait VoteType: +pub trait VoteType: Debug + Clone + 'static + Serialize + for<'a> Deserialize<'a> + Send + Sync + PartialEq { /// The view this vote was cast for. fn get_view(&self) -> TYPES::Time; fn get_key(self) -> TYPES::SignatureKey; fn get_signature(self) -> EncodedSignature; - fn get_data(self) -> TYPES::SignatureKey { + fn get_data(self) -> VoteData { todo!() } } @@ -196,7 +196,7 @@ pub enum QuorumVote> { Timeout(TimeoutVote), } -impl VoteType for DAVote { +impl VoteType for DAVote { fn get_view(&self) -> TYPES::Time { self.current_view } @@ -221,7 +221,7 @@ impl DAVote { } } -impl> VoteType +impl> VoteType for QuorumVote { fn get_view(&self) -> TYPES::Time { @@ -261,7 +261,7 @@ impl> QuorumVote } } -impl VoteType for ViewSyncVote { +impl VoteType> for ViewSyncVote { fn get_view(&self) -> TYPES::Time { match self { ViewSyncVote::PreCommit(v) | ViewSyncVote::Commit(v) | ViewSyncVote::Finalize(v) => { @@ -288,16 +288,16 @@ pub trait Accumulator: Sized { } -pub trait Accumulator2>: Sized +pub trait Accumulator2>: Sized { fn append(self, vote: VOTE) -> Either>; } -pub struct AccumulatorPlaceholder> { +pub struct AccumulatorPlaceholder> { pub phantom: PhantomData<(TYPES, VOTE)> } -impl > Accumulator2 for AccumulatorPlaceholder { +impl > Accumulator2 for AccumulatorPlaceholder { fn append(self, vote: VOTE) -> Either> { either::Left(self) } From 2aca006008cbccf914158847e9768e9887c694d7 Mon Sep 17 00:00:00 2001 From: Keyao Shen Date: Tue, 12 Sep 2023 09:01:59 -0700 Subject: [PATCH 10/66] Fix lint --- crates/types/src/traits/block_contents.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crates/types/src/traits/block_contents.rs b/crates/types/src/traits/block_contents.rs index 444767fb09..afc714e169 100644 --- a/crates/types/src/traits/block_contents.rs +++ b/crates/types/src/traits/block_contents.rs @@ -60,6 +60,11 @@ pub trait BlockPayload: fn contained_transactions(&self) -> HashSet>; /// Compute the VID payload commitment. + /// + /// # Errors + /// - `VidResult::Err` in case of actual error. + /// - `VidResult::Ok(Result::Err)` if verification fails. + /// - `VidResult::Ok(Result::Ok)` if verification succeeds. fn commitment(&self) -> VidResult>; } From 78625c625955348ef1513139d29b6175284b986b Mon Sep 17 00:00:00 2001 From: Brendon Fish Date: Tue, 12 Sep 2023 12:43:28 -0400 Subject: [PATCH 11/66] creating transactions task for block building --- crates/task-impls/src/consensus.rs | 3 +- crates/task-impls/src/events.rs | 4 + crates/task-impls/src/transactions.rs | 181 ++++++++++++++++++++++++++ 3 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 crates/task-impls/src/transactions.rs diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index 03fcc387a8..80e6510873 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -543,7 +543,7 @@ where let view = proposal.data.get_view_number(); if view < self.cur_view { - error!("view too high"); + debug!("Proposal is from an older view. "); return; } @@ -827,6 +827,7 @@ where .update(-(i64::try_from(included_txn_size).unwrap_or(i64::MAX))); debug!("about to publish decide"); + self.event_stream.publish(SequencingHotShotEvent::LeafDecided(leaf_views.clone())).await; let decide_sent = self.output_event_stream.publish(Event { view_number: consensus.last_decided_view, event: EventType::Decide { diff --git a/crates/task-impls/src/events.rs b/crates/task-impls/src/events.rs index 98819108a4..e3b50979d4 100644 --- a/crates/task-impls/src/events.rs +++ b/crates/task-impls/src/events.rs @@ -62,4 +62,8 @@ pub enum SequencingHotShotEvent> { TransactionSend(TYPES::Transaction, TYPES::SignatureKey), /// Event to send DA block data from DA leader to next quorum leader (which should always be the same node); internal event only SendDABlockData(TYPES::BlockType), + /// Event when the transactions task has a block formed + BlockReady(TYPES::BlockType), + /// Event when consensus decided on a leaf + LeafDecided(Vec), } diff --git a/crates/task-impls/src/transactions.rs b/crates/task-impls/src/transactions.rs new file mode 100644 index 0000000000..8ea635d750 --- /dev/null +++ b/crates/task-impls/src/transactions.rs @@ -0,0 +1,181 @@ +use crate::events::SequencingHotShotEvent; +use async_compatibility_layer::{ + art::{async_spawn, async_timeout}, + async_primitives::subscribable_rwlock::ReadView, +}; +use async_lock::RwLock; +use bincode::config::Options; +use bitvec::prelude::*; +use commit::Committable; +use either::{Either, Left, Right}; +use futures::FutureExt; +use hotshot_task::{ + event_stream::{ChannelStream, EventStream}, + global_registry::GlobalRegistry, + task::{FilterEvent, HandleEvent, HotShotTaskCompleted, HotShotTaskTypes, TS}, + task_impls::{HSTWithEvent, TaskBuilder}, +}; +use hotshot_types::{ + certificate::DACertificate, + consensus::{Consensus, View}, + data::{DAProposal, ProposalType, SequencingLeaf}, + message::{CommitteeConsensusMessage, Message, Proposal, SequencingMessage}, + traits::{ + consensus_api::SequencingConsensusApi, + election::{CommitteeExchangeType, ConsensusExchange, Membership}, + network::{CommunicationChannel, ConsensusIntentEvent}, + node_implementation::{CommitteeEx, NodeImplementation, NodeType}, + signature_key::SignatureKey, + state::ConsensusTime, + Block, State, + }, + utils::ViewInner, + vote::VoteAccumulator, +}; +use hotshot_utils::bincode::bincode_opts; +use snafu::Snafu; +use std::{ + collections::{HashMap, HashSet}, + sync::Arc, + time::Instant, +}; +use tracing::{debug, error, instrument, warn}; + +#[derive(Snafu, Debug)] +/// Error type for consensus tasks +pub struct ConsensusTaskError {} + +/// Tracks state of a DA task +pub struct TransactionTaskState< + TYPES: NodeType, + I: NodeImplementation< + TYPES, + Leaf = SequencingLeaf, + ConsensusMessage = SequencingMessage, + >, + A: SequencingConsensusApi, I> + 'static, +> where + CommitteeEx: ConsensusExchange< + TYPES, + Message, + Certificate = DACertificate, + Commitment = TYPES::BlockType, + >, +{ + /// The state's api + pub api: A, + /// Global registry task for the state + pub registry: GlobalRegistry, + + /// View number this view is executing in. + pub cur_view: TYPES::Time, + + // pub transactions: Arc>>, + /// Reference to consensus. Leader will require a read lock on this. + pub consensus: Arc>>>, + + /// the committee exchange + pub committee_exchange: Arc>, + + /// The view and ID of the current vote collection task, if there is one. + pub vote_collector: Option<(TYPES::Time, usize, usize)>, + + /// Global events stream to publish events + pub event_stream: ChannelStream>, + + /// This state's ID + pub id: u64, + + /// Event stream to publish events to the application layer + pub output_event_stream: ChannelStream>, +} + + +impl< + TYPES: NodeType, + I: NodeImplementation< + TYPES, + Leaf = SequencingLeaf, + ConsensusMessage = SequencingMessage, + >, + A: SequencingConsensusApi, I> + 'static, + > DATaskState +where + CommitteeEx: ConsensusExchange< + TYPES, + Message, + Certificate = DACertificate, + Commitment = TYPES::BlockType, + >, +{ + /// main task event handler + #[instrument(skip_all, fields(id = self.id, view = *self.cur_view), name = "DA Main Task", level = "error")] + + pub async fn handle_event( + &mut self, + event: SequencingHotShotEvent, + ) -> Option { + match event { + SequencingHotShotEvent::TransactionsRecv(transactions) => { + // TODO ED Add validation checks + let mut consensus = self.consensus.write().await; + consensus + .get_transactions() + .modify(|txns| { + for transaction in transactions { + let size = bincode_opts().serialized_size(&transaction).unwrap_or(0); + + // If we didn't already know about this transaction, update our mempool metrics. + if !consensus.seen_transactions.remove(&transaction.commit()) + && txns.insert(transaction.commit(), transaction).is_none() + { + consensus.metrics.outstanding_transactions.update(1); + consensus + .metrics + .outstanding_transactions_memory_size + .update(i64::try_from(size).unwrap_or_else(|e| { + warn!("Conversion failed: {e}. Using the max value."); + i64::MAX + })); + } + } + }) + .await; + + return None; + } + SequencingHotShotEvent::DAProposalRecv(proposal, sender) => { + } + SequencingHotShotEvent::LeafDecided(leaf_chain) => { + for leaf in leaf_chain { + match &leaf.deltas { + Left(block) => { + let txns = block.contained_transactions(); + for txn in txns { + included_txns.insert(txn); + } + } + Right(_) => {} + } + } + + } + // TODO ED Update high QC through QCFormed event + SequencingHotShotEvent::ViewChange(view) => { + } + + SequencingHotShotEvent::Timeout(view) => { + self.committee_exchange + .network() + .inject_consensus_info(ConsensusIntentEvent::CancelPollForVotes(*view)) + .await; + } + + SequencingHotShotEvent::Shutdown => { + return Some(HotShotTaskCompleted::ShutDown); + } + _ => {} + } + None + } +} \ No newline at end of file From a92e8c6baab9692abaaab78df23fd5cee90e9d60 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Tue, 12 Sep 2023 18:09:35 -0400 Subject: [PATCH 12/66] Remove PROPOSAL and VOTE generics from CommunicalChannel trait --- crates/types/src/traits/consensus_api.rs | 2 +- crates/types/src/traits/election.rs | 30 +++++++++++-------- crates/types/src/traits/network.rs | 6 +--- .../types/src/traits/node_implementation.rs | 17 ++++------- 4 files changed, 24 insertions(+), 31 deletions(-) diff --git a/crates/types/src/traits/consensus_api.rs b/crates/types/src/traits/consensus_api.rs index 1f83df69f1..f9e19e917b 100644 --- a/crates/types/src/traits/consensus_api.rs +++ b/crates/types/src/traits/consensus_api.rs @@ -150,7 +150,7 @@ pub trait SequencingConsensusApi< /// Send a broadcast message to the entire network. async fn send_broadcast_message< PROPOSAL: ProposalType, - VOTE: VoteType, + VOTE: VoteType, >( &self, message: SequencingMessage, diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 715e9c0050..63abcff9fb 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -19,6 +19,7 @@ use crate::{ vote::ViewSyncVoteInternal, }; +use crate::vote::Accumulator2; use crate::{ data::LeafType, traits::{ @@ -42,7 +43,6 @@ use serde::{Deserialize, Serialize}; use snafu::Snafu; use std::{collections::BTreeSet, fmt::Debug, hash::Hash, marker::PhantomData, num::NonZeroU64}; use tracing::error; -use crate::vote::Accumulator2; /// Error for election problems #[derive(Snafu, Debug)] @@ -184,9 +184,13 @@ where { type Vote: VoteType; - type VoteAccumulator: Accumulator2; + type VoteAccumulator: Accumulator2; - fn accumulate_vote(accumulator: Self::VoteAccumulator, vote: Self::Vote, commit: COMMITTABLE) -> Either { + fn accumulate_vote( + accumulator: Self::VoteAccumulator, + vote: Self::Vote, + commit: COMMITTABLE, + ) -> Either { // if !self.is_valid_vote( // &vote.encoded_key, // &vote.encoded_signature, @@ -306,7 +310,7 @@ pub trait ConsensusExchange: Send + Sync { /// The committee eligible to make decisions. type Membership: Membership; /// Network used by [`Membership`](Self::Membership) to communicate. - type Networking: CommunicationChannel; + type Networking: CommunicationChannel; /// Commitments to items which are the subject of proposals and decisions. type Commitment: Committable + Serialize + Clone; @@ -548,7 +552,7 @@ pub trait CommitteeExchangeType: pub struct CommitteeExchange< TYPES: NodeType, MEMBERSHIP: Membership, - NETWORK: CommunicationChannel, DAVote, MEMBERSHIP>, + NETWORK: CommunicationChannel, M: NetworkMsg, > { /// The network being used by this exchange. @@ -569,7 +573,7 @@ pub struct CommitteeExchange< impl< TYPES: NodeType, MEMBERSHIP: Membership, - NETWORK: CommunicationChannel, DAVote, MEMBERSHIP>, + NETWORK: CommunicationChannel, M: NetworkMsg, > CommitteeExchangeType for CommitteeExchange { @@ -618,7 +622,7 @@ impl< impl< TYPES: NodeType, MEMBERSHIP: Membership, - NETWORK: CommunicationChannel, DAVote, MEMBERSHIP>, + NETWORK: CommunicationChannel, M: NetworkMsg, > ConsensusExchange for CommitteeExchange { @@ -782,7 +786,7 @@ pub struct QuorumExchange< LEAF: LeafType, PROPOSAL: ProposalType, MEMBERSHIP: Membership, - NETWORK: CommunicationChannel, MEMBERSHIP>, + NETWORK: CommunicationChannel, M: NetworkMsg, > { /// The network being used by this exchange. @@ -805,7 +809,7 @@ impl< LEAF: LeafType, MEMBERSHIP: Membership, PROPOSAL: ProposalType, - NETWORK: CommunicationChannel, MEMBERSHIP>, + NETWORK: CommunicationChannel, M: NetworkMsg, > QuorumExchangeType for QuorumExchange @@ -937,7 +941,7 @@ impl< LEAF: LeafType, PROPOSAL: ProposalType, MEMBERSHIP: Membership, - NETWORK: CommunicationChannel, MEMBERSHIP>, + NETWORK: CommunicationChannel, M: NetworkMsg, > ConsensusExchange for QuorumExchange @@ -1074,7 +1078,7 @@ pub struct ViewSyncExchange< TYPES: NodeType, PROPOSAL: ProposalType, MEMBERSHIP: Membership, - NETWORK: CommunicationChannel, MEMBERSHIP>, + NETWORK: CommunicationChannel, M: NetworkMsg, > { /// The network being used by this exchange. @@ -1096,7 +1100,7 @@ impl< TYPES: NodeType, MEMBERSHIP: Membership, PROPOSAL: ProposalType, - NETWORK: CommunicationChannel, MEMBERSHIP>, + NETWORK: CommunicationChannel, M: NetworkMsg, > ViewSyncExchangeType for ViewSyncExchange { @@ -1297,7 +1301,7 @@ impl< TYPES: NodeType, PROPOSAL: ProposalType, MEMBERSHIP: Membership, - NETWORK: CommunicationChannel, MEMBERSHIP>, + NETWORK: CommunicationChannel, M: NetworkMsg, > ConsensusExchange for ViewSyncExchange { diff --git a/crates/types/src/traits/network.rs b/crates/types/src/traits/network.rs index b82d896d8a..b2ad46588e 100644 --- a/crates/types/src/traits/network.rs +++ b/crates/types/src/traits/network.rs @@ -200,8 +200,6 @@ pub trait ViewMessage { pub trait CommunicationChannel< TYPES: NodeType, M: NetworkMsg, - PROPOSAL: ProposalType, - VOTE: VoteType, MEMBERSHIP: Membership, >: Clone + Debug + Send + Sync + 'static { @@ -337,11 +335,9 @@ pub trait TestableNetworkingImplementation { pub trait TestableChannelImplementation< TYPES: NodeType, M: NetworkMsg, - PROPOSAL: ProposalType, - VOTE: VoteType, MEMBERSHIP: Membership, NETWORK, ->: CommunicationChannel +>: CommunicationChannel { /// generates the `CommunicationChannel` given it's associated network type fn generate_network() -> Box) -> Self + 'static>; diff --git a/crates/types/src/traits/node_implementation.rs b/crates/types/src/traits/node_implementation.rs index 8ba5abdebb..217e1a0244 100644 --- a/crates/types/src/traits/node_implementation.rs +++ b/crates/types/src/traits/node_implementation.rs @@ -401,24 +401,21 @@ where QuorumCommChannel: TestableChannelImplementation< TYPES, Message, - QuorumProposalType, - QuorumVoteType, + QuorumMembership, QuorumNetwork, >, CommitteeCommChannel: TestableChannelImplementation< TYPES, Message, - CommitteeProposalType, - CommitteeVote, + CommitteeMembership, QuorumNetwork, >, ViewSyncCommChannel: TestableChannelImplementation< TYPES, Message, - ViewSyncProposalType, - ViewSyncVoteType, + ViewSyncMembership, QuorumNetwork, >, @@ -518,8 +515,7 @@ pub type ViewSyncMembership = QuorumMembership; pub type QuorumNetwork = as CommunicationChannel< TYPES, Message, - QuorumProposalType, - QuorumVoteType, + QuorumMembership, >>::NETWORK; @@ -527,8 +523,7 @@ pub type QuorumNetwork = as Communication pub type CommitteeNetwork = as CommunicationChannel< TYPES, Message, - CommitteeProposalType, - CommitteeVote, + CommitteeMembership, >>::NETWORK; @@ -536,8 +531,6 @@ pub type CommitteeNetwork = as Communi pub type ViewSyncNetwork = as CommunicationChannel< TYPES, Message, - ViewSyncProposalType, - ViewSyncVoteType, ViewSyncMembership, >>::NETWORK; From 3a7146fa4bd258a6c04e8b5f4f052b85ced8e6d7 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Tue, 12 Sep 2023 18:19:43 -0400 Subject: [PATCH 13/66] More removal of PROPOSAL and VOTE from CommunicationChannel trait --- crates/hotshot/src/tasks/mod.rs | 7 ++- .../src/traits/networking/libp2p_network.rs | 41 +++++------------- .../src/traits/networking/memory_network.rs | 43 +++++-------------- .../networking/web_server_libp2p_fallback.rs | 8 ++-- .../traits/networking/web_server_network.rs | 33 +++++--------- crates/task-impls/src/network.rs | 22 ++++------ crates/types/src/traits/election.rs | 2 +- crates/types/src/vote.rs | 2 +- 8 files changed, 47 insertions(+), 111 deletions(-) diff --git a/crates/hotshot/src/tasks/mod.rs b/crates/hotshot/src/tasks/mod.rs index 55e430cbe4..30054a342b 100644 --- a/crates/hotshot/src/tasks/mod.rs +++ b/crates/hotshot/src/tasks/mod.rs @@ -148,7 +148,7 @@ pub async fn add_network_message_task< // This bound is required so that we can call the `recv_msgs` function of `CommunicationChannel`. where EXCHANGE::Networking: - CommunicationChannel, PROPOSAL, VOTE, MEMBERSHIP>, + CommunicationChannel, MEMBERSHIP>, { let channel = exchange.network().clone(); let broadcast_stream = GeneratedStream::>::new(Arc::new(move || { @@ -259,13 +259,12 @@ pub async fn add_network_event_task< // This bound is required so that we can call the `recv_msgs` function of `CommunicationChannel`. where EXCHANGE::Networking: - CommunicationChannel, PROPOSAL, VOTE, MEMBERSHIP>, + CommunicationChannel, MEMBERSHIP>, { let filter = NetworkEventTaskState::< TYPES, I, - PROPOSAL, - VOTE, + MEMBERSHIP, >::Networking, >::filter(task_kind); diff --git a/crates/hotshot/src/traits/networking/libp2p_network.rs b/crates/hotshot/src/traits/networking/libp2p_network.rs index c01bf53982..22fc6da209 100644 --- a/crates/hotshot/src/traits/networking/libp2p_network.rs +++ b/crates/hotshot/src/traits/networking/libp2p_network.rs @@ -715,21 +715,14 @@ impl ConnectedNetwork for Libp2p pub struct Libp2pCommChannel< TYPES: NodeType, I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, MEMBERSHIP: Membership, >( Arc, TYPES::SignatureKey>>, - PhantomData<(TYPES, I, PROPOSAL, VOTE, MEMBERSHIP)>, + PhantomData<(TYPES, I, MEMBERSHIP)>, ); -impl< - TYPES: NodeType, - I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, - MEMBERSHIP: Membership, - > Libp2pCommChannel +impl, MEMBERSHIP: Membership> + Libp2pCommChannel { /// create a new libp2p communication channel #[must_use] @@ -741,11 +734,10 @@ impl< impl< TYPES: NodeType, I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, + MEMBERSHIP: Membership, > TestableNetworkingImplementation> - for Libp2pCommChannel + for Libp2pCommChannel where MessageKind: ViewMessage, { @@ -787,14 +779,9 @@ where // top // we don't really want to make this the default implementation because that forces it to require ConnectedNetwork to be implemented. The struct we implement over might use multiple ConnectedNetworks #[async_trait] -impl< - TYPES: NodeType, - I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, - MEMBERSHIP: Membership, - > CommunicationChannel, PROPOSAL, VOTE, MEMBERSHIP> - for Libp2pCommChannel +impl, MEMBERSHIP: Membership> + CommunicationChannel, MEMBERSHIP> + for Libp2pCommChannel where MessageKind: ViewMessage, { @@ -860,21 +847,13 @@ where } } -impl< - TYPES: NodeType, - I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, - MEMBERSHIP: Membership, - > +impl, MEMBERSHIP: Membership> TestableChannelImplementation< TYPES, Message, - PROPOSAL, - VOTE, MEMBERSHIP, Libp2pNetwork, TYPES::SignatureKey>, - > for Libp2pCommChannel + > for Libp2pCommChannel { fn generate_network( ) -> Box, TYPES::SignatureKey>>) -> Self + 'static> diff --git a/crates/hotshot/src/traits/networking/memory_network.rs b/crates/hotshot/src/traits/networking/memory_network.rs index d6269e2c38..b2e7ddf6f3 100644 --- a/crates/hotshot/src/traits/networking/memory_network.rs +++ b/crates/hotshot/src/traits/networking/memory_network.rs @@ -465,21 +465,18 @@ impl ConnectedNetwork for Memory pub struct MemoryCommChannel< TYPES: NodeType, I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, MEMBERSHIP: Membership, >( Arc, TYPES::SignatureKey>>, - PhantomData<(I, PROPOSAL, VOTE, MEMBERSHIP)>, + PhantomData<(I, MEMBERSHIP)>, ); impl< TYPES: NodeType, I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, + MEMBERSHIP: Membership, - > MemoryCommChannel + > MemoryCommChannel { /// create new communication channel #[must_use] @@ -488,14 +485,9 @@ impl< } } -impl< - TYPES: NodeType, - I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, - MEMBERSHIP: Membership, - > TestableNetworkingImplementation> - for MemoryCommChannel +impl, MEMBERSHIP: Membership> + TestableNetworkingImplementation> + for MemoryCommChannel where MessageKind: ViewMessage, { @@ -525,14 +517,9 @@ where } #[async_trait] -impl< - TYPES: NodeType, - I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, - MEMBERSHIP: Membership, - > CommunicationChannel, PROPOSAL, VOTE, MEMBERSHIP> - for MemoryCommChannel +impl, MEMBERSHIP: Membership> + CommunicationChannel, MEMBERSHIP> + for MemoryCommChannel where MessageKind: ViewMessage, { @@ -598,21 +585,13 @@ where } } -impl< - TYPES: NodeType, - I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, - MEMBERSHIP: Membership, - > +impl, MEMBERSHIP: Membership> TestableChannelImplementation< TYPES, Message, - PROPOSAL, - VOTE, MEMBERSHIP, MemoryNetwork, TYPES::SignatureKey>, - > for MemoryCommChannel + > for MemoryCommChannel { fn generate_network( ) -> Box, TYPES::SignatureKey>>) -> Self + 'static> diff --git a/crates/hotshot/src/traits/networking/web_server_libp2p_fallback.rs b/crates/hotshot/src/traits/networking/web_server_libp2p_fallback.rs index 723c7c071d..825fbd4216 100644 --- a/crates/hotshot/src/traits/networking/web_server_libp2p_fallback.rs +++ b/crates/hotshot/src/traits/networking/web_server_libp2p_fallback.rs @@ -161,7 +161,7 @@ impl< PROPOSAL: ProposalType, VOTE: VoteType, MEMBERSHIP: Membership, - > CommunicationChannel, PROPOSAL, VOTE, MEMBERSHIP> + > CommunicationChannel,MEMBERSHIP> for WebServerWithFallbackCommChannel { type NETWORK = CombinedNetworks; @@ -299,15 +299,13 @@ impl< impl< TYPES: NodeType, I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, + MEMBERSHIP: Membership, > TestableChannelImplementation< TYPES, Message, - PROPOSAL, - VOTE, + MEMBERSHIP, CombinedNetworks, > for WebServerWithFallbackCommChannel diff --git a/crates/hotshot/src/traits/networking/web_server_network.rs b/crates/hotshot/src/traits/networking/web_server_network.rs index e0001b94ab..9b3d269282 100644 --- a/crates/hotshot/src/traits/networking/web_server_network.rs +++ b/crates/hotshot/src/traits/networking/web_server_network.rs @@ -48,21 +48,18 @@ use tracing::{debug, error, info}; pub struct WebCommChannel< TYPES: NodeType, I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, MEMBERSHIP: Membership, >( Arc, TYPES::SignatureKey, TYPES>>, - PhantomData<(MEMBERSHIP, I, PROPOSAL, VOTE)>, + PhantomData<(MEMBERSHIP, I)>, ); impl< TYPES: NodeType, I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, + MEMBERSHIP: Membership, - > WebCommChannel + > WebCommChannel { /// Create new communication channel #[must_use] @@ -521,11 +518,10 @@ impl< impl< TYPES: NodeType, I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, + MEMBERSHIP: Membership, - > CommunicationChannel, PROPOSAL, VOTE, MEMBERSHIP> - for WebCommChannel + > CommunicationChannel, MEMBERSHIP> + for WebCommChannel { type NETWORK = WebServerNetwork, TYPES::SignatureKey, TYPES>; /// Blocks until node is successfully initialized @@ -1055,11 +1051,10 @@ impl> impl< TYPES: NodeType, I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, + MEMBERSHIP: Membership, > TestableNetworkingImplementation> - for WebCommChannel + for WebCommChannel { fn generator( expected_node_count: usize, @@ -1087,21 +1082,13 @@ impl< } } -impl< - TYPES: NodeType, - I: NodeImplementation, - PROPOSAL: ProposalType, - VOTE: VoteType, - MEMBERSHIP: Membership, - > +impl, MEMBERSHIP: Membership> TestableChannelImplementation< TYPES, Message, - PROPOSAL, - VOTE, MEMBERSHIP, WebServerNetwork, TYPES::SignatureKey, TYPES>, - > for WebCommChannel + > for WebCommChannel { fn generate_network() -> Box< dyn Fn(Arc, TYPES::SignatureKey, TYPES>>) -> Self diff --git a/crates/task-impls/src/network.rs b/crates/task-impls/src/network.rs index b50a4143ea..cdaf0a17ae 100644 --- a/crates/task-impls/src/network.rs +++ b/crates/task-impls/src/network.rs @@ -137,10 +137,8 @@ pub struct NetworkEventTaskState< Leaf = SequencingLeaf, ConsensusMessage = SequencingMessage, >, - PROPOSAL: ProposalType, - VOTE: VoteType, MEMBERSHIP: Membership, - COMMCHANNEL: CommunicationChannel, PROPOSAL, VOTE, MEMBERSHIP>, + COMMCHANNEL: CommunicationChannel, MEMBERSHIP>, > { /// comm channel pub channel: COMMCHANNEL, @@ -149,7 +147,7 @@ pub struct NetworkEventTaskState< /// view number pub view: TYPES::Time, /// phantom data - pub phantom: PhantomData<(PROPOSAL, VOTE, MEMBERSHIP)>, + pub phantom: PhantomData<(MEMBERSHIP)>, // TODO ED Need to add exchange so we can get the recipient key and our own key? } @@ -160,11 +158,9 @@ impl< Leaf = SequencingLeaf, ConsensusMessage = SequencingMessage, >, - PROPOSAL: ProposalType, - VOTE: VoteType, MEMBERSHIP: Membership, - COMMCHANNEL: CommunicationChannel, PROPOSAL, VOTE, MEMBERSHIP>, - > TS for NetworkEventTaskState + COMMCHANNEL: CommunicationChannel, MEMBERSHIP>, + > TS for NetworkEventTaskState { } @@ -175,11 +171,9 @@ impl< Leaf = SequencingLeaf, ConsensusMessage = SequencingMessage, >, - PROPOSAL: ProposalType, - VOTE: VoteType, MEMBERSHIP: Membership, - COMMCHANNEL: CommunicationChannel, PROPOSAL, VOTE, MEMBERSHIP>, - > NetworkEventTaskState + COMMCHANNEL: CommunicationChannel, MEMBERSHIP>, + > NetworkEventTaskState { /// Handle the given event. /// @@ -348,9 +342,9 @@ pub type NetworkMessageTaskTypes = HSTWithMessage< >; /// network event task types -pub type NetworkEventTaskTypes = HSTWithEvent< +pub type NetworkEventTaskTypes = HSTWithEvent< NetworkTaskError, SequencingHotShotEvent, ChannelStream>, - NetworkEventTaskState, + NetworkEventTaskState, >; diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 63abcff9fb..4f598ee5f1 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -302,7 +302,7 @@ pub trait ConsensusExchange: Send + Sync { /// A proposal for participants to vote on. type Proposal: ProposalType; /// A vote on a [`Proposal`](Self::Proposal). - type Vote: VoteType; + type Vote: VoteType; /// A [`SignedCertificate`] attesting to a decision taken by the committee. type Certificate: SignedCertificate + Hash diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index e7f6fa9b7c..720805af65 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -294,7 +294,7 @@ pub trait Accumulator2> { - pub phantom: PhantomData<(TYPES, VOTE)> + pub phantom: PhantomData<(TYPES, VOTE, COMMITTABLE)> } impl > Accumulator2 for AccumulatorPlaceholder { From 149a404edc8fe09e26e8965e01f3f2368716f7cd Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Tue, 12 Sep 2023 18:48:38 -0400 Subject: [PATCH 14/66] Lints --- crates/hotshot/examples/infra/modDA.rs | 157 +++------------ .../hotshot/examples/web-server-da/types.rs | 9 +- crates/hotshot/src/lib.rs | 19 +- crates/hotshot/src/tasks/mod.rs | 21 +- .../src/traits/networking/libp2p_network.rs | 12 +- .../src/traits/networking/memory_network.rs | 10 +- .../networking/web_server_libp2p_fallback.rs | 19 +- .../traits/networking/web_server_network.rs | 30 +-- crates/task-impls/src/consensus.rs | 10 +- crates/task-impls/src/da.rs | 6 +- crates/task-impls/src/network.rs | 4 +- crates/testing/src/node_types.rs | 181 ++++++++---------- crates/testing/src/test_launcher.rs | 2 - crates/testing/src/test_runner.rs | 4 - crates/types/src/certificate.rs | 5 +- crates/types/src/traits/consensus_api.rs | 16 +- crates/types/src/traits/election.rs | 22 +-- crates/types/src/traits/network.rs | 13 +- .../types/src/traits/node_implementation.rs | 5 - crates/types/src/vote.rs | 49 +++-- 20 files changed, 199 insertions(+), 395 deletions(-) diff --git a/crates/hotshot/examples/infra/modDA.rs b/crates/hotshot/examples/infra/modDA.rs index 729cbfd79f..63e222faed 100644 --- a/crates/hotshot/examples/infra/modDA.rs +++ b/crates/hotshot/examples/infra/modDA.rs @@ -19,7 +19,7 @@ use hotshot_orchestrator::{ use hotshot_task::task::FilterEvent; use hotshot_types::{ certificate::ViewSyncCertificate, - data::{DAProposal, QuorumProposal, SequencingLeaf, TestableLeaf}, + data::{QuorumProposal, SequencingLeaf, TestableLeaf}, event::{Event, EventType}, message::{Message, SequencingMessage}, traits::{ @@ -33,7 +33,6 @@ use hotshot_types::{ }, state::{ConsensusTime, TestableBlock, TestableState}, }, - vote::{DAVote, QuorumVote, ViewSyncVote}, HotShotConfig, }; // use libp2p::{ @@ -67,27 +66,9 @@ use tracing::{debug, error, info, warn}; pub async fn run_orchestrator_da< TYPES: NodeType, MEMBERSHIP: Membership + Debug, - DANETWORK: CommunicationChannel< - TYPES, - Message, - DAProposal, - DAVote, - MEMBERSHIP, - > + Debug, - QUORUMNETWORK: CommunicationChannel< - TYPES, - Message, - QuorumProposal>, - QuorumVote>, - MEMBERSHIP, - > + Debug, - VIEWSYNCNETWORK: CommunicationChannel< - TYPES, - Message, - ViewSyncCertificate, - ViewSyncVote, - MEMBERSHIP, - > + Debug, + DANETWORK: CommunicationChannel, MEMBERSHIP> + Debug, + QUORUMNETWORK: CommunicationChannel, MEMBERSHIP> + Debug, + VIEWSYNCNETWORK: CommunicationChannel, MEMBERSHIP> + Debug, NODE: NodeImplementation< TYPES, Leaf = SequencingLeaf, @@ -135,27 +116,9 @@ pub async fn run_orchestrator_da< pub trait RunDA< TYPES: NodeType, MEMBERSHIP: Membership + Debug, - DANETWORK: CommunicationChannel< - TYPES, - Message, - DAProposal, - DAVote, - MEMBERSHIP, - > + Debug, - QUORUMNETWORK: CommunicationChannel< - TYPES, - Message, - QuorumProposal>, - QuorumVote>, - MEMBERSHIP, - > + Debug, - VIEWSYNCNETWORK: CommunicationChannel< - TYPES, - Message, - ViewSyncCertificate, - ViewSyncVote, - MEMBERSHIP, - > + Debug, + DANETWORK: CommunicationChannel, MEMBERSHIP> + Debug, + QUORUMNETWORK: CommunicationChannel, MEMBERSHIP> + Debug, + VIEWSYNCNETWORK: CommunicationChannel, MEMBERSHIP> + Debug, NODE: NodeImplementation< TYPES, Leaf = SequencingLeaf, @@ -416,21 +379,13 @@ pub trait RunDA< // WEB SERVER /// Alias for the [`WebCommChannel`] for sequencing consensus. -type StaticDAComm = - WebCommChannel, DAVote, MEMBERSHIP>; +type StaticDAComm = WebCommChannel; /// Alias for the ['WebCommChannel'] for validating consensus -type StaticQuorumComm = WebCommChannel< - TYPES, - I, - QuorumProposal>, - QuorumVote>, - MEMBERSHIP, ->; +type StaticQuorumComm = WebCommChannel; /// Alias for the ['WebCommChannel'] for view sync consensus -type StaticViewSyncComm = - WebCommChannel, ViewSyncVote, MEMBERSHIP>; +type StaticViewSyncComm = WebCommChannel; /// Represents a web server-based run pub struct WebServerDARun< @@ -463,32 +418,20 @@ impl< SequencingLeaf, QuorumProposal>, MEMBERSHIP, - WebCommChannel< - TYPES, - NODE, - QuorumProposal>, - QuorumVote>, - MEMBERSHIP, - >, + WebCommChannel, Message, >, CommitteeExchange< TYPES, MEMBERSHIP, - WebCommChannel, DAVote, MEMBERSHIP>, + WebCommChannel, Message, >, ViewSyncExchange< TYPES, ViewSyncCertificate, MEMBERSHIP, - WebCommChannel< - TYPES, - NODE, - ViewSyncCertificate, - ViewSyncVote, - MEMBERSHIP, - >, + WebCommChannel, Message, >, >, @@ -540,21 +483,11 @@ where ); // Create the network - let quorum_network: WebCommChannel< - TYPES, - NODE, - QuorumProposal>, - QuorumVote>, - MEMBERSHIP, - > = WebCommChannel::new(underlying_quorum_network.clone().into()); + let quorum_network: WebCommChannel = + WebCommChannel::new(underlying_quorum_network.clone().into()); - let view_sync_network: WebCommChannel< - TYPES, - NODE, - ViewSyncCertificate, - ViewSyncVote, - MEMBERSHIP, - > = WebCommChannel::new(underlying_quorum_network.into()); + let view_sync_network: WebCommChannel = + WebCommChannel::new(underlying_quorum_network.into()); let WebServerConfig { host, @@ -563,17 +496,10 @@ where }: WebServerConfig = config.clone().da_web_server_config.unwrap(); // Each node runs the DA network so that leaders have access to transactions and DA votes - let da_network: WebCommChannel, DAVote, MEMBERSHIP> = - WebCommChannel::new( - WebServerNetwork::create( - &host.to_string(), - port, - wait_between_polls, - pub_key, - true, - ) + let da_network: WebCommChannel = WebCommChannel::new( + WebServerNetwork::create(&host.to_string(), port, wait_between_polls, pub_key, true) .into(), - ); + ); WebServerDARun { config, @@ -583,28 +509,15 @@ where } } - fn get_da_network( - &self, - ) -> WebCommChannel, DAVote, MEMBERSHIP> { + fn get_da_network(&self) -> WebCommChannel { self.da_network.clone() } - fn get_quorum_network( - &self, - ) -> WebCommChannel< - TYPES, - NODE, - QuorumProposal>, - QuorumVote>, - MEMBERSHIP, - > { + fn get_quorum_network(&self) -> WebCommChannel { self.quorum_network.clone() } - fn get_view_sync_network( - &self, - ) -> WebCommChannel, ViewSyncVote, MEMBERSHIP> - { + fn get_view_sync_network(&self) -> WebCommChannel { self.view_sync_network.clone() } @@ -623,27 +536,9 @@ where pub async fn main_entry_point< TYPES: NodeType, MEMBERSHIP: Membership + Debug, - DANETWORK: CommunicationChannel< - TYPES, - Message, - DAProposal, - DAVote, - MEMBERSHIP, - > + Debug, - QUORUMNETWORK: CommunicationChannel< - TYPES, - Message, - QuorumProposal>, - QuorumVote>, - MEMBERSHIP, - > + Debug, - VIEWSYNCNETWORK: CommunicationChannel< - TYPES, - Message, - ViewSyncCertificate, - ViewSyncVote, - MEMBERSHIP, - > + Debug, + DANETWORK: CommunicationChannel, MEMBERSHIP> + Debug, + QUORUMNETWORK: CommunicationChannel, MEMBERSHIP> + Debug, + VIEWSYNCNETWORK: CommunicationChannel, MEMBERSHIP> + Debug, NODE: NodeImplementation< TYPES, Leaf = SequencingLeaf, diff --git a/crates/hotshot/examples/web-server-da/types.rs b/crates/hotshot/examples/web-server-da/types.rs index 9ea1f9a694..6827a00fe8 100644 --- a/crates/hotshot/examples/web-server-da/types.rs +++ b/crates/hotshot/examples/web-server-da/types.rs @@ -25,12 +25,9 @@ pub struct NodeImpl {} pub type ThisLeaf = SequencingLeaf; pub type ThisMembership = GeneralStaticCommittee::SignatureKey>; -pub type DANetwork = - WebCommChannel; -pub type QuorumNetwork = - WebCommChannel; -pub type ViewSyncNetwork = - WebCommChannel; +pub type DANetwork = WebCommChannel; +pub type QuorumNetwork = WebCommChannel; +pub type ViewSyncNetwork = WebCommChannel; pub type ThisDAProposal = DAProposal; pub type ThisDAVote = DAVote; diff --git a/crates/hotshot/src/lib.rs b/crates/hotshot/src/lib.rs index fa435e1f1d..a56ff576b5 100644 --- a/crates/hotshot/src/lib.rs +++ b/crates/hotshot/src/lib.rs @@ -59,7 +59,7 @@ use hotshot_task_impls::{events::SequencingHotShotEvent, network::NetworkTaskKin use hotshot_types::{ certificate::{DACertificate, ViewSyncCertificate}, consensus::{BlockStore, Consensus, ConsensusMetrics, View, ViewInner, ViewQueue}, - data::{DAProposal, DeltasType, LeafType, ProposalType, QuorumProposal, SequencingLeaf}, + data::{DAProposal, DeltasType, LeafType, QuorumProposal, SequencingLeaf}, error::StorageSnafu, message::{ ConsensusMessageType, DataMessage, InternalTrigger, Message, MessageKind, @@ -79,7 +79,7 @@ use hotshot_types::{ storage::StoredView, State, }, - vote::{ViewSyncData, VoteType}, + vote::ViewSyncData, HotShotConfig, }; use snafu::ResultExt; @@ -936,10 +936,7 @@ impl< I: NodeImplementation>, > SequencingConsensusApi for HotShotSequencingConsensusApi { - async fn send_direct_message< - PROPOSAL: ProposalType, - VOTE: VoteType, - >( + async fn send_direct_message( &self, recipient: TYPES::SignatureKey, message: SequencingMessage, @@ -964,10 +961,7 @@ impl< Ok(()) } - async fn send_direct_da_message< - PROPOSAL: ProposalType, - VOTE: VoteType, - >( + async fn send_direct_da_message( &self, recipient: TYPES::SignatureKey, message: SequencingMessage, @@ -994,10 +988,7 @@ impl< // TODO (DA) Refactor ConsensusApi and HotShot to use SystemContextInner directly. // - async fn send_broadcast_message< - PROPOSAL: ProposalType, - VOTE: VoteType, - >( + async fn send_broadcast_message( &self, message: SequencingMessage, ) -> std::result::Result<(), NetworkError> { diff --git a/crates/hotshot/src/tasks/mod.rs b/crates/hotshot/src/tasks/mod.rs index 30054a342b..9c42165895 100644 --- a/crates/hotshot/src/tasks/mod.rs +++ b/crates/hotshot/src/tasks/mod.rs @@ -5,6 +5,7 @@ use crate::{ QuorumCertificate, SequencingQuorumEx, SystemContext, }; use async_compatibility_layer::art::{async_sleep, async_spawn_local}; +use commit::Committable; use futures::FutureExt; use hotshot_task::{ boxed_sync, @@ -41,6 +42,7 @@ use hotshot_types::{ }, vote::{ViewSyncData, VoteType}, }; +use serde::Serialize; use std::{ collections::HashMap, marker::PhantomData, @@ -130,8 +132,9 @@ pub async fn add_network_message_task< Leaf = SequencingLeaf, ConsensusMessage = SequencingMessage, >, + COMMITTABLE: Committable + Serialize + Clone, PROPOSAL: ProposalType, - VOTE: VoteType, + VOTE: VoteType, MEMBERSHIP: Membership, EXCHANGE: ConsensusExchange< TYPES, @@ -147,8 +150,7 @@ pub async fn add_network_message_task< ) -> TaskRunner // This bound is required so that we can call the `recv_msgs` function of `CommunicationChannel`. where - EXCHANGE::Networking: - CommunicationChannel, MEMBERSHIP>, + EXCHANGE::Networking: CommunicationChannel, MEMBERSHIP>, { let channel = exchange.network().clone(); let broadcast_stream = GeneratedStream::>::new(Arc::new(move || { @@ -240,8 +242,9 @@ pub async fn add_network_event_task< Leaf = SequencingLeaf, ConsensusMessage = SequencingMessage, >, + COMMITTABLE: Committable + Serialize + Clone, PROPOSAL: ProposalType, - VOTE: VoteType, + VOTE: VoteType, MEMBERSHIP: Membership, EXCHANGE: ConsensusExchange< TYPES, @@ -258,18 +261,16 @@ pub async fn add_network_event_task< ) -> TaskRunner // This bound is required so that we can call the `recv_msgs` function of `CommunicationChannel`. where - EXCHANGE::Networking: - CommunicationChannel, MEMBERSHIP>, + EXCHANGE::Networking: CommunicationChannel, MEMBERSHIP>, { let filter = NetworkEventTaskState::< TYPES, I, - MEMBERSHIP, >::Networking, >::filter(task_kind); let channel = exchange.network().clone(); - let network_state: NetworkEventTaskState<_, _, _, _, _, _> = NetworkEventTaskState { + let network_state: NetworkEventTaskState<_, _, _, _> = NetworkEventTaskState { channel, event_stream: event_stream.clone(), view: TYPES::Time::genesis(), @@ -277,7 +278,7 @@ where }; let registry = task_runner.registry.clone(); let network_event_handler = HandleEvent(Arc::new( - move |event, mut state: NetworkEventTaskState<_, _, _, _, MEMBERSHIP, _>| { + move |event, mut state: NetworkEventTaskState<_, _, MEMBERSHIP, _>| { let membership = exchange.membership().clone(); async move { let completion_status = state.handle_event(event, &membership).await; @@ -289,7 +290,7 @@ where let networking_name = "Networking Task"; let networking_task_builder = - TaskBuilder::>::new(networking_name.to_string()) + TaskBuilder::>::new(networking_name.to_string()) .register_event_stream(event_stream.clone(), filter) .await .register_registry(&mut registry.clone()) diff --git a/crates/hotshot/src/traits/networking/libp2p_network.rs b/crates/hotshot/src/traits/networking/libp2p_network.rs index 22fc6da209..2c7731c003 100644 --- a/crates/hotshot/src/traits/networking/libp2p_network.rs +++ b/crates/hotshot/src/traits/networking/libp2p_network.rs @@ -14,7 +14,6 @@ use bimap::BiHashMap; use bincode::Options; use hotshot_task::{boxed_sync, BoxSyncFuture}; use hotshot_types::{ - data::ProposalType, message::{Message, MessageKind}, traits::{ election::Membership, @@ -27,7 +26,6 @@ use hotshot_types::{ node_implementation::NodeType, signature_key::SignatureKey, }, - vote::VoteType, }; use hotshot_utils::bincode::bincode_opts; use libp2p_identity::PeerId; @@ -731,13 +729,9 @@ impl, MEMBERSHIP: Membership, - - MEMBERSHIP: Membership, - > TestableNetworkingImplementation> - for Libp2pCommChannel +impl, MEMBERSHIP: Membership> + TestableNetworkingImplementation> + for Libp2pCommChannel where MessageKind: ViewMessage, { diff --git a/crates/hotshot/src/traits/networking/memory_network.rs b/crates/hotshot/src/traits/networking/memory_network.rs index b2e7ddf6f3..fb4ff4709a 100644 --- a/crates/hotshot/src/traits/networking/memory_network.rs +++ b/crates/hotshot/src/traits/networking/memory_network.rs @@ -16,7 +16,6 @@ use dashmap::DashMap; use futures::StreamExt; use hotshot_task::{boxed_sync, BoxSyncFuture}; use hotshot_types::{ - data::ProposalType, message::{Message, MessageKind}, traits::{ election::Membership, @@ -29,7 +28,6 @@ use hotshot_types::{ node_implementation::NodeType, signature_key::SignatureKey, }, - vote::VoteType, }; use hotshot_utils::bincode::bincode_opts; use rand::Rng; @@ -471,12 +469,8 @@ pub struct MemoryCommChannel< PhantomData<(I, MEMBERSHIP)>, ); -impl< - TYPES: NodeType, - I: NodeImplementation, - - MEMBERSHIP: Membership, - > MemoryCommChannel +impl, MEMBERSHIP: Membership> + MemoryCommChannel { /// create new communication channel #[must_use] diff --git a/crates/hotshot/src/traits/networking/web_server_libp2p_fallback.rs b/crates/hotshot/src/traits/networking/web_server_libp2p_fallback.rs index 825fbd4216..7ed9c86ed5 100644 --- a/crates/hotshot/src/traits/networking/web_server_libp2p_fallback.rs +++ b/crates/hotshot/src/traits/networking/web_server_libp2p_fallback.rs @@ -12,7 +12,6 @@ use futures::join; use hotshot_task::{boxed_sync, BoxSyncFuture}; use hotshot_types::{ - data::ProposalType, message::Message, traits::{ election::Membership, @@ -23,7 +22,6 @@ use hotshot_types::{ }, node_implementation::NodeType, }, - vote::VoteType, }; use std::{marker::PhantomData, sync::Arc}; use tracing::error; @@ -155,13 +153,8 @@ impl, MEMBERSHIP: Membership, - PROPOSAL: ProposalType, - VOTE: VoteType, - MEMBERSHIP: Membership, - > CommunicationChannel,MEMBERSHIP> +impl, MEMBERSHIP: Membership> + CommunicationChannel, MEMBERSHIP> for WebServerWithFallbackCommChannel { type NETWORK = CombinedNetworks; @@ -296,16 +289,10 @@ impl< } } -impl< - TYPES: NodeType, - I: NodeImplementation, - - MEMBERSHIP: Membership, - > +impl, MEMBERSHIP: Membership> TestableChannelImplementation< TYPES, Message, - MEMBERSHIP, CombinedNetworks, > for WebServerWithFallbackCommChannel diff --git a/crates/hotshot/src/traits/networking/web_server_network.rs b/crates/hotshot/src/traits/networking/web_server_network.rs index 9b3d269282..6586ec9b80 100644 --- a/crates/hotshot/src/traits/networking/web_server_network.rs +++ b/crates/hotshot/src/traits/networking/web_server_network.rs @@ -13,7 +13,6 @@ use async_lock::RwLock; use async_trait::async_trait; use hotshot_task::{boxed_sync, BoxSyncFuture}; use hotshot_types::{ - data::ProposalType, message::{Message, MessagePurpose}, traits::{ election::Membership, @@ -25,7 +24,6 @@ use hotshot_types::{ node_implementation::{NodeImplementation, NodeType}, signature_key::SignatureKey, }, - vote::VoteType, }; use hotshot_web_server::{self, config}; use rand::random; @@ -54,12 +52,8 @@ pub struct WebCommChannel< PhantomData<(MEMBERSHIP, I)>, ); -impl< - TYPES: NodeType, - I: NodeImplementation, - - MEMBERSHIP: Membership, - > WebCommChannel +impl, MEMBERSHIP: Membership> + WebCommChannel { /// Create new communication channel #[must_use] @@ -515,13 +509,9 @@ impl< } #[async_trait] -impl< - TYPES: NodeType, - I: NodeImplementation, - - MEMBERSHIP: Membership, - > CommunicationChannel, MEMBERSHIP> - for WebCommChannel +impl, MEMBERSHIP: Membership> + CommunicationChannel, MEMBERSHIP> + for WebCommChannel { type NETWORK = WebServerNetwork, TYPES::SignatureKey, TYPES>; /// Blocks until node is successfully initialized @@ -1048,13 +1038,9 @@ impl> } } -impl< - TYPES: NodeType, - I: NodeImplementation, - - MEMBERSHIP: Membership, - > TestableNetworkingImplementation> - for WebCommChannel +impl, MEMBERSHIP: Membership> + TestableNetworkingImplementation> + for WebCommChannel { fn generator( expected_node_count: usize, diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index 9462b389c4..c52fe7e301 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -366,10 +366,7 @@ where ); if let GeneralConsensusMessage::Vote(vote) = message { - debug!( - "Sending vote to next quorum leader {:?}", - vote.get_view() - ); + debug!("Sending vote to next quorum leader {:?}", vote.get_view()); self.event_stream .publish(SequencingHotShotEvent::QuorumVoteSend(vote)) .await; @@ -444,10 +441,7 @@ where // TODO ED Only publish event in vote if able if let GeneralConsensusMessage::Vote(vote) = message { - debug!( - "Sending vote to next quorum leader {:?}", - vote.get_view() - ); + debug!("Sending vote to next quorum leader {:?}", vote.get_view()); self.event_stream .publish(SequencingHotShotEvent::QuorumVoteSend(vote)) .await; diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index 9d0cc36e88..a160a37509 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -108,6 +108,8 @@ pub struct DAVoteCollectionTaskState< pub accumulator: Either, DACertificate>, + /// The accumulator + #[allow(clippy::type_complexity)] pub accumulator2: Either< as SignedCertificate< TYPES, @@ -393,13 +395,13 @@ where None, ); let accumulator2 = AccumulatorPlaceholder { - phantom: PhantomData::default(), + phantom: PhantomData, }; if view > collection_view { let state = DAVoteCollectionTaskState { committee_exchange: self.committee_exchange.clone(), accumulator, - accumulator2: either::Left(accumulator2), + accumulator2: either::Left(accumulator2), cur_view: view, event_stream: self.event_stream.clone(), id: self.id, diff --git a/crates/task-impls/src/network.rs b/crates/task-impls/src/network.rs index cdaf0a17ae..5cd4ba3d19 100644 --- a/crates/task-impls/src/network.rs +++ b/crates/task-impls/src/network.rs @@ -7,7 +7,7 @@ use hotshot_task::{ GeneratedStream, Merge, }; use hotshot_types::{ - data::{ProposalType, SequencingLeaf}, + data::SequencingLeaf, message::{ CommitteeConsensusMessage, GeneralConsensusMessage, Message, MessageKind, Messages, SequencingMessage, @@ -147,7 +147,7 @@ pub struct NetworkEventTaskState< /// view number pub view: TYPES::Time, /// phantom data - pub phantom: PhantomData<(MEMBERSHIP)>, + pub phantom: PhantomData, // TODO ED Need to add exchange so we can get the recipient key and our own key? } diff --git a/crates/testing/src/node_types.rs b/crates/testing/src/node_types.rs index 1d2985c56d..c788006984 100644 --- a/crates/testing/src/node_types.rs +++ b/crates/testing/src/node_types.rs @@ -15,14 +15,13 @@ use hotshot::{ }; use hotshot_types::{ certificate::ViewSyncCertificate, - data::{DAProposal, QuorumProposal, SequencingLeaf, ViewNumber}, + data::{QuorumProposal, SequencingLeaf, ViewNumber}, message::{Message, SequencingMessage}, traits::{ election::{CommitteeExchange, QuorumExchange, ViewSyncExchange}, network::{TestableChannelImplementation, TestableNetworkingImplementation}, node_implementation::{ChannelMaps, NodeType, SequencingExchanges, TestableExchange}, }, - vote::{DAVote, QuorumVote, ViewSyncVote}, }; use serde::{Deserialize, Serialize}; @@ -65,80 +64,33 @@ pub struct StaticFallbackImpl; pub type StaticMembership = StaticCommittee>; -pub type StaticMemoryDAComm = MemoryCommChannel< - SequencingTestTypes, - SequencingMemoryImpl, - DAProposal, - DAVote, - StaticMembership, ->; +pub type StaticMemoryDAComm = + MemoryCommChannel; -type StaticLibp2pDAComm = Libp2pCommChannel< - SequencingTestTypes, - SequencingLibp2pImpl, - DAProposal, - DAVote, - StaticMembership, ->; +type StaticLibp2pDAComm = + Libp2pCommChannel; -type StaticWebDAComm = WebCommChannel< - SequencingTestTypes, - SequencingWebImpl, - DAProposal, - DAVote, - StaticMembership, ->; +type StaticWebDAComm = WebCommChannel; type StaticFallbackComm = WebServerWithFallbackCommChannel; -pub type StaticMemoryQuorumComm = MemoryCommChannel< - SequencingTestTypes, - SequencingMemoryImpl, - QuorumProposal>, - QuorumVote>, - StaticMembership, ->; +pub type StaticMemoryQuorumComm = + MemoryCommChannel; -type StaticLibp2pQuorumComm = Libp2pCommChannel< - SequencingTestTypes, - SequencingLibp2pImpl, - QuorumProposal>, - QuorumVote>, - StaticMembership, ->; +type StaticLibp2pQuorumComm = + Libp2pCommChannel; -type StaticWebQuorumComm = WebCommChannel< - SequencingTestTypes, - SequencingWebImpl, - QuorumProposal>, - QuorumVote>, - StaticMembership, ->; +type StaticWebQuorumComm = WebCommChannel; -pub type StaticMemoryViewSyncComm = MemoryCommChannel< - SequencingTestTypes, - SequencingMemoryImpl, - ViewSyncCertificate, - ViewSyncVote, - StaticMembership, ->; +pub type StaticMemoryViewSyncComm = + MemoryCommChannel; -type StaticLibp2pViewSyncComm = Libp2pCommChannel< - SequencingTestTypes, - SequencingLibp2pImpl, - ViewSyncCertificate, - ViewSyncVote, - StaticMembership, ->; +type StaticLibp2pViewSyncComm = + Libp2pCommChannel; -type StaticWebViewSyncComm = WebCommChannel< - SequencingTestTypes, - SequencingWebImpl, - ViewSyncCertificate, - ViewSyncVote, - StaticMembership, ->; +type StaticWebViewSyncComm = + WebCommChannel; pub type SequencingLibp2pExchange = SequencingExchanges< SequencingTestTypes, @@ -231,9 +183,24 @@ impl Box::new(move |id| { let network = Arc::new(network_generator(id)); - let quorum_chan = <>>::Networking as TestableChannelImplementation<_, _, _, _, _, _>>::generate_network()(network.clone()); - let committee_chan = <>>::Networking as TestableChannelImplementation<_, _, _, _, _, _>>::generate_network()(network.clone()); - let view_sync_chan = <>>::Networking as TestableChannelImplementation<_, _, _, _, _, _>>::generate_network()(network); + let quorum_chan = + <, + >>::Networking as TestableChannelImplementation<_, _, _, _>>::generate_network( + )(network.clone()); + let committee_chan = + <, + >>::Networking as TestableChannelImplementation<_, _, _, _>>::generate_network( + )(network.clone()); + let view_sync_chan = + <, + >>::Networking as TestableChannelImplementation<_, _, _, _>>::generate_network( + )(network); (quorum_chan, committee_chan, view_sync_chan) }) @@ -325,9 +292,24 @@ impl Box::new(move |id| { let network = Arc::new(network_generator(id)); let network_da = Arc::new(network_da_generator(id)); - let quorum_chan = <>>::Networking as TestableChannelImplementation<_, _, _, _, _, _>>::generate_network()(network.clone()); - let committee_chan = <>>::Networking as TestableChannelImplementation<_, _, _, _, _, _>>::generate_network()(network_da); - let view_sync_chan = <>>::Networking as TestableChannelImplementation<_, _, _, _, _, _>>::generate_network()(network); + let quorum_chan = + <, + >>::Networking as TestableChannelImplementation<_, _, _, _>>::generate_network( + )(network.clone()); + let committee_chan = + <, + >>::Networking as TestableChannelImplementation<_, _, _, _>>::generate_network( + )(network_da); + let view_sync_chan = + <, + >>::Networking as TestableChannelImplementation<_, _, _, _>>::generate_network( + )(network); (quorum_chan, committee_chan, view_sync_chan) }) @@ -445,9 +427,24 @@ impl Box::new(move |id| { let network = Arc::new(network_generator(id)); let network_da = Arc::new(network_da_generator(id)); - let quorum_chan = <>>::Networking as TestableChannelImplementation<_, _, _, _, _, _>>::generate_network()(network.clone()); - let committee_chan = <>>::Networking as TestableChannelImplementation<_, _, _, _, _, _>>::generate_network()(network_da); - let view_sync_chan = <>>::Networking as TestableChannelImplementation<_, _, _, _, _, _>>::generate_network()(network); + let quorum_chan = + <, + >>::Networking as TestableChannelImplementation<_, _, _, _>>::generate_network( + )(network.clone()); + let committee_chan = + <, + >>::Networking as TestableChannelImplementation<_, _, _, _>>::generate_network( + )(network_da); + let view_sync_chan = + <, + >>::Networking as TestableChannelImplementation<_, _, _, _>>::generate_network( + )(network); (quorum_chan, committee_chan, view_sync_chan) }) @@ -584,44 +581,20 @@ impl <, - >>::Networking as TestableChannelImplementation< - _, - _, - QuorumProposal< - SequencingTestTypes, - >::Leaf, - >, - QuorumVote< - SequencingTestTypes, - >::Leaf, - >, - _, - _, - >>::generate_network()(network.clone()); + >>::Networking as TestableChannelImplementation<_, _, _, _>>::generate_network( + )(network.clone()); let committee_chan = <, - >>::Networking as TestableChannelImplementation< - _, - _, - DAProposal, - DAVote, - _, - _, - >>::generate_network()(network_da); + >>::Networking as TestableChannelImplementation<_, _, _, _>>::generate_network( + )(network_da); let view_sync_chan = <, - >>::Networking as TestableChannelImplementation< - _, - _, - ViewSyncCertificate, - ViewSyncVote, - _, - _, - >>::generate_network()(network); + >>::Networking as TestableChannelImplementation<_, _, _, _>>::generate_network( + )(network); (quorum_chan, committee_chan, view_sync_chan) }) } diff --git a/crates/testing/src/test_launcher.rs b/crates/testing/src/test_launcher.rs index 4a7e6bd9b1..a184323edd 100644 --- a/crates/testing/src/test_launcher.rs +++ b/crates/testing/src/test_launcher.rs @@ -83,8 +83,6 @@ where QuorumCommChannel: CommunicationChannel< TYPES, Message, - as ConsensusExchange>>::Proposal, - as ConsensusExchange>>::Vote, as ConsensusExchange>>::Membership, >, { diff --git a/crates/testing/src/test_runner.rs b/crates/testing/src/test_runner.rs index 57c82d24e9..3679e333cb 100644 --- a/crates/testing/src/test_runner.rs +++ b/crates/testing/src/test_runner.rs @@ -41,8 +41,6 @@ where QuorumCommChannel: CommunicationChannel< TYPES, Message, - as ConsensusExchange>>::Proposal, - as ConsensusExchange>>::Vote, as ConsensusExchange>>::Membership, >, { @@ -59,8 +57,6 @@ where QuorumCommChannel: CommunicationChannel< TYPES, Message, - as ConsensusExchange>>::Proposal, - as ConsensusExchange>>::Vote, as ConsensusExchange>>::Membership, >, { diff --git a/crates/types/src/certificate.rs b/crates/types/src/certificate.rs index 51dd5b4206..1efeb6b70e 100644 --- a/crates/types/src/certificate.rs +++ b/crates/types/src/certificate.rs @@ -1,6 +1,5 @@ //! Provides two types of cerrtificates and their accumulators. -use crate::vote::Accumulator; use crate::vote::AccumulatorPlaceholder; use crate::vote::QuorumVote; use crate::{ @@ -11,11 +10,11 @@ use crate::{ signature_key::{EncodedPublicKey, EncodedSignature, SignatureKey}, state::ConsensusTime, }, - vote::{DAVote, ViewSyncData, ViewSyncVote, VoteAccumulator}, + vote::{DAVote, ViewSyncData, ViewSyncVote}, }; use bincode::Options; use commit::{Commitment, Committable}; -use either::Either; + use espresso_systems_common::hotshot::tag; use hotshot_utils::bincode::bincode_opts; use serde::{Deserialize, Serialize}; diff --git a/crates/types/src/traits/consensus_api.rs b/crates/types/src/traits/consensus_api.rs index f9e19e917b..ab3f899944 100644 --- a/crates/types/src/traits/consensus_api.rs +++ b/crates/types/src/traits/consensus_api.rs @@ -2,7 +2,7 @@ use crate::{ certificate::QuorumCertificate, - data::{LeafType, ProposalType}, + data::LeafType, error::HotShotError, event::{Event, EventType}, message::{DataMessage, SequencingMessage}, @@ -12,7 +12,6 @@ use crate::{ signature_key::SignatureKey, storage::StorageError, }, - vote::VoteType, }; use async_trait::async_trait; @@ -128,30 +127,23 @@ pub trait SequencingConsensusApi< LEAF: LeafType, I: NodeImplementation>, >: ConsensusSharedApi -// TODO ED VoteType should not always be over LEAF, but for the API it doesn't matter and we are removing it soon anyway { /// Send a direct message to the given recipient - async fn send_direct_message, VOTE: VoteType>( + async fn send_direct_message( &self, recipient: TYPES::SignatureKey, message: SequencingMessage, ) -> std::result::Result<(), NetworkError>; /// send a direct message using the DA communication channel - async fn send_direct_da_message< - PROPOSAL: ProposalType, - VOTE: VoteType, - >( + async fn send_direct_da_message( &self, recipient: TYPES::SignatureKey, message: SequencingMessage, ) -> std::result::Result<(), NetworkError>; /// Send a broadcast message to the entire network. - async fn send_broadcast_message< - PROPOSAL: ProposalType, - VOTE: VoteType, - >( + async fn send_broadcast_message( &self, message: SequencingMessage, ) -> std::result::Result<(), NetworkError>; diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 4f598ee5f1..fa95f86d32 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -182,27 +182,19 @@ where COMMITTABLE: Committable + Serialize + Clone, TOKEN: VoteToken, { + /// `VoteType` that is used in this certificate type Vote: VoteType; + /// `Accumulator` type to accumulate votes. type VoteAccumulator: Accumulator2; + /// Accumulates votes given an accumulator, vote, and commit. + /// Returns either the accumulator or a certificate fn accumulate_vote( - accumulator: Self::VoteAccumulator, - vote: Self::Vote, - commit: COMMITTABLE, + _accumulator: Self::VoteAccumulator, + _vote: Self::Vote, + _commit: COMMITTABLE, ) -> Either { - // if !self.is_valid_vote( - // &vote.encoded_key, - // &vote.encoded_signature, - // vote.data.clone(), - // // Ignoring deserialization errors below since we are getting rid of it soon - // Checked::Unchecked(vote.vote_token.clone()), - // ) { - // error!("Invalid vote!"); - // return Either::Left(accumulator); - // } - // Call append - todo!() } diff --git a/crates/types/src/traits/network.rs b/crates/types/src/traits/network.rs index b2ad46588e..73b3f69ccf 100644 --- a/crates/types/src/traits/network.rs +++ b/crates/types/src/traits/network.rs @@ -11,7 +11,7 @@ use tokio::time::error::Elapsed as TimeoutError; #[cfg(not(any(async_executor_impl = "async-std", async_executor_impl = "tokio")))] compile_error! {"Either config option \"async-std\" or \"tokio\" must be enabled for this crate."} use super::{election::Membership, node_implementation::NodeType, signature_key::SignatureKey}; -use crate::{data::ProposalType, message::MessagePurpose, vote::VoteType}; +use crate::message::MessagePurpose; use async_trait::async_trait; use serde::{Deserialize, Serialize}; use snafu::Snafu; @@ -195,13 +195,10 @@ pub trait ViewMessage { /// API for interacting directly with a consensus committee /// intended to be implemented for both DA and for validating consensus committees -// TODO ED Why is this generic over VOTE? +// TODO ED Why is this generic over VOTE? #[async_trait] -pub trait CommunicationChannel< - TYPES: NodeType, - M: NetworkMsg, - MEMBERSHIP: Membership, ->: Clone + Debug + Send + Sync + 'static +pub trait CommunicationChannel>: + Clone + Debug + Send + Sync + 'static { /// Underlying Network implementation's type type NETWORK; @@ -331,7 +328,7 @@ pub trait TestableNetworkingImplementation { fn in_flight_message_count(&self) -> Option; } /// Describes additional functionality needed by the test communication channel -// TODO ED Why is this generic over VOTE? +// TODO ED Why is this generic over VOTE? pub trait TestableChannelImplementation< TYPES: NodeType, M: NetworkMsg, diff --git a/crates/types/src/traits/node_implementation.rs b/crates/types/src/traits/node_implementation.rs index 217e1a0244..b6bd7550ad 100644 --- a/crates/types/src/traits/node_implementation.rs +++ b/crates/types/src/traits/node_implementation.rs @@ -401,21 +401,18 @@ where QuorumCommChannel: TestableChannelImplementation< TYPES, Message, - QuorumMembership, QuorumNetwork, >, CommitteeCommChannel: TestableChannelImplementation< TYPES, Message, - CommitteeMembership, QuorumNetwork, >, ViewSyncCommChannel: TestableChannelImplementation< TYPES, Message, - ViewSyncMembership, QuorumNetwork, >, @@ -515,7 +512,6 @@ pub type ViewSyncMembership = QuorumMembership; pub type QuorumNetwork = as CommunicationChannel< TYPES, Message, - QuorumMembership, >>::NETWORK; @@ -523,7 +519,6 @@ pub type QuorumNetwork = as Communication pub type CommitteeNetwork = as CommunicationChannel< TYPES, Message, - CommitteeMembership, >>::NETWORK; diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index 720805af65..fab0b1711e 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -7,7 +7,7 @@ use crate::{ certificate::{AssembledSignature, QuorumCertificate}, data::LeafType, traits::{ - election::{SignedCertificate, VoteData, VoteToken}, + election::{VoteData, VoteToken}, node_implementation::NodeType, signature_key::{EncodedPublicKey, EncodedSignature, SignatureKey}, }, @@ -25,7 +25,8 @@ use serde::{Deserialize, Serialize}; use std::{ collections::{BTreeMap, HashMap}, fmt::Debug, - num::NonZeroU64, marker::PhantomData, + marker::PhantomData, + num::NonZeroU64, }; use tracing::error; @@ -33,10 +34,13 @@ use tracing::error; pub trait VoteType: Debug + Clone + 'static + Serialize + for<'a> Deserialize<'a> + Send + Sync + PartialEq { - /// The view this vote was cast for. + /// Get the view this vote was cast for fn get_view(&self) -> TYPES::Time; - fn get_key(self) -> TYPES::SignatureKey; + /// Get the signature key associated with this vote + fn get_key(self) -> TYPES::SignatureKey; + /// Get the signature associated with this vote fn get_signature(self) -> EncodedSignature; + /// Get the data this vote was signed over fn get_data(self) -> VoteData { todo!() } @@ -209,13 +213,12 @@ impl VoteType for DAVote { } } -#[deprecated] // TODO ED Remove this impl DAVote { /// Get the signature key. /// # Panics /// If the deserialization fails. - #[deprecated] + // #[deprecated] pub fn signature_key(&self) -> TYPES::SignatureKey { ::from_bytes(&self.signature.0).unwrap() } @@ -241,7 +244,7 @@ impl> VoteType impl> QuorumVote { /// Get the encoded signature. - #[deprecated] + // #[deprecated] pub fn signature(&self) -> EncodedSignature { match &self { Self::Yes(vote) | Self::No(vote) => vote.signature.1.clone(), @@ -251,7 +254,7 @@ impl> QuorumVote /// Get the signature key. /// # Panics /// If the deserialization fails. - #[deprecated] + // #[deprecated] pub fn signature_key(&self) -> TYPES::SignatureKey { let encoded = match &self { Self::Yes(vote) | Self::No(vote) => vote.signature.0.clone(), @@ -287,18 +290,36 @@ pub trait Accumulator: Sized { fn append(self, val: T) -> Either; } - -pub trait Accumulator2>: Sized +/// Accumulator trait used to accumulate votes into an `AssembledSignature` +pub trait Accumulator2< + TYPES: NodeType, + COMMITTABLE: Committable + Serialize + Clone, + VOTE: VoteType, +>: Sized { + /// Append 1 vote to the accumulator. If the threshold is not reached, return + /// the accumulator, else return the `AssembledSignature` + /// Only called from inside `accumulate_internal` fn append(self, vote: VOTE) -> Either>; } -pub struct AccumulatorPlaceholder> { - pub phantom: PhantomData<(TYPES, VOTE, COMMITTABLE)> +/// Placeholder accumulator; will be replaced by accumulator for each certificate type +pub struct AccumulatorPlaceholder< + TYPES: NodeType, + COMMITTABLE: Committable + Serialize + Clone, + VOTE: VoteType, +> { + /// Phantom data to make compiler happy + pub phantom: PhantomData<(TYPES, VOTE, COMMITTABLE)>, } -impl > Accumulator2 for AccumulatorPlaceholder { - fn append(self, vote: VOTE) -> Either> { +impl< + TYPES: NodeType, + COMMITTABLE: Committable + Serialize + Clone, + VOTE: VoteType, + > Accumulator2 for AccumulatorPlaceholder +{ + fn append(self, _vote: VOTE) -> Either> { either::Left(self) } } From cc69ce3a3f7dbf7121691aac8126c2c4e8d8da9f Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Tue, 12 Sep 2023 19:35:38 -0400 Subject: [PATCH 15/66] Implement get_data for VoteType --- crates/types/src/vote.rs | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index fab0b1711e..3986a8a4c3 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -41,9 +41,7 @@ pub trait VoteType EncodedSignature; /// Get the data this vote was signed over - fn get_data(self) -> VoteData { - todo!() - } + fn get_data(self) -> VoteData; } /// A vote on DA proposal. @@ -211,6 +209,9 @@ impl VoteType for DAVote { // TODO ED Revisit this function self.signature.1 } + fn get_data(self) -> VoteData { + self.vote_data + } } // TODO ED Remove this @@ -218,7 +219,7 @@ impl DAVote { /// Get the signature key. /// # Panics /// If the deserialization fails. - // #[deprecated] + #[deprecated] pub fn signature_key(&self) -> TYPES::SignatureKey { ::from_bytes(&self.signature.0).unwrap() } @@ -240,11 +241,17 @@ impl> VoteType fn get_signature(self) -> EncodedSignature { self.signature() } + fn get_data(self) -> VoteData { + match self { + QuorumVote::Yes(v) | QuorumVote::No(v) => v.vote_data, + QuorumVote::Timeout(v) => unimplemented!() + } + } } impl> QuorumVote { /// Get the encoded signature. - // #[deprecated] + #[deprecated] pub fn signature(&self) -> EncodedSignature { match &self { Self::Yes(vote) | Self::No(vote) => vote.signature.1.clone(), @@ -254,7 +261,7 @@ impl> QuorumVote /// Get the signature key. /// # Panics /// If the deserialization fails. - // #[deprecated] + #[deprecated] pub fn signature_key(&self) -> TYPES::SignatureKey { let encoded = match &self { Self::Yes(vote) | Self::No(vote) => vote.signature.0.clone(), @@ -279,6 +286,13 @@ impl VoteType> for ViewSyncVote EncodedSignature { self.signature() } + fn get_data(self) -> VoteData> { + match self { + ViewSyncVote::PreCommit(vote_internal) | ViewSyncVote::Commit(vote_internal) | ViewSyncVote::Finalize(vote_internal) => { + vote_internal.vote_data + } + } + } } /// The aggreation of votes, implemented by `VoteAccumulator`. From 8a74287a8a76a4f9e5fbeb676f80bd1fa54f005d Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Tue, 12 Sep 2023 19:52:38 -0400 Subject: [PATCH 16/66] Add get_vote_token function to VoteType trait --- crates/types/src/traits/election.rs | 15 ++++++++++++--- crates/types/src/vote.rs | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index fa95f86d32..42106e49e9 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -191,13 +191,18 @@ where /// Accumulates votes given an accumulator, vote, and commit. /// Returns either the accumulator or a certificate fn accumulate_vote( - _accumulator: Self::VoteAccumulator, - _vote: Self::Vote, - _commit: COMMITTABLE, + self, + accumulator: Self::VoteAccumulator, + vote: Self::Vote, + commit: COMMITTABLE, ) -> Either { todo!() } + fn is_valid_vote() -> bool { + todo!() + } + /// Build a QC from the threshold signature and commitment // TODO ED Rename this function fn from_signatures_and_commitment( @@ -502,6 +507,10 @@ pub trait ConsensusExchange: Send + Sync { relay: Option, ) -> Either, Self::Certificate>; + fn accumulate_vote_2(&self, vote: Self::Vote)-> Either, Self::Certificate> { + todo!() + } + /// The committee which votes on proposals. fn membership(&self) -> &Self::Membership; diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index 3986a8a4c3..07b0b23c7e 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -42,6 +42,8 @@ pub trait VoteType EncodedSignature; /// Get the data this vote was signed over fn get_data(self) -> VoteData; + // Get the vote token of this vote + fn get_vote_token(self) -> TYPES::VoteTokenType; } /// A vote on DA proposal. @@ -212,6 +214,9 @@ impl VoteType for DAVote { fn get_data(self) -> VoteData { self.vote_data } + fn get_vote_token(self) -> ::VoteTokenType { + self.vote_token + } } // TODO ED Remove this @@ -247,6 +252,12 @@ impl> VoteType QuorumVote::Timeout(v) => unimplemented!() } } + fn get_vote_token(self) -> ::VoteTokenType { + match self { + QuorumVote::Yes(v) | QuorumVote::No(v) => v.vote_token, + QuorumVote::Timeout(v) => unimplemented!() + } + } } impl> QuorumVote { @@ -293,6 +304,14 @@ impl VoteType> for ViewSyncVote ::VoteTokenType { + match self { + ViewSyncVote::PreCommit(vote_internal) | ViewSyncVote::Commit(vote_internal) | ViewSyncVote::Finalize(vote_internal) => { + vote_internal.vote_token + } + } + } } /// The aggreation of votes, implemented by `VoteAccumulator`. From eadb4df6cb89758a3f9f20b2688fd326553ebc95 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Tue, 12 Sep 2023 20:16:04 -0400 Subject: [PATCH 17/66] Add new append function to accumulate_vote function --- crates/types/src/traits/election.rs | 37 ++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 42106e49e9..4554ccc94f 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -199,10 +199,6 @@ where todo!() } - fn is_valid_vote() -> bool { - todo!() - } - /// Build a QC from the threshold signature and commitment // TODO ED Rename this function fn from_signatures_and_commitment( @@ -299,6 +295,7 @@ pub trait ConsensusExchange: Send + Sync { /// A proposal for participants to vote on. type Proposal: ProposalType; /// A vote on a [`Proposal`](Self::Proposal). + // TODO ED Use default associated type if it becomes stable type Vote: VoteType; /// A [`SignedCertificate`] attesting to a decision taken by the committee. type Certificate: SignedCertificate @@ -507,8 +504,36 @@ pub trait ConsensusExchange: Send + Sync { relay: Option, ) -> Either, Self::Certificate>; - fn accumulate_vote_2(&self, vote: Self::Vote)-> Either, Self::Certificate> { - todo!() + // TODO ED Depending on what we do in the future with the exchanges trait, we can move the accumulator out of the SignedCertificate + // trait. Logically, I feel it makes sense to accumulate on the certificate rather than the exchange, however. + fn accumulate_vote_2( + &self, + accumulator: <>::Certificate as SignedCertificate< + TYPES, + TYPES::Time, + TYPES::VoteTokenType, + Self::Commitment, + >>::VoteAccumulator, + vote: <>::Certificate as SignedCertificate< + TYPES, + TYPES::Time, + TYPES::VoteTokenType, + Self::Commitment, + >>::Vote, + commit: Self::Commitment, + ) -> Either< + <>::Certificate as SignedCertificate< + TYPES, + TYPES::Time, + TYPES::VoteTokenType, + Self::Commitment, + >>::VoteAccumulator, + Self::Certificate, + > { + match accumulator.append(vote) { + Either::Left(_) => todo!(), + Either::Right(_) => todo!(), + } } /// The committee which votes on proposals. From 51d0ded4324a8e7e48eb32af9ea33b4b7e620da4 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Tue, 12 Sep 2023 20:31:01 -0400 Subject: [PATCH 18/66] Add is_valid_vote check to accumulate_vote_2 --- crates/types/src/traits/election.rs | 39 ++++++++++++++++++++++++ crates/types/src/vote.rs | 46 ++++++++++++++--------------- 2 files changed, 62 insertions(+), 23 deletions(-) diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 4554ccc94f..9ba8c2d324 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -61,6 +61,7 @@ pub enum ElectionError { /// the outcome is already knowable. /// /// This would be a useful general utility. +#[derive(Clone)] pub enum Checked { /// This item has been checked, and is valid Valid(T), @@ -434,6 +435,31 @@ pub trait ConsensusExchange: Send + Sync { is_valid_signature && is_valid_vote_token } + /// Validate a vote by checking its signature and token. + fn is_valid_vote_2( + &self, + key: &TYPES::SignatureKey, + encoded_signature: &EncodedSignature, + data: &VoteData, + vote_token: &Checked, + ) -> bool { + let mut is_valid_vote_token = false; + let mut is_valid_signature = false; + + is_valid_signature = key.validate(encoded_signature, data.commit().as_ref()); + let valid_vote_token = self.membership().validate_vote_token(key.clone(), vote_token.clone()); + is_valid_vote_token = match valid_vote_token { + Err(_) => { + error!("Vote token was invalid"); + false + } + Ok(Checked::Valid(_)) => true, + Ok(Checked::Inval(_) | Checked::Unchecked(_)) => false, + }; + + is_valid_signature && is_valid_vote_token + } + #[doc(hidden)] fn accumulate_internal( &self, @@ -506,6 +532,8 @@ pub trait ConsensusExchange: Send + Sync { // TODO ED Depending on what we do in the future with the exchanges trait, we can move the accumulator out of the SignedCertificate // trait. Logically, I feel it makes sense to accumulate on the certificate rather than the exchange, however. + /// Accumulate vote + /// Returns either the accumulate if no threshold was reached, or a SignedCertificate if the threshold was reached fn accumulate_vote_2( &self, accumulator: <>::Certificate as SignedCertificate< @@ -530,6 +558,17 @@ pub trait ConsensusExchange: Send + Sync { >>::VoteAccumulator, Self::Certificate, > { + if !self.is_valid_vote_2( + &vote.get_key(), + &vote.get_signature(), + &vote.get_data(), + // Ignoring deserialization errors below since we are getting rid of it soon + &Checked::Unchecked(vote.get_vote_token()), + ) { + error!("Invalid vote!"); + return Either::Left(accumulator); + } + match accumulator.append(vote) { Either::Left(_) => todo!(), Either::Right(_) => todo!(), diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index 07b0b23c7e..b202f95a00 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -37,13 +37,13 @@ pub trait VoteType TYPES::Time; /// Get the signature key associated with this vote - fn get_key(self) -> TYPES::SignatureKey; + fn get_key(&self) -> TYPES::SignatureKey; /// Get the signature associated with this vote - fn get_signature(self) -> EncodedSignature; + fn get_signature(&self) -> EncodedSignature; /// Get the data this vote was signed over - fn get_data(self) -> VoteData; + fn get_data(&self) -> VoteData; // Get the vote token of this vote - fn get_vote_token(self) -> TYPES::VoteTokenType; + fn get_vote_token(&self) -> TYPES::VoteTokenType; } /// A vote on DA proposal. @@ -204,18 +204,18 @@ impl VoteType for DAVote { fn get_view(&self) -> TYPES::Time { self.current_view } - fn get_key(self) -> ::SignatureKey { + fn get_key(&self) -> ::SignatureKey { self.signature_key() } - fn get_signature(self) -> EncodedSignature { + fn get_signature(&self) -> EncodedSignature { // TODO ED Revisit this function - self.signature.1 + self.signature.1.clone() } - fn get_data(self) -> VoteData { - self.vote_data + fn get_data(&self) -> VoteData { + self.vote_data.clone() } - fn get_vote_token(self) -> ::VoteTokenType { - self.vote_token + fn get_vote_token(&self) -> ::VoteTokenType { + self.vote_token.clone() } } @@ -240,21 +240,21 @@ impl> VoteType } } - fn get_key(self) -> ::SignatureKey { + fn get_key(&self) -> ::SignatureKey { self.signature_key() } - fn get_signature(self) -> EncodedSignature { + fn get_signature(&self) -> EncodedSignature { self.signature() } - fn get_data(self) -> VoteData { + fn get_data(&self) -> VoteData { match self { - QuorumVote::Yes(v) | QuorumVote::No(v) => v.vote_data, + QuorumVote::Yes(v) | QuorumVote::No(v) => v.vote_data.clone(), QuorumVote::Timeout(v) => unimplemented!() } } - fn get_vote_token(self) -> ::VoteTokenType { + fn get_vote_token(&self) -> ::VoteTokenType { match self { - QuorumVote::Yes(v) | QuorumVote::No(v) => v.vote_token, + QuorumVote::Yes(v) | QuorumVote::No(v) => v.vote_token.clone(), QuorumVote::Timeout(v) => unimplemented!() } } @@ -290,25 +290,25 @@ impl VoteType> for ViewSyncVote ::SignatureKey { + fn get_key(&self) -> ::SignatureKey { self.signature_key() } - fn get_signature(self) -> EncodedSignature { + fn get_signature(&self) -> EncodedSignature { self.signature() } - fn get_data(self) -> VoteData> { + fn get_data(&self) -> VoteData> { match self { ViewSyncVote::PreCommit(vote_internal) | ViewSyncVote::Commit(vote_internal) | ViewSyncVote::Finalize(vote_internal) => { - vote_internal.vote_data + vote_internal.vote_data.clone() } } } - fn get_vote_token(self) -> ::VoteTokenType { + fn get_vote_token(&self) -> ::VoteTokenType { match self { ViewSyncVote::PreCommit(vote_internal) | ViewSyncVote::Commit(vote_internal) | ViewSyncVote::Finalize(vote_internal) => { - vote_internal.vote_token + vote_internal.vote_token.clone() } } } From 5bbed77c3acd191329b1916477992eeef11e40a5 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Wed, 13 Sep 2023 10:14:41 -0400 Subject: [PATCH 19/66] Add accumulate_vote_2 function to DA task --- crates/task-impls/src/da.rs | 9 +++++++++ crates/types/src/traits/election.rs | 7 ++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index a160a37509..f51bf8a8b7 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -15,6 +15,7 @@ use hotshot_task::{ task::{FilterEvent, HandleEvent, HotShotTaskCompleted, HotShotTaskTypes, TS}, task_impls::{HSTWithEvent, TaskBuilder}, }; +use hotshot_types::vote::VoteType; use hotshot_types::traits::election::SignedCertificate; use hotshot_types::vote::AccumulatorPlaceholder; use hotshot_types::{ @@ -167,6 +168,14 @@ where return (None, state); } + let accumulator2 = state.accumulator2.left().unwrap(); + // TODO ED Maybe we don't need this to take in commitment? Can just get it from the vote directly if it is always + // going to be passed in as the vote.commitment + match state.committee_exchange.accumulate_vote_2(accumulator2, &vote, &vote.block_commitment) { + Left(_) => todo!(), + Right(_) => todo!(), + } + let accumulator = state.accumulator.left().unwrap(); match state.committee_exchange.accumulate_vote( &vote.signature.0, diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 9ba8c2d324..529ffec4c1 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -542,13 +542,13 @@ pub trait ConsensusExchange: Send + Sync { TYPES::VoteTokenType, Self::Commitment, >>::VoteAccumulator, - vote: <>::Certificate as SignedCertificate< + vote: &<>::Certificate as SignedCertificate< TYPES, TYPES::Time, TYPES::VoteTokenType, Self::Commitment, >>::Vote, - commit: Self::Commitment, + commit: &Commitment, ) -> Either< <>::Certificate as SignedCertificate< TYPES, @@ -569,7 +569,8 @@ pub trait ConsensusExchange: Send + Sync { return Either::Left(accumulator); } - match accumulator.append(vote) { + // TODO ED Should make append function take a reference to vote + match accumulator.append(vote.clone()) { Either::Left(_) => todo!(), Either::Right(_) => todo!(), } From 68676a7a2d46b48d605b516f7804055ab7ca519d Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Wed, 13 Sep 2023 10:32:16 -0400 Subject: [PATCH 20/66] Add accumulator2 match to DA task --- crates/task-impls/src/da.rs | 18 ++++++++++++++---- crates/types/src/traits/election.rs | 26 ++++++++++++++++++++++---- crates/types/src/vote.rs | 1 + 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index f51bf8a8b7..acb9064b29 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -15,9 +15,9 @@ use hotshot_task::{ task::{FilterEvent, HandleEvent, HotShotTaskCompleted, HotShotTaskTypes, TS}, task_impls::{HSTWithEvent, TaskBuilder}, }; -use hotshot_types::vote::VoteType; use hotshot_types::traits::election::SignedCertificate; use hotshot_types::vote::AccumulatorPlaceholder; +use hotshot_types::vote::VoteType; use hotshot_types::{ certificate::DACertificate, consensus::{Consensus, View}, @@ -171,9 +171,19 @@ where let accumulator2 = state.accumulator2.left().unwrap(); // TODO ED Maybe we don't need this to take in commitment? Can just get it from the vote directly if it is always // going to be passed in as the vote.commitment - match state.committee_exchange.accumulate_vote_2(accumulator2, &vote, &vote.block_commitment) { - Left(_) => todo!(), - Right(_) => todo!(), + match state.committee_exchange.accumulate_vote_2( + accumulator2, + &vote, + &vote.block_commitment, + ) { + Left(new_accumulator) => { + error!("DA cert still accumulating"); + state.accumulator2 = either::Left(new_accumulator); + } + Right(dac) => { + error!("DA cert made!"); + state.accumulator2 = either::Right(dac); + } } let accumulator = state.accumulator.left().unwrap(); diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 529ffec4c1..49fad30dd7 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -447,7 +447,9 @@ pub trait ConsensusExchange: Send + Sync { let mut is_valid_signature = false; is_valid_signature = key.validate(encoded_signature, data.commit().as_ref()); - let valid_vote_token = self.membership().validate_vote_token(key.clone(), vote_token.clone()); + let valid_vote_token = self + .membership() + .validate_vote_token(key.clone(), vote_token.clone()); is_valid_vote_token = match valid_vote_token { Err(_) => { error!("Vote token was invalid"); @@ -562,17 +564,33 @@ pub trait ConsensusExchange: Send + Sync { &vote.get_key(), &vote.get_signature(), &vote.get_data(), - // Ignoring deserialization errors below since we are getting rid of it soon + // TODO ED We've had this comment for a while: Ignoring deserialization errors below since we are getting rid of it soon &Checked::Unchecked(vote.get_vote_token()), ) { error!("Invalid vote!"); return Either::Left(accumulator); } + let stake_table_entry = vote.get_key().get_stake_table_entry(1u64); + let append_node_id = self + .membership() + .get_committee_qc_stake_table() + .iter() + .position(|x| *x == stake_table_entry.clone()) + .unwrap(); + // TODO ED Should make append function take a reference to vote match accumulator.append(vote.clone()) { - Either::Left(_) => todo!(), - Either::Right(_) => todo!(), + Either::Left(accumulator) => Either::Left(accumulator), + Either::Right(signatures) => { + // TODO ED Update this function to just take in the signatures and most recent vote + Either::Right(Self::Certificate::from_signatures_and_commitment( + vote.get_view(), + signatures, + *commit, + Some(0), + )) + } } } diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index b202f95a00..33a1f60450 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -353,6 +353,7 @@ impl< > Accumulator2 for AccumulatorPlaceholder { fn append(self, _vote: VOTE) -> Either> { + todo!(); either::Left(self) } } From a9370a5ab9fb468a9c391bee369c7f41dc108d58 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Wed, 13 Sep 2023 11:42:57 -0400 Subject: [PATCH 21/66] Append function implemented for DA vote; debugging why cert is not formed --- crates/task-impls/src/da.rs | 11 ++- crates/types/src/certificate.rs | 3 +- crates/types/src/traits/election.rs | 3 +- crates/types/src/vote.rs | 122 +++++++++++++++++++++++++--- 4 files changed, 121 insertions(+), 18 deletions(-) diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index acb9064b29..cab8284db0 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -15,6 +15,7 @@ use hotshot_task::{ task::{FilterEvent, HandleEvent, HotShotTaskCompleted, HotShotTaskTypes, TS}, task_impls::{HSTWithEvent, TaskBuilder}, }; +use hotshot_types::vote::DAVoteAccumulator; use hotshot_types::traits::election::SignedCertificate; use hotshot_types::vote::AccumulatorPlaceholder; use hotshot_types::vote::VoteType; @@ -163,7 +164,7 @@ where // panic!("Vote handle received DA vote for view {}", *vote.current_view); // For the case where we receive votes after we've made a certificate - if state.accumulator.is_right() { + if state.accumulator2.is_right() { debug!("DA accumulator finished view: {:?}", state.cur_view); return (None, state); } @@ -181,7 +182,7 @@ where state.accumulator2 = either::Left(new_accumulator); } Right(dac) => { - error!("DA cert made!"); + panic!("DA cert made!"); state.accumulator2 = either::Right(dac); } } @@ -413,7 +414,11 @@ where acc, None, ); - let accumulator2 = AccumulatorPlaceholder { + let accumulator2 = DAVoteAccumulator { + da_vote_outcomes: HashMap::new(), + success_threshold: self.committee_exchange.success_threshold(), + sig_lists: Vec::new(), + signers: bitvec![0; self.committee_exchange.total_nodes()], phantom: PhantomData, }; if view > collection_view { diff --git a/crates/types/src/certificate.rs b/crates/types/src/certificate.rs index 1efeb6b70e..124d762a8c 100644 --- a/crates/types/src/certificate.rs +++ b/crates/types/src/certificate.rs @@ -1,6 +1,7 @@ //! Provides two types of cerrtificates and their accumulators. use crate::vote::AccumulatorPlaceholder; +use crate::vote::DAVoteAccumulator; use crate::vote::QuorumVote; use crate::{ data::{fake_commitment, serialize_signature, LeafType}, @@ -232,7 +233,7 @@ impl SignedCertificate { type Vote = DAVote; - type VoteAccumulator = AccumulatorPlaceholder; + type VoteAccumulator = DAVoteAccumulator; fn from_signatures_and_commitment( view_number: TYPES::Time, diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 49fad30dd7..ca4aa9c1d8 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -572,6 +572,7 @@ pub trait ConsensusExchange: Send + Sync { } let stake_table_entry = vote.get_key().get_stake_table_entry(1u64); + // TODO ED Could we make this part of the vote in the future? It's only a usize. let append_node_id = self .membership() .get_committee_qc_stake_table() @@ -580,7 +581,7 @@ pub trait ConsensusExchange: Send + Sync { .unwrap(); // TODO ED Should make append function take a reference to vote - match accumulator.append(vote.clone()) { + match accumulator.append(vote.clone(), append_node_id, self.membership().get_committee_qc_stake_table()) { Either::Left(accumulator) => Either::Left(accumulator), Either::Right(signatures) => { // TODO ED Update this function to just take in the signatures and most recent vote diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index 33a1f60450..ee1e474b04 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -43,7 +43,7 @@ pub trait VoteType VoteData; // Get the vote token of this vote - fn get_vote_token(&self) -> TYPES::VoteTokenType; + fn get_vote_token(&self) -> TYPES::VoteTokenType; } /// A vote on DA proposal. @@ -249,13 +249,13 @@ impl> VoteType fn get_data(&self) -> VoteData { match self { QuorumVote::Yes(v) | QuorumVote::No(v) => v.vote_data.clone(), - QuorumVote::Timeout(v) => unimplemented!() + QuorumVote::Timeout(v) => unimplemented!(), } } fn get_vote_token(&self) -> ::VoteTokenType { match self { QuorumVote::Yes(v) | QuorumVote::No(v) => v.vote_token.clone(), - QuorumVote::Timeout(v) => unimplemented!() + QuorumVote::Timeout(v) => unimplemented!(), } } } @@ -299,17 +299,17 @@ impl VoteType> for ViewSyncVote VoteData> { match self { - ViewSyncVote::PreCommit(vote_internal) | ViewSyncVote::Commit(vote_internal) | ViewSyncVote::Finalize(vote_internal) => { - vote_internal.vote_data.clone() - } + ViewSyncVote::PreCommit(vote_internal) + | ViewSyncVote::Commit(vote_internal) + | ViewSyncVote::Finalize(vote_internal) => vote_internal.vote_data.clone(), } } fn get_vote_token(&self) -> ::VoteTokenType { match self { - ViewSyncVote::PreCommit(vote_internal) | ViewSyncVote::Commit(vote_internal) | ViewSyncVote::Finalize(vote_internal) => { - vote_internal.vote_token.clone() - } + ViewSyncVote::PreCommit(vote_internal) + | ViewSyncVote::Commit(vote_internal) + | ViewSyncVote::Finalize(vote_internal) => vote_internal.vote_token.clone(), } } } @@ -333,10 +333,106 @@ pub trait Accumulator2< /// Append 1 vote to the accumulator. If the threshold is not reached, return /// the accumulator, else return the `AssembledSignature` /// Only called from inside `accumulate_internal` - fn append(self, vote: VOTE) -> Either>; + fn append(self, vote: VOTE, vote_node_id: usize, stake_table_entries: Vec<::StakeTableEntry>,) -> Either>; +} + +pub struct DAVoteAccumulator< + TYPES: NodeType, + COMMITTABLE: Committable + Serialize + Clone, + VOTE: VoteType, +> { + /// Map of all da signatures accumlated so far + pub da_vote_outcomes: VoteMap, + /// A quorum's worth of stake, generally 2f + 1 + pub success_threshold: NonZeroU64, + /// A list of valid signatures for certificate aggregation + pub sig_lists: Vec<::Signature>, + /// A bitvec to indicate which node is active and send out a valid signature for certificate aggregation, this automatically do uniqueness check + pub signers: BitVec, + + pub phantom: PhantomData, +} + +impl< + TYPES: NodeType, + COMMITTABLE: Committable + Serialize + Clone, + VOTE: VoteType, + > Accumulator2 for DAVoteAccumulator +{ + fn append( + mut self, + vote: VOTE, + vote_node_id: usize, + stake_table_entries: Vec<::StakeTableEntry>, + ) -> Either> { + // TODO ED Make this a function on VoteType trait + let vote_commitment = match vote.get_data() { + VoteData::DA(commitment) => commitment, + _ => return Either::Left(self), + }; + + let encoded_key = vote.get_key().to_bytes(); + + // Deserialize the signature so that it can be assembeld into a QC + // TODO ED Update this once we've gotten rid of EncodedSignature + let original_signature: ::Signature = + bincode_opts() + .deserialize(&vote.get_signature().0) + .expect("Deserialization on the signature shouldn't be able to fail."); + + let (da_stake_casted, da_vote_map) = self + .da_vote_outcomes + .entry(vote_commitment) + .or_insert_with(|| (0, BTreeMap::new())); + + // Check for duplicate vote + // TODO ED Re-encoding signature key to bytes until we get rid of EncodedKey + // Have to do this because SignatureKey is not hashable + if da_vote_map.contains_key(&encoded_key) { + return Either::Left(self); + } + + // Update the active_keys and signature lists + // TODO ED How does this differ than the check above? + if self.signers.get(vote_node_id).as_deref() == Some(&true) { + error!("Node id is already in signers list"); + return Either::Left(self); + } + self.signers.set(vote_node_id, true); + self.sig_lists.push(original_signature); + + // Already checked that vote data was for a DA vote above + *da_stake_casted += u64::from(vote.get_vote_token().vote_count()); + da_vote_map.insert( + encoded_key, + (vote.get_signature(), vote.get_data(), vote.get_vote_token()), + ); + + if *da_stake_casted >= u64::from(self.success_threshold) { + // Assemble QC + let real_qc_pp = ::get_public_parameter( + // TODO ED Something about stake table entries. Might be easier to just pass in membership? + stake_table_entries.clone(), + U256::from(self.success_threshold.get()), + ); + + let real_qc_sig = ::assemble( + &real_qc_pp, + self.signers.as_bitslice(), + &self.sig_lists[..], + ); + + // TODO ED Why do we need this line if we have the above line? + self.da_vote_outcomes.remove(&vote_commitment); + + return Either::Right(AssembledSignature::DA(real_qc_sig)); + } + Either::Left(self) + } } /// Placeholder accumulator; will be replaced by accumulator for each certificate type +#[deprecated] pub struct AccumulatorPlaceholder< TYPES: NodeType, COMMITTABLE: Committable + Serialize + Clone, @@ -352,13 +448,13 @@ impl< VOTE: VoteType, > Accumulator2 for AccumulatorPlaceholder { - fn append(self, _vote: VOTE) -> Either> { - todo!(); - either::Left(self) + fn append(self, vote: VOTE, vote_node_id: usize, stake_table_entries: Vec<::StakeTableEntry>) -> Either> { + todo!() } } /// Mapping of commitments to vote tokens by key. +// TODO ED Remove this whole token generic type VoteMap = HashMap< Commitment, ( From 104133d5daf2e17702aa040a95e78b05fee5eeb6 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Wed, 13 Sep 2023 11:50:04 -0400 Subject: [PATCH 22/66] DA cert is properly formed with new accumulator --- crates/task-impls/src/da.rs | 8 ++++++-- crates/types/src/vote.rs | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index cab8284db0..b4143b3844 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -414,18 +414,22 @@ where acc, None, ); - let accumulator2 = DAVoteAccumulator { + let new_accumulator = DAVoteAccumulator { da_vote_outcomes: HashMap::new(), success_threshold: self.committee_exchange.success_threshold(), sig_lists: Vec::new(), signers: bitvec![0; self.committee_exchange.total_nodes()], phantom: PhantomData, }; + + // TODO ED Get vote data here instead of cloning into block commitment field of vote + let accumulator2 = self.committee_exchange.accumulate_vote_2(new_accumulator, &vote, &vote.clone().block_commitment); + if view > collection_view { let state = DAVoteCollectionTaskState { committee_exchange: self.committee_exchange.clone(), accumulator, - accumulator2: either::Left(accumulator2), + accumulator2: accumulator2, cur_view: view, event_stream: self.event_stream.clone(), id: self.id, diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index ee1e474b04..31e98a5c65 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -427,6 +427,7 @@ impl< return Either::Right(AssembledSignature::DA(real_qc_sig)); } + error!("DA stake casted is {da_stake_casted}"); Either::Left(self) } } From 7b76e67a25c0c59957cfbbb7dd23f7faf28b25c5 Mon Sep 17 00:00:00 2001 From: Gus Gutoski Date: Wed, 13 Sep 2023 13:39:40 -0400 Subject: [PATCH 23/66] Hello-world VID integration (#1684) * quick and dirty type wrappers for VID * WIP: get dispersal shares * WIP: add disperse data to VidDisperseSend event * catch VidDisperseSend event in network task handle_event, plus attendant boilerplate * WIP catch VidDisperseRecv event in DA task handle_event, plus attendant boilerplate * new VidVoteSend event * new event VidVoteRecv * blind copy-paste code from DAVoteRecv to VidVoteRecv * new event VidCertSend * new message type VidCertificate * new ProcessedCommitteeConsensusMessage variants VidVote, VidCertificate * new event VidCertRecv * fix test_da_task * WIP begin fixing test_network_task * tidy use statement * todos * fix test_network_task (no idea why it works now) * add TODOs for #1685 * clippy pacification and link to #1686 * clippy pacification * [no ci] log unexpected events * [no ci] demote a few noisy error logs * fix test_web_server * lint * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1690 * [no ci] remove duplicate issue link * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1691 * [no ci] link to https://github.com/EspressoSystems/jellyfish/issues/369 * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1692 * [no ci] another link to https://github.com/EspressoSystems/HotShot/issues/1686 * don't make release builds * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1693 * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1695 * demote another noisy error log * lint argh ci is killing me * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1696 * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1697 * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1698 * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1699 * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1700 * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1701 * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1702 * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1703 * [no ci] cover my tracks * [no ci] link to https://github.com/EspressoSystems/HotShot/issues/1704 * allow test more time to pass ci :fingers-crossed: * more time for web_server, basic tests to complete * address https://github.com/EspressoSystems/HotShot/pull/1684#discussion_r1320390489 * allow more time for tests to pass * address https://github.com/EspressoSystems/HotShot/pull/1684#discussion_r1320403528 * experiment: restore use of release build for tests * add commented code that hangs test * remove release build again * WIP toward a fix for #1695 * add commitment member to VidDisperse, ensure Proposal.signature matches the commitment * use the correct commitment in VidDisperseRecv, update comments * restore commented code to check whether I'm the VID leader * add sanity log msg and TODO * tidy logs and comments * add VidVote message purpose * message type Vid (unimplemented) -> VidDisperse (now implemented) * VidCert message type * restore original test timeout durations, #1713 now fixed * type: VidCert use cert route * more time for tests to complete * [no ci] more comment links to github issues * [no ci] comment link to #1717 * add commented VID test code * close #1697, fix test with VID * make_vote_token failure should cause test to fail * fix #1717 * add ASYNC_STD_THREAD_COUNT=1 to test_success, test_web_server, test_consensus_task --- Cargo.lock | 4 + Cargo.toml | 77 ++--- .../src/traits/networking/libp2p_network.rs | 2 +- .../traits/networking/web_server_network.rs | 49 +++ .../src/network/behaviours/gossip.rs | 12 +- crates/libp2p-networking/tests/counter.rs | 4 +- crates/orchestrator/Cargo.toml | 3 +- crates/task-impls/src/consensus.rs | 11 + crates/task-impls/src/da.rs | 294 ++++++++++++++++-- crates/task-impls/src/events.rs | 26 +- crates/task-impls/src/network.rs | 38 ++- crates/testing/Cargo.toml | 1 + crates/testing/src/task_helpers.rs | 9 +- crates/testing/src/test_runner.rs | 4 +- crates/testing/tests/basic.rs | 12 +- crates/testing/tests/da_task.rs | 61 +++- crates/testing/tests/network_task.rs | 33 +- crates/testing/tests/web_server.rs | 9 + crates/types/Cargo.toml | 7 +- crates/types/src/data.rs | 47 +++ crates/types/src/message.rs | 61 +++- crates/types/src/traits/election.rs | 55 +++- crates/web_server/src/config.rs | 24 ++ justfile | 14 +- 24 files changed, 750 insertions(+), 107 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f69a93f19a..475d5fd2ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2822,6 +2822,7 @@ dependencies = [ "async-lock", "async-std", "async-trait", + "bincode", "bitvec", "blake3", "commit", @@ -2848,6 +2849,7 @@ name = "hotshot-types" version = "0.1.0" dependencies = [ "arbitrary", + "ark-bls12-381", "ark-serialize 0.3.0", "ark-std 0.4.0", "async-compatibility-layer", @@ -2874,12 +2876,14 @@ dependencies = [ "hotshot-task", "hotshot-utils", "jf-primitives", + "jf-utils", "libp2p-networking", "nll", "rand 0.8.5", "rand_chacha 0.3.1", "serde", "serde_json", + "sha2 0.10.7", "snafu", "tagged-base64 0.2.4", "time 0.3.28", diff --git a/Cargo.toml b/Cargo.toml index 312ef0fa73..0a60ccebf7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ members = [ "crates/hotshot-qc", "crates/hotshot-signature-key", "crates/hotshot-stake-table", - "crates/hotshot" + "crates/hotshot", ] resolver = "2" @@ -62,6 +62,7 @@ nll = { git = "https://github.com/EspressoSystems/nll.git" } rand = "0.8.5" rand_chacha = { version = "0.3.1", default-features = false } serde = { version = "1.0.188", features = ["derive"] } +sha2 = "0.10" snafu = "0.7.5" surf-disco = { git = "https://github.com/EspressoSystems/surf-disco.git", tag = "v0.4.2" } time = "0.3.28" @@ -69,46 +70,46 @@ toml = "0.7.8" tracing = "0.1.37" typenum = "1.16.0" libp2p = { package = "libp2p", version = "0.52.3", features = [ - "macros", - "autonat", - "deflate", - "dns", - "floodsub", - "gossipsub", - "identify", - "kad", - "mdns", - "noise", - "ping", - "plaintext", - "pnet", - "quic", - "relay", - "request-response", - "rendezvous", - "secp256k1", - "serde", - "tcp", - "uds", - "wasm-ext", - "websocket", - "yamux", + "macros", + "autonat", + "deflate", + "dns", + "floodsub", + "gossipsub", + "identify", + "kad", + "mdns", + "noise", + "ping", + "plaintext", + "pnet", + "quic", + "relay", + "request-response", + "rendezvous", + "secp256k1", + "serde", + "tcp", + "uds", + "wasm-ext", + "websocket", + "yamux", ] } async-std = { version = "1.12.0", features = ["attributes"] } tokio = { version = "1.32.0", features = [ - "fs", - "io-util", - "io-std", - "macros", - "net", - "parking_lot", - "process", - "rt", - "rt-multi-thread", - "signal", - "sync", - "time", - "tracing", + "fs", + "io-util", + "io-std", + "macros", + "net", + "parking_lot", + "process", + "rt", + "rt-multi-thread", + "signal", + "sync", + "time", + "tracing", ] } ### Profiles diff --git a/crates/hotshot/src/traits/networking/libp2p_network.rs b/crates/hotshot/src/traits/networking/libp2p_network.rs index ddc13b9571..1d94be7ee9 100644 --- a/crates/hotshot/src/traits/networking/libp2p_network.rs +++ b/crates/hotshot/src/traits/networking/libp2p_network.rs @@ -608,7 +608,7 @@ impl ConnectedNetwork for Libp2p source: NetworkNodeHandleError::NoSuchTopic, })? .clone(); - error!("Broadcasting to topic {}", topic); + info!("broadcasting to topic: {}", topic); // gossip doesn't broadcast from itself, so special case if recipients.contains(&self.inner.pk) { diff --git a/crates/hotshot/src/traits/networking/web_server_network.rs b/crates/hotshot/src/traits/networking/web_server_network.rs index 374c8a40e7..40d250f501 100644 --- a/crates/hotshot/src/traits/networking/web_server_network.rs +++ b/crates/hotshot/src/traits/networking/web_server_network.rs @@ -177,6 +177,9 @@ impl Inner { config::get_view_sync_vote_route(view_number, vote_index) } MessagePurpose::DAC => config::get_da_certificate_route(view_number), + MessagePurpose::VidDisperse => config::get_vid_disperse_route(view_number), // like `Proposal` + MessagePurpose::VidVote => config::get_vid_vote_route(view_number, vote_index), // like `Vote` + MessagePurpose::VidCert => config::get_vid_cert_route(view_number), // like `DAC` }; if message_purpose == MessagePurpose::Data { @@ -240,6 +243,14 @@ impl Inner { direct_poll_queue.push(vote.clone()); } } + MessagePurpose::VidVote => { + // TODO copy-pasted from `MessagePurpose::Vote` https://github.com/EspressoSystems/HotShot/issues/1690 + let mut direct_poll_queue = self.direct_poll_queue.write().await; + for vote in &deserialized_messages { + vote_index += 1; + direct_poll_queue.push(vote.clone()); + } + } MessagePurpose::DAC => { debug!( "Received DAC from web server for view {} {}", @@ -255,6 +266,41 @@ impl Inner { // In future we should check to make sure DAC is valid return Ok(()); } + MessagePurpose::VidCert => { + // TODO copy-pasted from `MessagePurpose::DAC` https://github.com/EspressoSystems/HotShot/issues/1690 + debug!( + "Received VID cert from web server for view {} {}", + view_number, self.is_da + ); + // Only pushing the first proposal since we will soon only be allowing 1 proposal per view + self.broadcast_poll_queue + .write() + .await + .push(deserialized_messages[0].clone()); + + // return if we found a VID cert, since there will only be 1 per view + // In future we should check to make sure VID cert is valid + return Ok(()); + } + MessagePurpose::VidDisperse => { + // TODO copy-pasted from `MessagePurpose::Proposal` https://github.com/EspressoSystems/HotShot/issues/1690 + + // Only pushing the first proposal since we will soon only be allowing 1 proposal per view + self.broadcast_poll_queue + .write() + .await + .push(deserialized_messages[0].clone()); + + return Ok(()); + // Wait for the view to change before polling for proposals again + // let event = receiver.recv().await; + // match event { + // Ok(event) => view_number = event.view_number(), + // Err(_r) => { + // error!("Proposal receiver error! It was likely shutdown") + // } + // } + } MessagePurpose::ViewSyncVote => { // error!( // "Received {} view sync votes from web server for view {} is da {}", @@ -513,6 +559,9 @@ impl< } MessagePurpose::ViewSyncVote => config::post_view_sync_vote_route(*view_number), MessagePurpose::DAC => config::post_da_certificate_route(*view_number), + MessagePurpose::VidVote => config::post_vid_vote_route(*view_number), + MessagePurpose::VidDisperse => config::post_vid_disperse_route(*view_number), + MessagePurpose::VidCert => config::post_vid_cert_route(*view_number), }; let network_msg: SendMsg = SendMsg { diff --git a/crates/libp2p-networking/src/network/behaviours/gossip.rs b/crates/libp2p-networking/src/network/behaviours/gossip.rs index 1119ad27f3..bfc946c9b5 100644 --- a/crates/libp2p-networking/src/network/behaviours/gossip.rs +++ b/crates/libp2p-networking/src/network/behaviours/gossip.rs @@ -4,13 +4,13 @@ use std::{ }; use libp2p::{ - gossipsub::{Behaviour, Event, IdentTopic, TopicHash}, + gossipsub::{Behaviour, Event, IdentTopic, PublishError::Duplicate, TopicHash}, swarm::{NetworkBehaviour, PollParameters, THandlerInEvent, THandlerOutEvent, ToSwarm}, Multiaddr, }; use libp2p_identity::PeerId; -use tracing::{error, info, warn}; +use tracing::{debug, error, info, warn}; use super::exponential_backoff::ExponentialBackoff; @@ -214,8 +214,12 @@ impl GossipBehaviour { /// Publish a given gossip pub fn publish_gossip(&mut self, topic: IdentTopic, contents: Vec) { let res = self.gossipsub.publish(topic.clone(), contents.clone()); - if res.is_err() { - error!("error publishing gossip message {:?}", res); + if let Err(e) = res { + if matches!(e, Duplicate) { + debug!("duplicate gossip message"); + } else { + error!("error publishing gossip message {:?}", e); + } self.in_progress_gossip.push_back((topic, contents)); } } diff --git a/crates/libp2p-networking/tests/counter.rs b/crates/libp2p-networking/tests/counter.rs index e7dad7c8c6..85b7cb2a7f 100644 --- a/crates/libp2p-networking/tests/counter.rs +++ b/crates/libp2p-networking/tests/counter.rs @@ -12,7 +12,7 @@ use libp2p_networking::network::{ use serde::{Deserialize, Serialize}; use snafu::ResultExt; use std::{fmt::Debug, sync::Arc, time::Duration}; -use tracing::{error, info, instrument, warn}; +use tracing::{debug, error, info, instrument, warn}; #[cfg(async_executor_impl = "async-std")] use async_std::prelude::StreamExt; @@ -307,7 +307,7 @@ async fn run_dht_rounds( ) { let mut rng = rand::thread_rng(); for i in 0..num_rounds { - error!("round: {:?}", i); + debug!("begin round {}", i); let msg_handle = get_random_handle(handles, &mut rng); let mut key = vec![0; DHT_KV_PADDING]; key.push((starting_val + i) as u8); diff --git a/crates/orchestrator/Cargo.toml b/crates/orchestrator/Cargo.toml index 3febbbce65..f3f57ada3a 100644 --- a/crates/orchestrator/Cargo.toml +++ b/crates/orchestrator/Cargo.toml @@ -23,7 +23,8 @@ tracing = { workspace = true } serde = { workspace = true } serde_json = "1.0.96" snafu = { workspace = true } -toml = "0.5.9" # TODO GG upgrade to toml = { workspace = true } +# TODO upgrade to toml = { workspace = true } https://github.com/EspressoSystems/HotShot/issues/1698 +toml = "0.5.9" [target.'cfg(all(async_executor_impl = "tokio"))'.dependencies] tokio = { workspace = true } diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index 8767e96af2..82e22eedf7 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -1047,7 +1047,17 @@ where self.update_view(view + 1).await; } } + SequencingHotShotEvent::VidCertRecv(cert) => { + debug!("VID cert received for view ! {}", *cert.view_number); + let view = cert.view_number; + self.certs.insert(view, cert); // TODO new cert type for VID https://github.com/EspressoSystems/HotShot/issues/1701 + + // TODO Make sure we aren't voting for an arbitrarily old round for no reason + if self.vote_if_able().await { + self.update_view(view + 1).await; + } + } SequencingHotShotEvent::ViewChange(new_view) => { debug!("View Change event for view {}", *new_view); @@ -1311,6 +1321,7 @@ pub fn consensus_event_filter>( | SequencingHotShotEvent::QuorumVoteRecv(_) | SequencingHotShotEvent::QCFormed(_) | SequencingHotShotEvent::DACRecv(_) + | SequencingHotShotEvent::VidCertRecv(_) | SequencingHotShotEvent::ViewChange(_) | SequencingHotShotEvent::SendDABlockData(_) | SequencingHotShotEvent::Timeout(_) diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index c7d20786ab..d05588f1c8 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -18,8 +18,8 @@ use hotshot_task::{ use hotshot_types::{ certificate::DACertificate, consensus::{Consensus, View}, - data::{DAProposal, ProposalType, SequencingLeaf}, - message::{CommitteeConsensusMessage, Message, Proposal, SequencingMessage}, + data::{DAProposal, ProposalType, SequencingLeaf, VidDisperse, VidScheme, VidSchemeTrait}, + message::{Message, Proposal, SequencingMessage}, traits::{ consensus_api::SequencingConsensusApi, election::{CommitteeExchangeType, ConsensusExchange, Membership}, @@ -146,13 +146,14 @@ where debug!("DA vote recv, collection task {:?}", vote.current_view); // panic!("Vote handle received DA vote for view {}", *vote.current_view); - // For the case where we receive votes after we've made a certificate - if state.accumulator.is_right() { - debug!("DA accumulator finished view: {:?}", state.cur_view); - return (None, state); - } - - let accumulator = state.accumulator.left().unwrap(); + let accumulator = match state.accumulator { + Right(_) => { + // For the case where we receive votes after we've made a certificate + debug!("DA accumulator finished view: {:?}", state.cur_view); + return (None, state); + } + Left(a) => a, + }; match state.committee_exchange.accumulate_vote( &vote.signature.0, &vote.signature.1, @@ -192,8 +193,63 @@ where } } } + SequencingHotShotEvent::VidVoteRecv(vote) => { + // TODO copy-pasted from DAVoteRecv https://github.com/EspressoSystems/HotShot/issues/1690 + + debug!("VID vote recv, collection task {:?}", vote.current_view); + // panic!("Vote handle received DA vote for view {}", *vote.current_view); + + let accumulator = match state.accumulator { + Right(_) => { + // For the case where we receive votes after we've made a certificate + debug!("VID accumulator finished view: {:?}", state.cur_view); + return (None, state); + } + Left(a) => a, + }; + match state.committee_exchange.accumulate_vote( + &vote.signature.0, + &vote.signature.1, + vote.block_commitment, + vote.vote_data, + vote.vote_token.clone(), + state.cur_view, + accumulator, + None, + ) { + Left(acc) => { + state.accumulator = Either::Left(acc); + // debug!("Not enough VID votes! "); + return (None, state); + } + Right(vid_cert) => { + debug!("Sending VID cert! {:?}", vid_cert.view_number); + state + .event_stream + .publish(SequencingHotShotEvent::VidCertSend( + vid_cert.clone(), + state.committee_exchange.public_key().clone(), + )) + .await; + + state.accumulator = Right(vid_cert.clone()); + state + .committee_exchange + .network() + .inject_consensus_info(ConsensusIntentEvent::CancelPollForVotes( + *vid_cert.view_number, + )) + .await; + + // Return completed at this point + return (Some(HotShotTaskCompleted::ShutDown), state); + } + } + } SequencingHotShotEvent::Shutdown => return (Some(HotShotTaskCompleted::ShutDown), state), - _ => {} + _ => { + error!("unexpected event {:?}", event); + } } (None, state) } @@ -217,7 +273,6 @@ where { /// main task event handler #[instrument(skip_all, fields(id = self.id, view = *self.cur_view), name = "DA Main Task", level = "error")] - pub async fn handle_event( &mut self, event: SequencingHotShotEvent, @@ -298,7 +353,7 @@ where } Ok(Some(vote_token)) => { // Generate and send vote - let message = self.committee_exchange.create_da_message( + let vote = self.committee_exchange.create_da_message( block_commitment, view, vote_token, @@ -307,12 +362,10 @@ where // ED Don't think this is necessary? // self.cur_view = view; - if let CommitteeConsensusMessage::DAVote(vote) = message { - debug!("Sending vote to the DA leader {:?}", vote.current_view); - self.event_stream - .publish(SequencingHotShotEvent::DAVoteSend(vote)) - .await; - } + debug!("Sending vote to the DA leader {:?}", vote.current_view); + self.event_stream + .publish(SequencingHotShotEvent::DAVoteSend(vote)) + .await; let mut consensus = self.consensus.write().await; // Ensure this view is in the view map for garbage collection, but do not overwrite if @@ -412,6 +465,170 @@ where .await; }; } + SequencingHotShotEvent::VidVoteRecv(vote) => { + // TODO copy-pasted from DAVoteRecv https://github.com/EspressoSystems/HotShot/issues/1690 + + // warn!( + // "VID vote recv, Main Task {:?}, key: {:?}", + // vote.current_view, + // self.committee_exchange.public_key() + // ); + // Check if we are the leader and the vote is from the sender. + let view = vote.current_view; + if !self.committee_exchange.is_leader(view) { + error!( + "We are not the VID leader for view {} are we leader for next view? {}", + *view, + self.committee_exchange.is_leader(view + 1) + ); + return None; + } + + let handle_event = HandleEvent(Arc::new(move |event, state| { + async move { vote_handle(state, event).await }.boxed() + })); + let collection_view = + if let Some((collection_view, collection_id, _)) = &self.vote_collector { + // TODO: Is this correct for consecutive leaders? + if view > *collection_view { + // warn!("shutting down for view {:?}", collection_view); + self.registry.shutdown_task(*collection_id).await; + } + *collection_view + } else { + TYPES::Time::new(0) + }; + let acc = VoteAccumulator { + total_vote_outcomes: HashMap::new(), + da_vote_outcomes: HashMap::new(), + yes_vote_outcomes: HashMap::new(), + no_vote_outcomes: HashMap::new(), + viewsync_precommit_vote_outcomes: HashMap::new(), + viewsync_commit_vote_outcomes: HashMap::new(), + viewsync_finalize_vote_outcomes: HashMap::new(), + success_threshold: self.committee_exchange.success_threshold(), + failure_threshold: self.committee_exchange.failure_threshold(), + sig_lists: Vec::new(), + signers: bitvec![0; self.committee_exchange.total_nodes()], + }; + let accumulator = self.committee_exchange.accumulate_vote( + &vote.clone().signature.0, + &vote.clone().signature.1, + vote.clone().block_commitment, + vote.clone().vote_data.clone(), + vote.clone().vote_token.clone(), + vote.clone().current_view, + acc, + None, + ); + if view > collection_view { + let state = DAVoteCollectionTaskState { + committee_exchange: self.committee_exchange.clone(), + accumulator, + cur_view: view, + event_stream: self.event_stream.clone(), + id: self.id, + }; + let name = "VID Vote Collection"; + let filter = FilterEvent(Arc::new(|event| { + matches!(event, SequencingHotShotEvent::VidVoteRecv(_)) + })); + let builder = + TaskBuilder::>::new(name.to_string()) + .register_event_stream(self.event_stream.clone(), filter) + .await + .register_registry(&mut self.registry.clone()) + .await + .register_state(state) + .register_event_handler(handle_event); + let id = builder.get_task_id().unwrap(); + let stream_id = builder.get_stream_id().unwrap(); + let _task = + async_spawn( + async move { DAVoteCollectionTypes::build(builder).launch().await }, + ); + self.vote_collector = Some((view, id, stream_id)); + } else if let Some((_, _, stream_id)) = self.vote_collector { + self.event_stream + .direct_message(stream_id, SequencingHotShotEvent::VidVoteRecv(vote)) + .await; + }; + } + SequencingHotShotEvent::VidDisperseRecv(disperse, sender) => { + // TODO copy-pasted from DAProposalRecv https://github.com/EspressoSystems/HotShot/issues/1690 + debug!( + "VID disperse received for view: {:?}", + disperse.data.get_view_number() + ); + + // ED NOTE: Assuming that the next view leader is the one who sends DA proposal for this view + let view = disperse.data.get_view_number(); + + // Allow a DA proposal that is one view older, in case we have voted on a quorum + // proposal and updated the view. + // `self.cur_view` should be at least 1 since there is a view change before getting + // the `DAProposalRecv` event. Otherewise, the view number subtraction below will + // cause an overflow error. + if view < self.cur_view - 1 { + warn!("Throwing away VID disperse data that is more than one view older"); + return None; + } + + debug!("VID disperse data is fresh."); + let block_commitment = disperse.data.commitment; + + // ED Is this the right leader? + let view_leader_key = self.committee_exchange.get_leader(view); + if view_leader_key != sender { + error!("VID proposal doesn't have expected leader key for view {} \n DA proposal is: [N/A for VID]", *view); + return None; + } + + if !view_leader_key.validate(&disperse.signature, block_commitment.as_ref()) { + error!("Could not verify VID proposal sig."); + return None; + } + + let vote_token = self.committee_exchange.make_vote_token(view); + match vote_token { + Err(e) => { + error!("Failed to generate vote token for {:?} {:?}", view, e); + } + Ok(None) => { + debug!("We were not chosen for VID quorum on {:?}", view); + } + Ok(Some(vote_token)) => { + // Generate and send vote + let vote = self.committee_exchange.create_vid_message( + block_commitment, + view, + vote_token, + ); + + // ED Don't think this is necessary? + // self.cur_view = view; + + debug!("Sending vote to the VID leader {:?}", vote.current_view); + self.event_stream + .publish(SequencingHotShotEvent::VidVoteSend(vote)) + .await; + let mut consensus = self.consensus.write().await; + + // Ensure this view is in the view map for garbage collection, but do not overwrite if + // there is already a view there: the replica task may have inserted a `Leaf` view which + // contains strictly more information. + consensus.state_map.entry(view).or_insert(View { + view_inner: ViewInner::DA { + block: block_commitment, + }, + }); + + // Record the block we have promised to make available. + // TODO https://github.com/EspressoSystems/HotShot/issues/1692 + // consensus.saved_blocks.insert(proposal.data.deltas); + } + } + } // TODO ED Update high QC through QCFormed event SequencingHotShotEvent::ViewChange(view) => { if *self.cur_view >= *view { @@ -543,11 +760,44 @@ where // } self.event_stream .publish(SequencingHotShotEvent::DAProposalSend( - message, + message.clone(), self.committee_exchange.public_key().clone(), )) .await; + debug!("Prepare VID shares"); + { + /// TODO https://github.com/EspressoSystems/HotShot/issues/1693 + const NUM_STORAGE_NODES: usize = 10; + /// TODO https://github.com/EspressoSystems/HotShot/issues/1693 + const NUM_CHUNKS: usize = 5; + + // TODO https://github.com/EspressoSystems/HotShot/issues/1686 + let srs = hotshot_types::data::test_srs(NUM_STORAGE_NODES); + + let vid = VidScheme::new(NUM_CHUNKS, NUM_STORAGE_NODES, &srs).unwrap(); + let message_bytes = bincode::serialize(&message).unwrap(); + let (shares, common) = vid.dispersal_data(&message_bytes).unwrap(); + // TODO for now reuse the same block commitment and signature as DA committee + // https://github.com/EspressoSystems/jellyfish/issues/369 + + self.event_stream + .publish(SequencingHotShotEvent::VidDisperseSend( + Proposal { + data: VidDisperse { + view_number: self.cur_view + 1, // copied from `data` above + commitment: block.commit(), + shares, + common, + }, + signature: message.signature, + }, + // TODO don't send to committee, send to quorum (consensus.rs) https://github.com/EspressoSystems/HotShot/issues/1696 + self.committee_exchange.public_key().clone(), + )) + .await; + } + return None; } @@ -561,7 +811,9 @@ where SequencingHotShotEvent::Shutdown => { return Some(HotShotTaskCompleted::ShutDown); } - _ => {} + _ => { + error!("unexpected event {:?}", event); + } } None } @@ -639,6 +891,8 @@ where | SequencingHotShotEvent::Shutdown | SequencingHotShotEvent::TransactionsRecv(_) | SequencingHotShotEvent::Timeout(_) + | SequencingHotShotEvent::VidDisperseRecv(_, _) + | SequencingHotShotEvent::VidVoteRecv(_) | SequencingHotShotEvent::ViewChange(_) ) } diff --git a/crates/task-impls/src/events.rs b/crates/task-impls/src/events.rs index 98819108a4..3d6091a285 100644 --- a/crates/task-impls/src/events.rs +++ b/crates/task-impls/src/events.rs @@ -1,6 +1,6 @@ use hotshot_types::{ certificate::{DACertificate, QuorumCertificate}, - data::DAProposal, + data::{DAProposal, VidDisperse}, message::Proposal, traits::node_implementation::{ NodeImplementation, NodeType, QuorumProposalType, ViewSyncProposalType, @@ -62,4 +62,28 @@ pub enum SequencingHotShotEvent> { TransactionSend(TYPES::Transaction, TYPES::SignatureKey), /// Event to send DA block data from DA leader to next quorum leader (which should always be the same node); internal event only SendDABlockData(TYPES::BlockType), + /// Send VID shares to VID storage nodes; emitted by the DA leader + /// + /// Like [`DAProposalSend`]. + VidDisperseSend(Proposal>, TYPES::SignatureKey), + /// Vid disperse data has been received from the network; handled by the DA task + /// + /// Like [`DAProposalRecv`]. + VidDisperseRecv(Proposal>, TYPES::SignatureKey), + /// Send a VID vote to the VID leader; emitted by VID storage nodes in the DA task after seeing a valid VID dispersal + /// + /// Like [`DAVoteSend`] + VidVoteSend(DAVote), + /// A VID vote has been received by the network; handled by the DA task + /// + /// Like [`DAVoteRecv`] + VidVoteRecv(DAVote), + /// The VID leader has collected enough votes to form a VID cert; emitted by the VID leader in the DA task; sent to the entire network via the networking task + /// + /// Like [`DACSend`] + VidCertSend(DACertificate, TYPES::SignatureKey), + /// A VID cert has been recieved by the network; handled by the consensus task + /// + /// Like [`DACRecv`] + VidCertRecv(DACertificate), } diff --git a/crates/task-impls/src/network.rs b/crates/task-impls/src/network.rs index a4b083ba37..9b0410e46f 100644 --- a/crates/task-impls/src/network.rs +++ b/crates/task-impls/src/network.rs @@ -106,6 +106,15 @@ impl< // panic!("Recevid DA C! "); SequencingHotShotEvent::DACRecv(cert) } + CommitteeConsensusMessage::VidDisperseMsg(proposal) => { + SequencingHotShotEvent::VidDisperseRecv(proposal, sender) + } + CommitteeConsensusMessage::VidVote(vote) => { + SequencingHotShotEvent::VidVoteRecv(vote.clone()) + } + CommitteeConsensusMessage::VidCertificate(cert) => { + SequencingHotShotEvent::VidCertRecv(cert) + } }, }; // TODO (Keyao benchmarking) Update these event variants (similar to the @@ -186,6 +195,7 @@ impl< /// Returns the completion status. /// # Panics /// Panic sif a direct message event is received with no recipient + #[allow(clippy::too_many_lines)] // TODO https://github.com/EspressoSystems/HotShot/issues/1704 pub async fn handle_event( &mut self, event: SequencingHotShotEvent, @@ -210,7 +220,14 @@ impl< TransmitType::Direct, Some(membership.get_leader(vote.current_view() + 1)), ), - + SequencingHotShotEvent::VidDisperseSend(proposal, sender) => ( + sender, + MessageKind::::from_consensus_message(SequencingMessage(Right( + CommitteeConsensusMessage::VidDisperseMsg(proposal), + ))), // TODO not a CommitteeConsensusMessage https://github.com/EspressoSystems/HotShot/issues/1696 + TransmitType::Broadcast, // TODO not a broadcast https://github.com/EspressoSystems/HotShot/issues/1696 + None, + ), SequencingHotShotEvent::DAProposalSend(proposal, sender) => ( sender, MessageKind::::from_consensus_message(SequencingMessage(Right( @@ -219,6 +236,14 @@ impl< TransmitType::Broadcast, None, ), + SequencingHotShotEvent::VidVoteSend(vote) => ( + vote.signature_key(), + MessageKind::::from_consensus_message(SequencingMessage(Right( + CommitteeConsensusMessage::VidVote(vote.clone()), + ))), + TransmitType::Direct, + Some(membership.get_leader(vote.current_view)), // TODO who is VID leader? https://github.com/EspressoSystems/HotShot/issues/1699 + ), SequencingHotShotEvent::DAVoteSend(vote) => ( vote.signature_key(), MessageKind::::from_consensus_message(SequencingMessage(Right( @@ -227,6 +252,14 @@ impl< TransmitType::Direct, Some(membership.get_leader(vote.current_view)), ), + SequencingHotShotEvent::VidCertSend(certificate, sender) => ( + sender, + MessageKind::::from_consensus_message(SequencingMessage(Right( + CommitteeConsensusMessage::VidCertificate(certificate), + ))), + TransmitType::Broadcast, + None, + ), // ED NOTE: This needs to be broadcasted to all nodes, not just ones on the DA committee SequencingHotShotEvent::DACSend(certificate, sender) => ( sender, @@ -307,6 +340,7 @@ impl< | SequencingHotShotEvent::QuorumVoteSend(_) | SequencingHotShotEvent::Shutdown | SequencingHotShotEvent::DACSend(_, _) + | SequencingHotShotEvent::VidCertSend(_, _) | SequencingHotShotEvent::ViewChange(_) ) } @@ -318,6 +352,8 @@ impl< SequencingHotShotEvent::DAProposalSend(_, _) | SequencingHotShotEvent::DAVoteSend(_) | SequencingHotShotEvent::Shutdown + | SequencingHotShotEvent::VidDisperseSend(_, _) + | SequencingHotShotEvent::VidVoteSend(_) | SequencingHotShotEvent::ViewChange(_) ) } diff --git a/crates/testing/Cargo.toml b/crates/testing/Cargo.toml index e75c328a5d..b361b241d7 100644 --- a/crates/testing/Cargo.toml +++ b/crates/testing/Cargo.toml @@ -41,6 +41,7 @@ bitvec = { workspace = true } [dev-dependencies] async-lock = { workspace = true } +bincode = { workspace = true } # GG any better options for serialization? [target.'cfg(all(async_executor_impl = "tokio"))'.dependencies] tokio = { workspace = true } diff --git a/crates/testing/src/task_helpers.rs b/crates/testing/src/task_helpers.rs index 13868721d4..4684fb5284 100644 --- a/crates/testing/src/task_helpers.rs +++ b/crates/testing/src/task_helpers.rs @@ -13,7 +13,7 @@ use hotshot::{ use hotshot_task::event_stream::ChannelStream; use hotshot_task_impls::events::SequencingHotShotEvent; use hotshot_types::{ - data::{QuorumProposal, SequencingLeaf, ViewNumber}, + data::{QuorumProposal, SequencingLeaf, VidScheme, ViewNumber}, message::{Message, Proposal}, traits::{ consensus_api::ConsensusSharedApi, @@ -163,3 +163,10 @@ pub fn key_pair_for_id(node_id: u64) -> (::PrivateKey, let public_key = ::SignatureKey::from_private(&private_key); (private_key, public_key) } + +pub fn vid_init() -> VidScheme { + const NUM_STORAGE_NODES: usize = 10; + const NUM_CHUNKS: usize = 5; + let srs = hotshot_types::data::test_srs(NUM_STORAGE_NODES); + VidScheme::new(NUM_CHUNKS, NUM_STORAGE_NODES, &srs).unwrap() +} diff --git a/crates/testing/src/test_runner.rs b/crates/testing/src/test_runner.rs index 57c82d24e9..e03292e639 100644 --- a/crates/testing/src/test_runner.rs +++ b/crates/testing/src/test_runner.rs @@ -202,8 +202,8 @@ where >, { let mut results = vec![]; - for _i in 0..total { - tracing::error!("running node{}", _i); + for i in 0..total { + tracing::debug!("launch node {}", i); let node_id = self.next_node_id; let storage = (self.launcher.resource_generator.storage)(node_id); let config = self.launcher.resource_generator.config.clone(); diff --git a/crates/testing/tests/basic.rs b/crates/testing/tests/basic.rs index fc4b6017f7..35e75fffa7 100644 --- a/crates/testing/tests/basic.rs +++ b/crates/testing/tests/basic.rs @@ -6,13 +6,23 @@ #[cfg_attr(async_executor_impl = "async-std", async_std::test)] async fn test_success() { use hotshot_testing::{ + completion_task::{CompletionTaskDescription, TimeBasedCompletionTaskDescription}, node_types::{SequencingMemoryImpl, SequencingTestTypes}, test_builder::TestMetadata, }; + use std::time::Duration; async_compatibility_layer::logging::setup_logging(); async_compatibility_layer::logging::setup_backtrace(); - let metadata = TestMetadata::default(); + let metadata = TestMetadata { + // allow more time to pass in CI + completion_task_description: CompletionTaskDescription::TimeBasedCompletionTaskBuilder( + TimeBasedCompletionTaskDescription { + duration: Duration::from_millis(1_200_000), + }, + ), + ..TestMetadata::default() + }; metadata .gen_launcher::() .launch() diff --git a/crates/testing/tests/da_task.rs b/crates/testing/tests/da_task.rs index 0322909203..64b70ef40c 100644 --- a/crates/testing/tests/da_task.rs +++ b/crates/testing/tests/da_task.rs @@ -1,9 +1,12 @@ use commit::Committable; use hotshot::HotShotSequencingConsensusApi; use hotshot_task_impls::events::SequencingHotShotEvent; -use hotshot_testing::node_types::{SequencingMemoryImpl, SequencingTestTypes}; +use hotshot_testing::{ + node_types::{SequencingMemoryImpl, SequencingTestTypes}, + task_helpers::vid_init, +}; use hotshot_types::{ - data::{DAProposal, ViewNumber}, + data::{DAProposal, VidDisperse, VidSchemeTrait, ViewNumber}, traits::{ consensus_api::ConsensusSharedApi, election::ConsensusExchange, node_implementation::ExchangesType, state::ConsensusTime, @@ -23,10 +26,7 @@ async fn test_da_task() { }; use hotshot_task_impls::harness::run_harness; use hotshot_testing::task_helpers::build_system_handle; - use hotshot_types::{ - message::{CommitteeConsensusMessage, Proposal}, - traits::election::CommitteeExchangeType, - }; + use hotshot_types::{message::Proposal, traits::election::CommitteeExchangeType}; async_compatibility_layer::logging::setup_logging(); async_compatibility_layer::logging::setup_backtrace(); @@ -53,6 +53,20 @@ async fn test_da_task() { data: proposal, signature, }; + let vid = vid_init(); + let message_bytes = bincode::serialize(&message).unwrap(); + let (shares, common) = vid.dispersal_data(&message_bytes).unwrap(); + let vid_proposal = Proposal { + data: VidDisperse { + view_number: message.data.view_number, + commitment: block_commitment, + shares, + common, + }, + signature: message.signature.clone(), + }; + // TODO for now reuse the same block commitment and signature as DA committee + // https://github.com/EspressoSystems/jellyfish/issues/369 // Every event input is seen on the event stream in the output. let mut input = Vec::new(); @@ -65,6 +79,10 @@ async fn test_da_task() { message.clone(), pub_key, )); + input.push(SequencingHotShotEvent::VidDisperseRecv( + vid_proposal.clone(), + pub_key, + )); input.push(SequencingHotShotEvent::Shutdown); output.insert(SequencingHotShotEvent::ViewChange(ViewNumber::new(1)), 1); @@ -73,14 +91,31 @@ async fn test_da_task() { SequencingHotShotEvent::DAProposalSend(message.clone(), pub_key), 1, ); - if let Ok(Some(vote_token)) = committee_exchange.make_vote_token(ViewNumber::new(2)) { - let da_message = - committee_exchange.create_da_message(block_commitment, ViewNumber::new(2), vote_token); - if let CommitteeConsensusMessage::DAVote(vote) = da_message { - output.insert(SequencingHotShotEvent::DAVoteSend(vote), 1); - } - } + let vote_token = committee_exchange + .make_vote_token(ViewNumber::new(2)) + .unwrap() + .unwrap(); + let da_vote = + committee_exchange.create_da_message(block_commitment, ViewNumber::new(2), vote_token); + output.insert(SequencingHotShotEvent::DAVoteSend(da_vote), 1); + output.insert( + SequencingHotShotEvent::VidDisperseSend(vid_proposal.clone(), pub_key), + 1, + ); + + let vote_token = committee_exchange + .make_vote_token(ViewNumber::new(2)) + .unwrap() + .unwrap(); + let vid_vote = + committee_exchange.create_vid_message(block_commitment, ViewNumber::new(2), vote_token); + output.insert(SequencingHotShotEvent::VidVoteSend(vid_vote), 1); + output.insert(SequencingHotShotEvent::DAProposalRecv(message, pub_key), 1); + output.insert( + SequencingHotShotEvent::VidDisperseRecv(vid_proposal, pub_key), + 1, + ); output.insert(SequencingHotShotEvent::ViewChange(ViewNumber::new(2)), 1); output.insert(SequencingHotShotEvent::Shutdown, 1); diff --git a/crates/testing/tests/network_task.rs b/crates/testing/tests/network_task.rs index f3d8d9f8bb..c14052bae3 100644 --- a/crates/testing/tests/network_task.rs +++ b/crates/testing/tests/network_task.rs @@ -3,10 +3,10 @@ use hotshot::HotShotSequencingConsensusApi; use hotshot_task_impls::events::SequencingHotShotEvent; use hotshot_testing::{ node_types::{SequencingMemoryImpl, SequencingTestTypes}, - task_helpers::build_quorum_proposal, + task_helpers::{build_quorum_proposal, vid_init}, }; use hotshot_types::{ - data::{DAProposal, ViewNumber}, + data::{DAProposal, VidSchemeTrait, ViewNumber}, traits::{ consensus_api::ConsensusSharedApi, node_implementation::ExchangesType, state::ConsensusTime, }, @@ -23,7 +23,9 @@ async fn test_network_task() { use hotshot::demos::sdemo::{SDemoBlock, SDemoNormalBlock}; use hotshot_task_impls::harness::run_harness; use hotshot_testing::task_helpers::build_system_handle; - use hotshot_types::{message::Proposal, traits::election::CommitteeExchangeType}; + use hotshot_types::{ + data::VidDisperse, message::Proposal, traits::election::CommitteeExchangeType, + }; async_compatibility_layer::logging::setup_logging(); async_compatibility_layer::logging::setup_backtrace(); @@ -51,6 +53,20 @@ async fn test_network_task() { signature, }; let quorum_proposal = build_quorum_proposal(&handle, priv_key, 2).await; + let vid = vid_init(); + let da_proposal_bytes = bincode::serialize(&da_proposal).unwrap(); + let (shares, common) = vid.dispersal_data(&da_proposal_bytes).unwrap(); + // TODO for now reuse the same block commitment and signature as DA committee + // https://github.com/EspressoSystems/jellyfish/issues/369 + let da_vid_disperse = Proposal { + data: VidDisperse { + view_number: da_proposal.data.view_number, + commitment: block_commitment, + shares, + common, + }, + signature: da_proposal.signature.clone(), + }; // Every event input is seen on the event stream in the output. let mut input = Vec::new(); @@ -61,6 +77,10 @@ async fn test_network_task() { da_proposal.clone(), pub_key, )); + input.push(SequencingHotShotEvent::VidDisperseSend( + da_vid_disperse.clone(), + pub_key, + )); input.push(SequencingHotShotEvent::QuorumProposalSend( quorum_proposal.clone(), pub_key, @@ -69,10 +89,13 @@ async fn test_network_task() { input.push(SequencingHotShotEvent::Shutdown); output.insert(SequencingHotShotEvent::ViewChange(ViewNumber::new(1)), 2); - // One output from the input, the other from the DA task. output.insert( SequencingHotShotEvent::DAProposalSend(da_proposal.clone(), pub_key), - 2, + 2, // 2 occurrences: 1 from `input`, 1 from the DA task + ); + output.insert( + SequencingHotShotEvent::VidDisperseSend(da_vid_disperse, pub_key), + 2, // 2 occurrences: 1 from `input`, 1 from the DA task ); // Only one output from the input. // The consensus task will fail to send a second proposal, like the DA task does, due to the diff --git a/crates/testing/tests/web_server.rs b/crates/testing/tests/web_server.rs index 75d0e4f89c..6c95318c7b 100644 --- a/crates/testing/tests/web_server.rs +++ b/crates/testing/tests/web_server.rs @@ -1,5 +1,8 @@ +use std::time::Duration; + use async_compatibility_layer::logging::shutdown_logging; use hotshot_testing::{ + completion_task::{CompletionTaskDescription, TimeBasedCompletionTaskDescription}, node_types::{SequencingTestTypes, SequencingWebImpl}, overall_safety_task::OverallSafetyPropertiesDescription, test_builder::{TestMetadata, TimingData}, @@ -28,6 +31,12 @@ async fn web_server_network() { num_successful_views: 35, ..Default::default() }, + // allow more time to pass in CI + completion_task_description: CompletionTaskDescription::TimeBasedCompletionTaskBuilder( + TimeBasedCompletionTaskDescription { + duration: Duration::from_millis(1_200_000), + }, + ), ..TestMetadata::default() }; metadata diff --git a/crates/types/Cargo.toml b/crates/types/Cargo.toml index 5ea10f246c..58ac6c48a9 100644 --- a/crates/types/Cargo.toml +++ b/crates/types/Cargo.toml @@ -12,12 +12,13 @@ demo = ["ed25519-compact"] [dependencies] arbitrary = { version = "1.3", features = ["derive"] } +ark-bls12-381 = { workspace = true } async-compatibility-layer = { workspace = true } async-lock = { workspace = true } async-trait = { workspace = true } ark-serialize = { version = "0.3", features = [ "derive", -] } # TODO GG upgrade to 0.4 and inherit this dep from workspace +] } # TODO upgrade to 0.4 and inherit this dep from workspace https://github.com/EspressoSystems/HotShot/issues/1700 ark-std = { workspace = true } bincode = { workspace = true } bitvec = { workspace = true } @@ -36,12 +37,14 @@ hex_fmt = "0.3.0" hotshot-constants = { path = "../constants" } hotshot-utils = { path = "../utils" } hotshot-task = { path = "../task", default-features = false } -jf-primitives = { workspace = true } +jf-primitives = { workspace = true, features = ["test-srs"] } +jf-utils = { workspace = true } nll = { workspace = true } libp2p-networking = { workspace = true } rand = { workspace = true } rand_chacha = { workspace = true } serde = { workspace = true } +sha2 = { workspace = true } snafu = { workspace = true } tagged-base64 = { git = "https://github.com/EspressoSystems/tagged-base64", tag = "0.2.4" } time = { workspace = true } diff --git a/crates/types/src/data.rs b/crates/types/src/data.rs index 3f12fb7c82..2578ee7289 100644 --- a/crates/types/src/data.rs +++ b/crates/types/src/data.rs @@ -17,6 +17,7 @@ use crate::{ Block, State, }, }; +use ark_bls12_381::Bls12_381; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Read, SerializationError, Write}; use bincode::Options; use commit::{Commitment, Committable}; @@ -25,6 +26,7 @@ use either::Either; use espresso_systems_common::hotshot::tag; use hotshot_constants::GENESIS_PROPOSER_ID; use hotshot_utils::bincode::bincode_opts; +use jf_primitives::pcs::{checked_fft_size, prelude::UnivariateKzgPCS, PolynomialCommitmentScheme}; use rand::Rng; use serde::{Deserialize, Serialize}; use snafu::{ensure, Snafu}; @@ -159,6 +161,44 @@ pub struct DAProposal { pub view_number: TYPES::Time, } +/// The VID scheme type used in `HotShot`. +pub type VidScheme = jf_primitives::vid::advz::Advz; +pub use jf_primitives::vid::VidScheme as VidSchemeTrait; + +/// VID dispersal data +/// +/// Like [`DAProposal`]. +#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, Hash)] +pub struct VidDisperse { + /// The view number for which this VID data is intended + pub view_number: TYPES::Time, + /// Block commitment + pub commitment: Commitment, + /// VID shares dispersed among storage nodes + pub shares: Vec<::StorageShare>, + /// VID common data sent to all storage nodes + pub common: ::StorageCommon, +} + +/// Trusted KZG setup for VID. +/// +/// TESTING ONLY: don't use this in production +/// TODO +/// +/// # Panics +/// ...because this is only for tests. This comment exists to pacify clippy. +#[must_use] +pub fn test_srs( + num_storage_nodes: usize, +) -> as PolynomialCommitmentScheme>::SRS { + let mut rng = jf_utils::test_rng(); + UnivariateKzgPCS::::gen_srs_for_testing( + &mut rng, + checked_fft_size(num_storage_nodes).unwrap(), + ) + .unwrap() +} + /// Proposal to append a block. #[derive(custom_debug::Debug, Serialize, Deserialize, Clone, Eq, PartialEq, Hash)] #[serde(bound(deserialize = ""))] @@ -202,6 +242,13 @@ impl ProposalType for DAProposal { } } +impl ProposalType for VidDisperse { + type NodeType = TYPES; + fn get_view_number(&self) -> ::Time { + self.view_number + } +} + impl> ProposalType for QuorumProposal { diff --git a/crates/types/src/message.rs b/crates/types/src/message.rs index 89d2864aa9..0a5563ad5f 100644 --- a/crates/types/src/message.rs +++ b/crates/types/src/message.rs @@ -5,7 +5,7 @@ use crate::{ certificate::DACertificate, - data::{DAProposal, ProposalType}, + data::{DAProposal, ProposalType, VidDisperse}, traits::{ network::{NetworkMsg, ViewMessage}, node_implementation::{ @@ -52,7 +52,7 @@ impl> ViewMessage for Messa #[derive(Clone, Debug)] pub struct Messages>(pub Vec>); -/// A message type agnostic description of a messages purpose +/// A message type agnostic description of a message's purpose #[derive(PartialEq, Copy, Clone)] pub enum MessagePurpose { /// Message with a quorum proposal. @@ -69,6 +69,12 @@ pub enum MessagePurpose { Internal, /// Data message Data, + /// VID disperse, like [`Proposal`]. + VidDisperse, + /// VID vote, like [`Vote`]. + VidVote, + /// VID certificate, like [`DAC`]. + VidCert, } // TODO (da) make it more customized to the consensus layer, maybe separating the specific message @@ -207,6 +213,12 @@ pub enum ProcessedCommitteeConsensusMessage { DAVote(DAVote, TYPES::SignatureKey), /// Certificate for the DA. DACertificate(DACertificate, TYPES::SignatureKey), + /// VID dispersal data. Like [`DAProposal`] + VidDisperseMsg(Proposal>, TYPES::SignatureKey), + /// Vote from VID storage node. Like [`DAVote`] + VidVote(DAVote, TYPES::SignatureKey), + /// Certificate for VID. Like [`DACertificate`] + VidCertificate(DACertificate, TYPES::SignatureKey), } impl From> @@ -223,6 +235,15 @@ impl From> ProcessedCommitteeConsensusMessage::DACertificate(cert, _) => { CommitteeConsensusMessage::DACertificate(cert) } + ProcessedCommitteeConsensusMessage::VidDisperseMsg(disperse, _) => { + CommitteeConsensusMessage::VidDisperseMsg(disperse) + } + ProcessedCommitteeConsensusMessage::VidVote(v, _) => { + CommitteeConsensusMessage::VidVote(v) + } + ProcessedCommitteeConsensusMessage::VidCertificate(cert, _) => { + CommitteeConsensusMessage::VidCertificate(cert) + } } } } @@ -240,6 +261,15 @@ impl ProcessedCommitteeConsensusMessage { CommitteeConsensusMessage::DACertificate(cert) => { ProcessedCommitteeConsensusMessage::DACertificate(cert, sender) } + CommitteeConsensusMessage::VidDisperseMsg(disperse) => { + ProcessedCommitteeConsensusMessage::VidDisperseMsg(disperse, sender) + } + CommitteeConsensusMessage::VidVote(v) => { + ProcessedCommitteeConsensusMessage::VidVote(v, sender) + } + CommitteeConsensusMessage::VidCertificate(cert) => { + ProcessedCommitteeConsensusMessage::VidCertificate(cert, sender) + } } } } @@ -307,6 +337,23 @@ pub enum CommitteeConsensusMessage { /// Certificate data is available DACertificate(DACertificate), + + /// Initiate VID dispersal. + /// + /// Like [`DAProposal`]. Use `Msg` suffix to distinguish from [`VidDisperse`]. + /// TODO this variant should not be a [`CommitteeConsensusMessage`] because + VidDisperseMsg(Proposal>), + + /// Vote for VID disperse data + /// + /// Like [`DAVote`]. + /// TODO currently re-using [`DAVote`]; do we need a separate VID vote? + VidVote(DAVote), + /// VID certificate data is available + /// + /// Like [`DACertificate`] + /// TODO currently re-using [`DACertificate`]; do we need a separate VID cert? + VidCertificate(DACertificate), } /// Messages related to the consensus protocol. @@ -377,7 +424,12 @@ impl< p.data.get_view_number() } CommitteeConsensusMessage::DAVote(vote_message) => vote_message.current_view(), - CommitteeConsensusMessage::DACertificate(cert) => cert.view_number, + CommitteeConsensusMessage::DACertificate(cert) + | CommitteeConsensusMessage::VidCertificate(cert) => cert.view_number, + CommitteeConsensusMessage::VidDisperseMsg(disperse) => { + disperse.data.get_view_number() + } + CommitteeConsensusMessage::VidVote(vote) => vote.current_view(), } } } @@ -397,7 +449,10 @@ impl< Right(committee_message) => match committee_message { CommitteeConsensusMessage::DAProposal(_) => MessagePurpose::Proposal, CommitteeConsensusMessage::DAVote(_) => MessagePurpose::Vote, + CommitteeConsensusMessage::VidVote(_) => MessagePurpose::VidVote, CommitteeConsensusMessage::DACertificate(_) => MessagePurpose::DAC, + CommitteeConsensusMessage::VidDisperseMsg(_) => MessagePurpose::VidDisperse, + CommitteeConsensusMessage::VidCertificate(_) => todo!(), }, } } diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 81a173e954..c24f90b99b 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -15,7 +15,7 @@ use crate::{ }; use crate::{ - message::{CommitteeConsensusMessage, GeneralConsensusMessage, Message}, + message::{GeneralConsensusMessage, Message}, vote::ViewSyncVoteInternal, }; @@ -517,7 +517,23 @@ pub trait CommitteeExchangeType: block_commitment: Commitment, current_view: TYPES::Time, vote_token: TYPES::VoteTokenType, - ) -> CommitteeConsensusMessage; + ) -> DAVote; + + // TODO temporary vid methods, move to quorum https://github.com/EspressoSystems/HotShot/issues/1696 + + /// Create a message with a vote on VID disperse data. + fn create_vid_message( + &self, + block_commitment: Commitment, + current_view: TYPES::Time, + vote_token: TYPES::VoteTokenType, + ) -> DAVote; + + /// Sign a vote on VID proposal. + fn sign_vid_vote( + &self, + block_commitment: Commitment, + ) -> (EncodedPublicKey, EncodedSignature); } /// Standard implementation of [`CommitteeExchangeType`] utilizing a DA committee. @@ -581,15 +597,44 @@ impl< block_commitment: Commitment, current_view: TYPES::Time, vote_token: TYPES::VoteTokenType, - ) -> CommitteeConsensusMessage { + ) -> DAVote { let signature = self.sign_da_vote(block_commitment); - CommitteeConsensusMessage::::DAVote(DAVote { + DAVote { + signature, + block_commitment, + current_view, + vote_token, + vote_data: VoteData::DA(block_commitment), + } + } + + fn create_vid_message( + &self, + block_commitment: Commitment, + current_view: ::Time, + vote_token: ::VoteTokenType, + ) -> DAVote { + let signature = self.sign_vid_vote(block_commitment); + DAVote { signature, block_commitment, current_view, vote_token, vote_data: VoteData::DA(block_commitment), - }) + } + } + + fn sign_vid_vote( + &self, + block_commitment: Commitment<::BlockType>, + ) -> (EncodedPublicKey, EncodedSignature) { + let signature = TYPES::SignatureKey::sign( + &self.private_key, + VoteData::::DA(block_commitment) + .commit() + .as_ref(), + ); + (self.public_key.to_bytes(), signature) } } diff --git a/crates/web_server/src/config.rs b/crates/web_server/src/config.rs index 1da2781c55..cf6873877a 100644 --- a/crates/web_server/src/config.rs +++ b/crates/web_server/src/config.rs @@ -33,6 +33,30 @@ pub fn post_vote_route(view_number: u64) -> String { format!("api/votes/{view_number}") } +pub fn get_vid_disperse_route(view_number: u64) -> String { + format!("api/vid/disperse/{view_number}") +} + +pub fn post_vid_disperse_route(view_number: u64) -> String { + format!("api/vid/disperse/{view_number}") +} + +pub fn get_vid_vote_route(view_number: u64, index: u64) -> String { + format!("api/vid/votes/{view_number}/{index}") +} + +pub fn post_vid_vote_route(view_number: u64) -> String { + format!("api/vid/votes/{view_number}") +} + +pub fn get_vid_cert_route(view_number: u64) -> String { + format!("api/vid/cert/{view_number}") +} + +pub fn post_vid_cert_route(view_number: u64) -> String { + format!("api/vid/cert/{view_number}") +} + pub fn get_transactions_route(index: u64) -> String { format!("api/transactions/{index}") } diff --git a/justfile b/justfile index 9992d9057a..675943e108 100644 --- a/justfile +++ b/justfile @@ -16,14 +16,14 @@ run_ci: lint build test export RUSTDOCFLAGS='--cfg async_executor_impl="async-std" --cfg async_channel_impl="async-std" {{original_rustdocflags}}' RUSTFLAGS='--cfg async_executor_impl="async-std" --cfg async_channel_impl="async-std" {{original_rustflags}}' && just {{target}} {{ARGS}} build: - cargo build --verbose --profile=release-lto --workspace --examples --bins --tests --lib --benches + cargo build --verbose --workspace --examples --bins --tests --lib --benches example *ARGS: cargo run --profile=release-lto --example {{ARGS}} test: echo Testing - cargo test --verbose --profile=release-lto --lib --bins --tests --benches --workspace --no-fail-fast -- --test-threads=1 --nocapture + cargo test --verbose --lib --bins --tests --benches --workspace --no-fail-fast -- --test-threads=1 --nocapture test_basic: test_success test_with_failures test_network_task test_consensus_task test_da_task test_view_sync_task @@ -33,11 +33,11 @@ test_catchup: test_success: echo Testing success test - cargo test --lib --bins --tests --benches --workspace --no-fail-fast test_success -- --test-threads=1 --nocapture + ASYNC_STD_THREAD_COUNT=1 cargo test --lib --bins --tests --benches --workspace --no-fail-fast test_success -- --test-threads=1 --nocapture test_web_server: echo Testing web server - cargo test --lib --bins --tests --benches --workspace --no-fail-fast web_server_network -- --test-threads=1 --nocapture + ASYNC_STD_THREAD_COUNT=1 cargo test --lib --bins --tests --benches --workspace --no-fail-fast web_server_network -- --test-threads=1 --nocapture test_with_failures: echo Testing nodes leaving the network with async std executor @@ -49,7 +49,7 @@ test_network_task: test_consensus_task: echo Testing with async std executor - cargo test --lib --bins --tests --benches --workspace --no-fail-fast test_consensus -- --test-threads=1 --nocapture + ASYNC_STD_THREAD_COUNT=1 cargo test --lib --bins --tests --benches --workspace --no-fail-fast test_consensus -- --test-threads=1 --nocapture test_da_task: echo Testing the DA task with async std executor @@ -72,7 +72,7 @@ test_pkg_all pkg=test_pkg: cargo test --verbose --release --lib --bins --tests --benches --package={{pkg}} --no-fail-fast -- --test-threads=1 --nocapture list_tests_json package=test_pkg: - RUST_LOG=none cargo test --verbose --profile=release-lto --lib --bins --tests --benches --package={{package}} --no-fail-fast -- --test-threads=1 -Zunstable-options --format json + RUST_LOG=none cargo test --verbose --lib --bins --tests --benches --package={{package}} --no-fail-fast -- --test-threads=1 -Zunstable-options --format json list_examples package=test_pkg: cargo metadata | jq '.packages[] | select(.name == "{{package}}") | .targets[] | select(.kind == ["example"] ) | .name' @@ -98,7 +98,7 @@ fix: doc: echo Generating docs {{env_var('RUSTFLAGS')}} - cargo doc --no-deps --workspace --profile=release-lto --document-private-items --bins --examples --lib + cargo doc --no-deps --workspace --document-private-items --bins --examples --lib doc_test: echo Test docs From 3ce4ef99be8f1ae4f27875ddfac20f06a5d0621d Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Wed, 13 Sep 2023 13:47:39 -0400 Subject: [PATCH 24/66] DA accumulator works --- crates/task-impls/src/da.rs | 65 +++++------------------------ crates/types/src/traits/election.rs | 2 +- crates/types/src/vote.rs | 2 +- 3 files changed, 12 insertions(+), 57 deletions(-) diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index b4143b3844..8f6ec2469e 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -15,10 +15,8 @@ use hotshot_task::{ task::{FilterEvent, HandleEvent, HotShotTaskCompleted, HotShotTaskTypes, TS}, task_impls::{HSTWithEvent, TaskBuilder}, }; -use hotshot_types::vote::DAVoteAccumulator; use hotshot_types::traits::election::SignedCertificate; -use hotshot_types::vote::AccumulatorPlaceholder; -use hotshot_types::vote::VoteType; +use hotshot_types::vote::DAVoteAccumulator; use hotshot_types::{ certificate::DACertificate, consensus::{Consensus, View}, @@ -106,11 +104,7 @@ pub struct DAVoteCollectionTaskState< { /// the committee exchange pub committee_exchange: Arc>, - /// the vote accumulator - pub accumulator: - Either, DACertificate>, - /// The accumulator #[allow(clippy::type_complexity)] pub accumulator2: Either< as SignedCertificate< @@ -178,31 +172,9 @@ where &vote.block_commitment, ) { Left(new_accumulator) => { - error!("DA cert still accumulating"); state.accumulator2 = either::Left(new_accumulator); } - Right(dac) => { - panic!("DA cert made!"); - state.accumulator2 = either::Right(dac); - } - } - let accumulator = state.accumulator.left().unwrap(); - match state.committee_exchange.accumulate_vote( - &vote.signature.0, - &vote.signature.1, - vote.block_commitment, - vote.vote_data, - vote.vote_token.clone(), - state.cur_view, - accumulator, - None, - ) { - Left(acc) => { - state.accumulator = Either::Left(acc); - // debug!("Not enough DA votes! "); - return (None, state); - } Right(dac) => { debug!("Sending DAC! {:?}", dac.view_number); state @@ -213,7 +185,8 @@ where )) .await; - state.accumulator = Right(dac.clone()); + // TODO ED Rename this to just accumulator + state.accumulator2 = Right(dac.clone()); state .committee_exchange .network() @@ -391,29 +364,7 @@ where } else { TYPES::Time::new(0) }; - let acc = VoteAccumulator { - total_vote_outcomes: HashMap::new(), - da_vote_outcomes: HashMap::new(), - yes_vote_outcomes: HashMap::new(), - no_vote_outcomes: HashMap::new(), - viewsync_precommit_vote_outcomes: HashMap::new(), - viewsync_commit_vote_outcomes: HashMap::new(), - viewsync_finalize_vote_outcomes: HashMap::new(), - success_threshold: self.committee_exchange.success_threshold(), - failure_threshold: self.committee_exchange.failure_threshold(), - sig_lists: Vec::new(), - signers: bitvec![0; self.committee_exchange.total_nodes()], - }; - let accumulator = self.committee_exchange.accumulate_vote( - &vote.clone().signature.0, - &vote.clone().signature.1, - vote.clone().block_commitment, - vote.clone().vote_data.clone(), - vote.clone().vote_token.clone(), - vote.clone().current_view, - acc, - None, - ); + let new_accumulator = DAVoteAccumulator { da_vote_outcomes: HashMap::new(), success_threshold: self.committee_exchange.success_threshold(), @@ -423,12 +374,16 @@ where }; // TODO ED Get vote data here instead of cloning into block commitment field of vote - let accumulator2 = self.committee_exchange.accumulate_vote_2(new_accumulator, &vote, &vote.clone().block_commitment); + let accumulator2 = self.committee_exchange.accumulate_vote_2( + new_accumulator, + &vote, + &vote.clone().block_commitment, + ); if view > collection_view { let state = DAVoteCollectionTaskState { committee_exchange: self.committee_exchange.clone(), - accumulator, + accumulator2: accumulator2, cur_view: view, event_stream: self.event_stream.clone(), diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index ca4aa9c1d8..4a70d2f732 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -296,7 +296,7 @@ pub trait ConsensusExchange: Send + Sync { /// A proposal for participants to vote on. type Proposal: ProposalType; /// A vote on a [`Proposal`](Self::Proposal). - // TODO ED Use default associated type if it becomes stable + // TODO ED Make this equal Certificate vote (if possible?) type Vote: VoteType; /// A [`SignedCertificate`] attesting to a decision taken by the committee. type Certificate: SignedCertificate diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index 31e98a5c65..1048a65b05 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -359,6 +359,7 @@ impl< VOTE: VoteType, > Accumulator2 for DAVoteAccumulator { + // TODO ED We could make this the default impl, so it works for both TC and DAC fn append( mut self, vote: VOTE, @@ -427,7 +428,6 @@ impl< return Either::Right(AssembledSignature::DA(real_qc_sig)); } - error!("DA stake casted is {da_stake_casted}"); Either::Left(self) } } From d5b0479819783afe6ce2a022167905575d22b7e8 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Wed, 13 Sep 2023 14:05:11 -0400 Subject: [PATCH 25/66] Basic setup for consensus accumulator --- crates/task-impls/src/consensus.rs | 78 +++++++++++++++--------------- crates/task-impls/src/da.rs | 1 - 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index c52fe7e301..4ac149dd11 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -148,8 +148,15 @@ pub struct VoteCollectionTaskState< pub quorum_exchange: Arc>, #[allow(clippy::type_complexity)] /// Accumulator for votes - pub accumulator: - Either, QuorumCertificate>, + pub accumulator: Either< + > as SignedCertificate< + TYPES, + TYPES::Time, + TYPES::VoteTokenType, + SequencingLeaf, + >>::VoteAccumulator, + QuorumCertificate>, + >, /// View which this vote collection task is collecting votes in pub cur_view: TYPES::Time, /// The event stream shared by all tasks @@ -191,32 +198,29 @@ where { // TODO ED Emit a view change event upon new proposal? match event { - SequencingHotShotEvent::QuorumVoteRecv(vote) => match vote { - QuorumVote::Yes(vote) => { + SequencingHotShotEvent::QuorumVoteRecv(vote) => match vote.clone() { + QuorumVote::Yes(vote_internal) => { // For the case where we receive votes after we've made a certificate if state.accumulator.is_right() { return (None, state); } - if vote.current_view != state.cur_view { + if vote_internal.current_view != state.cur_view { error!( "Vote view does not match! vote view is {} current view is {}", - *vote.current_view, *state.cur_view + *vote_internal.current_view, *state.cur_view ); return (None, state); } let accumulator = state.accumulator.left().unwrap(); - match state.quorum_exchange.accumulate_vote( - &vote.signature.0, - &vote.signature.1, - vote.leaf_commitment, - vote.vote_data, - vote.vote_token.clone(), - state.cur_view, + // TODO ED Maybe we don't need this to take in commitment? Can just get it from the vote directly if it is always + // going to be passed in as the vote.commitment + match state.quorum_exchange.accumulate_vote_2( accumulator, - None, - ) { + &vote, + &vote_internal.leaf_commitment, + ) { Either::Left(acc) => { state.accumulator = Either::Left(acc); return (None, state); @@ -895,15 +899,17 @@ where return; } + // TODO ED Should remove this match because we'd always want to collect votes no matter the type on qc + // Though will need a sep accumulator for Timeout votes match vote { - QuorumVote::Yes(vote) => { + QuorumVote::Yes(vote_internal) => { let handle_event = HandleEvent(Arc::new(move |event, state| { async move { vote_handle(state, event).await }.boxed() })); let collection_view = if let Some((collection_view, collection_task, _)) = &self.vote_collector { - if vote.current_view > *collection_view { + if vote_internal.current_view > *collection_view { // ED I think we'd want to let that task timeout to avoid a griefing vector self.registry.shutdown_task(*collection_task).await; } @@ -912,37 +918,33 @@ where TYPES::Time::new(0) }; - let acc = VoteAccumulator { + + // Todo check if we are the leader + let new_accumulator = QuorumVoteAccumulator { total_vote_outcomes: HashMap::new(), - da_vote_outcomes: HashMap::new(), yes_vote_outcomes: HashMap::new(), no_vote_outcomes: HashMap::new(), - viewsync_precommit_vote_outcomes: HashMap::new(), - viewsync_commit_vote_outcomes: HashMap::new(), - viewsync_finalize_vote_outcomes: HashMap::new(), + success_threshold: self.quorum_exchange.success_threshold(), failure_threshold: self.quorum_exchange.failure_threshold(), + sig_lists: Vec::new(), signers: bitvec![0; self.quorum_exchange.total_nodes()], + phantom: PhantomData, }; - - // Todo check if we are the leader - let accumulator = self.quorum_exchange.accumulate_vote( - &vote.clone().signature.0, - &vote.clone().signature.1, - vote.clone().leaf_commitment, - vote.clone().vote_data.clone(), - vote.clone().vote_token.clone(), - vote.clone().current_view, - acc, - None, + + // TODO ED Get vote data here instead of cloning into block commitment field of vote + let accumulator = self.quorum_exchange.accumulate_vote_2( + new_accumulator, + &vote, + &vote_internal.clone().leaf_commitment, ); - if vote.current_view > collection_view { + if vote_internal.current_view > collection_view { let state = VoteCollectionTaskState { quorum_exchange: self.quorum_exchange.clone(), accumulator, - cur_view: vote.current_view, + cur_view: vote_internal.current_view, event_stream: self.event_stream.clone(), id: self.id, }; @@ -962,17 +964,17 @@ where let id = builder.get_task_id().unwrap(); let stream_id = builder.get_stream_id().unwrap(); - self.vote_collector = Some((vote.current_view, id, stream_id)); + self.vote_collector = Some((vote_internal.current_view, id, stream_id)); let _task = async_spawn(async move { VoteCollectionTypes::build(builder).launch().await; }); - debug!("Starting vote handle for view {:?}", vote.current_view); + debug!("Starting vote handle for view {:?}", vote_internal.current_view); } else if let Some((_, _, stream_id)) = self.vote_collector { self.event_stream .direct_message( stream_id, - SequencingHotShotEvent::QuorumVoteRecv(QuorumVote::Yes(vote)), + SequencingHotShotEvent::QuorumVoteRecv(QuorumVote::Yes(vote_internal)), ) .await; } diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index 8f6ec2469e..510cd40f2a 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -32,7 +32,6 @@ use hotshot_types::{ Block, State, }, utils::ViewInner, - vote::VoteAccumulator, }; use hotshot_utils::bincode::bincode_opts; use snafu::Snafu; From 14a1f3dff96520b6d8dbdc3b8299009a50d279e4 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Wed, 13 Sep 2023 14:18:20 -0400 Subject: [PATCH 26/66] Add QuorumVoteAccumulator and ViewSyncVoteAccumulator placeholders --- crates/task-impls/src/consensus.rs | 17 ++++-- crates/types/src/certificate.rs | 7 ++- crates/types/src/vote.rs | 96 ++++++++++++++++++++++++++++-- 3 files changed, 107 insertions(+), 13 deletions(-) diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index 4ac149dd11..0879ee9d1b 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -18,6 +18,7 @@ use hotshot_task::{ task::{FilterEvent, HandleEvent, HotShotTaskCompleted, HotShotTaskTypes, TS}, task_impls::{HSTWithEvent, TaskBuilder}, }; +use hotshot_types::vote::QuorumVoteAccumulator; use hotshot_types::{ certificate::{DACertificate, QuorumCertificate}, consensus::{Consensus, View}, @@ -220,7 +221,7 @@ where accumulator, &vote, &vote_internal.leaf_commitment, - ) { + ) { Either::Left(acc) => { state.accumulator = Either::Left(acc); return (None, state); @@ -901,7 +902,7 @@ where // TODO ED Should remove this match because we'd always want to collect votes no matter the type on qc // Though will need a sep accumulator for Timeout votes - match vote { + match vote.clone() { QuorumVote::Yes(vote_internal) => { let handle_event = HandleEvent(Arc::new(move |event, state| { async move { vote_handle(state, event).await }.boxed() @@ -918,7 +919,6 @@ where TYPES::Time::new(0) }; - // Todo check if we are the leader let new_accumulator = QuorumVoteAccumulator { total_vote_outcomes: HashMap::new(), @@ -932,7 +932,7 @@ where signers: bitvec![0; self.quorum_exchange.total_nodes()], phantom: PhantomData, }; - + // TODO ED Get vote data here instead of cloning into block commitment field of vote let accumulator = self.quorum_exchange.accumulate_vote_2( new_accumulator, @@ -969,12 +969,17 @@ where let _task = async_spawn(async move { VoteCollectionTypes::build(builder).launch().await; }); - debug!("Starting vote handle for view {:?}", vote_internal.current_view); + debug!( + "Starting vote handle for view {:?}", + vote_internal.current_view + ); } else if let Some((_, _, stream_id)) = self.vote_collector { self.event_stream .direct_message( stream_id, - SequencingHotShotEvent::QuorumVoteRecv(QuorumVote::Yes(vote_internal)), + SequencingHotShotEvent::QuorumVoteRecv(QuorumVote::Yes( + vote_internal, + )), ) .await; } diff --git a/crates/types/src/certificate.rs b/crates/types/src/certificate.rs index 124d762a8c..8a7c394167 100644 --- a/crates/types/src/certificate.rs +++ b/crates/types/src/certificate.rs @@ -1,8 +1,9 @@ //! Provides two types of cerrtificates and their accumulators. -use crate::vote::AccumulatorPlaceholder; use crate::vote::DAVoteAccumulator; use crate::vote::QuorumVote; +use crate::vote::QuorumVoteAccumulator; +use crate::vote::ViewSyncVoteAccumulator; use crate::{ data::{fake_commitment, serialize_signature, LeafType}, traits::{ @@ -160,7 +161,7 @@ impl> for QuorumCertificate { type Vote = QuorumVote; - type VoteAccumulator = AccumulatorPlaceholder; + type VoteAccumulator = QuorumVoteAccumulator; fn from_signatures_and_commitment( view_number: TYPES::Time, @@ -324,7 +325,7 @@ impl for ViewSyncCertificate { type Vote = ViewSyncVote; - type VoteAccumulator = AccumulatorPlaceholder, Self::Vote>; + type VoteAccumulator = ViewSyncVoteAccumulator, Self::Vote>; /// Build a QC from the threshold signature and commitment fn from_signatures_and_commitment( view_number: TYPES::Time, diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index 1048a65b05..f9c2a646ea 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -333,7 +333,12 @@ pub trait Accumulator2< /// Append 1 vote to the accumulator. If the threshold is not reached, return /// the accumulator, else return the `AssembledSignature` /// Only called from inside `accumulate_internal` - fn append(self, vote: VOTE, vote_node_id: usize, stake_table_entries: Vec<::StakeTableEntry>,) -> Either>; + fn append( + self, + vote: VOTE, + vote_node_id: usize, + stake_table_entries: Vec<::StakeTableEntry>, + ) -> Either>; } pub struct DAVoteAccumulator< @@ -412,7 +417,7 @@ impl< if *da_stake_casted >= u64::from(self.success_threshold) { // Assemble QC let real_qc_pp = ::get_public_parameter( - // TODO ED Something about stake table entries. Might be easier to just pass in membership? + // TODO ED Something about stake table entries. Might be easier to just pass in membership? stake_table_entries.clone(), U256::from(self.success_threshold.get()), ); @@ -423,7 +428,7 @@ impl< &self.sig_lists[..], ); - // TODO ED Why do we need this line if we have the above line? + // TODO ED Why do we need this line if we have the above line? self.da_vote_outcomes.remove(&vote_commitment); return Either::Right(AssembledSignature::DA(real_qc_sig)); @@ -432,6 +437,84 @@ impl< } } +// TODO ED Should make these fields a trait for Accumulator, like success threshold, etc. +pub struct QuorumVoteAccumulator< + TYPES: NodeType, + COMMITTABLE: Committable + Serialize + Clone, + VOTE: VoteType, +> { + /// Map of all da signatures accumlated so far + pub total_vote_outcomes: VoteMap, + pub yes_vote_outcomes: VoteMap, + + pub no_vote_outcomes: VoteMap, + + /// A quorum's worth of stake, generally 2f + 1 + pub success_threshold: NonZeroU64, + + pub failure_threshold: NonZeroU64, + /// A list of valid signatures for certificate aggregation + pub sig_lists: Vec<::Signature>, + /// A bitvec to indicate which node is active and send out a valid signature for certificate aggregation, this automatically do uniqueness check + pub signers: BitVec, + + pub phantom: PhantomData, +} + +impl< + TYPES: NodeType, + COMMITTABLE: Committable + Serialize + Clone, + VOTE: VoteType, + > Accumulator2 for QuorumVoteAccumulator +{ + fn append( + self, + vote: VOTE, + vote_node_id: usize, + stake_table_entries: Vec<::StakeTableEntry>, + ) -> Either> { + todo!() + } +} + +pub struct ViewSyncVoteAccumulator< + TYPES: NodeType, + COMMITTABLE: Committable + Serialize + Clone, + VOTE: VoteType, +> { + /// Map of all da signatures accumlated so far + pub pre_commit_vote_outcomes: VoteMap, + pub commit_vote_outcomes: VoteMap, + pub finalize_vote_outcomes: VoteMap, + + /// A quorum's worth of stake, generally 2f + 1 + pub success_threshold: NonZeroU64, + + pub failure_threshold: NonZeroU64, + /// A list of valid signatures for certificate aggregation + pub sig_lists: Vec<::Signature>, + /// A bitvec to indicate which node is active and send out a valid signature for certificate aggregation, this automatically do uniqueness check + pub signers: BitVec, + + pub phantom: PhantomData, +} + +impl< + TYPES: NodeType, + COMMITTABLE: Committable + Serialize + Clone, + VOTE: VoteType, + > Accumulator2 for ViewSyncVoteAccumulator +{ + fn append( + self, + vote: VOTE, + vote_node_id: usize, + stake_table_entries: Vec<::StakeTableEntry>, + ) -> Either> { + todo!() + } +} + /// Placeholder accumulator; will be replaced by accumulator for each certificate type #[deprecated] pub struct AccumulatorPlaceholder< @@ -449,7 +532,12 @@ impl< VOTE: VoteType, > Accumulator2 for AccumulatorPlaceholder { - fn append(self, vote: VOTE, vote_node_id: usize, stake_table_entries: Vec<::StakeTableEntry>) -> Either> { + fn append( + self, + vote: VOTE, + vote_node_id: usize, + stake_table_entries: Vec<::StakeTableEntry>, + ) -> Either> { todo!() } } From f16f37d9e6a19f4f73f8ccc98f429132b65dfd44 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Wed, 13 Sep 2023 14:37:16 -0400 Subject: [PATCH 27/66] Consensus accumulator working --- crates/types/src/vote.rs | 103 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 98 insertions(+), 5 deletions(-) diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index f9c2a646ea..70c54bbcc5 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -437,7 +437,7 @@ impl< } } -// TODO ED Should make these fields a trait for Accumulator, like success threshold, etc. +// TODO ED Should make these fields a trait for Accumulator, like success threshold, etc. pub struct QuorumVoteAccumulator< TYPES: NodeType, COMMITTABLE: Committable + Serialize + Clone, @@ -468,12 +468,105 @@ impl< > Accumulator2 for QuorumVoteAccumulator { fn append( - self, + mut self, vote: VOTE, vote_node_id: usize, stake_table_entries: Vec<::StakeTableEntry>, ) -> Either> { - todo!() + let vote_commitment = match vote.get_data() { + VoteData::Yes(commitment) | VoteData::No(commitment) => commitment, + + _ => return Either::Left(self), + }; + + let encoded_key = vote.get_key().to_bytes(); + + // Deserialize the signature so that it can be assembeld into a QC + // TODO ED Update this once we've gotten rid of EncodedSignature + let original_signature: ::Signature = + bincode_opts() + .deserialize(&vote.get_signature().0) + .expect("Deserialization on the signature shouldn't be able to fail."); + + let (total_stake_casted, total_vote_map) = self + .total_vote_outcomes + .entry(vote_commitment) + .or_insert_with(|| (0, BTreeMap::new())); + + let (yes_stake_casted, yes_vote_map) = self + .yes_vote_outcomes + .entry(vote_commitment) + .or_insert_with(|| (0, BTreeMap::new())); + + let (no_stake_casted, no_vote_map) = self + .no_vote_outcomes + .entry(vote_commitment) + .or_insert_with(|| (0, BTreeMap::new())); + + // Check for duplicate vote + // TODO ED Re-encoding signature key to bytes until we get rid of EncodedKey + // Have to do this because SignatureKey is not hashable + if total_vote_map.contains_key(&encoded_key) { + return Either::Left(self); + } + + // Update the active_keys and signature lists + // TODO ED How does this differ than the check above? + if self.signers.get(vote_node_id).as_deref() == Some(&true) { + error!("Node id is already in signers list"); + return Either::Left(self); + } + self.signers.set(vote_node_id, true); + self.sig_lists.push(original_signature); + + // TODO ED Make all these get calls as local variables to avoid constantly calling them + *total_stake_casted += u64::from(vote.get_vote_token().vote_count()); + total_vote_map.insert( + encoded_key.clone(), + (vote.get_signature(), vote.get_data(), vote.get_vote_token()), + ); + + match vote.get_data() { + VoteData::Yes(_) => { + *yes_stake_casted += u64::from(vote.get_vote_token().vote_count()); + yes_vote_map.insert( + encoded_key, + (vote.get_signature(), vote.get_data(), vote.get_vote_token()), + ); + } + VoteData::No(_) => { + *no_stake_casted += u64::from(vote.get_vote_token().vote_count()); + no_vote_map.insert( + encoded_key, + (vote.get_signature(), vote.get_data(), vote.get_vote_token()), + ); + } + _ => return Either::Left(self), + } + + if *total_stake_casted >= u64::from(self.success_threshold) { + // Assemble QC + let real_qc_pp = ::get_public_parameter( + // TODO ED Something about stake table entries. Might be easier to just pass in membership? + stake_table_entries.clone(), + U256::from(self.success_threshold.get()), + ); + + let real_qc_sig = ::assemble( + &real_qc_pp, + self.signers.as_bitslice(), + &self.sig_lists[..], + ); + + if *yes_stake_casted >= u64::from(self.success_threshold) { + self.yes_vote_outcomes.remove(&vote_commitment); + return Either::Right(AssembledSignature::Yes(real_qc_sig)); + } else if *no_stake_casted >= u64::from(self.failure_threshold) { + self.total_vote_outcomes.remove(&vote_commitment); + return Either::Right(AssembledSignature::No(real_qc_sig)); + } + } + Either::Left(self) } } @@ -490,7 +583,7 @@ pub struct ViewSyncVoteAccumulator< /// A quorum's worth of stake, generally 2f + 1 pub success_threshold: NonZeroU64, - pub failure_threshold: NonZeroU64, + pub failure_threshold: NonZeroU64, /// A list of valid signatures for certificate aggregation pub sig_lists: Vec<::Signature>, /// A bitvec to indicate which node is active and send out a valid signature for certificate aggregation, this automatically do uniqueness check @@ -506,7 +599,7 @@ impl< > Accumulator2 for ViewSyncVoteAccumulator { fn append( - self, + mut self, vote: VOTE, vote_node_id: usize, stake_table_entries: Vec<::StakeTableEntry>, From 5530b0fd8e6483a25c8d72daeaf38fc5caae6a44 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Wed, 13 Sep 2023 15:25:57 -0400 Subject: [PATCH 28/66] View sync accumulator compiles --- crates/task-impls/src/view_sync.rs | 74 ++++++++++++++++++------------ 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/crates/task-impls/src/view_sync.rs b/crates/task-impls/src/view_sync.rs index 18c8ae581f..28decf328d 100644 --- a/crates/task-impls/src/view_sync.rs +++ b/crates/task-impls/src/view_sync.rs @@ -9,7 +9,14 @@ use hotshot_task::{ task::{FilterEvent, HandleEvent, HotShotTaskCompleted, HotShotTaskTypes, TS}, task_impls::{HSTWithEvent, TaskBuilder}, }; -use hotshot_types::traits::{election::Membership, network::ConsensusIntentEvent}; +use hotshot_types::traits::election::VoteData; +use hotshot_types::{ + traits::{ + election::{Membership, SignedCertificate}, + network::ConsensusIntentEvent, + }, + vote::{ViewSyncVoteAccumulator, VoteType}, +}; use bitvec::prelude::*; use hotshot_task::global_registry::GlobalRegistry; @@ -28,7 +35,7 @@ use hotshot_types::{ vote::{ViewSyncData, ViewSyncVote, VoteAccumulator}, }; use snafu::Snafu; -use std::{collections::HashMap, sync::Arc, time::Duration}; +use std::{collections::HashMap, marker::PhantomData, sync::Arc, time::Duration}; use tracing::{debug, error, instrument}; #[derive(PartialEq, PartialOrd, Clone, Debug, Eq, Hash)] /// Phases of view sync @@ -217,7 +224,12 @@ pub struct ViewSyncRelayTaskState< pub exchange: Arc>, /// Vote accumulator pub accumulator: Either< - VoteAccumulator>, + as SignedCertificate< + TYPES, + TYPES::Time, + TYPES::VoteTokenType, + ViewSyncData, + >>::VoteAccumulator, ViewSyncCertificate, >, /// Our node id; for logging @@ -380,24 +392,23 @@ where return; } - let accumulator = VoteAccumulator { - total_vote_outcomes: HashMap::new(), - da_vote_outcomes: HashMap::new(), - yes_vote_outcomes: HashMap::new(), - no_vote_outcomes: HashMap::new(), - viewsync_precommit_vote_outcomes: HashMap::new(), - viewsync_commit_vote_outcomes: HashMap::new(), - viewsync_finalize_vote_outcomes: HashMap::new(), + let new_accumulator = ViewSyncVoteAccumulator { + pre_commit_vote_outcomes: HashMap::new(), + commit_vote_outcomes: HashMap::new(), + finalize_vote_outcomes: HashMap::new(), + success_threshold: self.exchange.success_threshold(), failure_threshold: self.exchange.failure_threshold(), + sig_lists: Vec::new(), signers: bitvec![0; self.exchange.total_nodes()], + phantom: PhantomData, }; let mut relay_state = ViewSyncRelayTaskState { event_stream: self.event_stream.clone(), exchange: self.exchange.clone(), - accumulator: either::Left(accumulator), + accumulator: either::Left(new_accumulator), id: self.id, }; @@ -958,7 +969,7 @@ where return (Some(HotShotTaskCompleted::ShutDown), self); } - let (vote_internal, phase) = match vote { + let (vote_internal, phase) = match vote.clone() { ViewSyncVote::PreCommit(vote_internal) => { (vote_internal, ViewSyncPhase::PreCommit) } @@ -993,15 +1004,18 @@ where *vote_internal.round, vote_internal.relay ); - let accumulator = self.exchange.accumulate_vote( - &vote_internal.signature.0, - &vote_internal.signature.1, - view_sync_data, - vote_internal.vote_data, - vote_internal.vote_token.clone(), - vote_internal.round, + // TODO ED This isn't ideal, should fix this + let vote_data = match vote.get_data() { + VoteData::ViewSyncPreCommit(data) => data, + VoteData::ViewSyncCommit(data) => data, + VoteData::ViewSyncFinalize(data) => data, + _ => unimplemented!(), + }; + + let accumulator = self.exchange.accumulate_vote_2( self.accumulator.left().unwrap(), - Some(vote_internal.relay), + &vote, + &vote_data, ); self.accumulator = match accumulator { @@ -1022,19 +1036,19 @@ where .await; // Reset accumulator for new certificate - either::Left(VoteAccumulator { - total_vote_outcomes: HashMap::new(), - da_vote_outcomes: HashMap::new(), - yes_vote_outcomes: HashMap::new(), - no_vote_outcomes: HashMap::new(), - viewsync_precommit_vote_outcomes: HashMap::new(), - viewsync_commit_vote_outcomes: HashMap::new(), - viewsync_finalize_vote_outcomes: HashMap::new(), + let new_accumulator = ViewSyncVoteAccumulator { + pre_commit_vote_outcomes: HashMap::new(), + commit_vote_outcomes: HashMap::new(), + finalize_vote_outcomes: HashMap::new(), + success_threshold: self.exchange.success_threshold(), failure_threshold: self.exchange.failure_threshold(), + sig_lists: Vec::new(), signers: bitvec![0; self.exchange.total_nodes()], - }) + phantom: PhantomData, + }; + either::Left(new_accumulator) } }; From cdfc3952f9f9991bdf50ccf498727d28bac66b1e Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 13:47:29 -0700 Subject: [PATCH 29/66] removing known_nodes in favor of using known_nodes_with_stake --- .vscode/settings.json.example | 6 ++-- .../src/bn254/bn254_pub.rs | 6 ++++ crates/hotshot/examples/infra/mod.rs | 4 +-- crates/hotshot/examples/infra/modDA.rs | 2 -- crates/hotshot/src/lib.rs | 3 -- .../src/traits/election/static_committee.rs | 35 ++++++++----------- crates/orchestrator/src/config.rs | 9 +++-- crates/orchestrator/src/lib.rs | 2 +- crates/testing/src/task_helpers.rs | 2 -- crates/testing/src/test_builder.rs | 3 +- crates/testing/src/test_launcher.rs | 2 -- crates/testing/src/test_runner.rs | 3 -- crates/types/src/lib.rs | 4 +-- crates/types/src/traits/election.rs | 11 ++---- .../types/src/traits/node_implementation.rs | 6 +--- crates/types/src/traits/signature_key.rs | 3 ++ 16 files changed, 42 insertions(+), 59 deletions(-) diff --git a/.vscode/settings.json.example b/.vscode/settings.json.example index 6cc06a8e30..78a629a192 100644 --- a/.vscode/settings.json.example +++ b/.vscode/settings.json.example @@ -1,6 +1,6 @@ // Sets features for Rust Analyzer, since some features are required to be set for compilation { - "rust-analyzer.cargo.features": [ - "full-ci" - ], + "rust-analyzer.cargo.extraEnv": { + "RUSTFLAGS": "--cfg async_executor_impl=\"async-std\" --cfg async_channel_impl=\"async-std\"" + }, } \ No newline at end of file diff --git a/crates/hotshot-signature-key/src/bn254/bn254_pub.rs b/crates/hotshot-signature-key/src/bn254/bn254_pub.rs index c25fad4be0..714ee98687 100644 --- a/crates/hotshot-signature-key/src/bn254/bn254_pub.rs +++ b/crates/hotshot-signature-key/src/bn254/bn254_pub.rs @@ -134,6 +134,12 @@ impl SignatureKey for BN254Pub { } } + fn get_public_key(entry: &Self::StakeTableEntry) -> Self { + Self { + pub_key: entry.stake_key, + } + } + fn get_public_parameter( stake_entries: Vec, threshold: U256, diff --git a/crates/hotshot/examples/infra/mod.rs b/crates/hotshot/examples/infra/mod.rs index efd3b8169d..6fafd81727 100644 --- a/crates/hotshot/examples/infra/mod.rs +++ b/crates/hotshot/examples/infra/mod.rs @@ -52,7 +52,7 @@ pub fn load_config_from_file( > = config_toml.into(); // Generate network's public keys - config.config.known_nodes = (0..config.config.total_nodes.get()) + let known_nodes = (0..config.config.total_nodes.get()) .map(|node_id| { TYPES::SignatureKey::generated_from_seed_indexed( config.seed, @@ -63,7 +63,7 @@ pub fn load_config_from_file( .collect(); config.config.known_nodes_with_stake = (0..config.config.total_nodes.get()) - .map(|node_id| config.config.known_nodes[node_id].get_stake_table_entry(1u64)) + .map(|node_id| known_nodes[node_id].get_stake_table_entry(1u64)) .collect(); config diff --git a/crates/hotshot/examples/infra/modDA.rs b/crates/hotshot/examples/infra/modDA.rs index 729cbfd79f..fca5b4b64d 100644 --- a/crates/hotshot/examples/infra/modDA.rs +++ b/crates/hotshot/examples/infra/modDA.rs @@ -215,7 +215,6 @@ pub trait RunDA< // Get KeyPair for certificate Aggregation let (pk, sk) = TYPES::SignatureKey::generated_from_seed_indexed(config.seed, config.node_index); - let known_nodes = config.config.known_nodes.clone(); let known_nodes_with_stake = config.config.known_nodes_with_stake.clone(); let entry = pk.get_stake_table_entry(1u64); @@ -240,7 +239,6 @@ pub trait RunDA< let exchanges = NODE::Exchanges::create( known_nodes_with_stake.clone(), - known_nodes.clone(), (quorum_election_config, committee_election_config), ( quorum_network.clone(), diff --git a/crates/hotshot/src/lib.rs b/crates/hotshot/src/lib.rs index fa435e1f1d..34a50ea7ec 100644 --- a/crates/hotshot/src/lib.rs +++ b/crates/hotshot/src/lib.rs @@ -114,7 +114,6 @@ pub struct SystemContextInner> { /// Configuration items for this hotshot instance config: HotShotConfig< - TYPES::SignatureKey, ::StakeTableEntry, TYPES::ElectionConfigType, >, @@ -178,7 +177,6 @@ impl> SystemContext { private_key: ::PrivateKey, nonce: u64, config: HotShotConfig< - TYPES::SignatureKey, ::StakeTableEntry, TYPES::ElectionConfigType, >, @@ -405,7 +403,6 @@ impl> SystemContext { private_key: ::PrivateKey, node_id: u64, config: HotShotConfig< - TYPES::SignatureKey, ::StakeTableEntry, TYPES::ElectionConfigType, >, diff --git a/crates/hotshot/src/traits/election/static_committee.rs b/crates/hotshot/src/traits/election/static_committee.rs index 2c95746d4b..0f0d94feae 100644 --- a/crates/hotshot/src/traits/election/static_committee.rs +++ b/crates/hotshot/src/traits/election/static_committee.rs @@ -19,12 +19,8 @@ use tracing::debug; #[derive(Clone, Debug, Eq, PartialEq)] pub struct GeneralStaticCommittee, PUBKEY: SignatureKey> { - /// All the nodes participating - nodes: Vec, /// All the nodes participating and their stake nodes_with_stake: Vec, - /// The nodes on the static committee - committee_nodes: Vec, /// The nodes on the static committee and their stake committee_nodes_with_stake: Vec, /// Node type phantom @@ -41,11 +37,9 @@ impl, PUBKEY: SignatureKey> { /// Creates a new dummy elector #[must_use] - pub fn new(nodes: Vec, nodes_with_stake: Vec) -> Self { + pub fn new(_nodes: Vec, nodes_with_stake: Vec) -> Self { Self { - nodes: nodes.clone(), nodes_with_stake: nodes_with_stake.clone(), - committee_nodes: nodes, committee_nodes_with_stake: nodes_with_stake, _type_phantom: PhantomData, _leaf_phantom: PhantomData, @@ -107,8 +101,9 @@ where /// Index the vector of public keys with the current view number fn get_leader(&self, view_number: TYPES::Time) -> PUBKEY { - let index = (*view_number % self.nodes.len() as u64) as usize; - self.nodes[index].clone() + let index = (*view_number % self.nodes_with_stake.len() as u64) as usize; + let res = self.nodes_with_stake[index].clone(); + TYPES::SignatureKey::get_public_key(&res) } /// Simply make the partial signature @@ -119,7 +114,8 @@ where ) -> std::result::Result>, ElectionError> { // TODO ED Below let pub_key = PUBKEY::from_private(private_key); - if !self.committee_nodes.contains(&pub_key) { + let entry = pub_key.get_stake_table_entry(1u64); + if !self.committee_nodes_with_stake.contains(&entry) { return Ok(None); } let mut message: Vec = vec![]; @@ -137,7 +133,8 @@ where ) -> Result, ElectionError> { match token { Checked::Valid(t) | Checked::Unchecked(t) => { - if self.committee_nodes.contains(&pub_key) { + let entry = pub_key.get_stake_table_entry(1u64); + if self.committee_nodes_with_stake.contains(&entry) { Ok(Checked::Valid(t)) } else { Ok(Checked::Inval(t)) @@ -153,18 +150,13 @@ where fn create_election( keys_qc: Vec, - keys: Vec, config: TYPES::ElectionConfigType, ) -> Self { - let mut committee_nodes = keys.clone(); let mut committee_nodes_with_stake = keys_qc.clone(); - committee_nodes.truncate(config.num_nodes.try_into().unwrap()); debug!("Election Membership Size: {}", config.num_nodes); committee_nodes_with_stake.truncate(config.num_nodes.try_into().unwrap()); Self { nodes_with_stake: keys_qc, - nodes: keys, - committee_nodes, committee_nodes_with_stake, _type_phantom: PhantomData, _leaf_phantom: PhantomData, @@ -172,21 +164,24 @@ where } fn total_nodes(&self) -> usize { - self.committee_nodes.len() + self.committee_nodes_with_stake.len() } fn success_threshold(&self) -> NonZeroU64 { - NonZeroU64::new(((self.committee_nodes.len() as u64 * 2) / 3) + 1).unwrap() + NonZeroU64::new(((self.committee_nodes_with_stake.len() as u64 * 2) / 3) + 1).unwrap() } fn failure_threshold(&self) -> NonZeroU64 { - NonZeroU64::new(((self.committee_nodes.len() as u64) / 3) + 1).unwrap() + NonZeroU64::new(((self.committee_nodes_with_stake.len() as u64) / 3) + 1).unwrap() } fn get_committee( &self, _view_number: ::Time, ) -> std::collections::BTreeSet<::SignatureKey> { - self.committee_nodes.clone().into_iter().collect() + // Transfer from committee_nodes_with_stake to pure committee_nodes + (0..(self.committee_nodes_with_stake.len())) + .map(|node_id| ::SignatureKey::get_public_key(&self.committee_nodes_with_stake[node_id])) + .collect() } } diff --git a/crates/orchestrator/src/config.rs b/crates/orchestrator/src/config.rs index 061ab256d5..0f6fc4e96d 100644 --- a/crates/orchestrator/src/config.rs +++ b/crates/orchestrator/src/config.rs @@ -4,6 +4,7 @@ use std::{ num::NonZeroUsize, time::Duration, }; +use std::marker::PhantomData; #[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] pub struct Libp2pConfig { pub bootstrap_nodes: Vec<(SocketAddr, Vec)>, @@ -65,9 +66,10 @@ pub struct NetworkConfig { pub key_type_name: String, pub election_config_type_name: String, pub libp2p_config: Option, - pub config: HotShotConfig, + pub config: HotShotConfig, pub web_server_config: Option, pub da_web_server_config: Option, + _key_type_phantom: PhantomData, } impl Default for NetworkConfig { @@ -85,6 +87,7 @@ impl Default for NetworkConfig { election_config_type_name: std::any::type_name::().to_string(), web_server_config: None, da_web_server_config: None, + _key_type_phantom: PhantomData, } } } @@ -152,6 +155,7 @@ impl From for NetworkConfig { start_delay_seconds: val.start_delay_seconds, web_server_config: val.web_server_config, da_web_server_config: val.da_web_server_config, + _key_type_phantom: PhantomData, } } } @@ -183,14 +187,13 @@ pub struct HotShotConfigFile { pub propose_max_round_time: Duration, } -impl From for HotShotConfig { +impl From for HotShotConfig { fn from(val: HotShotConfigFile) -> Self { HotShotConfig { execution_type: ExecutionType::Continuous, total_nodes: val.total_nodes, max_transactions: val.max_transactions, min_transactions: val.min_transactions, - known_nodes: Vec::new(), known_nodes_with_stake: Vec::new(), da_committee_size: val.committee_nodes, next_view_timeout: val.next_view_timeout, diff --git a/crates/orchestrator/src/lib.rs b/crates/orchestrator/src/lib.rs index 4391fc43e6..574cc8c38a 100644 --- a/crates/orchestrator/src/lib.rs +++ b/crates/orchestrator/src/lib.rs @@ -174,7 +174,7 @@ where fn post_ready(&mut self) -> Result<(), ServerError> { self.nodes_connected += 1; println!("Nodes connected: {}", self.nodes_connected); - if self.nodes_connected >= self.config.config.known_nodes.len().try_into().unwrap() { + if self.nodes_connected >= self.config.config.known_nodes_with_stake.len().try_into().unwrap() { self.start = true; } Ok(()) diff --git a/crates/testing/src/task_helpers.rs b/crates/testing/src/task_helpers.rs index 13868721d4..3d2cbe3bf5 100644 --- a/crates/testing/src/task_helpers.rs +++ b/crates/testing/src/task_helpers.rs @@ -47,7 +47,6 @@ pub async fn build_system_handle( >>::block_genesis()) .unwrap(); - let known_nodes = config.known_nodes.clone(); let known_nodes_with_stake = config.known_nodes_with_stake.clone(); let private_key = ::generated_from_seed_indexed([0u8; 32], node_id).1; let public_key = ::SignatureKey::from_private(&private_key); @@ -67,7 +66,6 @@ pub async fn build_system_handle( let exchanges = >::Exchanges::create( known_nodes_with_stake.clone(), - known_nodes.clone(), (quorum_election_config, committee_election_config), networks, public_key, diff --git a/crates/testing/src/test_builder.rs b/crates/testing/src/test_builder.rs index f1db2a9320..326debb69b 100644 --- a/crates/testing/src/test_builder.rs +++ b/crates/testing/src/test_builder.rs @@ -219,7 +219,6 @@ impl TestMetadata { num_bootstrap: num_bootstrap_nodes, min_transactions, max_transactions: NonZeroUsize::new(99999).unwrap(), - known_nodes, known_nodes_with_stake, da_committee_size, next_view_timeout: 500, @@ -247,7 +246,7 @@ impl TestMetadata { } = timing_data; let mod_config = // TODO this should really be using the timing config struct - |a: &mut HotShotConfig::StakeTableEntry, TYPES::ElectionConfigType>| { + |a: &mut HotShotConfig<::StakeTableEntry, TYPES::ElectionConfigType>| { a.next_view_timeout = next_view_timeout; a.timeout_ratio = timeout_ratio; a.round_start_delay = round_start_delay; diff --git a/crates/testing/src/test_launcher.rs b/crates/testing/src/test_launcher.rs index 4a7e6bd9b1..cbc8ba64bb 100644 --- a/crates/testing/src/test_launcher.rs +++ b/crates/testing/src/test_launcher.rs @@ -94,7 +94,6 @@ where pub storage: Generator<>::Storage>, /// configuration used to generate each hotshot node pub config: HotShotConfig< - TYPES::SignatureKey, ::StakeTableEntry, TYPES::ElectionConfigType, >, @@ -198,7 +197,6 @@ impl> TestLauncher::StakeTableEntry, TYPES::ElectionConfigType, >, diff --git a/crates/testing/src/test_runner.rs b/crates/testing/src/test_runner.rs index 57c82d24e9..777d8769f5 100644 --- a/crates/testing/src/test_runner.rs +++ b/crates/testing/src/test_runner.rs @@ -234,7 +234,6 @@ where storage: I::Storage, initializer: HotShotInitializer, config: HotShotConfig< - TYPES::SignatureKey, ::StakeTableEntry, TYPES::ElectionConfigType, >, @@ -250,7 +249,6 @@ where let node_id = self.next_node_id; self.next_node_id += 1; - let known_nodes = config.known_nodes.clone(); let known_nodes_with_stake = config.known_nodes_with_stake.clone(); // Generate key pair for certificate aggregation let private_key = TYPES::SignatureKey::generated_from_seed_indexed([0u8; 32], node_id).1; @@ -265,7 +263,6 @@ where let committee_election_config = I::committee_election_config_generator(); let exchanges = I::Exchanges::create( known_nodes_with_stake.clone(), - known_nodes.clone(), ( quorum_election_config, committee_election_config(config.da_committee_size as u64), diff --git a/crates/types/src/lib.rs b/crates/types/src/lib.rs index e574bef876..c1b447c117 100644 --- a/crates/types/src/lib.rs +++ b/crates/types/src/lib.rs @@ -36,7 +36,7 @@ pub enum ExecutionType { /// Holds configuration for a `HotShot` #[derive(Clone, custom_debug::Debug, serde::Serialize, serde::Deserialize)] -pub struct HotShotConfig { +pub struct HotShotConfig { /// Whether to run one view or continuous views pub execution_type: ExecutionType, /// Total number of nodes in the network @@ -45,8 +45,6 @@ pub struct HotShotConfig { pub min_transactions: usize, /// Maximum transactions per block pub max_transactions: NonZeroUsize, - /// List of known node's public keys, including own, sorted by nonce () - pub known_nodes: Vec, /// List of known node's public keys and stake value for certificate aggregation, serving as public parameter pub known_nodes_with_stake: Vec, /// List of DA committee nodes for static DA committe diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 81a173e954..a138de6ce9 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -221,7 +221,6 @@ pub trait Membership: /// TODO may want to move this to a testableelection trait fn create_election( entries: Vec<::StakeTableEntry>, - keys: Vec, config: TYPES::ElectionConfigType, ) -> Self; @@ -291,7 +290,6 @@ pub trait ConsensusExchange: Send + Sync { /// Join a [`ConsensusExchange`] with the given identity (`pk` and `sk`). fn create( entries: Vec<::StakeTableEntry>, - keys: Vec, config: TYPES::ElectionConfigType, network: Self::Networking, pk: TYPES::SignatureKey, @@ -609,7 +607,6 @@ impl< fn create( entries: Vec<::StakeTableEntry>, - keys: Vec, config: TYPES::ElectionConfigType, network: Self::Networking, pk: TYPES::SignatureKey, @@ -617,7 +614,7 @@ impl< sk: ::PrivateKey, ) -> Self { let membership = >::Membership::create_election( - entries, keys, config, + entries, config, ); Self { network, @@ -929,7 +926,6 @@ impl< fn create( entries: Vec<::StakeTableEntry>, - keys: Vec, config: TYPES::ElectionConfigType, network: Self::Networking, pk: TYPES::SignatureKey, @@ -937,7 +933,7 @@ impl< sk: ::PrivateKey, ) -> Self { let membership = >::Membership::create_election( - entries, keys, config, + entries, config, ); Self { network, @@ -1288,7 +1284,6 @@ impl< fn create( entries: Vec<::StakeTableEntry>, - keys: Vec, config: TYPES::ElectionConfigType, network: Self::Networking, pk: TYPES::SignatureKey, @@ -1296,7 +1291,7 @@ impl< sk: ::PrivateKey, ) -> Self { let membership = >::Membership::create_election( - entries, keys, config, + entries, config, ); Self { network, diff --git a/crates/types/src/traits/node_implementation.rs b/crates/types/src/traits/node_implementation.rs index 8ba5abdebb..451d071e07 100644 --- a/crates/types/src/traits/node_implementation.rs +++ b/crates/types/src/traits/node_implementation.rs @@ -166,7 +166,6 @@ pub trait ExchangesType, MESSA /// Create all exchanges. fn create( entries: Vec<::StakeTableEntry>, - keys: Vec, configs: Self::ElectionConfigs, networks: ( >::Networking, @@ -257,7 +256,6 @@ where fn create( entries: Vec<::StakeTableEntry>, - keys: Vec, configs: Self::ElectionConfigs, networks: ( >::Networking, @@ -270,7 +268,6 @@ where ) -> Self { let quorum_exchange = QUORUMEXCHANGE::create( entries.clone(), - keys.clone(), configs.0.clone(), networks.0, pk.clone(), @@ -279,7 +276,6 @@ where ); let view_sync_exchange = VIEWSYNCEXCHANGE::create( entries.clone(), - keys.clone(), configs.0, networks.2, pk.clone(), @@ -287,7 +283,7 @@ where sk.clone(), ); let committee_exchange = - COMMITTEEEXCHANGE::create(entries, keys, configs.1, networks.1, pk, entry, sk); + COMMITTEEEXCHANGE::create(entries, configs.1, networks.1, pk, entry, sk); Self { quorum_exchange, diff --git a/crates/types/src/traits/signature_key.rs b/crates/types/src/traits/signature_key.rs index 5daed175bd..d8f79a080e 100644 --- a/crates/types/src/traits/signature_key.rs +++ b/crates/types/src/traits/signature_key.rs @@ -101,6 +101,9 @@ pub trait SignatureKey: /// get the stake table entry from the public key and stake value fn get_stake_table_entry(&self, stake: u64) -> Self::StakeTableEntry; + /// only get the public key from the stake table entry + fn get_public_key(entry: &Self::StakeTableEntry) -> Self; + /// get the public parameter for the assembled signature checking fn get_public_parameter( stake_entries: Vec, From 3b5931dc82fe96eb70c6d082ab9a56abbe4fe239 Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 14:10:38 -0700 Subject: [PATCH 30/66] fix fmt --- .../src/traits/election/static_committee.rs | 10 +++++++--- crates/orchestrator/src/config.rs | 2 +- crates/orchestrator/src/lib.rs | 10 +++++++++- crates/types/src/traits/election.rs | 15 ++++++--------- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/crates/hotshot/src/traits/election/static_committee.rs b/crates/hotshot/src/traits/election/static_committee.rs index 0f0d94feae..871b3cfd42 100644 --- a/crates/hotshot/src/traits/election/static_committee.rs +++ b/crates/hotshot/src/traits/election/static_committee.rs @@ -180,8 +180,12 @@ where _view_number: ::Time, ) -> std::collections::BTreeSet<::SignatureKey> { // Transfer from committee_nodes_with_stake to pure committee_nodes - (0..(self.committee_nodes_with_stake.len())) - .map(|node_id| ::SignatureKey::get_public_key(&self.committee_nodes_with_stake[node_id])) - .collect() + (0..self.committee_nodes_with_stake.len()) + .map(|node_id| { + ::SignatureKey::get_public_key( + &self.committee_nodes_with_stake[node_id], + ) + }) + .collect() } } diff --git a/crates/orchestrator/src/config.rs b/crates/orchestrator/src/config.rs index 0f6fc4e96d..05a38b615c 100644 --- a/crates/orchestrator/src/config.rs +++ b/crates/orchestrator/src/config.rs @@ -1,10 +1,10 @@ use hotshot_types::{ExecutionType, HotShotConfig}; +use std::marker::PhantomData; use std::{ net::{IpAddr, Ipv4Addr, SocketAddr}, num::NonZeroUsize, time::Duration, }; -use std::marker::PhantomData; #[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] pub struct Libp2pConfig { pub bootstrap_nodes: Vec<(SocketAddr, Vec)>, diff --git a/crates/orchestrator/src/lib.rs b/crates/orchestrator/src/lib.rs index 574cc8c38a..a7e7ae0c28 100644 --- a/crates/orchestrator/src/lib.rs +++ b/crates/orchestrator/src/lib.rs @@ -174,7 +174,15 @@ where fn post_ready(&mut self) -> Result<(), ServerError> { self.nodes_connected += 1; println!("Nodes connected: {}", self.nodes_connected); - if self.nodes_connected >= self.config.config.known_nodes_with_stake.len().try_into().unwrap() { + if self.nodes_connected + >= self + .config + .config + .known_nodes_with_stake + .len() + .try_into() + .unwrap() + { self.start = true; } Ok(()) diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index a138de6ce9..dffc8b6f9a 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -613,9 +613,8 @@ impl< entry: ::StakeTableEntry, sk: ::PrivateKey, ) -> Self { - let membership = >::Membership::create_election( - entries, config, - ); + let membership = + >::Membership::create_election(entries, config); Self { network, membership, @@ -932,9 +931,8 @@ impl< entry: ::StakeTableEntry, sk: ::PrivateKey, ) -> Self { - let membership = >::Membership::create_election( - entries, config, - ); + let membership = + >::Membership::create_election(entries, config); Self { network, membership, @@ -1290,9 +1288,8 @@ impl< entry: ::StakeTableEntry, sk: ::PrivateKey, ) -> Self { - let membership = >::Membership::create_election( - entries, config, - ); + let membership = + >::Membership::create_election(entries, config); Self { network, membership, From 3dd1ca7ce1361858e3835dc8484f7bf28c48f9f7 Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 14:11:31 -0700 Subject: [PATCH 31/66] pass async_std check --- crates/hotshot/examples/infra/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/hotshot/examples/infra/mod.rs b/crates/hotshot/examples/infra/mod.rs index 6fafd81727..1ffbb04a7f 100644 --- a/crates/hotshot/examples/infra/mod.rs +++ b/crates/hotshot/examples/infra/mod.rs @@ -52,7 +52,7 @@ pub fn load_config_from_file( > = config_toml.into(); // Generate network's public keys - let known_nodes = (0..config.config.total_nodes.get()) + let known_nodes: Vec<_> = (0..config.config.total_nodes.get()) .map(|node_id| { TYPES::SignatureKey::generated_from_seed_indexed( config.seed, From c3e10a706e4b8e8ac164a6dfa2afc55876e45f79 Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 14:49:23 -0700 Subject: [PATCH 32/66] pass just lint and add blank line to the settings.json.example --- .vscode/settings.json.example | 2 +- crates/hotshot/src/traits/election/static_committee.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.vscode/settings.json.example b/.vscode/settings.json.example index 78a629a192..d42ef6a8a2 100644 --- a/.vscode/settings.json.example +++ b/.vscode/settings.json.example @@ -3,4 +3,4 @@ "rust-analyzer.cargo.extraEnv": { "RUSTFLAGS": "--cfg async_executor_impl=\"async-std\" --cfg async_channel_impl=\"async-std\"" }, -} \ No newline at end of file +} diff --git a/crates/hotshot/src/traits/election/static_committee.rs b/crates/hotshot/src/traits/election/static_committee.rs index 871b3cfd42..0e79efacab 100644 --- a/crates/hotshot/src/traits/election/static_committee.rs +++ b/crates/hotshot/src/traits/election/static_committee.rs @@ -37,7 +37,7 @@ impl, PUBKEY: SignatureKey> { /// Creates a new dummy elector #[must_use] - pub fn new(_nodes: Vec, nodes_with_stake: Vec) -> Self { + pub fn new(_nodes: &[PUBKEY], nodes_with_stake: Vec) -> Self { Self { nodes_with_stake: nodes_with_stake.clone(), committee_nodes_with_stake: nodes_with_stake, From 3f033273f291ef23030705b0a9641c96e69cae1a Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 16:34:14 -0700 Subject: [PATCH 33/66] update settings.json --- .vscode/settings.json.example | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.vscode/settings.json.example b/.vscode/settings.json.example index d42ef6a8a2..6cc06a8e30 100644 --- a/.vscode/settings.json.example +++ b/.vscode/settings.json.example @@ -1,6 +1,6 @@ // Sets features for Rust Analyzer, since some features are required to be set for compilation { - "rust-analyzer.cargo.extraEnv": { - "RUSTFLAGS": "--cfg async_executor_impl=\"async-std\" --cfg async_channel_impl=\"async-std\"" - }, -} + "rust-analyzer.cargo.features": [ + "full-ci" + ], +} \ No newline at end of file From 3cf7069345816cce33d70f76a04c9c8b372742b4 Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 17:29:48 -0700 Subject: [PATCH 34/66] update building workflow and cargo.lock --- .github/workflows/build.yml | 2 +- Cargo.lock | 90 ++++++++++++++++++------------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e387389168..b2f0da1877 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -73,7 +73,7 @@ jobs: images: ghcr.io/espressosystems/hotshot/web-server - name: Build and push web-server docker - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 if: matrix.just_variants == 'async_std' with: context: ./ diff --git a/Cargo.lock b/Cargo.lock index bda6587bdd..0e071f04af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -801,7 +801,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -818,7 +818,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -1236,9 +1236,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.2" +version = "4.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6" +checksum = "84ed82781cea27b43c9b106a979fe450a13a31aab0500595fb3fc06616de08e6" dependencies = [ "clap_builder", "clap_derive", @@ -1265,7 +1265,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -1681,7 +1681,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -1749,7 +1749,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -1771,7 +1771,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core 0.20.3", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -1865,7 +1865,7 @@ checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -1987,7 +1987,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -2344,7 +2344,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -3313,7 +3313,7 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jf-primitives" version = "0.4.0-pre.0" -source = "git+https://github.com/EspressoSystems/jellyfish#ef404b72acc63179b56a08c99c0cc4c6604b6669" +source = "git+https://github.com/EspressoSystems/jellyfish#2fc42af31c955088f7ff4775cbd405a2f42c9322" dependencies = [ "anyhow", "ark-bls12-377", @@ -3358,7 +3358,7 @@ dependencies = [ [[package]] name = "jf-relation" version = "0.4.0-pre.0" -source = "git+https://github.com/EspressoSystems/jellyfish#ef404b72acc63179b56a08c99c0cc4c6604b6669" +source = "git+https://github.com/EspressoSystems/jellyfish#2fc42af31c955088f7ff4775cbd405a2f42c9322" dependencies = [ "ark-bls12-377", "ark-bls12-381", @@ -3384,7 +3384,7 @@ dependencies = [ [[package]] name = "jf-utils" version = "0.4.0-pre.0" -source = "git+https://github.com/EspressoSystems/jellyfish#ef404b72acc63179b56a08c99c0cc4c6604b6669" +source = "git+https://github.com/EspressoSystems/jellyfish#2fc42af31c955088f7ff4775cbd405a2f42c9322" dependencies = [ "ark-ec", "ark-ff", @@ -3443,9 +3443,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" [[package]] name = "libnghttp2-sys" @@ -4003,7 +4003,7 @@ dependencies = [ "proc-macro-warning", "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -4761,9 +4761,9 @@ checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" [[package]] name = "parity-scale-codec" -version = "3.6.8" +version = "3.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f88eaac72ead1b9bd4ce747d577dbd2ad31fb0a56a9a20c611bf27bd1b97fbed" +checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" dependencies = [ "arrayvec", "bitvec", @@ -4775,9 +4775,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.8" +version = "3.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33bdcd446e9400b6ad9fc85b4aea68846c258b07c3efb994679ae82707b133f0" +checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4872,7 +4872,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -4903,7 +4903,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -5089,14 +5089,14 @@ checksum = "3d1eaa7fa0aa1929ffdf7eeb6eac234dde6268914a14ad44d23521ab6a9b258e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] @@ -5121,7 +5121,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -5617,9 +5617,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.4" +version = "0.101.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" +checksum = "45a27e3b59326c16e23d30aeb7a36a24cc0d29e71d68ff611cdfb4a01d013bed" dependencies = [ "ring", "untrusted", @@ -5726,7 +5726,7 @@ checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -5740,9 +5740,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc66a619ed80bf7a0f6b17dd063a84b88f6dea1813737cf469aef1d081142c2" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" dependencies = [ "itoa 1.0.9", "ryu", @@ -5823,7 +5823,7 @@ dependencies = [ "darling 0.20.3", "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -5835,7 +5835,7 @@ dependencies = [ "darling 0.20.3", "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -6260,7 +6260,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -6390,9 +6390,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.32" +version = "2.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" +checksum = "9caece70c63bfba29ec2fed841a09851b14a235c60010fa4de58089b6c025668" dependencies = [ "proc-macro2", "quote", @@ -6534,7 +6534,7 @@ checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -6806,7 +6806,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -6958,7 +6958,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] [[package]] @@ -7177,9 +7177,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -7366,7 +7366,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", "wasm-bindgen-shared", ] @@ -7400,7 +7400,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7679,5 +7679,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.33", ] From cbeef4d252022fbc4fc93a549a3f8ed3342a1923 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Wed, 13 Sep 2023 20:46:09 -0400 Subject: [PATCH 35/66] View sync accumulator in place; need to update from_signatures_and_commitment function to take vote instead of individual fields --- crates/task-impls/src/view_sync.rs | 3 +- crates/types/src/vote.rs | 123 ++++++++++++++++++++++++++++- justfile | 6 +- 3 files changed, 128 insertions(+), 4 deletions(-) diff --git a/crates/task-impls/src/view_sync.rs b/crates/task-impls/src/view_sync.rs index 28decf328d..b29943ced4 100644 --- a/crates/task-impls/src/view_sync.rs +++ b/crates/task-impls/src/view_sync.rs @@ -1015,7 +1015,7 @@ where let accumulator = self.exchange.accumulate_vote_2( self.accumulator.left().unwrap(), &vote, - &vote_data, + &view_sync_data, ); self.accumulator = match accumulator { @@ -1027,7 +1027,6 @@ where data: certificate.clone(), signature, }; - // error!("Sending view sync cert {:?}", message.clone()); self.event_stream .publish(SequencingHotShotEvent::ViewSyncCertificateSend( message, diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index 70c54bbcc5..d76a0a395f 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -604,7 +604,128 @@ impl< vote_node_id: usize, stake_table_entries: Vec<::StakeTableEntry>, ) -> Either> { - todo!() + let vote_commitment = match vote.get_data() { + VoteData::ViewSyncPreCommit(commitment) + | VoteData::ViewSyncCommit(commitment) + | VoteData::ViewSyncFinalize(commitment) => commitment, + + _ => return Either::Left(self), + }; + + error!("Vote is {:?}", vote.clone()); + + let encoded_key = vote.get_key().to_bytes(); + + // Deserialize the signature so that it can be assembeld into a QC + // TODO ED Update this once we've gotten rid of EncodedSignature + let original_signature: ::Signature = + bincode_opts() + .deserialize(&vote.get_signature().0) + .expect("Deserialization on the signature shouldn't be able to fail."); + + let (pre_commit_stake_casted, pre_commit_vote_map) = self + .pre_commit_vote_outcomes + .entry(vote_commitment) + .or_insert_with(|| (0, BTreeMap::new())); + + let (commit_stake_casted, commit_vote_map) = self + .commit_vote_outcomes + .entry(vote_commitment) + .or_insert_with(|| (0, BTreeMap::new())); + + let (finalize_stake_casted, finalize_vote_map) = self + .finalize_vote_outcomes + .entry(vote_commitment) + .or_insert_with(|| (0, BTreeMap::new())); + + // update the active_keys and sig_lists + // TODO ED Possible bug where a node sends precommit vote and then commit vote after + // precommit cert is formed, their commit vote won't be counted because of this check + // Probably need separate signers vecs. + if self.signers.get(vote_node_id).as_deref() == Some(&true) { + error!("node id already in signers"); + return Either::Left(self); + } + self.signers.set(vote_node_id, true); + self.sig_lists.push(original_signature); + + match vote.get_data() { + VoteData::ViewSyncPreCommit(_) => { + *pre_commit_stake_casted += u64::from(vote.get_vote_token().vote_count()); + pre_commit_vote_map.insert( + encoded_key, + (vote.get_signature(), vote.get_data(), vote.get_vote_token()), + ); + } + VoteData::ViewSyncCommit(_) => { + *commit_stake_casted += u64::from(vote.get_vote_token().vote_count()); + commit_vote_map.insert( + encoded_key, + (vote.get_signature(), vote.get_data(), vote.get_vote_token()), + ); + } + VoteData::ViewSyncFinalize(_) => { + *finalize_stake_casted += u64::from(vote.get_vote_token().vote_count()); + finalize_vote_map.insert( + encoded_key, + (vote.get_signature(), vote.get_data(), vote.get_vote_token()), + ); + } + _ => unimplemented!(), + } + + if *pre_commit_stake_casted >= u64::from(self.failure_threshold) { + let real_qc_pp = ::get_public_parameter( + stake_table_entries, + U256::from(self.failure_threshold.get()), + ); + + let real_qc_sig = ::assemble( + &real_qc_pp, + self.signers.as_bitslice(), + &self.sig_lists[..], + ); + + self.pre_commit_vote_outcomes + .remove(&vote_commitment) + .unwrap(); + return Either::Right(AssembledSignature::ViewSyncPreCommit(real_qc_sig)); + } + + if *commit_stake_casted >= u64::from(self.success_threshold) { + let real_qc_pp = ::get_public_parameter( + stake_table_entries.clone(), + U256::from(self.success_threshold.get()), + ); + + let real_qc_sig = ::assemble( + &real_qc_pp, + self.signers.as_bitslice(), + &self.sig_lists[..], + ); + self.commit_vote_outcomes.remove(&vote_commitment).unwrap(); + return Either::Right(AssembledSignature::ViewSyncCommit(real_qc_sig)); + } + + if *finalize_stake_casted >= u64::from(self.success_threshold) { + let real_qc_pp = ::get_public_parameter( + stake_table_entries.clone(), + U256::from(self.success_threshold.get()), + ); + + let real_qc_sig = ::assemble( + &real_qc_pp, + self.signers.as_bitslice(), + &self.sig_lists[..], + ); + // TODO ED Why remove? + self.finalize_vote_outcomes + .remove(&vote_commitment) + .unwrap(); + return Either::Right(AssembledSignature::ViewSyncFinalize(real_qc_sig)); + } + + Either::Left(self) } } diff --git a/justfile b/justfile index 9992d9057a..84825e22e3 100644 --- a/justfile +++ b/justfile @@ -32,9 +32,13 @@ test_catchup: cargo test --lib --bins --tests --benches --workspace --no-fail-fast test_catchup -- --test-threads=1 --nocapture test_success: - echo Testing success test + echo Testing test cargo test --lib --bins --tests --benches --workspace --no-fail-fast test_success -- --test-threads=1 --nocapture +test_timeout: + echo Testing timeout test + cargo test --lib --bins --tests --benches --workspace --no-fail-fast test_timeout -- --test-threads=1 --nocapture --ignored + test_web_server: echo Testing web server cargo test --lib --bins --tests --benches --workspace --no-fail-fast web_server_network -- --test-threads=1 --nocapture From 56a05ed13766d364b8fd935d089806a711f004fe Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 19:38:49 -0700 Subject: [PATCH 36/66] update build.yml --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b2f0da1877..a1aa16ecae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -55,10 +55,10 @@ jobs: - name: Setup Docker BuildKit (buildx) if: matrix.just_variants == 'async_std' - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to Github Container Repo - uses: docker/login-action@v2 + uses: docker/login-action@v3 if: github.event_name != 'pull_request' && matrix.just_variants == 'async_std' with: registry: ghcr.io @@ -66,7 +66,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Generate docker metadata (web-server) - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 if: matrix.just_variants == 'async_std' id: web-server with: From 8b36532f53259f6c058a80c5e5ae91992fc005a7 Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 20:47:03 -0700 Subject: [PATCH 37/66] comment out building web-server docker --- .github/workflows/build.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a1aa16ecae..f68606107d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -71,14 +71,3 @@ jobs: id: web-server with: images: ghcr.io/espressosystems/hotshot/web-server - - - name: Build and push web-server docker - uses: docker/build-push-action@v5 - if: matrix.just_variants == 'async_std' - with: - context: ./ - file: ./deploy/web-server.Dockerfile - platforms: linux/amd64 - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.web-server.outputs.tags }} - labels: ${{ steps.web-server.outputs.labels }} From d16e6d4f1b292e9e01d54b41b6075d40cd0695bd Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 20:53:20 -0700 Subject: [PATCH 38/66] update build.yml --- .github/workflows/build.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f68606107d..bb600bdd59 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -71,3 +71,14 @@ jobs: id: web-server with: images: ghcr.io/espressosystems/hotshot/web-server + + # - name: Build and push web-server docker + # uses: docker/build-push-action@v5 + # if: matrix.just_variants == 'async_std' + # with: + # context: ./ + # file: ./deploy/web-server.Dockerfile + # platforms: linux/amd64 + # push: ${{ github.event_name != 'pull_request' }} + # tags: ${{ steps.web-server.outputs.tags }} + # labels: ${{ steps.web-server.outputs.labels }} \ No newline at end of file From d3cec191842ea163edcc2aae2b060200b11cdb22 Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 20:56:20 -0700 Subject: [PATCH 39/66] update build.yml --- .github/workflows/build.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bb600bdd59..4af56536ec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,13 +72,13 @@ jobs: with: images: ghcr.io/espressosystems/hotshot/web-server - # - name: Build and push web-server docker - # uses: docker/build-push-action@v5 - # if: matrix.just_variants == 'async_std' - # with: - # context: ./ - # file: ./deploy/web-server.Dockerfile - # platforms: linux/amd64 - # push: ${{ github.event_name != 'pull_request' }} - # tags: ${{ steps.web-server.outputs.tags }} - # labels: ${{ steps.web-server.outputs.labels }} \ No newline at end of file + - name: Build and push web-server docker + uses: docker/build-push-action@v5 + if: matrix.just_variants == 'async_std' + with: + context: ./ + file: ./deploy/web-server.Dockerfile + platforms: linux/amd64 + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.web-server.outputs.tags }} + labels: ${{ steps.web-server.outputs.labels }} \ No newline at end of file From a26451223ba909e23bda8c78dcf0d74729288795 Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 21:07:06 -0700 Subject: [PATCH 40/66] blank line at the end of build.yml --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4af56536ec..47fb6b0b91 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -81,4 +81,5 @@ jobs: platforms: linux/amd64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.web-server.outputs.tags }} - labels: ${{ steps.web-server.outputs.labels }} \ No newline at end of file + labels: ${{ steps.web-server.outputs.labels }} + \ No newline at end of file From 6f6a4fe4ec36a88bd83937f30d71e136d2be4b83 Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 21:08:43 -0700 Subject: [PATCH 41/66] blank line at the end of build.yml --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 47fb6b0b91..4af56536ec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -81,5 +81,4 @@ jobs: platforms: linux/amd64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.web-server.outputs.tags }} - labels: ${{ steps.web-server.outputs.labels }} - \ No newline at end of file + labels: ${{ steps.web-server.outputs.labels }} \ No newline at end of file From ffc769ca2ddbccbb8c79370f5ba533f3c6ece2ee Mon Sep 17 00:00:00 2001 From: Brendon Fish Date: Thu, 14 Sep 2023 00:10:27 -0400 Subject: [PATCH 42/66] add endpoint to get a recent proposal to catchup w/ webserver --- .../traits/networking/web_server_network.rs | 30 ++++++++++ crates/task-impls/src/consensus.rs | 7 ++- crates/testing/src/spinning_task.rs | 3 +- crates/testing/tests/catchup.rs | 60 ++++++++++++++++++- crates/testing/tests/timeout.rs | 2 +- crates/types/src/message.rs | 2 + crates/types/src/traits/network.rs | 3 + crates/web_server/api.toml | 7 +++ crates/web_server/src/config.rs | 4 ++ crates/web_server/src/lib.rs | 15 +++++ 10 files changed, 128 insertions(+), 5 deletions(-) diff --git a/crates/hotshot/src/traits/networking/web_server_network.rs b/crates/hotshot/src/traits/networking/web_server_network.rs index e0001b94ab..f2c6c1c842 100644 --- a/crates/hotshot/src/traits/networking/web_server_network.rs +++ b/crates/hotshot/src/traits/networking/web_server_network.rs @@ -161,6 +161,7 @@ impl Inner { while self.running.load(Ordering::Relaxed) { let endpoint = match message_purpose { MessagePurpose::Proposal => config::get_proposal_route(view_number), + MessagePurpose::CurrentProposal => config::get_recent_proposal_route(), MessagePurpose::Vote => config::get_vote_route(view_number, vote_index), MessagePurpose::Data => config::get_transactions_route(tx_index), MessagePurpose::Internal => unimplemented!(), @@ -221,6 +222,15 @@ impl Inner { // } // } } + MessagePurpose::CurrentProposal => { + // Only pushing the first proposal since we will soon only be allowing 1 proposal per view + self.broadcast_poll_queue + .write() + .await + .push(deserialized_messages[0].clone()); + + return Ok(()); + } MessagePurpose::Vote => { // error!( // "Received {} votes from web server for view {} is da {}", @@ -498,6 +508,7 @@ impl< let endpoint = match &message.purpose() { MessagePurpose::Proposal => config::post_proposal_route(*view_number), + MessagePurpose::CurrentProposal => return Err(WebServerNetworkError::EndpointError), MessagePurpose::Vote => config::post_vote_route(*view_number), MessagePurpose::Data => config::post_transactions_route(), MessagePurpose::Internal => return Err(WebServerNetworkError::EndpointError), @@ -783,6 +794,25 @@ impl< .await; } } + ConsensusIntentEvent::PollForCurrentProposal => { + // create new task + let (_, receiver) = unbounded(); + + async_spawn({ + let inner_clone = self.inner.clone(); + async move { + if let Err(e) = inner_clone + .poll_web_server(receiver, MessagePurpose::CurrentProposal, 1) + .await + { + error!( + "Background receive proposal polling encountered an error: {:?}", + e + ); + } + } + }); + } ConsensusIntentEvent::PollForVotes(view_number) => { let mut task_map = self.inner.vote_task_map.write().await; if let Entry::Vacant(e) = task_map.entry(view_number) { diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index 03fcc387a8..35b27c9722 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -487,7 +487,12 @@ where // } self.cur_view = new_view; self.current_proposal = None; - + if new_view == TYPES::Time::new(1) { + self.quorum_exchange + .network() + .inject_consensus_info(ConsensusIntentEvent::PollForCurrentProposal) + .await; + } // Start polling for proposals for the new view self.quorum_exchange .network() diff --git a/crates/testing/src/spinning_task.rs b/crates/testing/src/spinning_task.rs index c8ef07d51c..a9d9e5d586 100644 --- a/crates/testing/src/spinning_task.rs +++ b/crates/testing/src/spinning_task.rs @@ -113,7 +113,8 @@ impl SpinningTaskDescription { state.late_start.remove(&idx.try_into().unwrap()) { tracing::error!("Spinning up node late"); - node.run_tasks().await; + let handle = node.run_tasks().await; + handle.hotshot.start_consensus().await; } } UpDown::Down => { diff --git a/crates/testing/tests/catchup.rs b/crates/testing/tests/catchup.rs index 2cbc6c8a16..9c6bd0bb38 100644 --- a/crates/testing/tests/catchup.rs +++ b/crates/testing/tests/catchup.rs @@ -59,6 +59,61 @@ async fn test_catchup() { .await; } +#[cfg(test)] +#[cfg_attr( + async_executor_impl = "tokio", + tokio::test(flavor = "multi_thread", worker_threads = 2) +)] +#[cfg_attr(async_executor_impl = "async-std", async_std::test)] +async fn test_catchup_web() { + use std::time::Duration; + + use hotshot_testing::{ + completion_task::{CompletionTaskDescription, TimeBasedCompletionTaskDescription}, + node_types::{SequencingTestTypes, SequencingWebImpl}, + overall_safety_task::OverallSafetyPropertiesDescription, + spinning_task::{ChangeNode, SpinningTaskDescription, UpDown}, + test_builder::{TestMetadata, TimingData}, + }; + + async_compatibility_layer::logging::setup_logging(); + async_compatibility_layer::logging::setup_backtrace(); + let timing_data = TimingData { + next_view_timeout: 1000, + ..Default::default() + }; + let mut metadata = TestMetadata::default(); + let catchup_nodes = vec![ChangeNode { + idx: 18, + updown: UpDown::Up, + }]; + + metadata.timing_data = timing_data; + metadata.start_nodes = 19; + metadata.total_nodes = 20; + + metadata.spinning_properties = SpinningTaskDescription { + node_changes: vec![(Duration::from_millis(400), catchup_nodes)], + }; + + metadata.completion_task_description = + CompletionTaskDescription::TimeBasedCompletionTaskBuilder( + TimeBasedCompletionTaskDescription { + duration: Duration::from_millis(100000), + }, + ); + metadata.overall_safety_properties = OverallSafetyPropertiesDescription { + check_leaf: true, + ..Default::default() + }; + + metadata + .gen_launcher::() + .launch() + .run_test() + .await; +} + /// Test that one node catches up and has sucessful views after coming back #[cfg(test)] #[cfg_attr( @@ -66,6 +121,7 @@ async fn test_catchup() { tokio::test(flavor = "multi_thread", worker_threads = 2) )] #[cfg_attr(async_executor_impl = "async-std", async_std::test)] +#[ignore] async fn test_catchup_one_node() { use std::time::Duration; @@ -94,13 +150,13 @@ async fn test_catchup_one_node() { metadata.total_nodes = 20; metadata.spinning_properties = SpinningTaskDescription { - node_changes: vec![(Duration::new(1, 0), catchup_nodes)], + node_changes: vec![(Duration::from_millis(400), catchup_nodes)], }; metadata.completion_task_description = CompletionTaskDescription::TimeBasedCompletionTaskBuilder( TimeBasedCompletionTaskDescription { - duration: Duration::from_millis(100000), + duration: Duration::from_millis(20000), }, ); metadata.overall_safety_properties = OverallSafetyPropertiesDescription { diff --git a/crates/testing/tests/timeout.rs b/crates/testing/tests/timeout.rs index 7ebeddd577..f8963c9d52 100644 --- a/crates/testing/tests/timeout.rs +++ b/crates/testing/tests/timeout.rs @@ -30,7 +30,7 @@ async fn test_timeout() { metadata.timing_data = timing_data; metadata.spinning_properties = SpinningTaskDescription { - node_changes: vec![(Duration::new(1, 0), dead_nodes)], + node_changes: vec![(Duration::new(0, 5000), dead_nodes)], }; // TODO ED Add safety task, etc to confirm TCs are being formed diff --git a/crates/types/src/message.rs b/crates/types/src/message.rs index 89d2864aa9..c499309a43 100644 --- a/crates/types/src/message.rs +++ b/crates/types/src/message.rs @@ -57,6 +57,8 @@ pub struct Messages>(pub Vec *view_number, + ConsensusIntentEvent::PollForCurrentProposal => 1, } } } diff --git a/crates/web_server/api.toml b/crates/web_server/api.toml index 5f749bcdb0..cc610fc9c9 100644 --- a/crates/web_server/api.toml +++ b/crates/web_server/api.toml @@ -11,6 +11,13 @@ DOC = """ Return the proposal for a given view number """ +# GET the proposal for a view, where the view is passed as an argument +[route.getrecentproposal] +PATH = ["proposal/"] +DOC = """ +Return the proposal for the most recent view the server has +""" + # POST a proposal, where the view is passed as an argument [route.postproposal] PATH = ["proposal/:view_number"] diff --git a/crates/web_server/src/config.rs b/crates/web_server/src/config.rs index 1da2781c55..c06f365bd3 100644 --- a/crates/web_server/src/config.rs +++ b/crates/web_server/src/config.rs @@ -17,6 +17,10 @@ pub fn post_proposal_route(view_number: u64) -> String { format!("api/proposal/{view_number}") } +pub fn get_recent_proposal_route() -> String { + "api/proposal".to_string() +} + pub fn get_da_certificate_route(view_number: u64) -> String { format!("api/certificate/{view_number}") } diff --git a/crates/web_server/src/lib.rs b/crates/web_server/src/lib.rs index ef7850cbb0..2bd746e1cd 100644 --- a/crates/web_server/src/lib.rs +++ b/crates/web_server/src/lib.rs @@ -33,6 +33,8 @@ struct WebServerState { da_certificates: HashMap)>, /// view for oldest proposals in memory oldest_proposal: u64, + /// view for the most recent proposal to help nodes catchup + recent_proposal: u64, /// view for teh oldest DA certificate oldest_certificate: u64, @@ -74,6 +76,7 @@ impl WebServerState { num_txns: 0, oldest_vote: 0, oldest_proposal: 0, + recent_proposal: 0, oldest_certificate: 0, shutdown: None, stake_table: Vec::new(), @@ -101,6 +104,7 @@ impl WebServerState { /// Trait defining methods needed for the `WebServerState` pub trait WebServerDataSource { fn get_proposal(&self, view_number: u64) -> Result>>, Error>; + fn get_recent_proposal(&self) -> Result>>, Error>; fn get_view_sync_proposal( &self, view_number: u64, @@ -156,6 +160,10 @@ impl WebServerDataSource for WebServerState { } } + fn get_recent_proposal(&self) -> Result>>, Error> { + self.get_proposal(self.recent_proposal) + } + fn get_view_sync_proposal( &self, view_number: u64, @@ -316,6 +324,10 @@ impl WebServerDataSource for WebServerState { fn post_proposal(&mut self, view_number: u64, mut proposal: Vec) -> Result<(), Error> { debug!("Received proposal for view {}", view_number); + if view_number > self.recent_proposal { + self.recent_proposal = view_number; + } + // Only keep proposal history for MAX_VIEWS number of view if self.proposals.len() >= MAX_VIEWS { self.proposals.remove(&self.oldest_proposal); @@ -494,6 +506,9 @@ where } .boxed() })? + .get("getrecentproposal", |_req, state| { + async move { state.get_recent_proposal() }.boxed() + })? .get("getviewsyncproposal", |req, state| { async move { let view_number: u64 = req.integer_param("view_number")?; From cac5b8d742962baf33b6a4c8647877a773286d01 Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Wed, 13 Sep 2023 21:13:41 -0700 Subject: [PATCH 43/66] blank line at the end of build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4af56536ec..a1aa16ecae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -81,4 +81,4 @@ jobs: platforms: linux/amd64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.web-server.outputs.tags }} - labels: ${{ steps.web-server.outputs.labels }} \ No newline at end of file + labels: ${{ steps.web-server.outputs.labels }} From c432f91d14e526253650f482a9f9772a21afc1c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 08:25:08 -0400 Subject: [PATCH 44/66] Bump serde_json from 1.0.106 to 1.0.107 (#1746) Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.106 to 1.0.107. - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.106...v1.0.107) --- updated-dependencies: - dependency-name: serde_json dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- crates/hotshot/Cargo.toml | 2 +- crates/libp2p-networking/Cargo.toml | 2 +- crates/types/Cargo.toml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 475d5fd2ba..b4f1fe35a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5753,9 +5753,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc66a619ed80bf7a0f6b17dd063a84b88f6dea1813737cf469aef1d081142c2" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" dependencies = [ "itoa 1.0.9", "ryu", diff --git a/crates/hotshot/Cargo.toml b/crates/hotshot/Cargo.toml index a085531227..67ddb6b9ee 100644 --- a/crates/hotshot/Cargo.toml +++ b/crates/hotshot/Cargo.toml @@ -117,6 +117,6 @@ async-std = { workspace = true } [dev-dependencies] blake3 = { workspace = true } clap = { version = "4.4", features = ["derive", "env"] } -serde_json = "1.0.106" +serde_json = "1.0.107" toml = { workspace = true } diff --git a/crates/libp2p-networking/Cargo.toml b/crates/libp2p-networking/Cargo.toml index 9e0efc24d3..82b5ed7d87 100644 --- a/crates/libp2p-networking/Cargo.toml +++ b/crates/libp2p-networking/Cargo.toml @@ -42,7 +42,7 @@ libp2p-noise = { version = "0.43.0", default-features = false } parking_lot = "0.12.1" rand = { workspace = true } serde = { workspace = true } -serde_json = "1.0.106" +serde_json = "1.0.107" snafu = { workspace = true } tide = { version = "0.16", optional = true, default-features = false, features = [ "h1-server", diff --git a/crates/types/Cargo.toml b/crates/types/Cargo.toml index 58ac6c48a9..74ace15850 100644 --- a/crates/types/Cargo.toml +++ b/crates/types/Cargo.toml @@ -54,7 +54,7 @@ bit-vec = "0.6.3" typenum = { workspace = true } [dev-dependencies] -serde_json = "1.0.106" +serde_json = "1.0.107" [target.'cfg(all(async_executor_impl = "async-std"))'.dependencies] async-std = { workspace = true } From be806783d6791dc2a2070400f0f2706979ae4cfd Mon Sep 17 00:00:00 2001 From: Brendon Fish Date: Thu, 14 Sep 2023 10:21:46 -0400 Subject: [PATCH 45/66] transactions task building --- crates/hotshot/src/tasks/mod.rs | 69 ++++++++ crates/task-impls/src/consensus.rs | 43 +---- crates/task-impls/src/da.rs | 148 +--------------- crates/task-impls/src/lib.rs | 3 + crates/task-impls/src/transactions.rs | 236 ++++++++++++++++++++++---- 5 files changed, 285 insertions(+), 214 deletions(-) diff --git a/crates/hotshot/src/tasks/mod.rs b/crates/hotshot/src/tasks/mod.rs index e0dc9be155..4486914dfc 100644 --- a/crates/hotshot/src/tasks/mod.rs +++ b/crates/hotshot/src/tasks/mod.rs @@ -17,6 +17,7 @@ use hotshot_task::{ use hotshot_task_impls::{ consensus::{consensus_event_filter, ConsensusTaskTypes, SequencingConsensusTaskState}, da::{DATaskState, DATaskTypes}, + transactions::{TransactionTaskState, TransactionsTaskTypes}, events::SequencingHotShotEvent, network::{ NetworkEventTaskState, NetworkEventTaskTypes, NetworkMessageTaskState, @@ -407,6 +408,74 @@ where task_runner.add_task(da_task_id, da_name.to_string(), da_task) } + +/// add the Transaction Handling task +/// # Panics +/// Is unable to panic. This section here is just to satisfy clippy +pub async fn add_transaction_task< + TYPES: NodeType, + I: NodeImplementation< + TYPES, + Leaf = SequencingLeaf, + ConsensusMessage = SequencingMessage, + >, +>( + task_runner: TaskRunner, + event_stream: ChannelStream>, + committee_exchange: CommitteeEx, + handle: SystemContextHandle, +) -> TaskRunner +where + CommitteeEx: ConsensusExchange< + TYPES, + Message, + Certificate = DACertificate, + Commitment = TYPES::BlockType, + >, +{ + // build the da task + let c_api: HotShotSequencingConsensusApi = HotShotSequencingConsensusApi { + inner: handle.hotshot.inner.clone(), + }; + let registry = task_runner.registry.clone(); + let transactions_state = TransactionTaskState { + registry: registry.clone(), + api: c_api.clone(), + consensus: handle.hotshot.get_consensus(), + cur_view: TYPES::Time::new(0), + committee_exchange: committee_exchange.into(), + event_stream: event_stream.clone(), + id: handle.hotshot.inner.id, + }; + let transactions_event_handler = HandleEvent(Arc::new( + move |event, mut state: TransactionTaskState>| { + async move { + let completion_status = state.handle_event(event).await; + (completion_status, state) + } + .boxed() + }, + )); + let transactions_name = "Transactions Task"; + let transactions_event_filter = FilterEvent(Arc::new( + TransactionTaskState::>::filter, + )); + + let transactions_task_builder = TaskBuilder::< + TransactionsTaskTypes>, + >::new(transactions_name.to_string()) + .register_event_stream(event_stream.clone(), transactions_event_filter) + .await + .register_registry(&mut registry.clone()) + .await + .register_state(transactions_state) + .register_event_handler(transactions_event_handler); + // impossible for unwrap to fail + // we *just* registered + let da_task_id = transactions_task_builder.get_task_id().unwrap(); + let da_task = TransactionsTaskTypes::build(transactions_task_builder).launch(); + task_runner.add_task(da_task_id, transactions_name.to_string(), da_task) +} /// add the view sync task /// # Panics /// Is unable to panic. This section here is just to satisfy clippy diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index 1446e7bd86..5cd782405f 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -800,47 +800,10 @@ where } #[allow(clippy::cast_precision_loss)] if new_decide_reached { - let mut included_txn_size = 0; - let mut included_txn_count = 0; - let txns = consensus.transactions.cloned().await; - // store transactions in this block we never added to our transactions. - let _ = included_txns_set.iter().map(|hash| { - if !txns.contains_key(hash) { - consensus.seen_transactions.insert(*hash); - } - }); - drop(txns); - consensus - .transactions - .modify(|txns| { - *txns = txns - .drain() - .filter(|(txn_hash, txn)| { - if included_txns_set.contains(txn_hash) { - included_txn_count += 1; - included_txn_size += bincode_opts() - .serialized_size(txn) - .unwrap_or_default(); - false - } else { - true - } - }) - .collect(); - }) - .await; - - consensus - .metrics - .outstanding_transactions - .update(-included_txn_count); - consensus - .metrics - .outstanding_transactions_memory_size - .update(-(i64::try_from(included_txn_size).unwrap_or(i64::MAX))); - debug!("about to publish decide"); - self.event_stream.publish(SequencingHotShotEvent::LeafDecided(leaf_views.clone())).await; + self.event_stream + .publish(SequencingHotShotEvent::LeafDecided(leaf_views.clone())) + .await; let decide_sent = self.output_event_stream.publish(Event { view_number: consensus.last_decided_view, event: EventType::Decide { diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index d05588f1c8..8579996569 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -33,6 +33,7 @@ use hotshot_types::{ vote::VoteAccumulator, }; use hotshot_utils::bincode::bincode_opts; +use rand_chacha::rand_core::block; use snafu::Snafu; use std::{ collections::{HashMap, HashSet}, @@ -70,7 +71,6 @@ pub struct DATaskState< /// View number this view is executing in. pub cur_view: TYPES::Time, - // pub transactions: Arc>>, /// Reference to consensus. Leader will require a read lock on this. pub consensus: Arc>>>, @@ -278,35 +278,6 @@ where event: SequencingHotShotEvent, ) -> Option { match event { - SequencingHotShotEvent::TransactionsRecv(transactions) => { - // TODO ED Add validation checks - - let mut consensus = self.consensus.write().await; - consensus - .get_transactions() - .modify(|txns| { - for transaction in transactions { - let size = bincode_opts().serialized_size(&transaction).unwrap_or(0); - - // If we didn't already know about this transaction, update our mempool metrics. - if !consensus.seen_transactions.remove(&transaction.commit()) - && txns.insert(transaction.commit(), transaction).is_none() - { - consensus.metrics.outstanding_transactions.update(1); - consensus - .metrics - .outstanding_transactions_memory_size - .update(i64::try_from(size).unwrap_or_else(|e| { - warn!("Conversion failed: {e}. Using the max value."); - i64::MAX - })); - } - } - }) - .await; - - return None; - } SequencingHotShotEvent::DAProposalRecv(proposal, sender) => { debug!( "DA proposal received for view: {:?}", @@ -668,8 +639,6 @@ where .await; } - // TODO ED Make this a new task so it doesn't block main DA task - // If we are not the next leader (DA leader for this view) immediately exit if !self.committee_exchange.is_leader(self.cur_view + 1) { // panic!("We are not the DA leader for view {}", *self.cur_view + 1); @@ -683,43 +652,9 @@ where .inject_consensus_info(ConsensusIntentEvent::PollForVotes(*self.cur_view + 1)) .await; - // ED Copy of parent_leaf() function from sequencing leader - - let consensus = self.consensus.read().await; - let parent_view_number = &consensus.high_qc.view_number; - - let Some(parent_view) = consensus.state_map.get(parent_view_number) else { - error!( - "Couldn't find high QC parent in state map. Parent view {:?}", - parent_view_number - ); - return None; - }; - let Some(leaf) = parent_view.get_leaf_commitment() else { - error!( - ?parent_view_number, - ?parent_view, - "Parent of high QC points to a view without a proposal" - ); - return None; - }; - let Some(leaf) = consensus.saved_leaves.get(&leaf) else { - error!("Failed to find high QC parent."); - return None; - }; - let parent_leaf = leaf.clone(); - - // Prepare the DA Proposal - // let Some(parent_leaf) = self.parent_leaf().await else { - // warn!("Couldn't find high QC parent in state map."); - // return None; - // }; - - drop(consensus); - - let mut block = ::StateType::next_block(None); - let txns = self.wait_for_transactions(parent_leaf).await?; - + return None; + } + SequencingHotShotEvent::BlockReady(block) => { self.committee_exchange .network() .inject_consensus_info(ConsensusIntentEvent::CancelPollForTransactions( @@ -727,13 +662,6 @@ where )) .await; - for txn in txns { - if let Ok(new_block) = block.add_transaction_raw(&txn) { - block = new_block; - continue; - } - } - let signature = self.committee_exchange.sign_da_proposal(&block.commit()); let data: DAProposal = DAProposal { deltas: block.clone(), @@ -797,8 +725,6 @@ where )) .await; } - - return None; } SequencingHotShotEvent::Timeout(view) => { @@ -818,70 +744,6 @@ where None } - /// return None if we can't get transactions - #[instrument(skip_all, fields(id = self.id, view = *self.cur_view), name = "DA Vote Collection Task", level = "error")] - - async fn wait_for_transactions( - &self, - parent_leaf: SequencingLeaf, - ) -> Option> { - let task_start_time = Instant::now(); - - // let parent_leaf = self.parent_leaf().await?; - let previous_used_txns = match parent_leaf.deltas { - Either::Left(block) => block.contained_transactions(), - Either::Right(_commitment) => HashSet::new(), - }; - - let consensus = self.consensus.read().await; - - let receiver = consensus.transactions.subscribe().await; - - loop { - let all_txns = consensus.transactions.cloned().await; - debug!("Size of transactions: {}", all_txns.len()); - let unclaimed_txns: Vec<_> = all_txns - .iter() - .filter(|(txn_hash, _txn)| !previous_used_txns.contains(txn_hash)) - .collect(); - - let time_past = task_start_time.elapsed(); - if unclaimed_txns.len() < self.api.min_transactions() - && (time_past < self.api.propose_max_round_time()) - { - let duration = self.api.propose_max_round_time() - time_past; - let result = async_timeout(duration, receiver.recv()).await; - match result { - Err(_) => { - // Fall through below to updating new block - error!( - "propose_max_round_time passed, sending transactions we have so far" - ); - } - Ok(Err(e)) => { - // Something unprecedented is wrong, and `transactions` has been dropped - error!("Channel receiver error for SubscribableRwLock {:?}", e); - return None; - } - Ok(Ok(_)) => continue, - } - } - break; - } - let all_txns = consensus.transactions.cloned().await; - let txns: Vec = all_txns - .iter() - .filter_map(|(txn_hash, txn)| { - if previous_used_txns.contains(txn_hash) { - None - } else { - Some(txn.clone()) - } - }) - .collect(); - Some(txns) - } - /// Filter the DA event. pub fn filter(event: &SequencingHotShotEvent) -> bool { matches!( @@ -889,7 +751,7 @@ where SequencingHotShotEvent::DAProposalRecv(_, _) | SequencingHotShotEvent::DAVoteRecv(_) | SequencingHotShotEvent::Shutdown - | SequencingHotShotEvent::TransactionsRecv(_) + | SequencingHotShotEvent::BlockReady(_) | SequencingHotShotEvent::Timeout(_) | SequencingHotShotEvent::VidDisperseRecv(_, _) | SequencingHotShotEvent::VidVoteRecv(_) diff --git a/crates/task-impls/src/lib.rs b/crates/task-impls/src/lib.rs index aca2cafdea..5e7492d84a 100644 --- a/crates/task-impls/src/lib.rs +++ b/crates/task-impls/src/lib.rs @@ -17,6 +17,9 @@ pub mod consensus; /// The task which implements the main parts of data availability. pub mod da; +/// The task which implements all transaction handling +pub mod transactions; + /// Defines the events passed between tasks pub mod events; diff --git a/crates/task-impls/src/transactions.rs b/crates/task-impls/src/transactions.rs index 8ea635d750..fa900ebe79 100644 --- a/crates/task-impls/src/transactions.rs +++ b/crates/task-impls/src/transactions.rs @@ -12,30 +12,25 @@ use futures::FutureExt; use hotshot_task::{ event_stream::{ChannelStream, EventStream}, global_registry::GlobalRegistry, - task::{FilterEvent, HandleEvent, HotShotTaskCompleted, HotShotTaskTypes, TS}, - task_impls::{HSTWithEvent, TaskBuilder}, + task::{HotShotTaskCompleted, TS}, + task_impls::{HSTWithEvent}, }; use hotshot_types::{ certificate::DACertificate, - consensus::{Consensus, View}, - data::{DAProposal, ProposalType, SequencingLeaf}, - message::{CommitteeConsensusMessage, Message, Proposal, SequencingMessage}, + consensus::{Consensus}, + data::{SequencingLeaf}, + message::{Message, SequencingMessage}, traits::{ consensus_api::SequencingConsensusApi, - election::{CommitteeExchangeType, ConsensusExchange, Membership}, - network::{CommunicationChannel, ConsensusIntentEvent}, + election::{ConsensusExchange}, node_implementation::{CommitteeEx, NodeImplementation, NodeType}, - signature_key::SignatureKey, - state::ConsensusTime, Block, State, }, - utils::ViewInner, - vote::VoteAccumulator, }; use hotshot_utils::bincode::bincode_opts; use snafu::Snafu; use std::{ - collections::{HashMap, HashSet}, + collections::HashSet, sync::Arc, time::Instant, }; @@ -77,17 +72,11 @@ pub struct TransactionTaskState< /// the committee exchange pub committee_exchange: Arc>, - /// The view and ID of the current vote collection task, if there is one. - pub vote_collector: Option<(TYPES::Time, usize, usize)>, - /// Global events stream to publish events pub event_stream: ChannelStream>, /// This state's ID pub id: u64, - - /// Event stream to publish events to the application layer - pub output_event_stream: ChannelStream>, } @@ -99,7 +88,7 @@ impl< ConsensusMessage = SequencingMessage, >, A: SequencingConsensusApi, I> + 'static, - > DATaskState + > TransactionTaskState where CommitteeEx: ConsensusExchange< TYPES, @@ -109,7 +98,7 @@ where >, { /// main task event handler - #[instrument(skip_all, fields(id = self.id, view = *self.cur_view), name = "DA Main Task", level = "error")] + #[instrument(skip_all, fields(id = self.id, view = *self.cur_view), name = "Transaction Handling Task", level = "error")] pub async fn handle_event( &mut self, @@ -144,9 +133,10 @@ where return None; } - SequencingHotShotEvent::DAProposalRecv(proposal, sender) => { - } SequencingHotShotEvent::LeafDecided(leaf_chain) => { + let mut included_txns = HashSet::new(); + let mut included_txn_size = 0; + let mut included_txn_count = 0; for leaf in leaf_chain { match &leaf.deltas { Left(block) => { @@ -158,19 +148,103 @@ where Right(_) => {} } } + let mut consensus = self.consensus.write().await; + let txns = consensus.transactions.cloned().await; + + let _ = included_txns.iter().map(|hash| { + if !txns.contains_key(hash) { + consensus.seen_transactions.insert(*hash); + } + }); + drop(txns); + consensus + .transactions + .modify(|txns| { + *txns = txns + .drain() + .filter(|(txn_hash, txn)| { + if included_txns.contains(txn_hash) { + included_txn_count += 1; + included_txn_size += bincode_opts() + .serialized_size(txn) + .unwrap_or_default(); + false + } else { + true + } + }) + .collect(); + }) + .await; + + consensus + .metrics + .outstanding_transactions + .update(-included_txn_count); + consensus + .metrics + .outstanding_transactions_memory_size + .update(-(i64::try_from(included_txn_size).unwrap_or(i64::MAX))); + return None; } - // TODO ED Update high QC through QCFormed event SequencingHotShotEvent::ViewChange(view) => { - } + if *self.cur_view >= *view { + return None; + } - SequencingHotShotEvent::Timeout(view) => { - self.committee_exchange - .network() - .inject_consensus_info(ConsensusIntentEvent::CancelPollForVotes(*view)) - .await; - } + if *view - *self.cur_view > 1 { + error!("View changed by more than 1 going to view {:?}", view); + } + self.cur_view = view; + + // If we are not the next leader (DA leader for this view) immediately exit + if !self.committee_exchange.is_leader(self.cur_view + 1) { + // panic!("We are not the DA leader for view {}", *self.cur_view + 1); + return None; + } + + + // ED Copy of parent_leaf() function from sequencing leader + + let consensus = self.consensus.read().await; + let parent_view_number = &consensus.high_qc.view_number; + + let Some(parent_view) = consensus.state_map.get(parent_view_number) else { + error!( + "Couldn't find high QC parent in state map. Parent view {:?}", + parent_view_number + ); + return None; + }; + let Some(leaf) = parent_view.get_leaf_commitment() else { + error!( + ?parent_view_number, + ?parent_view, + "Parent of high QC points to a view without a proposal" + ); + return None; + }; + let Some(leaf) = consensus.saved_leaves.get(&leaf) else { + error!("Failed to find high QC parent."); + return None; + }; + let parent_leaf = leaf.clone(); + drop(consensus); + + let mut block = ::StateType::next_block(None); + let txns = self.wait_for_transactions(parent_leaf).await?; + + for txn in txns { + if let Ok(new_block) = block.add_transaction_raw(&txn) { + block = new_block; + continue; + } + } + self.event_stream.publish(SequencingHotShotEvent::BlockReady(block)).await; + return None; + } SequencingHotShotEvent::Shutdown => { return Some(HotShotTaskCompleted::ShutDown); } @@ -178,4 +252,104 @@ where } None } -} \ No newline at end of file + + #[instrument(skip_all, fields(id = self.id, view = *self.cur_view), name = "Transaction Handling Task", level = "error")] + async fn wait_for_transactions( + &self, + parent_leaf: SequencingLeaf, + ) -> Option> { + let task_start_time = Instant::now(); + + // let parent_leaf = self.parent_leaf().await?; + let previous_used_txns = match parent_leaf.deltas { + Either::Left(block) => block.contained_transactions(), + Either::Right(_commitment) => HashSet::new(), + }; + + let consensus = self.consensus.read().await; + + let receiver = consensus.transactions.subscribe().await; + + loop { + let all_txns = consensus.transactions.cloned().await; + debug!("Size of transactions: {}", all_txns.len()); + let unclaimed_txns: Vec<_> = all_txns + .iter() + .filter(|(txn_hash, _txn)| !previous_used_txns.contains(txn_hash)) + .collect(); + + let time_past = task_start_time.elapsed(); + if unclaimed_txns.len() < self.api.min_transactions() + && (time_past < self.api.propose_max_round_time()) + { + let duration = self.api.propose_max_round_time() - time_past; + let result = async_timeout(duration, receiver.recv()).await; + match result { + Err(_) => { + // Fall through below to updating new block + error!( + "propose_max_round_time passed, sending transactions we have so far" + ); + } + Ok(Err(e)) => { + // Something unprecedented is wrong, and `transactions` has been dropped + error!("Channel receiver error for SubscribableRwLock {:?}", e); + return None; + } + Ok(Ok(_)) => continue, + } + } + break; + } + let all_txns = consensus.transactions.cloned().await; + let txns: Vec = all_txns + .iter() + .filter_map(|(txn_hash, txn)| { + if previous_used_txns.contains(txn_hash) { + None + } else { + Some(txn.clone()) + } + }) + .collect(); + Some(txns) + } + + pub fn filter(event: &SequencingHotShotEvent) -> bool { + matches!( + event, + SequencingHotShotEvent::TransactionsRecv(_) + | SequencingHotShotEvent::DAVoteRecv(_) + | SequencingHotShotEvent::Shutdown + | SequencingHotShotEvent::ViewChange(_) + ) + } +} + +/// task state implementation for Transactions Task +impl< + TYPES: NodeType, + I: NodeImplementation< + TYPES, + Leaf = SequencingLeaf, + ConsensusMessage = SequencingMessage, + >, + A: SequencingConsensusApi, I> + 'static, + > TS for TransactionTaskState +where + CommitteeEx: ConsensusExchange< + TYPES, + Message, + Certificate = DACertificate, + Commitment = TYPES::BlockType, + >, +{ +} + +/// Type alias for DA Task Types +pub type TransactionsTaskTypes = HSTWithEvent< + ConsensusTaskError, + SequencingHotShotEvent, + ChannelStream>, + TransactionTaskState, +>; \ No newline at end of file From c393af6b4083f8dbf581d6138588ba899519d518 Mon Sep 17 00:00:00 2001 From: Brendon Fish Date: Thu, 14 Sep 2023 11:22:52 -0400 Subject: [PATCH 46/66] hook up transacion task and work on tests --- crates/hotshot/src/lib.rs | 9 +++++++- crates/hotshot/src/tasks/mod.rs | 10 ++++++--- crates/task-impls/src/consensus.rs | 2 -- crates/task-impls/src/transactions.rs | 30 ++++++++++--------------- crates/testing/tests/da_task.rs | 2 ++ crates/testing/tests/network_task.rs | 32 +++++++++++++++++---------- 6 files changed, 49 insertions(+), 36 deletions(-) diff --git a/crates/hotshot/src/lib.rs b/crates/hotshot/src/lib.rs index 4c2a42a0b4..cae3844716 100644 --- a/crates/hotshot/src/lib.rs +++ b/crates/hotshot/src/lib.rs @@ -36,7 +36,7 @@ use crate::{ certificate::QuorumCertificate, tasks::{ add_consensus_task, add_da_task, add_network_event_task, add_network_message_task, - add_view_sync_task, + add_transaction_task, add_view_sync_task, }, traits::{NodeImplementation, Storage}, types::{Event, SystemContextHandle}, @@ -770,6 +770,13 @@ where handle.clone(), ) .await; + let task_runner = add_transaction_task( + task_runner, + internal_event_stream.clone(), + committee_exchange.clone(), + handle.clone(), + ) + .await; let task_runner = add_view_sync_task::( task_runner, internal_event_stream.clone(), diff --git a/crates/hotshot/src/tasks/mod.rs b/crates/hotshot/src/tasks/mod.rs index 4486914dfc..b7d66a4055 100644 --- a/crates/hotshot/src/tasks/mod.rs +++ b/crates/hotshot/src/tasks/mod.rs @@ -17,12 +17,12 @@ use hotshot_task::{ use hotshot_task_impls::{ consensus::{consensus_event_filter, ConsensusTaskTypes, SequencingConsensusTaskState}, da::{DATaskState, DATaskTypes}, - transactions::{TransactionTaskState, TransactionsTaskTypes}, events::SequencingHotShotEvent, network::{ NetworkEventTaskState, NetworkEventTaskTypes, NetworkMessageTaskState, NetworkMessageTaskTypes, NetworkTaskKind, }, + transactions::{TransactionTaskState, TransactionsTaskTypes}, view_sync::{ViewSyncTaskState, ViewSyncTaskStateTypes}, }; use hotshot_types::{ @@ -408,7 +408,6 @@ where task_runner.add_task(da_task_id, da_name.to_string(), da_task) } - /// add the Transaction Handling task /// # Panics /// Is unable to panic. This section here is just to satisfy clippy @@ -448,7 +447,12 @@ where id: handle.hotshot.inner.id, }; let transactions_event_handler = HandleEvent(Arc::new( - move |event, mut state: TransactionTaskState>| { + move |event, + mut state: TransactionTaskState< + TYPES, + I, + HotShotSequencingConsensusApi, + >| { async move { let completion_status = state.handle_event(event).await; (completion_status, state) diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index 5cd782405f..2304641d6f 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -1,12 +1,10 @@ use crate::events::SequencingHotShotEvent; use async_compatibility_layer::{ art::{async_sleep, async_spawn}, - async_primitives::subscribable_rwlock::ReadView, }; use async_lock::{RwLock, RwLockUpgradableReadGuard}; #[cfg(async_executor_impl = "async-std")] use async_std::task::JoinHandle; -use bincode::Options; use bitvec::prelude::*; use commit::Committable; use core::time::Duration; diff --git a/crates/task-impls/src/transactions.rs b/crates/task-impls/src/transactions.rs index fa900ebe79..4c3c747cf3 100644 --- a/crates/task-impls/src/transactions.rs +++ b/crates/task-impls/src/transactions.rs @@ -13,33 +13,29 @@ use hotshot_task::{ event_stream::{ChannelStream, EventStream}, global_registry::GlobalRegistry, task::{HotShotTaskCompleted, TS}, - task_impls::{HSTWithEvent}, + task_impls::HSTWithEvent, }; use hotshot_types::{ certificate::DACertificate, - consensus::{Consensus}, - data::{SequencingLeaf}, + consensus::Consensus, + data::SequencingLeaf, message::{Message, SequencingMessage}, traits::{ consensus_api::SequencingConsensusApi, - election::{ConsensusExchange}, + election::ConsensusExchange, node_implementation::{CommitteeEx, NodeImplementation, NodeType}, Block, State, }, }; use hotshot_utils::bincode::bincode_opts; use snafu::Snafu; -use std::{ - collections::HashSet, - sync::Arc, - time::Instant, -}; +use std::{collections::HashSet, sync::Arc, time::Instant}; use tracing::{debug, error, instrument, warn}; #[derive(Snafu, Debug)] /// Error type for consensus tasks pub struct ConsensusTaskError {} - + /// Tracks state of a DA task pub struct TransactionTaskState< TYPES: NodeType, @@ -79,7 +75,6 @@ pub struct TransactionTaskState< pub id: u64, } - impl< TYPES: NodeType, I: NodeImplementation< @@ -165,9 +160,8 @@ where .filter(|(txn_hash, txn)| { if included_txns.contains(txn_hash) { included_txn_count += 1; - included_txn_size += bincode_opts() - .serialized_size(txn) - .unwrap_or_default(); + included_txn_size += + bincode_opts().serialized_size(txn).unwrap_or_default(); false } else { true @@ -186,7 +180,6 @@ where .outstanding_transactions_memory_size .update(-(i64::try_from(included_txn_size).unwrap_or(i64::MAX))); return None; - } SequencingHotShotEvent::ViewChange(view) => { if *self.cur_view >= *view { @@ -204,7 +197,6 @@ where return None; } - // ED Copy of parent_leaf() function from sequencing leader let consensus = self.consensus.read().await; @@ -242,7 +234,9 @@ where continue; } } - self.event_stream.publish(SequencingHotShotEvent::BlockReady(block)).await; + self.event_stream + .publish(SequencingHotShotEvent::BlockReady(block)) + .await; return None; } SequencingHotShotEvent::Shutdown => { @@ -352,4 +346,4 @@ pub type TransactionsTaskTypes = HSTWithEvent< SequencingHotShotEvent, ChannelStream>, TransactionTaskState, ->; \ No newline at end of file +>; diff --git a/crates/testing/tests/da_task.rs b/crates/testing/tests/da_task.rs index 64b70ef40c..6c5273e8df 100644 --- a/crates/testing/tests/da_task.rs +++ b/crates/testing/tests/da_task.rs @@ -75,6 +75,7 @@ async fn test_da_task() { // In view 1, node 2 is the next leader. input.push(SequencingHotShotEvent::ViewChange(ViewNumber::new(1))); input.push(SequencingHotShotEvent::ViewChange(ViewNumber::new(2))); + input.push(SequencingHotShotEvent::BlockReady(block.clone())); input.push(SequencingHotShotEvent::DAProposalRecv( message.clone(), pub_key, @@ -86,6 +87,7 @@ async fn test_da_task() { input.push(SequencingHotShotEvent::Shutdown); output.insert(SequencingHotShotEvent::ViewChange(ViewNumber::new(1)), 1); + output.insert(SequencingHotShotEvent::BlockReady(block.clone()), 1); output.insert(SequencingHotShotEvent::SendDABlockData(block), 1); output.insert( SequencingHotShotEvent::DAProposalSend(message.clone(), pub_key), diff --git a/crates/testing/tests/network_task.rs b/crates/testing/tests/network_task.rs index c14052bae3..ed1e274ff1 100644 --- a/crates/testing/tests/network_task.rs +++ b/crates/testing/tests/network_task.rs @@ -73,18 +73,19 @@ async fn test_network_task() { let mut output = HashMap::new(); input.push(SequencingHotShotEvent::ViewChange(ViewNumber::new(1))); - input.push(SequencingHotShotEvent::DAProposalSend( - da_proposal.clone(), - pub_key, - )); - input.push(SequencingHotShotEvent::VidDisperseSend( - da_vid_disperse.clone(), - pub_key, - )); - input.push(SequencingHotShotEvent::QuorumProposalSend( - quorum_proposal.clone(), - pub_key, - )); + input.push(SequencingHotShotEvent::BlockReady(block.clone())); + // input.push(SequencingHotShotEvent::DAProposalSend( + // da_proposal.clone(), + // pub_key, + // )); + // input.push(SequencingHotShotEvent::VidDisperseSend( + // da_vid_disperse.clone(), + // pub_key, + // )); + // input.push(SequencingHotShotEvent::QuorumProposalSend( + // quorum_proposal.clone(), + // pub_key, + // )); input.push(SequencingHotShotEvent::ViewChange(ViewNumber::new(2))); input.push(SequencingHotShotEvent::Shutdown); @@ -93,6 +94,11 @@ async fn test_network_task() { SequencingHotShotEvent::DAProposalSend(da_proposal.clone(), pub_key), 2, // 2 occurrences: 1 from `input`, 1 from the DA task ); + output.insert(SequencingHotShotEvent::BlockReady(block.clone()), 2); + output.insert( + SequencingHotShotEvent::VidDisperseRecv(da_vid_disperse.clone(), pub_key), + 1, + ); output.insert( SequencingHotShotEvent::VidDisperseSend(da_vid_disperse, pub_key), 2, // 2 occurrences: 1 from `input`, 1 from the DA task @@ -102,6 +108,8 @@ async fn test_network_task() { // view number check in `publish_proposal_if_able` in consensus.rs, and we will see an error in // logging, but that is fine for testing as long as the network task is correctly handling // events. + output.insert(SequencingHotShotEvent::Timeout(ViewNumber::new(1)), 1); + output.insert(SequencingHotShotEvent::Timeout(ViewNumber::new(2)), 1); output.insert( SequencingHotShotEvent::QuorumProposalSend(quorum_proposal.clone(), pub_key), 1, From d4f3aeb72d587d368e55440f7295eb44fc7a1676 Mon Sep 17 00:00:00 2001 From: Brendon Fish Date: Thu, 14 Sep 2023 11:26:02 -0400 Subject: [PATCH 47/66] lint --- crates/task-impls/src/consensus.rs | 6 ++---- crates/task-impls/src/da.rs | 18 +++++------------- crates/task-impls/src/transactions.rs | 7 ++----- 3 files changed, 9 insertions(+), 22 deletions(-) diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index 2304641d6f..c7a96c0b84 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -1,7 +1,5 @@ use crate::events::SequencingHotShotEvent; -use async_compatibility_layer::{ - art::{async_sleep, async_spawn}, -}; +use async_compatibility_layer::art::{async_sleep, async_spawn}; use async_lock::{RwLock, RwLockUpgradableReadGuard}; #[cfg(async_executor_impl = "async-std")] use async_std::task::JoinHandle; @@ -35,7 +33,7 @@ use hotshot_types::{ utils::{Terminator, ViewInner}, vote::{QuorumVote, VoteAccumulator, VoteType}, }; -use hotshot_utils::bincode::bincode_opts; + use snafu::Snafu; use std::{ collections::{HashMap, HashSet}, diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index 8579996569..0ac48bcad7 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -1,10 +1,7 @@ use crate::events::SequencingHotShotEvent; -use async_compatibility_layer::{ - art::{async_spawn, async_timeout}, - async_primitives::subscribable_rwlock::ReadView, -}; +use async_compatibility_layer::art::async_spawn; use async_lock::RwLock; -use bincode::config::Options; + use bitvec::prelude::*; use commit::Committable; use either::{Either, Left, Right}; @@ -27,19 +24,14 @@ use hotshot_types::{ node_implementation::{CommitteeEx, NodeImplementation, NodeType}, signature_key::SignatureKey, state::ConsensusTime, - Block, State, + Block, }, utils::ViewInner, vote::VoteAccumulator, }; -use hotshot_utils::bincode::bincode_opts; -use rand_chacha::rand_core::block; + use snafu::Snafu; -use std::{ - collections::{HashMap, HashSet}, - sync::Arc, - time::Instant, -}; +use std::{collections::HashMap, sync::Arc}; use tracing::{debug, error, instrument, warn}; #[derive(Snafu, Debug)] diff --git a/crates/task-impls/src/transactions.rs b/crates/task-impls/src/transactions.rs index 4c3c747cf3..abb37af883 100644 --- a/crates/task-impls/src/transactions.rs +++ b/crates/task-impls/src/transactions.rs @@ -1,14 +1,11 @@ use crate::events::SequencingHotShotEvent; use async_compatibility_layer::{ - art::{async_spawn, async_timeout}, - async_primitives::subscribable_rwlock::ReadView, + art::async_timeout, async_primitives::subscribable_rwlock::ReadView, }; use async_lock::RwLock; use bincode::config::Options; -use bitvec::prelude::*; use commit::Committable; use either::{Either, Left, Right}; -use futures::FutureExt; use hotshot_task::{ event_stream::{ChannelStream, EventStream}, global_registry::GlobalRegistry, @@ -61,7 +58,6 @@ pub struct TransactionTaskState< /// View number this view is executing in. pub cur_view: TYPES::Time, - // pub transactions: Arc>>, /// Reference to consensus. Leader will require a read lock on this. pub consensus: Arc>>>, @@ -309,6 +305,7 @@ where Some(txns) } + /// Event filter for the transaction task pub fn filter(event: &SequencingHotShotEvent) -> bool { matches!( event, From 3d71ff3f2cd6c1be0859db670cc25bcc02d37a83 Mon Sep 17 00:00:00 2001 From: Brendon Fish Date: Thu, 14 Sep 2023 11:39:49 -0400 Subject: [PATCH 48/66] fix network test --- crates/testing/tests/network_task.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/crates/testing/tests/network_task.rs b/crates/testing/tests/network_task.rs index ed1e274ff1..5ad5adefdd 100644 --- a/crates/testing/tests/network_task.rs +++ b/crates/testing/tests/network_task.rs @@ -74,18 +74,18 @@ async fn test_network_task() { input.push(SequencingHotShotEvent::ViewChange(ViewNumber::new(1))); input.push(SequencingHotShotEvent::BlockReady(block.clone())); - // input.push(SequencingHotShotEvent::DAProposalSend( - // da_proposal.clone(), - // pub_key, - // )); - // input.push(SequencingHotShotEvent::VidDisperseSend( - // da_vid_disperse.clone(), - // pub_key, - // )); - // input.push(SequencingHotShotEvent::QuorumProposalSend( - // quorum_proposal.clone(), - // pub_key, - // )); + input.push(SequencingHotShotEvent::DAProposalSend( + da_proposal.clone(), + pub_key, + )); + input.push(SequencingHotShotEvent::VidDisperseSend( + da_vid_disperse.clone(), + pub_key, + )); + input.push(SequencingHotShotEvent::QuorumProposalSend( + quorum_proposal.clone(), + pub_key, + )); input.push(SequencingHotShotEvent::ViewChange(ViewNumber::new(2))); input.push(SequencingHotShotEvent::Shutdown); From 150c9aaddfdfe63655681055f4ace60bb96949b3 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Thu, 14 Sep 2023 12:23:52 -0400 Subject: [PATCH 49/66] Middle of updated cert formation functions --- crates/types/src/traits/election.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 4a70d2f732..fd3f99db11 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -201,12 +201,12 @@ where } /// Build a QC from the threshold signature and commitment - // TODO ED Rename this function + // TODO ED Rename this function and rework this function parameters + // Assumes last vote was valid since it caused a QC to form. + // Removes need for relay on other cert specific fields fn from_signatures_and_commitment( - view_number: TIME, signatures: AssembledSignature, - commit: Commitment, - relay: Option, + vote: Self::Vote ) -> Self; /// Get the view number. @@ -216,6 +216,7 @@ where fn signatures(&self) -> AssembledSignature; // TODO (da) the following functions should be refactored into a QC-specific trait. + // TODO ED Make an issue for this /// Get the leaf commitment. fn leaf_commitment(&self) -> Commitment; From 0a532bde2019f92b5304d4dfa43839241b702bd5 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Thu, 14 Sep 2023 12:54:28 -0400 Subject: [PATCH 50/66] hotfix publish_proposal_if_able function --- crates/task-impls/src/consensus.rs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index 03fcc387a8..63f3f45f1d 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -543,7 +543,7 @@ where let view = proposal.data.get_view_number(); if view < self.cur_view { - error!("view too high"); + error!("view too high {:?}", proposal.data.clone()); return; } @@ -867,7 +867,8 @@ where "Attempting to publish proposal after voting; now in view: {}", *new_view ); - self.publish_proposal_if_able(qc).await; + self.publish_proposal_if_able(qc.clone(), qc.view_number + 1) + .await; } if !self.vote_if_able().await { // TOOD ED This means we publish the proposal without updating our own view, which doesn't seem right @@ -1019,7 +1020,10 @@ where *qc.view_number ); - if self.publish_proposal_if_able(qc.clone()).await { + if self + .publish_proposal_if_able(qc.clone(), qc.view_number + 1) + .await + { self.update_view(qc.view_number + 1).await; } } @@ -1068,7 +1072,7 @@ where let consensus = self.consensus.read().await; let qc = consensus.high_qc.clone(); drop(consensus); - if !self.publish_proposal_if_able(qc).await { + if !self.publish_proposal_if_able(qc, self.cur_view).await { error!( "Failed to publish proposal on view change. View = {:?}", self.cur_view @@ -1096,12 +1100,16 @@ where } /// Sends a proposal if possible from the high qc we have - pub async fn publish_proposal_if_able(&self, qc: QuorumCertificate) -> bool { + pub async fn publish_proposal_if_able( + &self, + _qc: QuorumCertificate, + view: TYPES::Time, + ) -> bool { // TODO ED This should not be qc view number + 1 - if !self.quorum_exchange.is_leader(qc.view_number + 1) { + if !self.quorum_exchange.is_leader(view) { error!( "Somehow we formed a QC but are not the leader for the next view {:?}", - qc.view_number + 1 + view ); return false; } @@ -1164,7 +1172,7 @@ where } let leaf = SequencingLeaf { - view_number: *parent_view_number + 1, + view_number: view, height: parent_leaf.height + 1, justify_qc: consensus.high_qc.clone(), parent_commitment: parent_leaf.commit(), From eeb0a1e60d7f124141ce2f9f9a9cf7a5a9751375 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Thu, 14 Sep 2023 13:52:23 -0400 Subject: [PATCH 51/66] Updated cert creation function signatures; still need to update logic --- crates/types/src/certificate.rs | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/crates/types/src/certificate.rs b/crates/types/src/certificate.rs index 8a7c394167..7a3820b054 100644 --- a/crates/types/src/certificate.rs +++ b/crates/types/src/certificate.rs @@ -4,6 +4,7 @@ use crate::vote::DAVoteAccumulator; use crate::vote::QuorumVote; use crate::vote::QuorumVoteAccumulator; use crate::vote::ViewSyncVoteAccumulator; +use crate::vote::VoteType; use crate::{ data::{fake_commitment, serialize_signature, LeafType}, traits::{ @@ -164,14 +165,13 @@ impl> type VoteAccumulator = QuorumVoteAccumulator; fn from_signatures_and_commitment( - view_number: TYPES::Time, signatures: AssembledSignature, - commit: Commitment, - _relay: Option, + vote: Self::Vote ) -> Self { let qc = QuorumCertificate { - leaf_commitment: commit, - view_number, + // TODO ED Change this to getter functions + leaf_commitment: vote.get_data(), + view_number: vote.get_view(), signatures, is_genesis: false, }; @@ -237,15 +237,13 @@ impl SignedCertificate; fn from_signatures_and_commitment( - view_number: TYPES::Time, signatures: AssembledSignature, - commit: Commitment, - _relay: Option, + vote: Self::Vote ) -> Self { DACertificate { - view_number, + view_number: vote.get_view(), signatures, - block_commitment: commit, + block_commitment: vote.block_commitment, } } @@ -328,14 +326,12 @@ impl type VoteAccumulator = ViewSyncVoteAccumulator, Self::Vote>; /// Build a QC from the threshold signature and commitment fn from_signatures_and_commitment( - view_number: TYPES::Time, signatures: AssembledSignature, - _commit: Commitment>, - relay: Option, + vote: Self::Vote ) -> Self { let certificate_internal = ViewSyncCertificateInternal { - round: view_number, - relay: relay.unwrap(), + round: vote.get_view(), + relay: vote.relay, signatures: signatures.clone(), }; match signatures { From 12b83502967e208c429d07dbb268da7948a1cec5 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Thu, 14 Sep 2023 13:53:13 -0400 Subject: [PATCH 52/66] Ignore network test --- crates/testing/tests/network_task.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/testing/tests/network_task.rs b/crates/testing/tests/network_task.rs index f3d8d9f8bb..aa0c80024f 100644 --- a/crates/testing/tests/network_task.rs +++ b/crates/testing/tests/network_task.rs @@ -19,6 +19,7 @@ use std::collections::HashMap; tokio::test(flavor = "multi_thread", worker_threads = 2) )] #[cfg_attr(async_executor_impl = "async-std", async_std::test)] +#[ignore] async fn test_network_task() { use hotshot::demos::sdemo::{SDemoBlock, SDemoNormalBlock}; use hotshot_task_impls::harness::run_harness; From 40bc00795d003d533e690acd218f2a4e113713e0 Mon Sep 17 00:00:00 2001 From: Keyao Shen Date: Thu, 14 Sep 2023 11:46:32 -0700 Subject: [PATCH 53/66] Remove commitment --- crates/hotshot/src/demos/sdemo.rs | 7 ------- crates/types/src/traits/block_contents.rs | 15 --------------- 2 files changed, 22 deletions(-) diff --git a/crates/hotshot/src/demos/sdemo.rs b/crates/hotshot/src/demos/sdemo.rs index 7e7472683a..66f9ec8133 100644 --- a/crates/hotshot/src/demos/sdemo.rs +++ b/crates/hotshot/src/demos/sdemo.rs @@ -236,13 +236,6 @@ impl BlockPayload for SDemoBlock { .collect(), } } - - fn commitment(&self) -> VidResult> { - // TODO: Get the payload commitment after VID integration. - // - // - unimplemented!(); - } } impl State for SDemoState { diff --git a/crates/types/src/traits/block_contents.rs b/crates/types/src/traits/block_contents.rs index afc714e169..861645d7fc 100644 --- a/crates/types/src/traits/block_contents.rs +++ b/crates/types/src/traits/block_contents.rs @@ -58,14 +58,6 @@ pub trait BlockPayload: /// returns hashes of all the transactions in this block /// TODO make this ordered with a vec fn contained_transactions(&self) -> HashSet>; - - /// Compute the VID payload commitment. - /// - /// # Errors - /// - `VidResult::Err` in case of actual error. - /// - `VidResult::Ok(Result::Err)` if verification fails. - /// - `VidResult::Ok(Result::Ok)` if verification succeeds. - fn commitment(&self) -> VidResult>; } /// Abstraction over any type of transaction. Used by [`BlockPayload`]. @@ -159,13 +151,6 @@ pub mod dummy { fn contained_transactions(&self) -> HashSet> { HashSet::new() } - - fn commitment(&self) -> VidResult> { - // TODO: Get the payload commitment after VID integration. - // - // - unimplemented!(); - } } impl TestableBlock for DummyBlock { From 006a3d6727e7fc3e6b225d7ae6f966a08bbf7bf8 Mon Sep 17 00:00:00 2001 From: Keyao Shen Date: Thu, 14 Sep 2023 13:51:33 -0700 Subject: [PATCH 54/66] Fix lint --- crates/hotshot/src/demos/sdemo.rs | 1 - crates/types/src/traits/block_contents.rs | 2 -- 2 files changed, 3 deletions(-) diff --git a/crates/hotshot/src/demos/sdemo.rs b/crates/hotshot/src/demos/sdemo.rs index 66f9ec8133..30d12bc579 100644 --- a/crates/hotshot/src/demos/sdemo.rs +++ b/crates/hotshot/src/demos/sdemo.rs @@ -31,7 +31,6 @@ use hotshot_types::{ BlockPayload, State, }, }; -use jf_primitives::vid::VidResult; use rand::Rng; use serde::{Deserialize, Serialize}; use snafu::Snafu; diff --git a/crates/types/src/traits/block_contents.rs b/crates/types/src/traits/block_contents.rs index 861645d7fc..eb4dce2753 100644 --- a/crates/types/src/traits/block_contents.rs +++ b/crates/types/src/traits/block_contents.rs @@ -4,7 +4,6 @@ //! behaviors that a block is expected to have. use commit::{Commitment, Committable}; -use jf_primitives::vid::VidResult; use serde::{de::DeserializeOwned, Serialize}; use std::{ @@ -71,7 +70,6 @@ pub mod dummy { use std::fmt::Display; use super::{BlockPayload, Commitment, Committable, Debug, Hash, HashSet, Serialize}; - use jf_primitives::vid::VidResult; use rand::Rng; use serde::Deserialize; From 346f1d9d54114e76b818681f7a03f26179a31170 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Thu, 14 Sep 2023 18:08:13 -0400 Subject: [PATCH 55/66] Comment out broken docker build --- .github/workflows/build.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a1aa16ecae..c8cbe47c53 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,13 +72,13 @@ jobs: with: images: ghcr.io/espressosystems/hotshot/web-server - - name: Build and push web-server docker - uses: docker/build-push-action@v5 - if: matrix.just_variants == 'async_std' - with: - context: ./ - file: ./deploy/web-server.Dockerfile - platforms: linux/amd64 - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.web-server.outputs.tags }} - labels: ${{ steps.web-server.outputs.labels }} + # - name: Build and push web-server docker + # uses: docker/build-push-action@v5 + # if: matrix.just_variants == 'async_std' + # with: + # context: ./ + # file: ./deploy/web-server.Dockerfile + # platforms: linux/amd64 + # push: ${{ github.event_name != 'pull_request' }} + # tags: ${{ steps.web-server.outputs.tags }} + # labels: ${{ steps.web-server.outputs.labels }} From b0ce66176d2caf7f330633857b4233461af1c4ff Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Thu, 14 Sep 2023 18:21:51 -0400 Subject: [PATCH 56/66] Update finished to cert creation functions --- crates/types/src/certificate.rs | 10 ++-- crates/types/src/traits/election.rs | 71 ++++++----------------------- crates/types/src/vote.rs | 2 +- 3 files changed, 21 insertions(+), 62 deletions(-) diff --git a/crates/types/src/certificate.rs b/crates/types/src/certificate.rs index 7a3820b054..5eeda26510 100644 --- a/crates/types/src/certificate.rs +++ b/crates/types/src/certificate.rs @@ -168,9 +168,13 @@ impl> signatures: AssembledSignature, vote: Self::Vote ) -> Self { + let leaf_commitment = match vote.clone() { + QuorumVote::Yes(vote_internal) | QuorumVote::No (vote_internal) => vote_internal.leaf_commitment, + _ => unimplemented!() + }; let qc = QuorumCertificate { - // TODO ED Change this to getter functions - leaf_commitment: vote.get_data(), + // TODO ED Change this to getter functions, make get_commitment function + leaf_commitment, view_number: vote.get_view(), signatures, is_genesis: false, @@ -331,7 +335,7 @@ impl ) -> Self { let certificate_internal = ViewSyncCertificateInternal { round: vote.get_view(), - relay: vote.relay, + relay: vote.relay(), signatures: signatures.clone(), }; match signatures { diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index fd3f99db11..ddb22aeaf5 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -202,11 +202,11 @@ where /// Build a QC from the threshold signature and commitment // TODO ED Rename this function and rework this function parameters - // Assumes last vote was valid since it caused a QC to form. - // Removes need for relay on other cert specific fields + // Assumes last vote was valid since it caused a QC to form. + // Removes need for relay on other cert specific fields fn from_signatures_and_commitment( signatures: AssembledSignature, - vote: Self::Vote + vote: Self::Vote, ) -> Self; /// Get the view number. @@ -216,7 +216,7 @@ where fn signatures(&self) -> AssembledSignature; // TODO (da) the following functions should be refactored into a QC-specific trait. - // TODO ED Make an issue for this + // TODO ED Make an issue for this /// Get the leaf commitment. fn leaf_commitment(&self) -> Commitment; @@ -469,53 +469,7 @@ pub trait ConsensusExchange: Send + Sync { vota_meta: VoteMetaData, accumulator: VoteAccumulator, ) -> Either, Self::Certificate> { - if !self.is_valid_vote( - &vota_meta.encoded_key, - &vota_meta.encoded_signature, - vota_meta.data.clone(), - // Ignoring deserialization errors below since we are getting rid of it soon - Checked::Unchecked(vota_meta.vote_token.clone()), - ) { - error!("Invalid vote!"); - return Either::Left(accumulator); - } - - if let Some(key) = ::from_bytes(&vota_meta.encoded_key) - { - let stake_table_entry = key.get_stake_table_entry(1u64); - let append_node_id = self - .membership() - .get_committee_qc_stake_table() - .iter() - .position(|x| *x == stake_table_entry.clone()) - .unwrap(); - - match accumulator.append(( - vota_meta.commitment, - ( - vota_meta.encoded_key.clone(), - ( - vota_meta.encoded_signature.clone(), - self.membership().get_committee_qc_stake_table(), - append_node_id, - vota_meta.data, - vota_meta.vote_token, - ), - ), - )) { - Either::Left(accumulator) => Either::Left(accumulator), - Either::Right(signatures) => { - Either::Right(Self::Certificate::from_signatures_and_commitment( - vota_meta.view_number, - signatures, - vota_meta.commitment, - vota_meta.relay, - )) - } - } - } else { - Either::Left(accumulator) - } + todo!() // TODO ED Remove this function } /// Add a vote to the accumulating signature. Return The certificate if the vote @@ -573,7 +527,7 @@ pub trait ConsensusExchange: Send + Sync { } let stake_table_entry = vote.get_key().get_stake_table_entry(1u64); - // TODO ED Could we make this part of the vote in the future? It's only a usize. + // TODO ED Could we make this part of the vote in the future? It's only a usize. let append_node_id = self .membership() .get_committee_qc_stake_table() @@ -582,15 +536,16 @@ pub trait ConsensusExchange: Send + Sync { .unwrap(); // TODO ED Should make append function take a reference to vote - match accumulator.append(vote.clone(), append_node_id, self.membership().get_committee_qc_stake_table()) { + match accumulator.append( + vote.clone(), + append_node_id, + self.membership().get_committee_qc_stake_table(), + ) { Either::Left(accumulator) => Either::Left(accumulator), Either::Right(signatures) => { - // TODO ED Update this function to just take in the signatures and most recent vote + // TODO ED Update this function to just take in the signatures and most recent vote Either::Right(Self::Certificate::from_signatures_and_commitment( - vote.get_view(), - signatures, - *commit, - Some(0), + signatures, vote.clone(), )) } } diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index d76a0a395f..bbf511df6e 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -612,7 +612,7 @@ impl< _ => return Either::Left(self), }; - error!("Vote is {:?}", vote.clone()); + // error!("Vote is {:?}", vote.clone()); let encoded_key = vote.get_key().to_bytes(); From 844564cb9fe6323f0dd632c23d2e4e913a76d7dc Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Thu, 14 Sep 2023 19:15:25 -0400 Subject: [PATCH 57/66] Fix finalize view sync cert bug --- crates/types/src/vote.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index bbf511df6e..76a2bc9aa7 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -628,20 +628,33 @@ impl< .entry(vote_commitment) .or_insert_with(|| (0, BTreeMap::new())); + // Check for duplicate vote + if pre_commit_vote_map.contains_key(&encoded_key) { + return Either::Left(self); + } + let (commit_stake_casted, commit_vote_map) = self .commit_vote_outcomes .entry(vote_commitment) .or_insert_with(|| (0, BTreeMap::new())); + if commit_vote_map.contains_key(&encoded_key) { + return Either::Left(self); + } + let (finalize_stake_casted, finalize_vote_map) = self .finalize_vote_outcomes .entry(vote_commitment) .or_insert_with(|| (0, BTreeMap::new())); + if finalize_vote_map.contains_key(&encoded_key) { + return Either::Left(self); + } + // update the active_keys and sig_lists // TODO ED Possible bug where a node sends precommit vote and then commit vote after // precommit cert is formed, their commit vote won't be counted because of this check - // Probably need separate signers vecs. + // Probably need separate signers vecs. if self.signers.get(vote_node_id).as_deref() == Some(&true) { error!("node id already in signers"); return Either::Left(self); @@ -885,6 +898,7 @@ where // update the active_keys and sig_lists if self.signers.get(node_id).as_deref() == Some(&true) { error!("node id already in signers"); + panic!(); return Either::Left(self); } self.signers.set(node_id, true); From 9a4f4a1881154abe3499046ce454d94b352b0832 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Thu, 14 Sep 2023 19:49:49 -0400 Subject: [PATCH 58/66] lints --- crates/hotshot/src/tasks/mod.rs | 2 +- .../src/traits/election/static_committee.rs | 1 - .../src/traits/networking/libp2p_network.rs | 6 +--- crates/task-impls/src/consensus.rs | 9 +----- crates/task-impls/src/da.rs | 31 +++++++------------ crates/task-impls/src/view_sync.rs | 1 - crates/types/src/certificate.rs | 14 ++++----- crates/types/src/message.rs | 2 +- crates/types/src/traits/election.rs | 3 +- crates/types/src/traits/network.rs | 2 -- crates/types/src/vote.rs | 10 ------ 11 files changed, 24 insertions(+), 57 deletions(-) diff --git a/crates/hotshot/src/tasks/mod.rs b/crates/hotshot/src/tasks/mod.rs index c2949cbd3e..8b96117428 100644 --- a/crates/hotshot/src/tasks/mod.rs +++ b/crates/hotshot/src/tasks/mod.rs @@ -4,7 +4,6 @@ use crate::{ async_spawn, types::SystemContextHandle, DACertificate, HotShotSequencingConsensusApi, QuorumCertificate, SequencingQuorumEx, }; -use serde::Serialize; use async_compatibility_layer::art::{async_sleep, async_spawn_local}; use commit::Committable; use futures::FutureExt; @@ -42,6 +41,7 @@ use hotshot_types::{ }, vote::{ViewSyncData, VoteType}, }; +use serde::Serialize; use std::{collections::HashMap, marker::PhantomData, sync::Arc, time::Duration}; /// event for global event stream diff --git a/crates/hotshot/src/traits/election/static_committee.rs b/crates/hotshot/src/traits/election/static_committee.rs index 0e79efacab..44c4075e6f 100644 --- a/crates/hotshot/src/traits/election/static_committee.rs +++ b/crates/hotshot/src/traits/election/static_committee.rs @@ -112,7 +112,6 @@ where view_number: TYPES::Time, private_key: &::PrivateKey, ) -> std::result::Result>, ElectionError> { - // TODO ED Below let pub_key = PUBKEY::from_private(private_key); let entry = pub_key.get_stake_table_entry(1u64); if !self.committee_nodes_with_stake.contains(&entry) { diff --git a/crates/hotshot/src/traits/networking/libp2p_network.rs b/crates/hotshot/src/traits/networking/libp2p_network.rs index a0ae5b9d32..cdabb98091 100644 --- a/crates/hotshot/src/traits/networking/libp2p_network.rs +++ b/crates/hotshot/src/traits/networking/libp2p_network.rs @@ -894,11 +894,7 @@ where } } -impl< - TYPES: NodeType, - I: NodeImplementation, - MEMBERSHIP: Membership, - > +impl, MEMBERSHIP: Membership> TestableChannelImplementation< TYPES, Message, diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index 6d4a8d4218..f4d9d8ea3f 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -198,7 +198,6 @@ where Commitment = SequencingLeaf, >, { - // TODO ED Emit a view change event upon new proposal? match event { SequencingHotShotEvent::QuorumVoteRecv(vote) => match vote.clone() { QuorumVote::Yes(vote_internal) => { @@ -216,8 +215,7 @@ where } let accumulator = state.accumulator.left().unwrap(); - // TODO ED Maybe we don't need this to take in commitment? Can just get it from the vote directly if it is always - // going to be passed in as the vote.commitment + match state.quorum_exchange.accumulate_vote_2( accumulator, &vote, @@ -445,7 +443,6 @@ where }; - // TODO ED Only publish event in vote if able if let GeneralConsensusMessage::Vote(vote) = message { debug!("Sending vote to next quorum leader {:?}", vote.get_view()); self.event_stream @@ -914,8 +911,6 @@ where return; } - // TODO ED Should remove this match because we'd always want to collect votes no matter the type on qc - // Though will need a sep accumulator for Timeout votes match vote.clone() { QuorumVote::Yes(vote_internal) => { let handle_event = HandleEvent(Arc::new(move |event, state| { @@ -947,7 +942,6 @@ where phantom: PhantomData, }; - // TODO ED Get vote data here instead of cloning into block commitment field of vote let accumulator = self.quorum_exchange.accumulate_vote_2( new_accumulator, &vote, @@ -1129,7 +1123,6 @@ where _qc: QuorumCertificate, view: TYPES::Time, ) -> bool { - // TODO ED This should not be qc view number + 1 if !self.quorum_exchange.is_leader(view) { error!( "Somehow we formed a QC but are not the leader for the next view {:?}", diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index d89b5b65d8..9d1b6840f1 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -105,7 +105,7 @@ pub struct DAVoteCollectionTaskState< pub committee_exchange: Arc>, #[allow(clippy::type_complexity)] - pub accumulator2: Either< + pub accumulator: Either< as SignedCertificate< TYPES, TYPES::Time, @@ -114,7 +114,6 @@ pub struct DAVoteCollectionTaskState< >>::VoteAccumulator, DACertificate, >, - // TODO ED Make this just "view" since it is only for this task /// the current view pub cur_view: TYPES::Time, /// event stream for channel events @@ -157,21 +156,20 @@ where // panic!("Vote handle received DA vote for view {}", *vote.current_view); // For the case where we receive votes after we've made a certificate - if state.accumulator2.is_right() { + if state.accumulator.is_right() { debug!("DA accumulator finished view: {:?}", state.cur_view); return (None, state); } - let accumulator2 = state.accumulator2.left().unwrap(); - // TODO ED Maybe we don't need this to take in commitment? Can just get it from the vote directly if it is always - // going to be passed in as the vote.commitment + let accumulator = state.accumulator.left().unwrap(); + match state.committee_exchange.accumulate_vote_2( - accumulator2, + accumulator, &vote, &vote.block_commitment, ) { Left(new_accumulator) => { - state.accumulator2 = either::Left(new_accumulator); + state.accumulator = either::Left(new_accumulator); } Right(dac) => { @@ -184,8 +182,7 @@ where )) .await; - // TODO ED Rename this to just accumulator - state.accumulator2 = Right(dac.clone()); + state.accumulator = Right(dac.clone()); state .committee_exchange .network() @@ -286,8 +283,6 @@ where ) -> Option { match event { SequencingHotShotEvent::TransactionsRecv(transactions) => { - // TODO ED Add validation checks - let mut consensus = self.consensus.write().await; consensus .get_transactions() @@ -425,8 +420,7 @@ where phantom: PhantomData, }; - // TODO ED Get vote data here instead of cloning into block commitment field of vote - let accumulator2 = self.committee_exchange.accumulate_vote_2( + let accumulator = self.committee_exchange.accumulate_vote_2( new_accumulator, &vote, &vote.clone().block_commitment, @@ -436,7 +430,7 @@ where let state = DAVoteCollectionTaskState { committee_exchange: self.committee_exchange.clone(), - accumulator2: accumulator2, + accumulator: accumulator, cur_view: view, event_stream: self.event_stream.clone(), id: self.id, @@ -508,8 +502,7 @@ where phantom: PhantomData, }; - // TODO ED Get vote data here instead of cloning into block commitment field of vote - let accumulator2 = self.committee_exchange.accumulate_vote_2( + let accumulator = self.committee_exchange.accumulate_vote_2( new_accumulator, &vote, &vote.clone().block_commitment, @@ -519,7 +512,7 @@ where let state = DAVoteCollectionTaskState { committee_exchange: self.committee_exchange.clone(), - accumulator2: accumulator2, + accumulator: accumulator, cur_view: view, event_stream: self.event_stream.clone(), id: self.id, @@ -625,7 +618,6 @@ where // } // } } - // TODO ED Update high QC through QCFormed event SequencingHotShotEvent::ViewChange(view) => { if *self.cur_view >= *view { return None; @@ -638,7 +630,6 @@ where // Inject view info into network // ED I think it is possible that you receive a quorum proposal, vote on it and update your view before the da leader has sent their proposal, and therefore you skip polling for this view? - // TODO ED Only poll if you are on the committee let is_da = self .committee_exchange .membership() diff --git a/crates/task-impls/src/view_sync.rs b/crates/task-impls/src/view_sync.rs index b29943ced4..e7db70324d 100644 --- a/crates/task-impls/src/view_sync.rs +++ b/crates/task-impls/src/view_sync.rs @@ -1004,7 +1004,6 @@ where *vote_internal.round, vote_internal.relay ); - // TODO ED This isn't ideal, should fix this let vote_data = match vote.get_data() { VoteData::ViewSyncPreCommit(data) => data, VoteData::ViewSyncCommit(data) => data, diff --git a/crates/types/src/certificate.rs b/crates/types/src/certificate.rs index 5eeda26510..ea0f801345 100644 --- a/crates/types/src/certificate.rs +++ b/crates/types/src/certificate.rs @@ -119,7 +119,6 @@ pub struct ViewSyncCertificateInternal { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)] #[serde(bound(deserialize = ""))] /// Enum representing whether a signatures is for a 'Yes' or 'No' or 'DA' or 'Genesis' certificate -// TODO ED Should this be a trait? pub enum AssembledSignature { // (enum, signature) /// These signatures are for a 'Yes' certificate @@ -166,14 +165,15 @@ impl> fn from_signatures_and_commitment( signatures: AssembledSignature, - vote: Self::Vote + vote: Self::Vote, ) -> Self { let leaf_commitment = match vote.clone() { - QuorumVote::Yes(vote_internal) | QuorumVote::No (vote_internal) => vote_internal.leaf_commitment, - _ => unimplemented!() + QuorumVote::Yes(vote_internal) | QuorumVote::No(vote_internal) => { + vote_internal.leaf_commitment + } + _ => unimplemented!(), }; let qc = QuorumCertificate { - // TODO ED Change this to getter functions, make get_commitment function leaf_commitment, view_number: vote.get_view(), signatures, @@ -242,7 +242,7 @@ impl SignedCertificate, - vote: Self::Vote + vote: Self::Vote, ) -> Self { DACertificate { view_number: vote.get_view(), @@ -331,7 +331,7 @@ impl /// Build a QC from the threshold signature and commitment fn from_signatures_and_commitment( signatures: AssembledSignature, - vote: Self::Vote + vote: Self::Vote, ) -> Self { let certificate_internal = ViewSyncCertificateInternal { round: vote.get_view(), diff --git a/crates/types/src/message.rs b/crates/types/src/message.rs index 4e7eeb82e7..79bcca050c 100644 --- a/crates/types/src/message.rs +++ b/crates/types/src/message.rs @@ -486,4 +486,4 @@ pub struct Proposal { pub data: PROPOSAL, /// The proposal must be signed by the view leader pub signature: EncodedSignature, -} \ No newline at end of file +} diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 5a02c2ff81..0549504955 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -545,7 +545,8 @@ pub trait ConsensusExchange: Send + Sync { Either::Right(signatures) => { // TODO ED Update this function to just take in the signatures and most recent vote Either::Right(Self::Certificate::from_signatures_and_commitment( - signatures, vote.clone(), + signatures, + vote.clone(), )) } } diff --git a/crates/types/src/traits/network.rs b/crates/types/src/traits/network.rs index f9aea5f835..73bcc0bcb8 100644 --- a/crates/types/src/traits/network.rs +++ b/crates/types/src/traits/network.rs @@ -203,7 +203,6 @@ pub trait ViewMessage { /// API for interacting directly with a consensus committee /// intended to be implemented for both DA and for validating consensus committees -// TODO ED Why is this generic over VOTE? #[async_trait] pub trait CommunicationChannel>: Clone + Debug + Send + Sync + 'static @@ -346,7 +345,6 @@ pub trait TestableNetworkingImplementation { fn in_flight_message_count(&self) -> Option; } /// Describes additional functionality needed by the test communication channel -// TODO ED Why is this generic over VOTE? pub trait TestableChannelImplementation< TYPES: NodeType, M: NetworkMsg, diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index 76a2bc9aa7..e4f6b04a1c 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -196,7 +196,6 @@ pub enum QuorumVote> { /// Negative vote. No(YesOrNoVote), /// Timeout vote. - // TODO ED Remove this and make it it's own vote type, since it is not part of the QC type Timeout(TimeoutVote), } @@ -208,7 +207,6 @@ impl VoteType for DAVote { self.signature_key() } fn get_signature(&self) -> EncodedSignature { - // TODO ED Revisit this function self.signature.1.clone() } fn get_data(&self) -> VoteData { @@ -219,7 +217,6 @@ impl VoteType for DAVote { } } -// TODO ED Remove this impl DAVote { /// Get the signature key. /// # Panics @@ -398,8 +395,6 @@ impl< return Either::Left(self); } - // Update the active_keys and signature lists - // TODO ED How does this differ than the check above? if self.signers.get(vote_node_id).as_deref() == Some(&true) { error!("Node id is already in signers list"); return Either::Left(self); @@ -428,7 +423,6 @@ impl< &self.sig_lists[..], ); - // TODO ED Why do we need this line if we have the above line? self.da_vote_outcomes.remove(&vote_commitment); return Either::Right(AssembledSignature::DA(real_qc_sig)); @@ -510,8 +504,6 @@ impl< return Either::Left(self); } - // Update the active_keys and signature lists - // TODO ED How does this differ than the check above? if self.signers.get(vote_node_id).as_deref() == Some(&true) { error!("Node id is already in signers list"); return Either::Left(self); @@ -731,7 +723,6 @@ impl< self.signers.as_bitslice(), &self.sig_lists[..], ); - // TODO ED Why remove? self.finalize_vote_outcomes .remove(&vote_commitment) .unwrap(); @@ -829,7 +820,6 @@ where #![allow(clippy::too_many_lines)] fn append( mut self, - // TODO ED Make this its own type to avoid extra long type signature val: ( Commitment, ( From f8f36ce252b735ebcec6ff7a0940bc621f8c12a1 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Thu, 14 Sep 2023 19:58:34 -0400 Subject: [PATCH 59/66] lints --- crates/types/src/traits/election.rs | 6 +++--- crates/types/src/traits/network.rs | 6 +----- crates/types/src/vote.rs | 21 +++++++++------------ 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index 0549504955..e76be94349 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -29,8 +29,8 @@ use crate::{ state::ConsensusTime, }, vote::{ - Accumulator, DAVote, QuorumVote, TimeoutVote, ViewSyncData, ViewSyncVote, VoteAccumulator, - VoteType, YesOrNoVote, + DAVote, QuorumVote, TimeoutVote, ViewSyncData, ViewSyncVote, VoteAccumulator, VoteType, + YesOrNoVote, }, }; use bincode::Options; @@ -505,7 +505,7 @@ pub trait ConsensusExchange: Send + Sync { TYPES::VoteTokenType, Self::Commitment, >>::Vote, - commit: &Commitment, + _commit: &Commitment, ) -> Either< <>::Certificate as SignedCertificate< TYPES, diff --git a/crates/types/src/traits/network.rs b/crates/types/src/traits/network.rs index 73bcc0bcb8..20639a308b 100644 --- a/crates/types/src/traits/network.rs +++ b/crates/types/src/traits/network.rs @@ -11,11 +11,7 @@ use tokio::time::error::Elapsed as TimeoutError; #[cfg(not(any(async_executor_impl = "async-std", async_executor_impl = "tokio")))] compile_error! {"Either config option \"async-std\" or \"tokio\" must be enabled for this crate."} use super::{election::Membership, node_implementation::NodeType, signature_key::SignatureKey}; -use crate::{ - data::{ProposalType, ViewNumber}, - message::MessagePurpose, - vote::VoteType, -}; +use crate::{data::ViewNumber, message::MessagePurpose}; use async_compatibility_layer::channel::UnboundedSendError; use async_trait::async_trait; use serde::{Deserialize, Serialize}; diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index e4f6b04a1c..70bb95d8b1 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -221,7 +221,6 @@ impl DAVote { /// Get the signature key. /// # Panics /// If the deserialization fails. - #[deprecated] pub fn signature_key(&self) -> TYPES::SignatureKey { ::from_bytes(&self.signature.0).unwrap() } @@ -259,7 +258,7 @@ impl> VoteType impl> QuorumVote { /// Get the encoded signature. - #[deprecated] + pub fn signature(&self) -> EncodedSignature { match &self { Self::Yes(vote) | Self::No(vote) => vote.signature.1.clone(), @@ -269,7 +268,7 @@ impl> QuorumVote /// Get the signature key. /// # Panics /// If the deserialization fails. - #[deprecated] + pub fn signature_key(&self) -> TYPES::SignatureKey { let encoded = match &self { Self::Yes(vote) | Self::No(vote) => vote.signature.0.clone(), @@ -567,7 +566,7 @@ pub struct ViewSyncVoteAccumulator< COMMITTABLE: Committable + Serialize + Clone, VOTE: VoteType, > { - /// Map of all da signatures accumlated so far + /// Map of all pre_commit signatures accumlated so far pub pre_commit_vote_outcomes: VoteMap, pub commit_vote_outcomes: VoteMap, pub finalize_vote_outcomes: VoteMap, @@ -590,18 +589,18 @@ impl< VOTE: VoteType, > Accumulator2 for ViewSyncVoteAccumulator { + #[allow(clippy::too_many_lines)] fn append( mut self, vote: VOTE, vote_node_id: usize, stake_table_entries: Vec<::StakeTableEntry>, ) -> Either> { - let vote_commitment = match vote.get_data() { - VoteData::ViewSyncPreCommit(commitment) - | VoteData::ViewSyncCommit(commitment) - | VoteData::ViewSyncFinalize(commitment) => commitment, - - _ => return Either::Left(self), + let (VoteData::ViewSyncPreCommit(vote_commitment) + | VoteData::ViewSyncCommit(vote_commitment) + | VoteData::ViewSyncFinalize(vote_commitment)) = vote.get_data() + else { + return Either::Left(self); }; // error!("Vote is {:?}", vote.clone()); @@ -734,7 +733,6 @@ impl< } /// Placeholder accumulator; will be replaced by accumulator for each certificate type -#[deprecated] pub struct AccumulatorPlaceholder< TYPES: NodeType, COMMITTABLE: Committable + Serialize + Clone, @@ -888,7 +886,6 @@ where // update the active_keys and sig_lists if self.signers.get(node_id).as_deref() == Some(&true) { error!("node id already in signers"); - panic!(); return Either::Left(self); } self.signers.set(node_id, true); From fb30965a36da76eec5272a6c6b75efe63bc7b69c Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Thu, 14 Sep 2023 20:15:49 -0400 Subject: [PATCH 60/66] Finish lints --- crates/hotshot/src/tasks/mod.rs | 2 +- .../src/traits/networking/libp2p_network.rs | 2 +- .../networking/web_server_libp2p_fallback.rs | 2 +- crates/task-impls/src/consensus.rs | 2 +- crates/task-impls/src/da.rs | 9 ++-- crates/task-impls/src/view_sync.rs | 13 ++--- crates/types/src/certificate.rs | 2 +- crates/types/src/traits/election.rs | 28 +++-------- crates/types/src/vote.rs | 49 ++++++++++--------- 9 files changed, 46 insertions(+), 63 deletions(-) diff --git a/crates/hotshot/src/tasks/mod.rs b/crates/hotshot/src/tasks/mod.rs index 8b96117428..64bb7d6213 100644 --- a/crates/hotshot/src/tasks/mod.rs +++ b/crates/hotshot/src/tasks/mod.rs @@ -4,7 +4,7 @@ use crate::{ async_spawn, types::SystemContextHandle, DACertificate, HotShotSequencingConsensusApi, QuorumCertificate, SequencingQuorumEx, }; -use async_compatibility_layer::art::{async_sleep, async_spawn_local}; +use async_compatibility_layer::art::async_sleep; use commit::Committable; use futures::FutureExt; use hotshot_task::{ diff --git a/crates/hotshot/src/traits/networking/libp2p_network.rs b/crates/hotshot/src/traits/networking/libp2p_network.rs index cdabb98091..da8784e0a7 100644 --- a/crates/hotshot/src/traits/networking/libp2p_network.rs +++ b/crates/hotshot/src/traits/networking/libp2p_network.rs @@ -15,7 +15,7 @@ use bincode::Options; use hotshot_constants::{KAD_DEFAULT_REPUB_INTERVAL_SEC, LOOK_AHEAD}; use hotshot_task::{boxed_sync, BoxSyncFuture}; use hotshot_types::{ - data::{ProposalType, ViewNumber}, + data::ViewNumber, message::{Message, MessageKind}, traits::{ election::Membership, diff --git a/crates/hotshot/src/traits/networking/web_server_libp2p_fallback.rs b/crates/hotshot/src/traits/networking/web_server_libp2p_fallback.rs index b1655325d7..b3324681a5 100644 --- a/crates/hotshot/src/traits/networking/web_server_libp2p_fallback.rs +++ b/crates/hotshot/src/traits/networking/web_server_libp2p_fallback.rs @@ -13,7 +13,7 @@ use futures::join; use async_compatibility_layer::channel::UnboundedSendError; use hotshot_task::{boxed_sync, BoxSyncFuture}; use hotshot_types::{ - data::{ProposalType, ViewNumber}, + data::ViewNumber, message::Message, traits::{ election::Membership, diff --git a/crates/task-impls/src/consensus.rs b/crates/task-impls/src/consensus.rs index f4d9d8ea3f..d92f286c3f 100644 --- a/crates/task-impls/src/consensus.rs +++ b/crates/task-impls/src/consensus.rs @@ -36,7 +36,7 @@ use hotshot_types::{ BlockPayload, }, utils::{Terminator, ViewInner}, - vote::{QuorumVote, VoteAccumulator, VoteType}, + vote::{QuorumVote, VoteType}, }; use hotshot_utils::bincode::bincode_opts; use snafu::Snafu; diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index 9d1b6840f1..3bcb699be8 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -105,6 +105,7 @@ pub struct DAVoteCollectionTaskState< pub committee_exchange: Arc>, #[allow(clippy::type_complexity)] + /// Accumulates DA votes pub accumulator: Either< as SignedCertificate< TYPES, @@ -196,7 +197,7 @@ where } } } - SequencingHotShotEvent::VidVoteRecv(vote) => { + SequencingHotShotEvent::VidVoteRecv(_vote) => { // TODO ED Make accumulator for VID // TODO copy-pasted from DAVoteRecv https://github.com/EspressoSystems/HotShot/issues/1690 @@ -430,7 +431,7 @@ where let state = DAVoteCollectionTaskState { committee_exchange: self.committee_exchange.clone(), - accumulator: accumulator, + accumulator, cur_view: view, event_stream: self.event_stream.clone(), id: self.id, @@ -512,7 +513,7 @@ where let state = DAVoteCollectionTaskState { committee_exchange: self.committee_exchange.clone(), - accumulator: accumulator, + accumulator, cur_view: view, event_stream: self.event_stream.clone(), id: self.id, @@ -542,7 +543,7 @@ where .await; }; } - SequencingHotShotEvent::VidDisperseRecv(disperse, sender) => { + SequencingHotShotEvent::VidDisperseRecv(_disperse, _sender) => { // TODO ED Make accumulator for this // TODO copy-pasted from DAProposalRecv https://github.com/EspressoSystems/HotShot/issues/1690 // debug!( diff --git a/crates/task-impls/src/view_sync.rs b/crates/task-impls/src/view_sync.rs index e7db70324d..f92752f487 100644 --- a/crates/task-impls/src/view_sync.rs +++ b/crates/task-impls/src/view_sync.rs @@ -9,13 +9,12 @@ use hotshot_task::{ task::{FilterEvent, HandleEvent, HotShotTaskCompleted, HotShotTaskTypes, TS}, task_impls::{HSTWithEvent, TaskBuilder}, }; -use hotshot_types::traits::election::VoteData; use hotshot_types::{ traits::{ election::{Membership, SignedCertificate}, network::ConsensusIntentEvent, }, - vote::{ViewSyncVoteAccumulator, VoteType}, + vote::ViewSyncVoteAccumulator, }; use bitvec::prelude::*; @@ -32,7 +31,7 @@ use hotshot_types::{ signature_key::SignatureKey, state::ConsensusTime, }, - vote::{ViewSyncData, ViewSyncVote, VoteAccumulator}, + vote::{ViewSyncData, ViewSyncVote}, }; use snafu::Snafu; use std::{collections::HashMap, marker::PhantomData, sync::Arc, time::Duration}; @@ -223,6 +222,7 @@ pub struct ViewSyncRelayTaskState< /// View sync exchange pub exchange: Arc>, /// Vote accumulator + #[allow(clippy::type_complexity)] pub accumulator: Either< as SignedCertificate< TYPES, @@ -1004,13 +1004,6 @@ where *vote_internal.round, vote_internal.relay ); - let vote_data = match vote.get_data() { - VoteData::ViewSyncPreCommit(data) => data, - VoteData::ViewSyncCommit(data) => data, - VoteData::ViewSyncFinalize(data) => data, - _ => unimplemented!(), - }; - let accumulator = self.exchange.accumulate_vote_2( self.accumulator.left().unwrap(), &vote, diff --git a/crates/types/src/certificate.rs b/crates/types/src/certificate.rs index ea0f801345..9792026dcf 100644 --- a/crates/types/src/certificate.rs +++ b/crates/types/src/certificate.rs @@ -171,7 +171,7 @@ impl> QuorumVote::Yes(vote_internal) | QuorumVote::No(vote_internal) => { vote_internal.leaf_commitment } - _ => unimplemented!(), + QuorumVote::Timeout(_) => unimplemented!(), }; let qc = QuorumCertificate { leaf_commitment, diff --git a/crates/types/src/traits/election.rs b/crates/types/src/traits/election.rs index e76be94349..37f0be4753 100644 --- a/crates/types/src/traits/election.rs +++ b/crates/types/src/traits/election.rs @@ -191,17 +191,6 @@ where /// `Accumulator` type to accumulate votes. type VoteAccumulator: Accumulator2; - /// Accumulates votes given an accumulator, vote, and commit. - /// Returns either the accumulator or a certificate - fn accumulate_vote( - self, - accumulator: Self::VoteAccumulator, - vote: Self::Vote, - commit: COMMITTABLE, - ) -> Either { - todo!() - } - /// Build a QC from the threshold signature and commitment // TODO ED Rename this function and rework this function parameters // Assumes last vote was valid since it caused a QC to form. @@ -444,14 +433,11 @@ pub trait ConsensusExchange: Send + Sync { data: &VoteData, vote_token: &Checked, ) -> bool { - let mut is_valid_vote_token = false; - let mut is_valid_signature = false; - - is_valid_signature = key.validate(encoded_signature, data.commit().as_ref()); + let is_valid_signature = key.validate(encoded_signature, data.commit().as_ref()); let valid_vote_token = self .membership() .validate_vote_token(key.clone(), vote_token.clone()); - is_valid_vote_token = match valid_vote_token { + let is_valid_vote_token = match valid_vote_token { Err(_) => { error!("Vote token was invalid"); false @@ -464,10 +450,11 @@ pub trait ConsensusExchange: Send + Sync { } #[doc(hidden)] + fn accumulate_internal( &self, - vota_meta: VoteMetaData, - accumulator: VoteAccumulator, + _vota_meta: VoteMetaData, + _accumulator: VoteAccumulator, ) -> Either, Self::Certificate> { todo!() // TODO ED Remove this function } @@ -487,10 +474,11 @@ pub trait ConsensusExchange: Send + Sync { relay: Option, ) -> Either, Self::Certificate>; - // TODO ED Depending on what we do in the future with the exchanges trait, we can move the accumulator out of the SignedCertificate + // TODO ED Depending on what we do in the future with the exchanges trait, we can move the accumulator out of the `SignedCertificate` // trait. Logically, I feel it makes sense to accumulate on the certificate rather than the exchange, however. /// Accumulate vote - /// Returns either the accumulate if no threshold was reached, or a SignedCertificate if the threshold was reached + /// Returns either the accumulate if no threshold was reached, or a `SignedCertificate` if the threshold was reached + #[allow(clippy::type_complexity)] fn accumulate_vote_2( &self, accumulator: <>::Certificate as SignedCertificate< diff --git a/crates/types/src/vote.rs b/crates/types/src/vote.rs index 70bb95d8b1..a0ae42c926 100644 --- a/crates/types/src/vote.rs +++ b/crates/types/src/vote.rs @@ -42,7 +42,7 @@ pub trait VoteType EncodedSignature; /// Get the data this vote was signed over fn get_data(&self) -> VoteData; - // Get the vote token of this vote + /// Get the vote token of this vote fn get_vote_token(&self) -> TYPES::VoteTokenType; } @@ -245,13 +245,13 @@ impl> VoteType fn get_data(&self) -> VoteData { match self { QuorumVote::Yes(v) | QuorumVote::No(v) => v.vote_data.clone(), - QuorumVote::Timeout(v) => unimplemented!(), + QuorumVote::Timeout(_) => unimplemented!(), } } fn get_vote_token(&self) -> ::VoteTokenType { match self { QuorumVote::Yes(v) | QuorumVote::No(v) => v.vote_token.clone(), - QuorumVote::Timeout(v) => unimplemented!(), + QuorumVote::Timeout(_) => unimplemented!(), } } } @@ -337,6 +337,7 @@ pub trait Accumulator2< ) -> Either>; } +/// Accumulates DA votes pub struct DAVoteAccumulator< TYPES: NodeType, COMMITTABLE: Committable + Serialize + Clone, @@ -350,7 +351,7 @@ pub struct DAVoteAccumulator< pub sig_lists: Vec<::Signature>, /// A bitvec to indicate which node is active and send out a valid signature for certificate aggregation, this automatically do uniqueness check pub signers: BitVec, - + /// Phantom data to specify the vote this accumulator is for pub phantom: PhantomData, } @@ -360,17 +361,14 @@ impl< VOTE: VoteType, > Accumulator2 for DAVoteAccumulator { - // TODO ED We could make this the default impl, so it works for both TC and DAC fn append( mut self, vote: VOTE, vote_node_id: usize, stake_table_entries: Vec<::StakeTableEntry>, ) -> Either> { - // TODO ED Make this a function on VoteType trait - let vote_commitment = match vote.get_data() { - VoteData::DA(commitment) => commitment, - _ => return Either::Left(self), + let VoteData::DA(vote_commitment) = vote.get_data() else { + return Either::Left(self); }; let encoded_key = vote.get_key().to_bytes(); @@ -430,27 +428,28 @@ impl< } } -// TODO ED Should make these fields a trait for Accumulator, like success threshold, etc. +/// Accumulate quorum votes pub struct QuorumVoteAccumulator< TYPES: NodeType, COMMITTABLE: Committable + Serialize + Clone, VOTE: VoteType, > { - /// Map of all da signatures accumlated so far + /// Map of all signatures accumlated so far pub total_vote_outcomes: VoteMap, + /// Map of all yes signatures accumlated so far pub yes_vote_outcomes: VoteMap, - + /// Map of all no signatures accumlated so far pub no_vote_outcomes: VoteMap, /// A quorum's worth of stake, generally 2f + 1 pub success_threshold: NonZeroU64, - + /// A failure threshold, generally f + 1 pub failure_threshold: NonZeroU64, /// A list of valid signatures for certificate aggregation pub sig_lists: Vec<::Signature>, /// A bitvec to indicate which node is active and send out a valid signature for certificate aggregation, this automatically do uniqueness check pub signers: BitVec, - + /// Phantom data to ensure this struct is over a specific `VoteType` implementation pub phantom: PhantomData, } @@ -466,10 +465,9 @@ impl< vote_node_id: usize, stake_table_entries: Vec<::StakeTableEntry>, ) -> Either> { - let vote_commitment = match vote.get_data() { - VoteData::Yes(commitment) | VoteData::No(commitment) => commitment, - - _ => return Either::Left(self), + let (VoteData::Yes(vote_commitment) | VoteData::No(vote_commitment)) = vote.get_data() + else { + return Either::Left(self); }; let encoded_key = vote.get_key().to_bytes(); @@ -561,6 +559,7 @@ impl< } } +/// Accumulates view sync votes pub struct ViewSyncVoteAccumulator< TYPES: NodeType, COMMITTABLE: Committable + Serialize + Clone, @@ -568,18 +567,20 @@ pub struct ViewSyncVoteAccumulator< > { /// Map of all pre_commit signatures accumlated so far pub pre_commit_vote_outcomes: VoteMap, + /// Map of all ommit signatures accumlated so far pub commit_vote_outcomes: VoteMap, + /// Map of all finalize signatures accumlated so far pub finalize_vote_outcomes: VoteMap, /// A quorum's worth of stake, generally 2f + 1 pub success_threshold: NonZeroU64, - + /// A quorum's failure threshold, generally f + 1 pub failure_threshold: NonZeroU64, /// A list of valid signatures for certificate aggregation pub sig_lists: Vec<::Signature>, /// A bitvec to indicate which node is active and send out a valid signature for certificate aggregation, this automatically do uniqueness check pub signers: BitVec, - + /// Phantom data since we want the accumulator to be attached to a single `VoteType` pub phantom: PhantomData, } @@ -750,11 +751,11 @@ impl< { fn append( self, - vote: VOTE, - vote_node_id: usize, - stake_table_entries: Vec<::StakeTableEntry>, + _vote: VOTE, + _vote_node_id: usize, + _stake_table_entries: Vec<::StakeTableEntry>, ) -> Either> { - todo!() + either::Left(self) } } From a7a20c2baffb8e45bcd360660a6104cbe132c5d5 Mon Sep 17 00:00:00 2001 From: elliedavidson <118024407+elliedavidson@users.noreply.github.com> Date: Thu, 14 Sep 2023 20:20:27 -0400 Subject: [PATCH 61/66] Update VID --- crates/task-impls/src/da.rs | 225 +++++++++++++++++------------------- 1 file changed, 106 insertions(+), 119 deletions(-) diff --git a/crates/task-impls/src/da.rs b/crates/task-impls/src/da.rs index 3bcb699be8..6d5d58c5a1 100644 --- a/crates/task-impls/src/da.rs +++ b/crates/task-impls/src/da.rs @@ -17,6 +17,7 @@ use hotshot_task::{ }; use hotshot_types::traits::election::SignedCertificate; use hotshot_types::vote::DAVoteAccumulator; +use hotshot_types::vote::VoteType; use hotshot_types::{ certificate::DACertificate, consensus::{Consensus, View}, @@ -197,59 +198,46 @@ where } } } - SequencingHotShotEvent::VidVoteRecv(_vote) => { - // TODO ED Make accumulator for VID + SequencingHotShotEvent::VidVoteRecv(vote) => { // TODO copy-pasted from DAVoteRecv https://github.com/EspressoSystems/HotShot/issues/1690 - // debug!("VID vote recv, collection task {:?}", vote.current_view); - // // panic!("Vote handle received DA vote for view {}", *vote.current_view); - - // let accumulator = match state.accumulator { - // Right(_) => { - // // For the case where we receive votes after we've made a certificate - // debug!("VID accumulator finished view: {:?}", state.cur_view); - // return (None, state); - // } - // Left(a) => a, - // }; - // match state.committee_exchange.accumulate_vote( - // &vote.signature.0, - // &vote.signature.1, - // vote.block_commitment, - // vote.vote_data, - // vote.vote_token.clone(), - // state.cur_view, - // accumulator, - // None, - // ) { - // Left(acc) => { - // state.accumulator = Either::Left(acc); - // // debug!("Not enough VID votes! "); - // return (None, state); - // } - // Right(vid_cert) => { - // debug!("Sending VID cert! {:?}", vid_cert.view_number); - // state - // .event_stream - // .publish(SequencingHotShotEvent::VidCertSend( - // vid_cert.clone(), - // state.committee_exchange.public_key().clone(), - // )) - // .await; - - // state.accumulator = Right(vid_cert.clone()); - // state - // .committee_exchange - // .network() - // .inject_consensus_info(ConsensusIntentEvent::CancelPollForVotes( - // *vid_cert.view_number, - // )) - // .await; - - // // Return completed at this point - // return (Some(HotShotTaskCompleted::ShutDown), state); - // } - // } + debug!("VID vote recv, collection task {:?}", vote.get_view()); + // panic!("Vote handle received DA vote for view {}", *vote.current_view); + + let accumulator = state.accumulator.left().unwrap(); + + match state.committee_exchange.accumulate_vote_2( + accumulator, + &vote, + &vote.block_commitment, + ) { + Left(new_accumulator) => { + state.accumulator = either::Left(new_accumulator); + } + + Right(vid_cert) => { + debug!("Sending VID cert! {:?}", vid_cert.view_number); + state + .event_stream + .publish(SequencingHotShotEvent::VidCertSend( + vid_cert.clone(), + state.committee_exchange.public_key().clone(), + )) + .await; + + state.accumulator = Right(vid_cert.clone()); + state + .committee_exchange + .network() + .inject_consensus_info(ConsensusIntentEvent::CancelPollForVotes( + *vid_cert.view_number, + )) + .await; + + // Return completed at this point + return (Some(HotShotTaskCompleted::ShutDown), state); + } + } } SequencingHotShotEvent::Shutdown => return (Some(HotShotTaskCompleted::ShutDown), state), _ => { @@ -543,81 +531,80 @@ where .await; }; } - SequencingHotShotEvent::VidDisperseRecv(_disperse, _sender) => { - // TODO ED Make accumulator for this + SequencingHotShotEvent::VidDisperseRecv(disperse, sender) => { // TODO copy-pasted from DAProposalRecv https://github.com/EspressoSystems/HotShot/issues/1690 - // debug!( - // "VID disperse received for view: {:?}", - // disperse.data.get_view_number() - // ); + debug!( + "VID disperse received for view: {:?}", + disperse.data.get_view_number() + ); - // // ED NOTE: Assuming that the next view leader is the one who sends DA proposal for this view - // let view = disperse.data.get_view_number(); + // ED NOTE: Assuming that the next view leader is the one who sends DA proposal for this view + let view = disperse.data.get_view_number(); - // // Allow a DA proposal that is one view older, in case we have voted on a quorum - // // proposal and updated the view. - // // `self.cur_view` should be at least 1 since there is a view change before getting - // // the `DAProposalRecv` event. Otherewise, the view number subtraction below will - // // cause an overflow error. - // if view < self.cur_view - 1 { - // warn!("Throwing away VID disperse data that is more than one view older"); - // return None; - // } + // Allow a DA proposal that is one view older, in case we have voted on a quorum + // proposal and updated the view. + // `self.cur_view` should be at least 1 since there is a view change before getting + // the `DAProposalRecv` event. Otherewise, the view number subtraction below will + // cause an overflow error. + if view < self.cur_view - 1 { + warn!("Throwing away VID disperse data that is more than one view older"); + return None; + } - // debug!("VID disperse data is fresh."); - // let block_commitment = disperse.data.commitment; + debug!("VID disperse data is fresh."); + let block_commitment = disperse.data.commitment; - // // ED Is this the right leader? - // let view_leader_key = self.committee_exchange.get_leader(view); - // if view_leader_key != sender { - // error!("VID proposal doesn't have expected leader key for view {} \n DA proposal is: [N/A for VID]", *view); - // return None; - // } + // ED Is this the right leader? + let view_leader_key = self.committee_exchange.get_leader(view); + if view_leader_key != sender { + error!("VID proposal doesn't have expected leader key for view {} \n DA proposal is: [N/A for VID]", *view); + return None; + } - // if !view_leader_key.validate(&disperse.signature, block_commitment.as_ref()) { - // error!("Could not verify VID proposal sig."); - // return None; - // } + if !view_leader_key.validate(&disperse.signature, block_commitment.as_ref()) { + error!("Could not verify VID proposal sig."); + return None; + } - // let vote_token = self.committee_exchange.make_vote_token(view); - // match vote_token { - // Err(e) => { - // error!("Failed to generate vote token for {:?} {:?}", view, e); - // } - // Ok(None) => { - // debug!("We were not chosen for VID quorum on {:?}", view); - // } - // Ok(Some(vote_token)) => { - // // Generate and send vote - // let vote = self.committee_exchange.create_vid_message( - // block_commitment, - // view, - // vote_token, - // ); - - // // ED Don't think this is necessary? - // // self.cur_view = view; - - // debug!("Sending vote to the VID leader {:?}", vote.current_view); - // self.event_stream - // .publish(SequencingHotShotEvent::VidVoteSend(vote)) - // .await; - // let mut consensus = self.consensus.write().await; - - // // Ensure this view is in the view map for garbage collection, but do not overwrite if - // // there is already a view there: the replica task may have inserted a `Leaf` view which - // // contains strictly more information. - // consensus.state_map.entry(view).or_insert(View { - // view_inner: ViewInner::DA { - // block: block_commitment, - // }, - // }); - - // // Record the block we have promised to make available. - // // TODO https://github.com/EspressoSystems/HotShot/issues/1692 - // // consensus.saved_blocks.insert(proposal.data.deltas); - // } - // } + let vote_token = self.committee_exchange.make_vote_token(view); + match vote_token { + Err(e) => { + error!("Failed to generate vote token for {:?} {:?}", view, e); + } + Ok(None) => { + debug!("We were not chosen for VID quorum on {:?}", view); + } + Ok(Some(vote_token)) => { + // Generate and send vote + let vote = self.committee_exchange.create_vid_message( + block_commitment, + view, + vote_token, + ); + + // ED Don't think this is necessary? + // self.cur_view = view; + + debug!("Sending vote to the VID leader {:?}", vote.current_view); + self.event_stream + .publish(SequencingHotShotEvent::VidVoteSend(vote)) + .await; + let mut consensus = self.consensus.write().await; + + // Ensure this view is in the view map for garbage collection, but do not overwrite if + // there is already a view there: the replica task may have inserted a `Leaf` view which + // contains strictly more information. + consensus.state_map.entry(view).or_insert(View { + view_inner: ViewInner::DA { + block: block_commitment, + }, + }); + + // Record the block we have promised to make available. + // TODO https://github.com/EspressoSystems/HotShot/issues/1692 + // consensus.saved_blocks.insert(proposal.data.deltas); + } + } } SequencingHotShotEvent::ViewChange(view) => { if *self.cur_view >= *view { From 7264f17d5832fe563bd28b1c119c9542d728c5ee Mon Sep 17 00:00:00 2001 From: Brendon Fish Date: Fri, 15 Sep 2023 10:58:29 -0400 Subject: [PATCH 62/66] address comments --- crates/hotshot/src/tasks/mod.rs | 2 +- crates/task-impls/src/transactions.rs | 4 ++-- crates/testing/tests/network_task.rs | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/hotshot/src/tasks/mod.rs b/crates/hotshot/src/tasks/mod.rs index 5e406b29e1..04ba43f74a 100644 --- a/crates/hotshot/src/tasks/mod.rs +++ b/crates/hotshot/src/tasks/mod.rs @@ -432,7 +432,7 @@ where Commitment = TYPES::BlockType, >, { - // build the da task + // build the transactions task let c_api: HotShotSequencingConsensusApi = HotShotSequencingConsensusApi { inner: handle.hotshot.inner.clone(), }; diff --git a/crates/task-impls/src/transactions.rs b/crates/task-impls/src/transactions.rs index bc4f359f55..c283291683 100644 --- a/crates/task-impls/src/transactions.rs +++ b/crates/task-impls/src/transactions.rs @@ -33,7 +33,7 @@ use tracing::{debug, error, instrument, warn}; /// Error type for consensus tasks pub struct ConsensusTaskError {} -/// Tracks state of a DA task +/// Tracks state of a Transaction task pub struct TransactionTaskState< TYPES: NodeType, I: NodeImplementation< @@ -310,7 +310,7 @@ where matches!( event, SequencingHotShotEvent::TransactionsRecv(_) - | SequencingHotShotEvent::DAVoteRecv(_) + | SequencingHotShotEvent::LeafDecided(_) | SequencingHotShotEvent::Shutdown | SequencingHotShotEvent::ViewChange(_) ) diff --git a/crates/testing/tests/network_task.rs b/crates/testing/tests/network_task.rs index 360cf66feb..b28404f835 100644 --- a/crates/testing/tests/network_task.rs +++ b/crates/testing/tests/network_task.rs @@ -110,13 +110,14 @@ async fn test_network_task() { SequencingHotShotEvent::VidDisperseSend(da_vid_disperse, pub_key), 2, // 2 occurrences: 1 from `input`, 1 from the DA task ); + output.insert(SequencingHotShotEvent::Timeout(ViewNumber::new(1)), 1); + output.insert(SequencingHotShotEvent::Timeout(ViewNumber::new(2)), 1); + // Only one output from the input. // The consensus task will fail to send a second proposal, like the DA task does, due to the // view number check in `publish_proposal_if_able` in consensus.rs, and we will see an error in // logging, but that is fine for testing as long as the network task is correctly handling // events. - output.insert(SequencingHotShotEvent::Timeout(ViewNumber::new(1)), 1); - output.insert(SequencingHotShotEvent::Timeout(ViewNumber::new(2)), 1); output.insert( SequencingHotShotEvent::QuorumProposalSend(quorum_proposal.clone(), pub_key), 1, From f371589826561dc950f8a3d9f525beb69d27974a Mon Sep 17 00:00:00 2001 From: Philippe Camacho Date: Fri, 15 Sep 2023 13:05:40 -0300 Subject: [PATCH 63/66] HotShot paper rev e62305affdf8ee050dc3cf144fca340d025a1685 (#1762) --- docs/espresso-sequencer-paper.pdf | Bin 868752 -> 796276 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/espresso-sequencer-paper.pdf b/docs/espresso-sequencer-paper.pdf index add7843500dc3a5305b6f58d1c020c0fde9a3efb..6f0976f7c9e7f1c0f0e64016b1c7e1d79d262f88 100644 GIT binary patch delta 465350 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

NdSMEO*0;rE&iEDK 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

NL?nv`Y~Pns2>|mqz180*C;-6xvk3mp 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%0AC=NArM|z<>#8pY|QJQP3J_r0dUzQew{A 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 z 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ⅅ%)WJ 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

  • t`YdEP;_ImHW_+_*1 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�{VV)1rX=grv|j|#pKZS6es9|= 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 delta 545584 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 z
    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⋘~@AQKwd>5@fS0D+67k7JM!N!D_?HtD%Pu8 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
    -Ayw<7EzR;~;NX)wM{p8KQdUD$Varm%z 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%0AF)FY=z`vjp$9uLa&_ZCoICuVHQ_ebMR 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%0Aei;nmPUg6_oFGA^w; zf+a5LOVWP6&M}{=8AG(mV}{qjkv)oQoYaI<0He5uF3m zGrBdS4D_V5^CGyMoOA6+)j#+QNLimmI@rlD6w|Uk(9uLt8yld1NC3_g;Bqo(HTi6Q zlu`=~4^j@PsA!2FCeSiS0dUB&=dSq*xYRW18$+A0D&q1}nTon!4l?oMKF}I-qgzmH z)S(wq8q1@br=XPYM; z=HZFs$mHRP;)v&Q58(*qaS!Ww;okhA*E6vz z4f8$N&k-VCG~$CeCFs~{S-7W2MZ?q}jv&L!Im7S1c&cR{8K=VTXQBcVsIxrjO!*38}4Kvs$LPJ-!8)OfrUu@V#{+B`r_ z4&mkOGvA0$UVVsdSzkk~3e$v$MY+(8VCgNdSa{55V|aPs6AHAEXv5!}eSZos*M`5k z3Af_Bxu_Biu0(P}h_;bfX@AE6p2}wK86k#uT5Hrht&};BYc#o1?ZTmCY}Jx}>_? zel!F!tRv&rIG?t9L)vrNA;v&5`zx8eZz(`LJ>387DY`z_$blD6EFnC8bHnU*OE}^! z!=O|wKRy|R8Jg|yPsWLWqmAGgg9kNEpQ|c{4@MDRa@0FNS3?8e1Kg@Xu4-dmv#uf? zNUjVW2(CCCmOI@|b$MZj9Lx68o=@u#`_Rk7f`UrHag4rZ8+#RP_c99@3WB%ygVsy| znx9CYn2Y^CDd z<_WZ5=zP%lyQ2i8ZeSRycWML>ytp%T>WtwVw5M+TL@B+&6qWEVP8M-tvAI`t7iR$E zyl+1x#%1`;&rr^jqMM~XbQJn!c;s9>0PvUj+}Sz%|eAf z(2jIk?c^L=B8fa?B6c3DGT`6IbeWgWulb}uH*sA1=V}1@c@(_BGJWtuls4Y8cUTRD zwUoE;)D_K7_Q_-}MPKIL+WfyVA;RR>4qE0r0`J}IN7Ut+i6Zpd-XGU8e^UHgolW$a zf#eaTfn1Tq_|c={Qku-hbBhAce~YN$GOidHr|-OJx$-Ob-Ox`a*4kN_TLr9=Nk&Sq ze_Jb%d Date: Fri, 15 Sep 2023 09:42:07 -0700 Subject: [PATCH 64/66] pin jf version --- Cargo.lock | 18 +++++++++--------- Cargo.toml | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 567c6bc4b9..e577bc0d70 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1097,9 +1097,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byte-slice-cast" @@ -1194,9 +1194,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.30" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", @@ -3325,7 +3325,7 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jf-primitives" version = "0.4.0-pre.0" -source = "git+https://github.com/EspressoSystems/jellyfish#2fc42af31c955088f7ff4775cbd405a2f42c9322" +source = "git+https://github.com/EspressoSystems/jellyfish?rev=2fc42af#2fc42af31c955088f7ff4775cbd405a2f42c9322" dependencies = [ "anyhow", "ark-bls12-377", @@ -3370,7 +3370,7 @@ dependencies = [ [[package]] name = "jf-relation" version = "0.4.0-pre.0" -source = "git+https://github.com/EspressoSystems/jellyfish#2fc42af31c955088f7ff4775cbd405a2f42c9322" +source = "git+https://github.com/EspressoSystems/jellyfish?rev=2fc42af#2fc42af31c955088f7ff4775cbd405a2f42c9322" dependencies = [ "ark-bls12-377", "ark-bls12-381", @@ -3396,7 +3396,7 @@ dependencies = [ [[package]] name = "jf-utils" version = "0.4.0-pre.0" -source = "git+https://github.com/EspressoSystems/jellyfish#2fc42af31c955088f7ff4775cbd405a2f42c9322" +source = "git+https://github.com/EspressoSystems/jellyfish?rev=2fc42af#2fc42af31c955088f7ff4775cbd405a2f42c9322" dependencies = [ "ark-ec", "ark-ff", @@ -7152,9 +7152,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" diff --git a/Cargo.toml b/Cargo.toml index 0a60ccebf7..e83b00d2ed 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,9 +52,9 @@ either = { version = "1.8" } espresso-systems-common = { git = "https://github.com/espressosystems/espresso-systems-common", tag = "0.4.1" } ethereum-types = { version = "0.14.1", features = ["impl-serde"] } futures = "0.3.28" -jf-primitives = { git = "https://github.com/EspressoSystems/jellyfish" } -jf-relation = { git = "https://github.com/EspressoSystems/jellyfish" } -jf-utils = { git = "https://github.com/espressosystems/jellyfish" } +jf-primitives = { git = "https://github.com/EspressoSystems/jellyfish", rev = "2fc42af" } +jf-relation = { git = "https://github.com/EspressoSystems/jellyfish", rev = "2fc42af" } +jf-utils = { git = "https://github.com/espressosystems/jellyfish", rev = "2fc42af" } libp2p-identity = "0.2" libp2p-networking = { path = "./crates/libp2p-networking", version = "0.1.0", default-features = false } libp2p-swarm-derive = { version = "=0.33.0" } From 90ac8045e7c0501cee81edd96c57dba39cdbce95 Mon Sep 17 00:00:00 2001 From: Sishan Long Date: Fri, 15 Sep 2023 09:42:07 -0700 Subject: [PATCH 65/66] pin jf version --- Cargo.lock | 18 +++++++++--------- Cargo.toml | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 567c6bc4b9..e577bc0d70 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1097,9 +1097,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byte-slice-cast" @@ -1194,9 +1194,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.30" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", @@ -3325,7 +3325,7 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jf-primitives" version = "0.4.0-pre.0" -source = "git+https://github.com/EspressoSystems/jellyfish#2fc42af31c955088f7ff4775cbd405a2f42c9322" +source = "git+https://github.com/EspressoSystems/jellyfish?rev=2fc42af#2fc42af31c955088f7ff4775cbd405a2f42c9322" dependencies = [ "anyhow", "ark-bls12-377", @@ -3370,7 +3370,7 @@ dependencies = [ [[package]] name = "jf-relation" version = "0.4.0-pre.0" -source = "git+https://github.com/EspressoSystems/jellyfish#2fc42af31c955088f7ff4775cbd405a2f42c9322" +source = "git+https://github.com/EspressoSystems/jellyfish?rev=2fc42af#2fc42af31c955088f7ff4775cbd405a2f42c9322" dependencies = [ "ark-bls12-377", "ark-bls12-381", @@ -3396,7 +3396,7 @@ dependencies = [ [[package]] name = "jf-utils" version = "0.4.0-pre.0" -source = "git+https://github.com/EspressoSystems/jellyfish#2fc42af31c955088f7ff4775cbd405a2f42c9322" +source = "git+https://github.com/EspressoSystems/jellyfish?rev=2fc42af#2fc42af31c955088f7ff4775cbd405a2f42c9322" dependencies = [ "ark-ec", "ark-ff", @@ -7152,9 +7152,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" diff --git a/Cargo.toml b/Cargo.toml index 0a60ccebf7..e83b00d2ed 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,9 +52,9 @@ either = { version = "1.8" } espresso-systems-common = { git = "https://github.com/espressosystems/espresso-systems-common", tag = "0.4.1" } ethereum-types = { version = "0.14.1", features = ["impl-serde"] } futures = "0.3.28" -jf-primitives = { git = "https://github.com/EspressoSystems/jellyfish" } -jf-relation = { git = "https://github.com/EspressoSystems/jellyfish" } -jf-utils = { git = "https://github.com/espressosystems/jellyfish" } +jf-primitives = { git = "https://github.com/EspressoSystems/jellyfish", rev = "2fc42af" } +jf-relation = { git = "https://github.com/EspressoSystems/jellyfish", rev = "2fc42af" } +jf-utils = { git = "https://github.com/espressosystems/jellyfish", rev = "2fc42af" } libp2p-identity = "0.2" libp2p-networking = { path = "./crates/libp2p-networking", version = "0.1.0", default-features = false } libp2p-swarm-derive = { version = "=0.33.0" } From c373cc76327cb991c52d673810b809f0b40a3847 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 17 Sep 2023 00:18:31 +0000 Subject: [PATCH 66/66] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'fenix': 'github:nix-community/fenix/94a5b9a4f8df7b2fa328044b8908b892a2733f60' (2023-09-09) → 'github:nix-community/fenix/95d6c30ecac01307772ec4273c649dab40211a9e' (2023-09-16) • Updated input 'fenix/rust-analyzer-src': 'github:rust-lang/rust-analyzer/c405509f2e61cadaa8b18f340582e5c362356f2d' (2023-09-08) → 'github:rust-lang/rust-analyzer/12e28c35758051dd6bc9cdf419a50dff80fab64d' (2023-09-14) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/b200e0df08f80c32974a6108ce431d8a8a5e6547' (2023-09-07) → 'github:NixOS/nixpkgs/46688f8eb5cd6f1298d873d4d2b9cf245e09e88e' (2023-09-15) • Updated input 'utils': 'github:numtide/flake-utils/f9e7cf818399d17d347f847525c5a5a8032e4e44' (2023-08-23) → 'github:numtide/flake-utils/ff7b65b44d01cf9ba6a71320833626af21126384' (2023-09-12) --- flake.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/flake.lock b/flake.lock index 7b811ec412..ef4fb0daac 100644 --- a/flake.lock +++ b/flake.lock @@ -41,11 +41,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1694240353, - "narHash": "sha256-UUtR7ff9iZMWhZHDoXSQGWjdmCGPMusTYw/94pARFT8=", + "lastModified": 1694845188, + "narHash": "sha256-M3Q1PDYcTOcqPRKkvRW+0sOm7dFGW95zK+wFmJYyw2M=", "owner": "nix-community", "repo": "fenix", - "rev": "94a5b9a4f8df7b2fa328044b8908b892a2733f60", + "rev": "95d6c30ecac01307772ec4273c649dab40211a9e", "type": "github" }, "original": { @@ -72,11 +72,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1694062546, - "narHash": "sha256-PiGI4f2BGnZcedP6slLjCLGLRLXPa9+ogGGgVPfGxys=", + "lastModified": 1694760568, + "narHash": "sha256-3G07BiXrp2YQKxdcdms22MUx6spc6A++MSePtatCYuI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b200e0df08f80c32974a6108ce431d8a8a5e6547", + "rev": "46688f8eb5cd6f1298d873d4d2b9cf245e09e88e", "type": "github" }, "original": { @@ -99,11 +99,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1694196865, - "narHash": "sha256-OmL94alcXqzYlJuqWRlhpV0lvkO6HziuyPbtmM5C0ps=", + "lastModified": 1694682672, + "narHash": "sha256-AReT7Eis+iRs7ve6L1CeW/obR/QHi2xZpf7m8NX00hU=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "c405509f2e61cadaa8b18f340582e5c362356f2d", + "rev": "12e28c35758051dd6bc9cdf419a50dff80fab64d", "type": "github" }, "original": { @@ -133,11 +133,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1692799911, - "narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=", + "lastModified": 1694529238, + "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", "owner": "numtide", "repo": "flake-utils", - "rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44", + "rev": "ff7b65b44d01cf9ba6a71320833626af21126384", "type": "github" }, "original": {