diff --git a/Cargo.lock b/Cargo.lock index accf24516..6196785db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3952,7 +3952,7 @@ dependencies = [ [[package]] name = "hotshot" version = "0.5.43" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.54#af6e40d6157e335a7ed71c956ef37d8e820635c5" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.55#81842b54a699a255645ac195354a0feb08fdc9d6" dependencies = [ "anyhow", "async-broadcast", @@ -3997,7 +3997,7 @@ dependencies = [ [[package]] name = "hotshot-builder-api" version = "0.1.7" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.54#af6e40d6157e335a7ed71c956ef37d8e820635c5" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.55#81842b54a699a255645ac195354a0feb08fdc9d6" dependencies = [ "async-trait", "clap", @@ -4016,7 +4016,7 @@ dependencies = [ [[package]] name = "hotshot-builder-core" version = "0.1.21" -source = "git+https://github.com/EspressoSystems/hotshot-builder-core?tag=0.1.21#ebbf1c887ea80217b492853c573506bf6972fd3a" +source = "git+https://github.com/EspressoSystems/hotshot-builder-core?tag=0.1.22#4dc6959aadfdf876a622ff5d3686715b20ba4065" dependencies = [ "anyhow", "async-broadcast", @@ -4068,7 +4068,7 @@ dependencies = [ [[package]] name = "hotshot-events-service" version = "0.1.22" -source = "git+https://github.com/EspressoSystems/hotshot-events-service.git?tag=0.1.22#0986778c44d729b94b88b3e80db58d82de7dae9e" +source = "git+https://github.com/EspressoSystems/hotshot-events-service.git?tag=0.1.23#7049c81d8e697894803ea76e7128d0aca7fa47c9" dependencies = [ "async-broadcast", "async-compatibility-layer", @@ -4093,7 +4093,7 @@ dependencies = [ [[package]] name = "hotshot-example-types" version = "0.5.43" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.54#af6e40d6157e335a7ed71c956ef37d8e820635c5" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.55#81842b54a699a255645ac195354a0feb08fdc9d6" dependencies = [ "anyhow", "async-broadcast", @@ -4118,12 +4118,13 @@ dependencies = [ "time 0.3.36", "tokio", "tracing", + "vbs", ] [[package]] name = "hotshot-macros" version = "0.5.43" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.54#af6e40d6157e335a7ed71c956ef37d8e820635c5" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.55#81842b54a699a255645ac195354a0feb08fdc9d6" dependencies = [ "derive_builder", "proc-macro2", @@ -4134,7 +4135,7 @@ dependencies = [ [[package]] name = "hotshot-orchestrator" version = "0.5.43" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.54#af6e40d6157e335a7ed71c956ef37d8e820635c5" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.55#81842b54a699a255645ac195354a0feb08fdc9d6" dependencies = [ "anyhow", "async-compatibility-layer", @@ -4163,7 +4164,7 @@ dependencies = [ [[package]] name = "hotshot-query-service" version = "0.1.23" -source = "git+https://github.com/EspressoSystems/hotshot-query-service?tag=0.1.24#d81e21183efcc83273595ea21a2ac37831d7bd8a" +source = "git+https://github.com/EspressoSystems/hotshot-query-service?tag=0.1.25#337df31f577acdc5ecf9e628d1bfa1644b8ce6aa" dependencies = [ "anyhow", "ark-serialize", @@ -4216,7 +4217,7 @@ dependencies = [ [[package]] name = "hotshot-stake-table" version = "0.5.43" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.54#af6e40d6157e335a7ed71c956ef37d8e820635c5" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.55#81842b54a699a255645ac195354a0feb08fdc9d6" dependencies = [ "ark-bn254", "ark-ed-on-bn254", @@ -4287,7 +4288,7 @@ dependencies = [ [[package]] name = "hotshot-task" version = "0.5.43" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.54#af6e40d6157e335a7ed71c956ef37d8e820635c5" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.55#81842b54a699a255645ac195354a0feb08fdc9d6" dependencies = [ "async-broadcast", "async-compatibility-layer", @@ -4300,7 +4301,7 @@ dependencies = [ [[package]] name = "hotshot-task-impls" version = "0.5.43" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.54#af6e40d6157e335a7ed71c956ef37d8e820635c5" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.55#81842b54a699a255645ac195354a0feb08fdc9d6" dependencies = [ "anyhow", "async-broadcast", @@ -4335,7 +4336,7 @@ dependencies = [ [[package]] name = "hotshot-testing" version = "0.5.43" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.54#af6e40d6157e335a7ed71c956ef37d8e820635c5" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.55#81842b54a699a255645ac195354a0feb08fdc9d6" dependencies = [ "async-broadcast", "async-compatibility-layer", @@ -4375,7 +4376,7 @@ dependencies = [ [[package]] name = "hotshot-types" version = "0.1.11" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.54#af6e40d6157e335a7ed71c956ef37d8e820635c5" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.55#81842b54a699a255645ac195354a0feb08fdc9d6" dependencies = [ "anyhow", "ark-bls12-381", @@ -5638,7 +5639,7 @@ dependencies = [ [[package]] name = "libp2p-networking" version = "0.5.43" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.54#af6e40d6157e335a7ed71c956ef37d8e820635c5" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.55#81842b54a699a255645ac195354a0feb08fdc9d6" dependencies = [ "anyhow", "async-compatibility-layer", @@ -7386,7 +7387,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.12.1", "proc-macro2", "quote", "syn 2.0.60", diff --git a/Cargo.toml b/Cargo.toml index 18a161d71..5f6a133c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,18 +46,18 @@ dotenvy = "0.15" ethers = { version = "2.0", features = ["solc"] } futures = "0.3" -hotshot = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.54" } +hotshot = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.55" } # Hotshot imports -hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", tag = "0.5.54" } -hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", tag = "0.1.21" } -hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", tag = "0.1.22" } -hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.54" } -hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", tag = "0.1.24" } -hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.54" } +hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", tag = "0.5.55" } +hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", tag = "0.1.22" } +hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", tag = "0.1.23" } +hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.55" } +hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", tag = "0.1.25" } +hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.55" } hotshot-state-prover = { version = "0.1.0", path = "hotshot-state-prover" } -hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.54" } -hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.54" } -hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.54" } +hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.55" } +hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.55" } +hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.55" } # Push CDN imports cdn-broker = { git = "https://github.com/EspressoSystems/Push-CDN", features = [ diff --git a/builder/src/lib.rs b/builder/src/lib.rs index 980653d93..6263e4e73 100644 --- a/builder/src/lib.rs +++ b/builder/src/lib.rs @@ -195,7 +195,7 @@ pub mod testing { // Only pass the pub keys to the hotshot config let known_nodes_without_stake_pub_keys = known_nodes_without_stake .iter() - .map(|x| ::get_public_key(&x.stake_table_entry)) + .map(|x| ::public_key(&x.stake_table_entry)) .collect::>(); let master_map = MasterMap::new(); @@ -261,7 +261,7 @@ pub mod testing { .iter() .zip(&state_key_pairs) .map(|(pub_key, state_key_pair)| PeerConfig:: { - stake_table_entry: pub_key.get_stake_table_entry(stake_value), + stake_table_entry: pub_key.stake_table_entry(stake_value), state_ver_key: state_key_pair.ver_key(), }) .collect::>(); @@ -466,7 +466,7 @@ pub mod testing { // send the events to the event streaming state async_spawn({ async move { - let mut hotshot_event_stream = hotshot_context_handle.get_event_stream(); + let mut hotshot_event_stream = hotshot_context_handle.event_stream(); loop { let event = hotshot_event_stream.next().await.unwrap(); tracing::debug!("Before writing in event streamer: {event:?}"); @@ -494,12 +494,12 @@ pub mod testing { if let Decide { leaf_chain, .. } = event.event { if let Some(height) = leaf_chain.iter().find_map(|LeafInfo { leaf, .. }| { if leaf - .get_block_payload() + .block_payload() .as_ref()? - .transaction_commitments(leaf.get_block_header().metadata()) + .transaction_commitments(leaf.block_header().metadata()) .contains(&commitment) { - Some(leaf.get_block_header().block_number()) + Some(leaf.block_header().block_number()) } else { None } @@ -664,7 +664,7 @@ mod test { use hotshot_builder_core::service::GlobalState; use hotshot_types::event::LeafInfo; use hotshot_types::traits::block_contents::{ - vid_commitment, BlockHeader, BlockPayload, GENESIS_VID_NUM_STORAGE_NODES, + vid_commitment, BlockHeader, BlockPayload, EncodeBytes, GENESIS_VID_NUM_STORAGE_NODES, }; use hotshot_types::utils::BuilderCommitment; use sequencer::block::payload::Payload; @@ -695,7 +695,7 @@ mod test { let total_nodes = HotShotTestConfig::total_nodes(); // try to listen on non-voting node handle as it is the last handle - let mut events = handles[total_nodes - 1].0.get_event_stream(); + let mut events = handles[total_nodes - 1].0.event_stream(); for (handle, ..) in handles.iter() { handle.hotshot.start_consensus().await; } @@ -709,9 +709,7 @@ mod test { let builder_commitment = genesis_payload.builder_commitment(&genesis_ns_table); let genesis_commitment = { // TODO we should not need to collect payload bytes just to compute vid_commitment - let payload_bytes = genesis_payload - .encode() - .expect("unable to encode genesis payload"); + let payload_bytes = genesis_payload.encode(); vid_commitment(&payload_bytes, GENESIS_VID_NUM_STORAGE_NODES) }; Header::genesis( @@ -733,7 +731,7 @@ mod test { // Check that each successive header satisfies invariants relative to its parent: all // the fields which should be monotonic are. for LeafInfo { leaf, .. } in leaf_chain.iter().rev() { - let header = leaf.get_block_header().clone(); + let header = leaf.block_header().clone(); if header.height == 0 { parent = header; continue; diff --git a/builder/src/non_permissioned.rs b/builder/src/non_permissioned.rs index 391840511..683d2eff8 100644 --- a/builder/src/non_permissioned.rs +++ b/builder/src/non_permissioned.rs @@ -30,6 +30,7 @@ use hotshot_types::{ traits::{ block_contents::{vid_commitment, GENESIS_VID_NUM_STORAGE_NODES}, node_implementation::{ConsensusTime, NodeType}, + EncodeBytes, }, utils::BuilderCommitment, }; @@ -119,9 +120,7 @@ impl BuilderConfig { let builder_commitment = genesis_payload.builder_commitment(&genesis_ns_table); let vid_commitment = { - let payload_bytes = genesis_payload - .encode() - .expect("unable to encode genesis payload"); + let payload_bytes = genesis_payload.encode(); vid_commitment(&payload_bytes, GENESIS_VID_NUM_STORAGE_NODES) }; diff --git a/builder/src/permissioned.rs b/builder/src/permissioned.rs index c36793e37..393a790de 100644 --- a/builder/src/permissioned.rs +++ b/builder/src/permissioned.rs @@ -28,7 +28,7 @@ use hotshot_types::{ event::Event, light_client::StateKeyPair, signature_key::{BLSPrivKey, BLSPubKey}, - traits::{election::Membership, metrics::Metrics}, + traits::{election::Membership, metrics::Metrics, EncodeBytes}, utils::BuilderCommitment, HotShotConfig, PeerConfig, ValidatorConfig, }; @@ -407,9 +407,7 @@ impl) -> Self { Self { state_signer: ctx.state_signer(), - event_streamer: ctx.get_event_streamer(), + event_streamer: ctx.event_streamer(), node_state: ctx.node_state(), handle: ctx.consensus().clone(), } @@ -97,7 +97,7 @@ impl impl Stream> + Unpin { let state = self.clone(); - async move { state.consensus().await.get_event_stream() } + async move { state.consensus().await.event_stream() } .boxed() .flatten_stream() } @@ -209,14 +209,9 @@ impl anyhow::Result { - let state = self - .consensus() - .await - .get_state(view) - .await - .context(format!( - "state not available for height {height}, view {view:?}" - ))?; + let state = self.consensus().await.state(view).await.context(format!( + "state not available for height {height}, view {view:?}" + ))?; let (proof, balance) = FeeAccountProof::prove(&state.fee_merkle_tree, account).context( format!("account {account} not available for height {height}, view {view:?}"), )?; @@ -225,14 +220,9 @@ impl anyhow::Result { - let state = self - .consensus() - .await - .get_state(view) - .await - .context(format!( - "state not available for height {height}, view {view:?}" - ))?; + let state = self.consensus().await.state(view).await.context(format!( + "state not available for height {height}, view {view:?}" + ))?; let tree = &state.block_merkle_tree; let frontier = tree.lookup(tree.num_leaves() - 1).expect_ok()?.1; Ok(frontier) @@ -357,7 +347,7 @@ mod test_helpers { // Hook the builder up to the event stream from the first node if let Some(builder_task) = builder_task { - builder_task.start(Box::new(handle_0.get_event_stream())); + builder_task.start(Box::new(handle_0.event_stream())); } for ctx in &nodes { @@ -455,7 +445,7 @@ mod test_helpers { let options = opt(Options::from(options::Http { port }).submit(Default::default())); let network = TestNetwork::new(options, [no_storage::Options; TestConfig::NUM_NODES]).await; - let mut events = network.server.get_event_stream(); + let mut events = network.server.event_stream(); client.connect(None).await; @@ -489,12 +479,7 @@ mod test_helpers { // Wait for block >=2 appears // It's waiting for an extra second to make sure that the signature is generated loop { - height = network - .server - .consensus() - .get_decided_leaf() - .await - .get_height(); + height = network.server.consensus().decided_leaf().await.height(); sleep(std::time::Duration::from_secs(1)).await; if height >= 2 { break; @@ -529,7 +514,7 @@ mod test_helpers { client.connect(None).await; // Wait for a few blocks to be decided. - let mut events = network.server.get_event_stream(); + let mut events = network.server.event_stream(); loop { if let Event { event: EventType::Decide { leaf_chain, .. }, @@ -538,7 +523,7 @@ mod test_helpers { { if leaf_chain .iter() - .any(|LeafInfo { leaf, .. }| leaf.get_block_header().height > 2) + .any(|LeafInfo { leaf, .. }| leaf.block_header().height > 2) { break; } @@ -549,13 +534,13 @@ mod test_helpers { network.server.consensus_mut().shut_down().await; // Undecided fee state: absent account. - let leaf = network.server.consensus().get_decided_leaf().await; - let height = leaf.get_height() + 1; - let view = leaf.get_view_number() + 1; + let leaf = network.server.consensus().decided_leaf().await; + let height = leaf.height() + 1; + let view = leaf.view_number() + 1; let res = client .get::(&format!( "catchup/{height}/{}/account/{:x}", - view.get_u64(), + view.u64(), Address::default() )) .send() @@ -568,7 +553,7 @@ mod test_helpers { &network .server .consensus() - .get_state(view) + .state(view) .await .unwrap() .fee_merkle_tree @@ -580,14 +565,14 @@ mod test_helpers { // Undecided block state. let res = client - .get::(&format!("catchup/{height}/{}/blocks", view.get_u64())) + .get::(&format!("catchup/{height}/{}/blocks", view.u64())) .send() .await .unwrap(); let root = &network .server .consensus() - .get_state(view) + .state(view) .await .unwrap() .block_merkle_tree @@ -659,7 +644,7 @@ mod api_tests { [no_storage::Options; TestConfig::NUM_NODES], ) .await; - let mut events = network.server.get_event_stream(); + let mut events = network.server.event_stream(); // Connect client. let client: Client = @@ -948,13 +933,13 @@ mod test { .await; // Wait for replica 0 to reach a (non-genesis) decide, before disconnecting it. - let mut events = network.peers[0].get_event_stream(); + let mut events = network.peers[0].event_stream(); loop { let event = events.next().await.unwrap(); let EventType::Decide { leaf_chain, .. } = event.event else { continue; }; - if leaf_chain[0].leaf.get_height() > 0 { + if leaf_chain[0].leaf.height() > 0 { break; } } @@ -969,7 +954,7 @@ mod test { // Wait for a few blocks to pass while the node is down, so it falls behind. network .server - .get_event_stream() + .event_stream() .filter(|event| future::ready(matches!(event.event, EventType::Decide { .. }))) .take(3) .collect::>() @@ -990,7 +975,7 @@ mod test { SEQUENCER_VERSION, ) .await; - let mut events = node.get_event_stream(); + let mut events = node.event_stream(); // Wait for a (non-genesis) block proposed by each node, to prove that the lagging node has // caught up and all nodes are in sync. @@ -1001,9 +986,8 @@ mod test { continue; }; for LeafInfo { leaf, .. } in leaf_chain.iter().rev() { - let height = leaf.get_height(); - let leaf_builder = - (leaf.get_view_number().get_u64() as usize) % TestConfig::NUM_NODES; + let height = leaf.height(); + let leaf_builder = (leaf.view_number().u64() as usize) % TestConfig::NUM_NODES; if height == 0 { continue; } @@ -1083,10 +1067,10 @@ mod test { .try_collect() .await .unwrap(); - let decided_view = chain.last().unwrap().leaf().get_view_number(); + let decided_view = chain.last().unwrap().leaf().view_number(); // Get the most recent state, for catchup. - let state = network.server.consensus().get_decided_state().await; + let state = network.server.consensus().decided_state().await; tracing::info!(?decided_view, ?state, "consensus state"); // Fully shut down the API servers. @@ -1133,7 +1117,7 @@ mod test { .unwrap(); assert_eq!(new_leaf.height(), height as u64); assert_eq!( - new_leaf.leaf().get_parent_commitment(), + new_leaf.leaf().parent_commitment(), chain[height - 1].hash() ); diff --git a/sequencer/src/block.rs b/sequencer/src/block.rs index 06000d406..126c1c3b7 100644 --- a/sequencer/src/block.rs +++ b/sequencer/src/block.rs @@ -1,7 +1,7 @@ use crate::{BlockBuildingSnafu, NodeState, Transaction}; use committable::{Commitment, Committable}; use hotshot_query_service::availability::QueryablePayload; -use hotshot_types::traits::BlockPayload; +use hotshot_types::traits::{BlockPayload, EncodeBytes}; use hotshot_types::utils::BuilderCommitment; use serde::{Deserialize, Serialize}; use sha2::Digest; @@ -19,7 +19,11 @@ use payload::Payload; use tables::NameSpaceTable; pub type NsTable = NameSpaceTable; - +impl EncodeBytes for Payload { + fn encode(&self) -> Arc<[u8]> { + Arc::from(self.raw_payload.clone()) + } +} impl BlockPayload for Payload { type Error = crate::Error; type Transaction = Transaction; @@ -72,10 +76,6 @@ impl BlockPayload for Payload { Self::from_transactions([], &NodeState::mock()).unwrap() } - fn encode(&self) -> Result, Self::Error> { - Ok(Arc::from(self.raw_payload.clone())) - } - fn transaction_commitments(&self, meta: &Self::Metadata) -> Vec> { self.enumerate(meta).map(|(_, tx)| tx.commit()).collect() } @@ -92,7 +92,7 @@ impl BlockPayload for Payload { BuilderCommitment::from_raw_digest(digest.finalize()) } - fn get_transactions<'a>( + fn transactions<'a>( &'a self, metadata: &'a Self::Metadata, ) -> impl 'a + Iterator { diff --git a/sequencer/src/catchup.rs b/sequencer/src/catchup.rs index 29b53957b..a31028980 100644 --- a/sequencer/src/catchup.rs +++ b/sequencer/src/catchup.rs @@ -158,7 +158,7 @@ impl StateCatchup for StatePeers { match client .get::(&format!( "catchup/{height}/{}/account/{account}", - view.get_u64(), + view.u64(), )) .send() .await @@ -185,7 +185,7 @@ impl StateCatchup for StatePeers { for client in self.clients.iter() { tracing::info!("Fetching frontier from {}", client.url); match client - .get::(&format!("catchup/{height}/{}/blocks", view.get_u64())) + .get::(&format!("catchup/{height}/{}/blocks", view.u64())) .send() .await { diff --git a/sequencer/src/context.rs b/sequencer/src/context.rs index c37aa8b70..f2f1ecf2c 100644 --- a/sequencer/src/context.rs +++ b/sequencer/src/context.rs @@ -154,7 +154,7 @@ impl>>, node_state: NodeState, ) -> Self { - let events = handle.get_event_stream(); + let events = handle.event_stream(); let mut ctx = Self { handle, @@ -196,8 +196,8 @@ impl impl Stream> { - self.handle.get_event_stream() + pub fn event_stream(&self) -> impl Stream> { + self.handle.event_stream() } pub async fn submit_transaction(&self, tx: Transaction) -> anyhow::Result<()> { @@ -206,7 +206,7 @@ impl Arc>> { + pub fn event_streamer(&self) -> Arc>> { self.events_streamer.clone() } diff --git a/sequencer/src/header.rs b/sequencer/src/header.rs index 76676e8e8..cba542336 100644 --- a/sequencer/src/header.rs +++ b/sequencer/src/header.rs @@ -24,6 +24,7 @@ use jf_merkle_tree::prelude::*; use serde::{Deserialize, Serialize}; use snafu::Snafu; use time::OffsetDateTime; +use vbs::version::Version; /// A header is like a [`Block`] with the body replaced by a digest. #[derive(Clone, Debug, Deserialize, Serialize, Hash, PartialEq, Eq)] @@ -157,7 +158,7 @@ impl Header { chain_config: ChainConfig, ) -> anyhow::Result { // Increment height. - let parent_header = parent_leaf.get_block_header(); + let parent_header = parent_leaf.block_header(); let height = parent_header.height + 1; // Ensure the timestamp does not decrease. We can trust `parent.timestamp` because `parent` @@ -271,8 +272,8 @@ impl BlockHeader for Header { skip_all, fields( node_id = instance_state.node_id, - view = ?parent_leaf.get_view_number(), - height = parent_leaf.get_block_header().height, + view = ?parent_leaf.view_number(), + height = parent_leaf.block_header().height, ), )] @@ -285,10 +286,11 @@ impl BlockHeader for Header { metadata: <::BlockPayload as BlockPayload>::Metadata, builder_fee: BuilderFee, _vid_common: VidCommon, + _version: Version, ) -> Result { let chain_config = instance_state.chain_config; - let height = parent_leaf.get_height(); - let view = parent_leaf.get_view_number(); + let height = parent_leaf.height(); + let view = parent_leaf.view_number(); let mut validated_state = parent_state.clone(); @@ -303,7 +305,7 @@ impl BlockHeader for Header { .get_finalized_deposits( addr, parent_leaf - .get_block_header() + .block_header() .l1_finalized .map(|block_info| block_info.number), block_info.number, @@ -525,7 +527,7 @@ mod test_headers { parent.l1_finalized = self.parent_l1_finalized; let mut parent_leaf = genesis.leaf.clone(); - *parent_leaf.get_block_header_mut() = parent.clone(); + *parent_leaf.block_header_mut() = parent.clone(); let block_merkle_tree = BlockMerkleTree::from_elems(Some(32), Vec::>::new()).unwrap(); @@ -749,8 +751,8 @@ mod test_headers { let instance_state = NodeState::mock(); let validated_state = ValidatedState::genesis(&instance_state).0; let leaf = Leaf::genesis(&instance_state); - let header = leaf.get_block_header().clone(); - let ns_table = leaf.get_block_payload().unwrap().get_ns_table().clone(); + let header = leaf.block_header().clone(); + let ns_table = leaf.block_payload().unwrap().get_ns_table().clone(); Self { instance_state, validated_state, @@ -771,7 +773,7 @@ mod test_headers { let mut parent_header = genesis.header.clone(); let mut parent_leaf = genesis.leaf.clone(); - *parent_leaf.get_block_header_mut() = parent_header.clone(); + *parent_leaf.block_header_mut() = parent_header.clone(); // Populate the tree with an initial `push`. block_merkle_tree.push(genesis.header.commit()).unwrap(); @@ -871,12 +873,12 @@ mod test_headers { parent_header.fee_merkle_tree_root = fee_merkle_tree_root; let mut parent_leaf = genesis.leaf.clone(); - *parent_leaf.get_block_header_mut() = parent_header.clone(); + *parent_leaf.block_header_mut() = parent_header.clone(); // Forget the state to trigger lookups in Header::new let forgotten_state = parent_state.forget(); genesis_state.peers = Arc::new(MockStateCatchup::from_iter([( - parent_leaf.get_view_number(), + parent_leaf.view_number(), Arc::new(parent_state.clone()), )])); // Get a proposal from a parent @@ -904,6 +906,7 @@ mod test_headers { ns_table, builder_fee, vid_common.clone(), + hotshot_types::constants::BASE_VERSION, ) .await .unwrap(); diff --git a/sequencer/src/hotshot_commitment.rs b/sequencer/src/hotshot_commitment.rs index fe79f2ec1..ad205ad64 100644 --- a/sequencer/src/hotshot_commitment.rs +++ b/sequencer/src/hotshot_commitment.rs @@ -330,7 +330,7 @@ mod test { fn mock_leaf(height: u64, node_state: &NodeState) -> LeafQueryData { let mut leaf = Leaf::genesis(node_state); let mut qc = QuorumCertificate::genesis(node_state); - leaf.get_block_header_mut().height = height; + leaf.block_header_mut().height = height; qc.data.leaf_commit = leaf.commit(); LeafQueryData::new(leaf, qc).unwrap() } diff --git a/sequencer/src/lib.rs b/sequencer/src/lib.rs index dd947ef76..e6d09bd62 100644 --- a/sequencer/src/lib.rs +++ b/sequencer/src/lib.rs @@ -566,7 +566,7 @@ pub mod testing { .iter() .zip(&state_key_pairs) .map(|(pub_key, state_key_pair)| PeerConfig:: { - stake_table_entry: pub_key.get_stake_table_entry(1), + stake_table_entry: pub_key.stake_table_entry(1), state_ver_key: state_key_pair.ver_key(), }) .collect::>(); @@ -733,12 +733,12 @@ pub mod testing { if let Decide { leaf_chain, .. } = event.event { if let Some(height) = leaf_chain.iter().find_map(|LeafInfo { leaf, .. }| { if leaf - .get_block_payload() + .block_payload() .as_ref()? - .transaction_commitments(leaf.get_block_header().metadata()) + .transaction_commitments(leaf.block_header().metadata()) .contains(&commitment) { - Some(leaf.get_block_header().block_number()) + Some(leaf.block_header().block_number()) } else { None } @@ -766,7 +766,7 @@ mod test { use hotshot_types::{ event::LeafInfo, traits::block_contents::{ - vid_commitment, BlockHeader, BlockPayload, GENESIS_VID_NUM_STORAGE_NODES, + vid_commitment, BlockHeader, BlockPayload, EncodeBytes, GENESIS_VID_NUM_STORAGE_NODES, }, }; use testing::{wait_for_decide_on_handle, TestConfig}; @@ -789,10 +789,10 @@ mod test { // Hook the builder up to the event stream from the first node if let Some(builder_task) = builder_task { - builder_task.start(Box::new(handle_0.get_event_stream())); + builder_task.start(Box::new(handle_0.event_stream())); } - let mut events = handle_0.get_event_stream(); + let mut events = handle_0.event_stream(); for handle in handles.iter() { handle.start_consensus().await; @@ -826,11 +826,11 @@ mod test { let handle_0 = &handles[0]; - let mut events = handle_0.get_event_stream(); + let mut events = handle_0.event_stream(); // Hook the builder up to the event stream from the first node if let Some(builder_task) = builder_task { - builder_task.start(Box::new(handle_0.get_event_stream())); + builder_task.start(Box::new(handle_0.event_stream())); } for handle in handles.iter() { @@ -843,9 +843,7 @@ mod test { Payload::from_transactions([], &NodeState::mock()).unwrap(); let genesis_commitment = { // TODO we should not need to collect payload bytes just to compute vid_commitment - let payload_bytes = genesis_payload - .encode() - .expect("unable to encode genesis payload"); + let payload_bytes = genesis_payload.encode(); vid_commitment(&payload_bytes, GENESIS_VID_NUM_STORAGE_NODES) }; let genesis_state = NodeState::mock(); @@ -868,7 +866,7 @@ mod test { // Check that each successive header satisfies invariants relative to its parent: all // the fields which should be monotonic are. for LeafInfo { leaf, .. } in leaf_chain.iter().rev() { - let header = leaf.get_block_header().clone(); + let header = leaf.block_header().clone(); if header.height == 0 { parent = header; continue; diff --git a/sequencer/src/persistence.rs b/sequencer/src/persistence.rs index ab9f8d13d..b545e1a75 100644 --- a/sequencer/src/persistence.rs +++ b/sequencer/src/persistence.rs @@ -126,10 +126,10 @@ pub trait SequencerPersistence: Sized + Send + Sync + 'static { Some((leaf, high_qc)) => { tracing::info!(?leaf, ?high_qc, "starting from saved leaf"); ensure!( - leaf.get_view_number() == high_qc.view_number, + leaf.view_number() == high_qc.view_number, format!( "loaded anchor leaf from view {:?}, but high QC is from view {:?}", - leaf.get_view_number(), + leaf.view_number(), high_qc.view_number ) ); @@ -140,7 +140,7 @@ pub trait SequencerPersistence: Sized + Send + Sync + 'static { (Leaf::genesis(&state), QuorumCertificate::genesis(&state)) } }; - let validated_state = if leaf.get_block_header().height == 0 { + let validated_state = if leaf.block_header().height == 0 { // If we are starting from genesis, we can provide the full state. Some(Arc::new(ValidatedState::genesis(&state).0)) } else { @@ -153,7 +153,7 @@ pub trait SequencerPersistence: Sized + Send + Sync + 'static { // between `highest_voted_view` and `leaf.view_number`. This prevents double votes from // starting in a view in which we had already voted before the restart, and prevents // unnecessary catchup from starting in a view earlier than the anchor leaf. - let mut view = max(highest_voted_view, leaf.get_view_number()); + let mut view = max(highest_voted_view, leaf.view_number()); if view != ViewNumber::genesis() { view += 1; } @@ -188,9 +188,9 @@ pub trait SequencerPersistence: Sized + Send + Sync + 'static { async fn handle_event(&mut self, event: &Event) { if let EventType::Decide { leaf_chain, qc, .. } = &event.event { if let Some(LeafInfo { leaf, .. }) = leaf_chain.first() { - if qc.view_number != leaf.get_view_number() { + if qc.view_number != leaf.view_number() { tracing::error!( - leaf_view = ?leaf.get_view_number(), + leaf_view = ?leaf.view_number(), qc_view = ?qc.view_number, "latest leaf and QC are from different views!", ); @@ -204,7 +204,7 @@ pub trait SequencerPersistence: Sized + Send + Sync + 'static { ); } - if let Err(err) = self.collect_garbage(leaf.get_view_number()).await { + if let Err(err) = self.collect_garbage(leaf.view_number()).await { tracing::error!("Failed to garbage collect. {err:#}",); } } @@ -252,8 +252,9 @@ mod persistence_tests { use crate::{NodeState, Transaction}; use async_compatibility_layer::logging::{setup_backtrace, setup_logging}; + use hotshot::types::BLSPubKey; use hotshot::types::SignatureKey; - use hotshot::{traits::BlockPayload, types::BLSPubKey}; + use hotshot_types::traits::EncodeBytes; use hotshot_types::{event::HotShotAction, vid::vid_scheme}; use jf_vid::VidScheme; use rand::{RngCore, SeedableRng}; @@ -282,7 +283,7 @@ mod persistence_tests { // Store a newer leaf, make sure storage gets updated. let mut leaf2 = leaf1.clone(); - leaf2.get_block_header_mut().height += 1; + leaf2.block_header_mut().height += 1; let mut qc2 = qc1.clone(); qc2.data.leaf_commit = leaf2.commit(); qc2.vote_commitment = qc2.data.commit(); @@ -359,8 +360,8 @@ mod persistence_tests { ); let leaf = Leaf::genesis(&NodeState::mock()); - let payload = leaf.get_block_payload().unwrap(); - let bytes = payload.encode().unwrap().to_vec(); + let payload = leaf.block_payload().unwrap(); + let bytes = payload.encode().to_vec(); let disperse = vid_scheme(2).disperse(bytes).unwrap(); let (pubkey, privkey) = BLSPubKey::generated_from_seed_indexed([0; 32], 1); let mut vid = VidDisperseShare:: { diff --git a/sequencer/src/persistence/fs.rs b/sequencer/src/persistence/fs.rs index a7887f0ad..03aa995da 100644 --- a/sequencer/src/persistence/fs.rs +++ b/sequencer/src/persistence/fs.rs @@ -163,7 +163,7 @@ impl SequencerPersistence for Persistence { } async fn collect_garbage(&mut self, view: ViewNumber) -> anyhow::Result<()> { - let view_number = view.get_u64(); + let view_number = view.u64(); let delete_files = |dir_path: PathBuf| -> anyhow::Result<()> { if !dir_path.is_dir() { @@ -220,10 +220,10 @@ impl SequencerPersistence for Persistence { let mut height_bytes = [0; 8]; file.read_exact(&mut height_bytes).context("read height")?; let height = u64::from_le_bytes(height_bytes); - if height >= leaf.get_height() { + if height >= leaf.height() { tracing::warn!( saved_height = height, - new_height = leaf.get_height(), + new_height = leaf.height(), "not writing anchor leaf because saved leaf has newer height", ); return Ok(false); @@ -235,7 +235,7 @@ impl SequencerPersistence for Persistence { }, |mut file| { // Save the new leaf. First we write the height. - file.write_all(&leaf.get_height().to_le_bytes()) + file.write_all(&leaf.height().to_le_bytes()) .context("write height")?; // Now serialize and write out the actual leaf and its corresponding QC. let bytes = bincode::serialize(&(leaf, qc)).context("serialize leaf")?; @@ -280,9 +280,7 @@ impl SequencerPersistence for Persistence { ) -> anyhow::Result>>> { let dir_path = self.da_dir_path(); - let file_path = dir_path - .join(view.get_u64().to_string()) - .with_extension("txt"); + let file_path = dir_path.join(view.u64().to_string()).with_extension("txt"); if !file_path.exists() { return Ok(None); @@ -301,9 +299,7 @@ impl SequencerPersistence for Persistence { ) -> anyhow::Result>>> { let dir_path = self.vid_dir_path(); - let file_path = dir_path - .join(view.get_u64().to_string()) - .with_extension("txt"); + let file_path = dir_path.join(view.u64().to_string()).with_extension("txt"); if !file_path.exists() { return Ok(None); @@ -319,7 +315,7 @@ impl SequencerPersistence for Persistence { &mut self, proposal: &Proposal>, ) -> anyhow::Result<()> { - let view_number = proposal.data.get_view_number().get_u64(); + let view_number = proposal.data.view_number().u64(); let dir_path = self.vid_dir_path(); fs::create_dir_all(dir_path.clone()).context("failed to create vid dir")?; @@ -344,7 +340,7 @@ impl SequencerPersistence for Persistence { &mut self, proposal: &Proposal>, ) -> anyhow::Result<()> { - let view_number = proposal.data.get_view_number().get_u64(); + let view_number = proposal.data.view_number().u64(); let dir_path = self.da_dir_path(); fs::create_dir_all(dir_path.clone()).context("failed to create da dir")?; @@ -384,7 +380,7 @@ impl SequencerPersistence for Persistence { Ok(saved_view < view) }, |mut file| { - file.write_all(&view.get_u64().to_le_bytes())?; + file.write_all(&view.u64().to_le_bytes())?; Ok(()) }, ) diff --git a/sequencer/src/persistence/sql.rs b/sequencer/src/persistence/sql.rs index 89ec8d608..c3e8b63ab 100644 --- a/sequencer/src/persistence/sql.rs +++ b/sequencer/src/persistence/sql.rs @@ -290,10 +290,10 @@ impl SequencerPersistence for Persistence { transaction(self, |mut tx| { async move { let stmt1 = "DELETE FROM vid_share where view <= $1"; - tx.execute(stmt1, [&(view.get_u64() as i64)]).await?; + tx.execute(stmt1, [&(view.u64() as i64)]).await?; let stmt2 = "DELETE FROM da_proposal where view <= $1"; - tx.execute(stmt2, [&(view.get_u64() as i64)]).await?; + tx.execute(stmt2, [&(view.u64() as i64)]).await?; Ok(()) } .boxed() @@ -325,8 +325,8 @@ impl SequencerPersistence for Persistence { ) "; - let height = leaf.get_height() as i64; - let view = qc.view_number.get_u64() as i64; + let height = leaf.height() as i64; + let view = qc.view_number.u64() as i64; let leaf_bytes = bincode::serialize(leaf)?; let qc_bytes = bincode::serialize(qc)?; @@ -408,7 +408,7 @@ impl SequencerPersistence for Persistence { .db .query_opt( "SELECT data FROM da_proposal where view = $1", - [&(view.get_u64() as i64)], + [&(view.u64() as i64)], ) .await?; @@ -428,7 +428,7 @@ impl SequencerPersistence for Persistence { .db .query_opt( "SELECT data FROM vid_share where view = $1", - [&(view.get_u64() as i64)], + [&(view.u64() as i64)], ) .await?; @@ -445,7 +445,7 @@ impl SequencerPersistence for Persistence { proposal: &Proposal>, ) -> anyhow::Result<()> { let data = &proposal.data; - let view = data.get_view_number().get_u64(); + let view = data.view_number().u64(); let data_bytes = bincode::serialize(proposal).unwrap(); transaction(self, |mut tx| { @@ -468,7 +468,7 @@ impl SequencerPersistence for Persistence { proposal: &Proposal>, ) -> anyhow::Result<()> { let data = &proposal.data; - let view = data.get_view_number().get_u64(); + let view = data.view_number().u64(); let data_bytes = bincode::serialize(proposal).unwrap(); transaction(self, |mut tx| { @@ -497,7 +497,7 @@ impl SequencerPersistence for Persistence { transaction(self, |mut tx| { async move { - tx.execute_one_with_retries(stmt, [view.get_u64() as i64]) + tx.execute_one_with_retries(stmt, [view.u64() as i64]) .await?; Ok(()) } diff --git a/sequencer/src/state.rs b/sequencer/src/state.rs index fac937ae1..378023ee9 100644 --- a/sequencer/src/state.rs +++ b/sequencer/src/state.rs @@ -47,6 +47,7 @@ use serde::{Deserialize, Serialize}; use std::sync::Arc; use std::time::Duration; use std::{collections::HashSet, ops::Add, str::FromStr}; +use vbs::version::Version; const BLOCK_MERKLE_TREE_HEIGHT: usize = 32; const FEE_MERKLE_TREE_HEIGHT: usize = 20; @@ -210,7 +211,7 @@ pub fn validate_proposal( proposal: &Header, vid_common: &VidCommon, ) -> anyhow::Result<()> { - let parent_header = parent_leaf.get_block_header(); + let parent_header = parent_leaf.block_header(); // validate `ChainConfig` anyhow::ensure!( @@ -321,10 +322,10 @@ async fn compute_state_update( ) -> anyhow::Result<(ValidatedState, Delta)> { let proposed_leaf = proposed_leaf.leaf(); let parent_leaf = parent_leaf.leaf(); - let header = proposed_leaf.get_block_header(); + let header = proposed_leaf.block_header(); // Check internal consistency. - let parent_header = parent_leaf.get_block_header(); + let parent_header = parent_leaf.block_header(); ensure!( state.block_merkle_tree.commitment() == parent_header.block_merkle_tree_root, "internal error! in-memory block tree {:?} does not match parent header {:?}", @@ -409,7 +410,7 @@ async fn store_state_update( skip_all, fields( node_id = instance.node_id, - view = ?parent_leaf.leaf().get_view_number(), + view = ?parent_leaf.leaf().view_number(), height = parent_leaf.height(), ), )] @@ -574,8 +575,8 @@ impl ValidatedState { .chain(l1_deposits.iter().map(|fee_info| fee_info.account)), ); - let parent_height = parent_leaf.get_height(); - let parent_view = parent_leaf.get_view_number(); + let parent_height = parent_leaf.height(); + let parent_view = parent_leaf.view_number(); // Ensure merkle tree has frontier if self.need_to_fetch_blocks_mt_frontier() { @@ -653,7 +654,7 @@ pub async fn get_l1_deposits( .get_finalized_deposits( addr, parent_leaf - .get_block_header() + .block_header() .l1_finalized .map(|block_info| block_info.number), block_info.number, @@ -675,7 +676,7 @@ fn apply_proposal( // pushing a block into merkle tree shouldn't fail validated_state .block_merkle_tree - .push(parent_leaf.get_block_header().commit()) + .push(parent_leaf.block_header().commit()) .unwrap(); for FeeInfo { account, amount } in l1_deposits.iter() { @@ -705,8 +706,8 @@ impl HotShotState for ValidatedState { skip_all, fields( node_id = instance.node_id, - view = ?parent_leaf.get_view_number(), - height = parent_leaf.get_height(), + view = ?parent_leaf.view_number(), + height = parent_leaf.height(), ), )] async fn validate_and_apply_header( @@ -715,6 +716,7 @@ impl HotShotState for ValidatedState { parent_leaf: &Leaf, proposed_header: &Header, vid_common: VidCommon, + _version: Version, ) -> Result<(Self, Self::Delta), Self::Error> { //validate builder fee if let Err(err) = validate_builder_fee(proposed_header) { @@ -743,7 +745,7 @@ impl HotShotState for ValidatedState { // log successful progress about once in 10 - 20 seconds, // TODO: we may want to make this configurable - if parent_leaf.get_view_number().get_u64() % 10 == 0 { + if parent_leaf.view_number().u64() % 10 == 0 { tracing::info!("validated and applied new header"); } Ok((validated_state, delta)) @@ -1295,7 +1297,7 @@ mod test { ..Default::default() }); let parent = Leaf::genesis(&instance); - let header = parent.get_block_header(); + let header = parent.block_header(); // Validation fails because the proposed block exceeds the maximum block size. let err = validate_proposal(&state, instance.chain_config, &parent, header, &vid_common) @@ -1319,7 +1321,7 @@ mod test { ..Default::default() }); let parent = Leaf::genesis(&instance); - let header = parent.get_block_header(); + let header = parent.block_header(); // Validation fails because the genesis fee (0) is too low. let err = validate_proposal(&state, instance.chain_config, &parent, header, &vid_common) diff --git a/sequencer/src/state_signature.rs b/sequencer/src/state_signature.rs index a9b43f7ac..d3f2964d3 100644 --- a/sequencer/src/state_signature.rs +++ b/sequencer/src/state_signature.rs @@ -76,10 +76,7 @@ impl StateSigner { match form_light_client_state(leaf, &self.stake_table_comm) { Ok(state) => { let signature = self.sign_new_state(&state).await; - tracing::debug!( - "New leaves decided. Latest block height: {}", - leaf.get_height(), - ); + tracing::debug!("New leaves decided. Latest block height: {}", leaf.height(),); if let Some(client) = &self.relay_server_client { let request_body = StateSignatureRequestBody { @@ -151,7 +148,7 @@ fn form_light_client_state( leaf: &Leaf, stake_table_comm: &StakeTableCommitmentType, ) -> anyhow::Result { - let header = leaf.get_block_header(); + let header = leaf.block_header(); let mut block_comm_root_bytes = vec![]; header .block_merkle_tree_root @@ -162,8 +159,8 @@ fn form_light_client_state( .fee_merkle_tree_root .serialize_compressed(&mut fee_ledger_comm_bytes)?; Ok(LightClientState { - view_number: leaf.get_view_number().get_u64() as usize, - block_height: leaf.get_height() as usize, + view_number: leaf.view_number().u64() as usize, + block_height: leaf.height() as usize, block_comm_root: hash_bytes_to_field(&block_comm_root_bytes)?, fee_ledger_comm: hash_bytes_to_field(&fee_ledger_comm_bytes)?, stake_table_comm: *stake_table_comm, @@ -203,8 +200,8 @@ pub fn static_stake_table_commitment( known_nodes_with_stakes.iter().for_each(|peer| { // This `unwrap()` won't fail unless number of entries exceeds `capacity` st.register( - *peer.stake_table_entry.get_key(), - peer.stake_table_entry.get_stake(), + *peer.stake_table_entry.key(), + peer.stake_table_entry.stake(), peer.state_ver_key.clone(), ) .unwrap();