From 94043bfe221759449e0f0582c33a04b9d1f382da Mon Sep 17 00:00:00 2001 From: Anca Zamfir Date: Tue, 18 Feb 2025 19:33:50 +0100 Subject: [PATCH 01/54] Change topics to match starknet --- code/crates/network/src/channel.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/crates/network/src/channel.rs b/code/crates/network/src/channel.rs index 97b7f4c30..015d3bb6c 100644 --- a/code/crates/network/src/channel.rs +++ b/code/crates/network/src/channel.rs @@ -31,7 +31,7 @@ impl Channel { pub fn as_str(&self) -> &'static str { match self { Channel::Consensus => "/consensus", - Channel::ProposalParts => "/proposal_parts", + Channel::ProposalParts => "/consensus_proposals", Channel::Sync => "/sync", } } @@ -50,8 +50,8 @@ impl Channel { pub fn from_gossipsub_topic_hash(topic: &gossipsub::TopicHash) -> Option { match topic.as_str() { - "/consensus" => Some(Channel::Consensus), - "/proposal_parts" => Some(Channel::ProposalParts), + "/consensus_votes" => Some(Channel::Consensus), + "/consensus_proposals" => Some(Channel::ProposalParts), "/sync" => Some(Channel::Sync), _ => None, } @@ -59,8 +59,8 @@ impl Channel { pub fn from_broadcast_topic(topic: &broadcast::Topic) -> Option { match topic.as_ref() { - b"/consensus" => Some(Channel::Consensus), - b"/proposal_parts" => Some(Channel::ProposalParts), + b"/consensus_votes" => Some(Channel::Consensus), + b"/consensus_proposals" => Some(Channel::ProposalParts), b"/sync" => Some(Channel::Sync), _ => None, } From d2410c534b29d7acdf0dae41d2634fc37b24551e Mon Sep 17 00:00:00 2001 From: Anca Zamfir Date: Tue, 18 Feb 2025 19:34:22 +0100 Subject: [PATCH 02/54] Change starknet INITIAL to 0 --- code/crates/starknet/p2p-types/src/height.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/crates/starknet/p2p-types/src/height.rs b/code/crates/starknet/p2p-types/src/height.rs index 62b4c8c70..adf1bdcf9 100644 --- a/code/crates/starknet/p2p-types/src/height.rs +++ b/code/crates/starknet/p2p-types/src/height.rs @@ -46,7 +46,7 @@ impl fmt::Display for Height { impl malachitebft_core_types::Height for Height { const ZERO: Self = Self::new(0, 0); - const INITIAL: Self = Self::new(1, 0); + const INITIAL: Self = Self::new(0, 0); fn increment_by(&self, n: u64) -> Self { Self { From 034e17a41289edc1d4b2972e04aee5d40183b911 Mon Sep 17 00:00:00 2001 From: Anca Zamfir Date: Wed, 19 Feb 2025 19:53:15 +0100 Subject: [PATCH 03/54] More topic changes --- code/crates/network/src/channel.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/crates/network/src/channel.rs b/code/crates/network/src/channel.rs index 015d3bb6c..86d984643 100644 --- a/code/crates/network/src/channel.rs +++ b/code/crates/network/src/channel.rs @@ -30,7 +30,7 @@ impl Channel { pub fn as_str(&self) -> &'static str { match self { - Channel::Consensus => "/consensus", + Channel::Consensus => "/consensus_votes", Channel::ProposalParts => "/consensus_proposals", Channel::Sync => "/sync", } From 5fb98a14350b161b5d26d7bc6a6cc0b5813354e1 Mon Sep 17 00:00:00 2001 From: Anca Zamfir Date: Wed, 19 Feb 2025 19:53:56 +0100 Subject: [PATCH 04/54] Start from INITIAL if nothing in store, else store height + 1 --- code/crates/starknet/host/src/actor.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/crates/starknet/host/src/actor.rs b/code/crates/starknet/host/src/actor.rs index eb12bedfb..7c067571c 100644 --- a/code/crates/starknet/host/src/actor.rs +++ b/code/crates/starknet/host/src/actor.rs @@ -217,9 +217,11 @@ async fn on_consensus_ready( state: &mut HostState, consensus: ConsensusRef, ) -> Result<(), ActorProcessingErr> { - let latest_block_height = state.block_store.last_height().unwrap_or_default(); - let start_height = latest_block_height.increment(); - + let mut start_height = malachitebft_core_types::Height::INITIAL; + if state.block_store.last_height().is_some() { + let latest_block_height = state.block_store.last_height().unwrap_or_default(); + start_height = latest_block_height.increment(); + } state.consensus = Some(consensus.clone()); tokio::time::sleep(Duration::from_millis(200)).await; From 476fd137c0a1824547a05b536e563fc2ef25be82 Mon Sep 17 00:00:00 2001 From: Anca Zamfir Date: Wed, 19 Feb 2025 19:54:39 +0100 Subject: [PATCH 05/54] Cannot decrement with INITIAL 0, also matches starknet proposer selection. --- code/crates/starknet/p2p-types/src/context.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/crates/starknet/p2p-types/src/context.rs b/code/crates/starknet/p2p-types/src/context.rs index d655eb114..f0c44bbe8 100644 --- a/code/crates/starknet/p2p-types/src/context.rs +++ b/code/crates/starknet/p2p-types/src/context.rs @@ -40,7 +40,7 @@ impl Context for MockContext { let height = height.as_u64() as usize; let round = round.as_i64() as usize; - (height - 1 + round) % validator_set.count() + (height + round) % validator_set.count() }; validator_set From eacfcb0aa4d49b640a277d311f9be023dfe8b10f Mon Sep 17 00:00:00 2001 From: Anca Zamfir Date: Wed, 19 Feb 2025 19:55:38 +0100 Subject: [PATCH 06/54] Fix one test, must disable sync. --- code/crates/starknet/test/src/tests/n3f0.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/code/crates/starknet/test/src/tests/n3f0.rs b/code/crates/starknet/test/src/tests/n3f0.rs index 1d6d75601..764fce634 100644 --- a/code/crates/starknet/test/src/tests/n3f0.rs +++ b/code/crates/starknet/test/src/tests/n3f0.rs @@ -1,5 +1,7 @@ use std::time::Duration; +use malachitebft_test_framework::TestParams; + use crate::TestBuilder; #[tokio::test] @@ -12,5 +14,13 @@ pub async fn all_correct_nodes() { test.add_node().start().wait_until(HEIGHT).success(); test.add_node().start().wait_until(HEIGHT).success(); - test.build().run(Duration::from_secs(30)).await + test.build() + .run_with_params( + Duration::from_secs(30), // Timeout for the whole test + TestParams { + enable_sync: false, // Enable Sync + ..Default::default() + }, + ) + .await } From 64cb49424f081cbf36df5a1ccdb539d12410af43 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Thu, 27 Feb 2025 14:32:29 +0100 Subject: [PATCH 07/54] Post-merge fixes --- code/crates/starknet/test/src/tests/n3f0.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/crates/starknet/test/src/tests/n3f0.rs b/code/crates/starknet/test/src/tests/n3f0.rs index 764fce634..faf3b8d9c 100644 --- a/code/crates/starknet/test/src/tests/n3f0.rs +++ b/code/crates/starknet/test/src/tests/n3f0.rs @@ -17,10 +17,7 @@ pub async fn all_correct_nodes() { test.build() .run_with_params( Duration::from_secs(30), // Timeout for the whole test - TestParams { - enable_sync: false, // Enable Sync - ..Default::default() - }, + TestParams::default(), ) .await } From 3780e00468c94168a16cc8918e0b97dc7c89a94f Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Thu, 27 Feb 2025 14:53:49 +0100 Subject: [PATCH 08/54] Improve logs --- code/crates/network/src/lib.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/code/crates/network/src/lib.rs b/code/crates/network/src/lib.rs index aaf51eb48..92c8ed095 100644 --- a/code/crates/network/src/lib.rs +++ b/code/crates/network/src/lib.rs @@ -10,7 +10,7 @@ use libp2p::swarm::{self, SwarmEvent}; use libp2p::{gossipsub, identify, quic, SwarmBuilder}; use libp2p_broadcast as broadcast; use tokio::sync::{mpsc, oneshot}; -use tracing::{debug, error, error_span, trace, warn, Instrument}; +use tracing::{debug, error, error_span, info, trace, warn, Instrument}; use malachitebft_discovery::{self as discovery}; use malachitebft_metrics::SharedRegistry; @@ -202,7 +202,9 @@ pub async fn spawn( let state = State::new(discovery); let peer_id = PeerId::from_libp2p(swarm.local_peer_id()); - let span = error_span!("network", peer = %peer_id); + let span = error_span!("network"); + info!(parent: span.clone(), %peer_id, "Starting network"); + let task_handle = tokio::task::spawn(run(config, metrics, state, swarm, rx_ctrl, tx_event).instrument(span)); @@ -388,13 +390,20 @@ async fn handle_swarm_event( SwarmEvent::ConnectionClosed { peer_id, connection_id, + endpoint, cause, .. } => { if let Some(cause) = cause { - warn!("Connection closed with {peer_id}, reason: {cause}"); + warn!( + "Connection closed with {peer_id} at {}, reason: {cause}", + endpoint.get_remote_address() + ); } else { - warn!("Connection closed with {peer_id}, reason: unknown"); + warn!( + "Connection closed with {peer_id} at {}, reason: unknown", + endpoint.get_remote_address() + ); } state From ffdc15b2610032e4f826f64eee036cd29ec4b056 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Mon, 3 Mar 2025 11:49:37 +0100 Subject: [PATCH 09/54] Use same protocol versions as Starknet --- code/crates/discovery/src/behaviour.rs | 2 +- code/crates/network/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/crates/discovery/src/behaviour.rs b/code/crates/discovery/src/behaviour.rs index 6113a11eb..3a68b7f37 100644 --- a/code/crates/discovery/src/behaviour.rs +++ b/code/crates/discovery/src/behaviour.rs @@ -15,7 +15,7 @@ use serde::{Deserialize, Serialize}; use crate::config::BootstrapProtocol; use crate::Config; -const DISCOVERY_KAD_PROTOCOL: &str = "/malachitebft-discovery/kad/v1beta1"; +const DISCOVERY_KAD_PROTOCOL: &str = "/starknet/kad/MY_CUSTOM_CHAIN_ID/1.0.0"; const DISCOVERY_REQRES_PROTOCOL: &str = "/malachitebft-discovery/reqres/v1beta1"; #[derive(Clone, Debug, Serialize, Deserialize)] diff --git a/code/crates/network/src/lib.rs b/code/crates/network/src/lib.rs index 92c8ed095..e547f6563 100644 --- a/code/crates/network/src/lib.rs +++ b/code/crates/network/src/lib.rs @@ -33,7 +33,7 @@ pub use channel::Channel; use behaviour::{Behaviour, NetworkEvent}; use handle::Handle; -const PROTOCOL: &str = "/malachitebft-core-consensus/v1beta1"; +const PROTOCOL: &str = "/staknet/identify/0.1.0-rc.0"; // Typo is from the sequencer code const METRICS_PREFIX: &str = "malachitebft_network"; const DISCOVERY_METRICS_PREFIX: &str = "malachitebft_discovery"; From 7e5e3bdd8675460fa78218486594a97ee3b818b5 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Thu, 13 Mar 2025 15:22:17 +0100 Subject: [PATCH 10/54] Bunch of horrible hacks to have the nodes connect --- code/crates/discovery/src/behaviour.rs | 12 ++--- code/crates/discovery/src/config.rs | 6 +-- .../discovery/src/handlers/connect_request.rs | 32 ++++++------- .../discovery/src/handlers/extension.rs | 2 +- .../discovery/src/handlers/peers_request.rs | 46 +++++++++---------- code/crates/engine/src/consensus.rs | 4 ++ code/crates/network/src/behaviour.rs | 38 +++++++++++---- code/crates/network/src/channel.rs | 23 +++++----- code/crates/network/src/lib.rs | 31 ++++++++----- code/crates/network/src/pubsub.rs | 4 ++ code/crates/starknet/host/src/actor.rs | 34 +++++++++++--- code/crates/starknet/host/src/host/state.rs | 8 ++++ code/crates/starknet/p2p-types/src/context.rs | 2 +- code/crates/test/mempool/src/behaviour.rs | 5 +- 14 files changed, 156 insertions(+), 91 deletions(-) diff --git a/code/crates/discovery/src/behaviour.rs b/code/crates/discovery/src/behaviour.rs index 3a68b7f37..f99219bfe 100644 --- a/code/crates/discovery/src/behaviour.rs +++ b/code/crates/discovery/src/behaviour.rs @@ -65,7 +65,7 @@ where #[behaviour(to_swarm = "NetworkEvent")] pub struct Behaviour { pub kademlia: Toggle>, - pub request_response: request_response::cbor::Behaviour, + pub request_response: Toggle>, } fn kademlia_config() -> kad::Config { @@ -106,14 +106,14 @@ impl Behaviour { ), ); - let request_response = request_response::cbor::Behaviour::new( - request_response_protocol(), - request_response_config(), - ); + // let request_response = request_response::cbor::Behaviour::new( + // request_response_protocol(), + // request_response_config(), + // ); Self { kademlia, - request_response, + request_response: Toggle::from(None), } } } diff --git a/code/crates/discovery/src/config.rs b/code/crates/discovery/src/config.rs index 26701255a..5c2a4f6dc 100644 --- a/code/crates/discovery/src/config.rs +++ b/code/crates/discovery/src/config.rs @@ -5,9 +5,9 @@ const DEFAULT_NUM_INBOUND_PEERS: usize = 20; const DEFAULT_EPHEMERAL_CONNECTION_TIMEOUT: Duration = Duration::from_secs(15); -const DEFAULT_DIAL_MAX_RETRIES: usize = 5; -const DEFAULT_PEERS_REQUEST_MAX_RETRIES: usize = 5; -const DEFAULT_CONNECT_REQUEST_MAX_RETRIES: usize = 0; +const DEFAULT_DIAL_MAX_RETRIES: usize = 10_000; +const DEFAULT_PEERS_REQUEST_MAX_RETRIES: usize = 10_000; +const DEFAULT_CONNECT_REQUEST_MAX_RETRIES: usize = 10_000; #[derive(Copy, Clone, Debug, PartialEq, Eq, Default)] pub enum BootstrapProtocol { diff --git a/code/crates/discovery/src/handlers/connect_request.rs b/code/crates/discovery/src/handlers/connect_request.rs index 843d68afb..c481eb49a 100644 --- a/code/crates/discovery/src/handlers/connect_request.rs +++ b/code/crates/discovery/src/handlers/connect_request.rs @@ -48,13 +48,13 @@ where request_data.retry.count() ); - let request_id = swarm - .behaviour_mut() - .send_request(&request_data.peer_id(), behaviour::Request::Connect()); - - self.controller - .connect_request - .register_in_progress(request_id, request_data); + // let request_id = swarm + // .behaviour_mut() + // .send_request(&request_data.peer_id(), behaviour::Request::Connect()); + // + // self.controller + // .connect_request + // .register_in_progress(request_id, request_data); } pub(crate) fn handle_connect_request( @@ -85,15 +85,15 @@ where self.update_connections_metrics(); - if swarm - .behaviour_mut() - .send_response(channel, behaviour::Response::Connect(accepted)) - .is_err() - { - error!("Error sending connect response to {peer}"); - } else { - trace!("Sent connect response to {peer}"); - } + // if swarm + // .behaviour_mut() + // .send_response(channel, behaviour::Response::Connect(accepted)) + // .is_err() + // { + // error!("Error sending connect response to {peer}"); + // } else { + // trace!("Sent connect response to {peer}"); + // } } pub(crate) fn handle_connect_response( diff --git a/code/crates/discovery/src/handlers/extension.rs b/code/crates/discovery/src/handlers/extension.rs index d807d0de6..7cc9dc697 100644 --- a/code/crates/discovery/src/handlers/extension.rs +++ b/code/crates/discovery/src/handlers/extension.rs @@ -87,7 +87,7 @@ where self.metrics.elapsed().as_millis() ); - self.adjust_connections(swarm); + // self.adjust_connections(swarm); self.state = State::Idle; } else { diff --git a/code/crates/discovery/src/handlers/peers_request.rs b/code/crates/discovery/src/handlers/peers_request.rs index 30de07e23..8bafcede6 100644 --- a/code/crates/discovery/src/handlers/peers_request.rs +++ b/code/crates/discovery/src/handlers/peers_request.rs @@ -50,14 +50,14 @@ where request_data.retry.count() ); - let request_id = swarm.behaviour_mut().send_request( - &request_data.peer_id(), - behaviour::Request::Peers(self.get_all_peers_except(request_data.peer_id())), - ); - - self.controller - .peers_request - .register_in_progress(request_id, request_data); + // let request_id = swarm.behaviour_mut().send_request( + // &request_data.peer_id(), + // behaviour::Request::Peers(self.get_all_peers_except(request_data.peer_id())), + // ); + // + // self.controller + // .peers_request + // .register_in_progress(request_id, request_data); } pub(crate) fn handle_peers_request( @@ -69,21 +69,21 @@ where ) { // Compute the difference between the discovered peers and the requested peers // to avoid sending the requesting peer the peers it already knows. - let peers_difference = self - .get_all_peers_except(peer) - .difference(&peers) - .cloned() - .collect(); - - if swarm - .behaviour_mut() - .send_response(channel, behaviour::Response::Peers(peers_difference)) - .is_err() - { - error!("Error sending peers to {peer}"); - } else { - trace!("Sent peers to {peer}"); - } + // let peers_difference = self + // .get_all_peers_except(peer) + // .difference(&peers) + // .cloned() + // .collect(); + + // if swarm + // .behaviour_mut() + // .send_response(channel, behaviour::Response::Peers(peers_difference)) + // .is_err() + // { + // error!("Error sending peers to {peer}"); + // } else { + // trace!("Sent peers to {peer}"); + // } } pub(crate) fn handle_peers_response( diff --git a/code/crates/engine/src/consensus.rs b/code/crates/engine/src/consensus.rs index ee60fa322..10da2504b 100644 --- a/code/crates/engine/src/consensus.rs +++ b/code/crates/engine/src/consensus.rs @@ -370,6 +370,8 @@ where debug!(connected = %connected_peers, total = %total_peers, "Connected to another peer"); self.metrics.connected_peers.inc(); + + self.host.cast(HostMsg::PeerJoined { peer_id })?; } NetworkEvent::PeerDisconnected(peer_id) => { @@ -377,6 +379,8 @@ where if state.connected_peers.remove(&peer_id) { self.metrics.connected_peers.dec(); + + self.host.cast(HostMsg::PeerLeft { peer_id })?; } } diff --git a/code/crates/network/src/behaviour.rs b/code/crates/network/src/behaviour.rs index 2f7c0f0e9..64bea4b57 100644 --- a/code/crates/network/src/behaviour.rs +++ b/code/crates/network/src/behaviour.rs @@ -2,6 +2,7 @@ use std::time::Duration; use libp2p::kad::{Addresses, KBucketKey, KBucketRef}; use libp2p::request_response::{OutboundRequestId, ResponseChannel}; +use libp2p::swarm::behaviour::toggle::Toggle; use libp2p::swarm::NetworkBehaviour; use libp2p::{gossipsub, identify, ping}; use libp2p_broadcast as broadcast; @@ -65,11 +66,11 @@ impl From for NetworkEvent { #[behaviour(to_swarm = "NetworkEvent")] pub struct Behaviour { pub identify: identify::Behaviour, - pub ping: ping::Behaviour, + pub ping: Toggle, pub gossipsub: gossipsub::Behaviour, - pub broadcast: broadcast::Behaviour, - pub sync: sync::Behaviour, - pub discovery: discovery::Behaviour, + pub broadcast: Toggle, + pub sync: Toggle, + pub discovery: Toggle, } /// Dummy implementation of Debug for Behaviour. @@ -82,6 +83,8 @@ impl std::fmt::Debug for Behaviour { impl discovery::DiscoveryClient for Behaviour { fn add_address(&mut self, peer: &PeerId, address: Multiaddr) -> libp2p::kad::RoutingUpdate { self.discovery + .as_mut() + .unwrap() .kademlia .as_mut() .expect("Kademlia behaviour should be available") @@ -90,6 +93,8 @@ impl discovery::DiscoveryClient for Behaviour { fn kbuckets(&mut self) -> impl Iterator, Addresses>> { self.discovery + .as_mut() + .unwrap() .kademlia .as_mut() .expect("Kademlia behaviour should be available") @@ -97,7 +102,13 @@ impl discovery::DiscoveryClient for Behaviour { } fn send_request(&mut self, peer_id: &PeerId, req: discovery::Request) -> OutboundRequestId { - self.discovery.request_response.send_request(peer_id, req) + self.discovery + .as_mut() + .unwrap() + .request_response + .as_mut() + .unwrap() + .send_request(peer_id, req) } fn send_response( @@ -105,7 +116,13 @@ impl discovery::DiscoveryClient for Behaviour { ch: ResponseChannel, rs: discovery::Response, ) -> Result<(), discovery::Response> { - self.discovery.request_response.send_response(ch, rs) + self.discovery + .as_mut() + .unwrap() + .request_response + .as_mut() + .unwrap() + .send_response(ch, rs) } } @@ -120,6 +137,7 @@ fn message_id(message: &gossipsub::Message) -> gossipsub::MessageId { fn gossipsub_config(config: GossipSubConfig, max_transmit_size: usize) -> gossipsub::Config { gossipsub::ConfigBuilder::default() + .protocol_id_prefix("/meshsub") .max_transmit_size(max_transmit_size) .opportunistic_graft_ticks(3) .heartbeat_interval(Duration::from_secs(1)) @@ -168,11 +186,11 @@ impl Behaviour { Self { identify, - ping, + ping: Toggle::from(None), gossipsub, - broadcast, - sync, - discovery, + broadcast: Toggle::from(None), + sync: Toggle::from(None), + discovery: Toggle::from(Some(discovery)), } } } diff --git a/code/crates/network/src/channel.rs b/code/crates/network/src/channel.rs index 86d984643..f21833c06 100644 --- a/code/crates/network/src/channel.rs +++ b/code/crates/network/src/channel.rs @@ -20,8 +20,9 @@ impl Channel { &[Channel::Consensus, Channel::ProposalParts] } - pub fn to_gossipsub_topic(self) -> gossipsub::IdentTopic { - gossipsub::IdentTopic::new(self.as_str()) + pub fn to_gossipsub_topic(self) -> gossipsub::Sha256Topic { + // gossipsub::IdentTopic::new(self.as_str()) + gossipsub::Sha256Topic::new(self.as_str()) } pub fn to_broadcast_topic(self) -> broadcast::Topic { @@ -30,9 +31,9 @@ impl Channel { pub fn as_str(&self) -> &'static str { match self { - Channel::Consensus => "/consensus_votes", - Channel::ProposalParts => "/consensus_proposals", - Channel::Sync => "/sync", + Channel::Consensus => "consensus_votes", + Channel::ProposalParts => "consensus_proposals", + Channel::Sync => "sync", } } @@ -50,18 +51,18 @@ impl Channel { pub fn from_gossipsub_topic_hash(topic: &gossipsub::TopicHash) -> Option { match topic.as_str() { - "/consensus_votes" => Some(Channel::Consensus), - "/consensus_proposals" => Some(Channel::ProposalParts), - "/sync" => Some(Channel::Sync), + "consensus_votes" => Some(Channel::Consensus), + "consensus_proposals" => Some(Channel::ProposalParts), + "sync" => Some(Channel::Sync), _ => None, } } pub fn from_broadcast_topic(topic: &broadcast::Topic) -> Option { match topic.as_ref() { - b"/consensus_votes" => Some(Channel::Consensus), - b"/consensus_proposals" => Some(Channel::ProposalParts), - b"/sync" => Some(Channel::Sync), + b"consensus_votes" => Some(Channel::Consensus), + b"consensus_proposals" => Some(Channel::ProposalParts), + b"sync" => Some(Channel::Sync), _ => None, } } diff --git a/code/crates/network/src/lib.rs b/code/crates/network/src/lib.rs index 4977f7e44..2d4ccff1e 100644 --- a/code/crates/network/src/lib.rs +++ b/code/crates/network/src/lib.rs @@ -232,10 +232,10 @@ async fn run( return; }; - if let Err(e) = pubsub::subscribe(&mut swarm, PubSubProtocol::Broadcast, &[Channel::Sync]) { - error!("Error subscribing to Sync channel: {e}"); - return; - }; + // if let Err(e) = pubsub::subscribe(&mut swarm, PubSubProtocol::Broadcast, &[Channel::Sync]) { + // error!("Error subscribing to Sync channel: {e}"); + // return; + // }; loop { let result = tokio::select! { @@ -295,13 +295,13 @@ async fn handle_ctrl_msg( } CtrlMsg::Broadcast(channel, data) => { - let msg_size = data.len(); - let result = pubsub::publish(swarm, PubSubProtocol::Broadcast, channel, data); - - match result { - Ok(()) => debug!(%channel, size = %msg_size, "Broadcasted message"), - Err(e) => error!(%channel, "Error broadcasting message: {e}"), - } + // let msg_size = data.len(); + // let result = pubsub::publish(swarm, PubSubProtocol::Broadcast, channel, data); + // + // match result { + // Ok(()) => debug!(%channel, size = %msg_size, "Broadcasted message"), + // Err(e) => error!(%channel, "Error broadcasting message: {e}"), + // } ControlFlow::Continue(()) } @@ -310,6 +310,8 @@ async fn handle_ctrl_msg( let request_id = swarm .behaviour_mut() .sync + .as_mut() + .unwrap() .send_request(peer_id.to_libp2p(), request); if let Err(e) = reply_to.send(request_id) { @@ -325,7 +327,12 @@ async fn handle_ctrl_msg( return ControlFlow::Continue(()); }; - let result = swarm.behaviour_mut().sync.send_response(channel, data); + let result = swarm + .behaviour_mut() + .sync + .as_mut() + .unwrap() + .send_response(channel, data); match result { Ok(()) => debug!(%request_id, "Replied to Sync request"), diff --git a/code/crates/network/src/pubsub.rs b/code/crates/network/src/pubsub.rs index afc08365f..f0dd0601d 100644 --- a/code/crates/network/src/pubsub.rs +++ b/code/crates/network/src/pubsub.rs @@ -23,6 +23,8 @@ pub fn subscribe( swarm .behaviour_mut() .broadcast + .as_mut() + .unwrap() .subscribe(channel.to_broadcast_topic()); } } @@ -48,6 +50,8 @@ pub fn publish( swarm .behaviour_mut() .broadcast + .as_mut() + .unwrap() .broadcast(&channel.to_broadcast_topic(), data); } } diff --git a/code/crates/starknet/host/src/actor.rs b/code/crates/starknet/host/src/actor.rs index 7c067571c..59901bb2b 100644 --- a/code/crates/starknet/host/src/actor.rs +++ b/code/crates/starknet/host/src/actor.rs @@ -202,11 +202,25 @@ impl Host { HostMsg::PeerJoined { peer_id } => { debug!(%peer_id, "Peer joined the network"); + + state.peers.insert(peer_id); + + if state.peers.len() == 1 && state.ready { + let start_height = state.start_height; + let consensus = state.consensus.as_ref().unwrap(); + + consensus.cast(ConsensusMsg::StartHeight( + start_height, + state.host.validator_set.clone(), + ))?; + } + Ok(()) } HostMsg::PeerLeft { peer_id } => { debug!(%peer_id, "Peer left the network"); + state.peers.remove(&peer_id); Ok(()) } } @@ -217,19 +231,27 @@ async fn on_consensus_ready( state: &mut HostState, consensus: ConsensusRef, ) -> Result<(), ActorProcessingErr> { + if !state.ready { + state.consensus = Some(consensus.clone()); + state.ready = true; + } + let mut start_height = malachitebft_core_types::Height::INITIAL; if state.block_store.last_height().is_some() { let latest_block_height = state.block_store.last_height().unwrap_or_default(); start_height = latest_block_height.increment(); } - state.consensus = Some(consensus.clone()); - tokio::time::sleep(Duration::from_millis(200)).await; + state.start_height = start_height; - consensus.cast(ConsensusMsg::StartHeight( - start_height, - state.host.validator_set.clone(), - ))?; + if !state.peers.is_empty() { + tokio::time::sleep(Duration::from_millis(200)).await; + + consensus.cast(ConsensusMsg::StartHeight( + start_height, + state.host.validator_set.clone(), + ))?; + } Ok(()) } diff --git a/code/crates/starknet/host/src/host/state.rs b/code/crates/starknet/host/src/host/state.rs index 4bfd7284e..50839ea27 100644 --- a/code/crates/starknet/host/src/host/state.rs +++ b/code/crates/starknet/host/src/host/state.rs @@ -1,6 +1,8 @@ +use std::collections::HashSet; use std::path::Path; use std::sync::Arc; +use malachitebft_sync::PeerId; use rand::RngCore; use tracing::{debug, error, trace}; @@ -25,6 +27,9 @@ pub struct HostState { pub block_store: BlockStore, pub part_streams_map: PartStreamsMap, pub nonce: u64, + pub ready: bool, + pub peers: HashSet, + pub start_height: Height, } impl HostState { @@ -47,6 +52,9 @@ impl HostState { block_store: BlockStore::new(db_path).unwrap(), part_streams_map: PartStreamsMap::default(), nonce: rng.next_u64(), + ready: false, + peers: HashSet::new(), + start_height: Height::new(0, 0), } } diff --git a/code/crates/starknet/p2p-types/src/context.rs b/code/crates/starknet/p2p-types/src/context.rs index d628a1cbc..070a42b9f 100644 --- a/code/crates/starknet/p2p-types/src/context.rs +++ b/code/crates/starknet/p2p-types/src/context.rs @@ -42,7 +42,7 @@ impl Context for MockContext { let height = height.as_u64() as usize; let round = round.as_i64() as usize; - (height + round) % validator_set.count() + (height + round + 1) % validator_set.count() }; validator_set diff --git a/code/crates/test/mempool/src/behaviour.rs b/code/crates/test/mempool/src/behaviour.rs index 694e26b08..371ab1636 100644 --- a/code/crates/test/mempool/src/behaviour.rs +++ b/code/crates/test/mempool/src/behaviour.rs @@ -30,7 +30,8 @@ fn message_id(message: &gossipsub::Message) -> gossipsub::MessageId { } fn gossipsub_config() -> gossipsub::Config { - gossipsub::ConfigBuilder::default() + dbg!(gossipsub::ConfigBuilder::default() + .protocol_id_prefix("/meshsub") .max_transmit_size(MAX_TRANSMIT_SIZE) .opportunistic_graft_ticks(3) .heartbeat_interval(Duration::from_secs(1)) @@ -43,7 +44,7 @@ fn gossipsub_config() -> gossipsub::Config { .mesh_n(3) .message_id_fn(message_id) .build() - .unwrap() + .unwrap()) } impl Behaviour { From a89435687ba518d91649e3e6d5c52b60b05ae4e9 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Thu, 13 Mar 2025 15:41:25 +0100 Subject: [PATCH 11/54] Switch to Protobuf currently used by the sequencer --- code/crates/discovery/src/lib.rs | 2 + code/crates/network/src/lib.rs | 2 + code/crates/starknet/host/src/actor.rs | 2 +- .../crates/starknet/host/src/host/proposal.rs | 53 +++--- code/crates/starknet/host/src/host/state.rs | 68 +++++-- .../proto/p2p/proto/consensus/consensus.proto | 109 ++++------- .../starknet/p2p-types/src/block_info.rs | 23 ++- .../p2p-types/src/proposal_commitment.rs | 174 +++++++++--------- .../starknet/p2p-types/src/proposal_part.rs | 57 +++--- code/crates/starknet/p2p-types/src/vote.rs | 8 +- 10 files changed, 251 insertions(+), 247 deletions(-) diff --git a/code/crates/discovery/src/lib.rs b/code/crates/discovery/src/lib.rs index 6563c13e3..8b4327642 100644 --- a/code/crates/discovery/src/lib.rs +++ b/code/crates/discovery/src/lib.rs @@ -1,3 +1,5 @@ +#![allow(unused_variables, unused_imports, dead_code, unused_assignments)] + use std::collections::HashMap; use tracing::{debug, error, info, warn}; diff --git a/code/crates/network/src/lib.rs b/code/crates/network/src/lib.rs index 2d4ccff1e..9a5cc1efb 100644 --- a/code/crates/network/src/lib.rs +++ b/code/crates/network/src/lib.rs @@ -1,3 +1,5 @@ +#![allow(unused_variables, unused_imports)] + use std::collections::HashMap; use std::error::Error; use std::ops::ControlFlow; diff --git a/code/crates/starknet/host/src/actor.rs b/code/crates/starknet/host/src/actor.rs index 59901bb2b..5630556ad 100644 --- a/code/crates/starknet/host/src/actor.rs +++ b/code/crates/starknet/host/src/actor.rs @@ -480,7 +480,7 @@ async fn on_restream_proposal( PartType::Init => init_part.clone(), PartType::BlockInfo => part, PartType::Transactions => part, - PartType::ProposalCommitment => part, + // PartType::ProposalCommitment => part, PartType::Fin => fin_part.clone(), }; diff --git a/code/crates/starknet/host/src/host/proposal.rs b/code/crates/starknet/host/src/host/proposal.rs index e790b0952..74d8ed32f 100644 --- a/code/crates/starknet/host/src/host/proposal.rs +++ b/code/crates/starknet/host/src/host/proposal.rs @@ -15,7 +15,7 @@ use crate::host::starknet::StarknetParams; use crate::mempool::{MempoolMsg, MempoolRef}; use crate::types::*; -const PROTOCOL_VERSION: &str = "0.13.0"; +// const PROTOCOL_VERSION: &str = "0.13.0"; pub async fn build_proposal_task( height: Height, @@ -89,7 +89,8 @@ async fn run_build_proposal_task( l1_gas_price_wei: 0, l1_data_gas_price_wei: 0, l2_gas_price_fri: 0, - eth_to_strk_rate: 0, + // eth_to_strk_rate: 0, + eth_to_fri_rate: 0, l1_da_mode: L1DataAvailabilityMode::Blob, }); @@ -160,30 +161,30 @@ async fn run_build_proposal_task( } } - // Proposal Commitment - { - let part = ProposalPart::Commitment(Box::new(ProposalCommitment { - height, - parent_commitment: Hash::new([0; 32]), - builder: proposer, - timestamp: now, - protocol_version: PROTOCOL_VERSION.to_string(), - old_state_root: Hash::new([0; 32]), - state_diff_commitment: Hash::new([0; 32]), - transaction_commitment: Hash::new([0; 32]), - event_commitment: Hash::new([0; 32]), - receipt_commitment: Hash::new([0; 32]), - concatenated_counts: Felt::ONE, - l1_gas_price_fri: 0, - l1_data_gas_price_fri: 0, - l2_gas_price_fri: 0, - l2_gas_used: 0, - l1_da_mode: L1DataAvailabilityMode::Blob, - })); - - tx_part.send(part).await?; - sequence += 1; - } + // // Proposal Commitment + // { + // let part = ProposalPart::Commitment(Box::new(ProposalCommitment { + // height, + // parent_commitment: Hash::new([0; 32]), + // builder: proposer, + // timestamp: now, + // protocol_version: PROTOCOL_VERSION.to_string(), + // old_state_root: Hash::new([0; 32]), + // state_diff_commitment: Hash::new([0; 32]), + // transaction_commitment: Hash::new([0; 32]), + // event_commitment: Hash::new([0; 32]), + // receipt_commitment: Hash::new([0; 32]), + // concatenated_counts: Felt::ONE, + // l1_gas_price_fri: 0, + // l1_data_gas_price_fri: 0, + // l2_gas_price_fri: 0, + // l2_gas_used: 0, + // l1_da_mode: L1DataAvailabilityMode::Blob, + // })); + // + // tx_part.send(part).await?; + // sequence += 1; + // } // TODO: Compute the actual propoosal commitment hash let proposal_commitment_hash = Hash::new([42; 32]); diff --git a/code/crates/starknet/host/src/host/state.rs b/code/crates/starknet/host/src/host/state.rs index 50839ea27..269ba146f 100644 --- a/code/crates/starknet/host/src/host/state.rs +++ b/code/crates/starknet/host/src/host/state.rs @@ -2,7 +2,7 @@ use std::collections::HashSet; use std::path::Path; use std::sync::Arc; -use malachitebft_sync::PeerId; +use bytes::{Buf, BufMut}; use rand::RngCore; use tracing::{debug, error, trace}; @@ -10,13 +10,47 @@ use malachitebft_core_types::{Context, Round, Validity}; use malachitebft_engine::consensus::ConsensusRef; use malachitebft_engine::host::ProposedValue; use malachitebft_engine::util::streaming::StreamId; -use malachitebft_starknet_p2p_proto as p2p_proto; +// use malachitebft_starknet_p2p_proto as p2p_proto; +use malachitebft_sync::PeerId; use crate::block_store::BlockStore; use crate::host::{Host, StarknetHost}; use crate::streaming::PartStreamsMap; use crate::types::*; +/// HeightAndRound is a tuple struct used as the StreamId for consensus and context. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct HeightAndRound(pub u64, pub u32); + +impl TryFrom> for HeightAndRound { + type Error = &'static str; + + fn try_from(value: Vec) -> Result { + if value.len() != 12 { + return Err("Invalid length"); + } + let mut bytes = value.as_slice(); + let height = bytes.get_u64(); + let round = bytes.get_u32(); + Ok(HeightAndRound(height, round)) + } +} + +impl From for Vec { + fn from(value: HeightAndRound) -> Vec { + let mut bytes = Vec::with_capacity(12); + bytes.put_u64(value.0); + bytes.put_u32(value.1); + bytes + } +} + +impl std::fmt::Display for HeightAndRound { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "(height: {}, round: {})", self.0, self.1) + } +} + pub struct HostState { pub ctx: MockContext, pub height: Height, @@ -59,15 +93,11 @@ impl HostState { } pub fn stream_id(&mut self) -> StreamId { - let stream_id = p2p_proto::ConsensusStreamId { - height: self.height.as_u64(), - round: self.round.as_u32().expect("round is non-nil"), - nonce: self.nonce, - }; + let stream_id = HeightAndRound(self.height.block_number, self.round.as_u32().unwrap()); self.nonce += 1; - let bytes = prost::Message::encode_to_vec(&stream_id); + let bytes = Vec::::from(stream_id); StreamId::new(bytes.into()) } @@ -119,12 +149,14 @@ impl HostState { return None; }; - let Some(commitment) = parts.iter().find_map(|part| part.as_commitment()) else { - error!("Part not found: ProposalCommitment"); - return None; - }; + // let Some(commitment) = parts.iter().find_map(|part| part.as_commitment()) else { + // error!("Part not found: ProposalCommitment"); + // return None; + // }; - let validity = self.verify_proposal_validity(init, fin, commitment).await?; + let validity = self + .verify_proposal_validity(init, fin /*, commitment */) + .await?; let valid_round = init.valid_round; if valid_round.is_defined() { @@ -145,7 +177,7 @@ impl HostState { &self, init: &ProposalInit, _fin: &ProposalFin, - _commitment: &ProposalCommitment, + // _commitment: &ProposalCommitment, ) -> Option { let validators = self.host.validators(init.height).await?; @@ -219,10 +251,10 @@ impl HostState { return None; }; - let Some(_proposal_commitment) = parts.iter().find_map(|part| part.as_commitment()) else { - debug!("Proposal part has not been received yet: ProposalCommitment"); - return None; - }; + // let Some(_proposal_commitment) = parts.iter().find_map(|part| part.as_commitment()) else { + // debug!("Proposal part has not been received yet: ProposalCommitment"); + // return None; + // }; let block_size: usize = parts.iter().map(|p| p.size_bytes()).sum(); let tx_count: usize = parts.iter().map(|p| p.tx_count()).sum(); diff --git a/code/crates/starknet/p2p-proto/proto/p2p/proto/consensus/consensus.proto b/code/crates/starknet/p2p-proto/proto/p2p/proto/consensus/consensus.proto index f8a83a82a..b9154cf1d 100644 --- a/code/crates/starknet/p2p-proto/proto/p2p/proto/consensus/consensus.proto +++ b/code/crates/starknet/p2p-proto/proto/p2p/proto/consensus/consensus.proto @@ -1,12 +1,9 @@ syntax = "proto3"; - import "p2p/proto/common.proto"; import "p2p/proto/transaction.proto"; option go_package = "github.com/starknet-io/starknet-p2pspecs/p2p/proto/consensus/consensus"; -// WIP - will change - // Contains all variants of mempool and an L1Handler variant to cover all transactions that can be // in a new block. message ConsensusTransaction { @@ -29,36 +26,21 @@ message Vote { // We use a type field to distinguish between prevotes and precommits instead of different // messages, to make sure the data, and therefore the signatures, are unambiguous between // Prevote and Precommit. - VoteType vote_type = 1; - uint64 block_number = 3; - uint64 fork_id = 4; - uint32 round = 5; + VoteType vote_type = 2; + uint64 height = 3; + uint32 round = 4; // This is optional since a vote can be NIL. - optional Hash block_hash = 6; - // Identifies the voter. - Address voter = 7; -} - -// Streaming of proposals is done on the "consensus_proposal" topic. -message ConsensusStreamId { - uint64 height = 1; - uint32 round = 2; - uint64 nonce = 3; + optional Hash block_hash = 5; + Address voter = 6; } -// The timestamp of a proposal can impact consensus, specifically the lower bound applied. If nodes -// apply a lower bound validation based on their local time, then we risk a scenario where in round -// `R` proposal P is locked. Then in a later round the timestamp in P has gone stale. Therefore the -// lower bound should be "greater than the previous timestamp". Upper bounds don't suffer from this -// problem. -message ProposalPart { - oneof messages { - ProposalInit init = 1; - ProposalFin fin = 2; - BlockInfo block_info = 3; - TransactionBatch transactions = 4; - ProposalCommitment commitment = 5; +message StreamMessage { + oneof message { + bytes content = 1; + Fin fin = 2; } + bytes stream_id = 3; + uint64 message_id = 4; } message ProposalInit { @@ -68,58 +50,35 @@ message ProposalInit { Address proposer = 4; } -// Identifies the content proposed (and executed). Consensus is reached on the value contained here. -message ProposalFin { - Hash proposal_commitment = 1; +message BlockInfo { + uint64 height = 1; + uint64 timestamp = 2; + Address builder = 3; + L1DataAvailabilityMode l1_da_mode = 4; + Uint128 l2_gas_price_fri = 5; + Uint128 l1_gas_price_wei = 6; + Uint128 l1_data_gas_price_wei = 7; + Uint128 eth_to_fri_rate = 8; } message TransactionBatch { repeated ConsensusTransaction transactions = 1; } -// The content and stream_id are generic fields. The user of the stream can choose to pass whatever -// message that they want. The messages are then encoded in bytes. -message StreamMessage { - oneof message { - bytes content = 1; - Fin fin = 2; - } - bytes stream_id = 3; - uint64 message_id = 4; -} - -message ProposalCommitment { - uint64 block_number = 1; - uint64 fork_id = 2; - Hash parent_commitment = 3; - Address builder = 4; - uint64 timestamp = 5; - string protocol_version = 6; // Starknet version - // State root of block `H-K`, where `K` is defined by the protocol's version. - Hash old_state_root = 7; - // The state diff commitment returned by the Starknet Feeder Gateway - Hash state_diff_commitment = 8; - Hash transaction_commitment = 9; - Hash event_commitment = 10; - Hash receipt_commitment = 11; - // TODO: Just put the sizes explicitly? This is relatively free compared actually hashing the - // lists we commit to. If not, should we also pack other fields? - Felt252 concatenated_counts = 12; - Uint128 l1_gas_price_fri = 13; - Uint128 l1_data_gas_price_fri = 14; - Uint128 l2_gas_price_fri = 15; - Uint128 l2_gas_used = 16; - L1DataAvailabilityMode l1_da_mode = 17; +message ProposalFin { + // Identifies a Starknet block based on the content streamed in the proposal. + Hash proposal_commitment = 1; } -message BlockInfo { - uint64 block_number = 1; - uint64 fork_id = 2; - Address builder = 3; - uint64 timestamp = 4; - Uint128 l2_gas_price_fri = 5; - Uint128 l1_gas_price_wei = 6; - Uint128 l1_data_gas_price_wei = 7; - Uint128 eth_to_strk_rate = 8; - L1DataAvailabilityMode l1_da_mode = 9; +// Network format: +// 1. First message is ProposalInit +// 2. Last message is ProposalFin +// 3. In between can be any number of other messages. +message ProposalPart { + oneof message { + ProposalInit init = 1; + ProposalFin fin = 2; + BlockInfo block_info = 3; + TransactionBatch transactions = 4; + } } diff --git a/code/crates/starknet/p2p-types/src/block_info.rs b/code/crates/starknet/p2p-types/src/block_info.rs index ff22adbd3..99f42c492 100644 --- a/code/crates/starknet/p2p-types/src/block_info.rs +++ b/code/crates/starknet/p2p-types/src/block_info.rs @@ -12,7 +12,8 @@ pub struct BlockInfo { pub l1_gas_price_wei: u128, pub l1_data_gas_price_wei: u128, pub l2_gas_price_fri: u128, - pub eth_to_strk_rate: u128, + // pub eth_to_strk_rate: u128, + pub eth_to_fri_rate: u128, pub l1_da_mode: L1DataAvailabilityMode, } @@ -21,7 +22,7 @@ impl Protobuf for BlockInfo { fn from_proto(proto: Self::Proto) -> Result { Ok(Self { - height: Height::new(proto.block_number, proto.fork_id), + height: Height::new(proto.height, 0), builder: Address::from_proto( proto .builder @@ -40,9 +41,13 @@ impl Protobuf for BlockInfo { .l2_gas_price_fri .ok_or_else(|| ProtoError::missing_field::("l2_gas_price_fri"))? .into(), - eth_to_strk_rate: proto - .eth_to_strk_rate - .ok_or_else(|| ProtoError::missing_field::("eth_to_strk_rate"))? + // eth_to_strk_rate: proto + // .eth_to_strk_rate + // .ok_or_else(|| ProtoError::missing_field::("eth_to_strk_rate"))? + // .into(), + eth_to_fri_rate: proto + .eth_to_fri_rate + .ok_or_else(|| ProtoError::missing_field::("eth_to_fri_rate"))? .into(), l1_da_mode: L1DataAvailabilityMode::from_proto(proto.l1_da_mode)?, }) @@ -50,14 +55,16 @@ impl Protobuf for BlockInfo { fn to_proto(&self) -> Result { Ok(Self::Proto { - block_number: self.height.block_number, - fork_id: self.height.fork_id, + height: self.height.block_number, + // block_number: self.height.block_number, + // fork_id: self.height.fork_id, builder: Some(self.builder.to_proto()?), timestamp: self.timestamp, l2_gas_price_fri: Some(self.l2_gas_price_fri.into()), l1_gas_price_wei: Some(self.l1_gas_price_wei.into()), l1_data_gas_price_wei: Some(self.l1_data_gas_price_wei.into()), - eth_to_strk_rate: Some(self.eth_to_strk_rate.into()), + // eth_to_strk_rate: Some(self.eth_to_strk_rate.into()), + eth_to_fri_rate: Some(self.eth_to_fri_rate.into()), l1_da_mode: self.l1_da_mode.to_proto()?, }) } diff --git a/code/crates/starknet/p2p-types/src/proposal_commitment.rs b/code/crates/starknet/p2p-types/src/proposal_commitment.rs index 1a8107dfe..735c6595e 100644 --- a/code/crates/starknet/p2p-types/src/proposal_commitment.rs +++ b/code/crates/starknet/p2p-types/src/proposal_commitment.rs @@ -1,7 +1,7 @@ use malachitebft_proto::{Error as ProtoError, Protobuf}; use malachitebft_starknet_p2p_proto::{self as p2p_proto}; -use crate::felt::FeltExt; +// use crate::felt::FeltExt; use crate::{Address, Felt, Hash, Height}; #[derive(Clone, Debug, PartialEq, Eq)] @@ -52,89 +52,89 @@ impl Protobuf for L1DataAvailabilityMode { } } -impl Protobuf for ProposalCommitment { - type Proto = p2p_proto::ProposalCommitment; - - fn from_proto(proto: Self::Proto) -> Result { - Ok(Self { - height: Height::new(proto.block_number, proto.fork_id), - parent_commitment: Hash::from_proto( - proto - .parent_commitment - .ok_or_else(|| ProtoError::missing_field::("parent_commitment"))?, - )?, - builder: Address::from_proto( - proto - .builder - .ok_or_else(|| ProtoError::missing_field::("builder"))?, - )?, - timestamp: proto.timestamp, - protocol_version: proto.protocol_version, - old_state_root: Hash::from_proto( - proto - .old_state_root - .ok_or_else(|| ProtoError::missing_field::("old_state_root"))?, - )?, - state_diff_commitment: Hash::from_proto(proto.state_diff_commitment.ok_or_else( - || ProtoError::missing_field::("state_diff_commitment"), - )?)?, - transaction_commitment: Hash::from_proto(proto.transaction_commitment.ok_or_else( - || ProtoError::missing_field::("transaction_commitment"), - )?)?, - event_commitment: Hash::from_proto( - proto - .event_commitment - .ok_or_else(|| ProtoError::missing_field::("event_commitment"))?, - )?, - receipt_commitment: Hash::from_proto( - proto.receipt_commitment.ok_or_else(|| { - ProtoError::missing_field::("receipt_commitment") - })?, - )?, - concatenated_counts: Felt::from_proto( - proto.concatenated_counts.ok_or_else(|| { - ProtoError::missing_field::("concatenated_counts") - })?, - )?, - l1_gas_price_fri: proto - .l1_gas_price_fri - .ok_or_else(|| ProtoError::missing_field::("l1_gas_price_fri"))? - .into(), - l1_data_gas_price_fri: proto - .l1_data_gas_price_fri - .ok_or_else(|| ProtoError::missing_field::("l1_data_gas_price_fri"))? - .into(), - l2_gas_price_fri: proto - .l2_gas_price_fri - .ok_or_else(|| ProtoError::missing_field::("l2_gas_price_fri"))? - .into(), - l2_gas_used: proto - .l2_gas_used - .ok_or_else(|| ProtoError::missing_field::("l2_gas_used"))? - .into(), - l1_da_mode: L1DataAvailabilityMode::from_proto(proto.l1_da_mode)?, - }) - } - - fn to_proto(&self) -> Result { - Ok(Self::Proto { - block_number: self.height.block_number, - fork_id: self.height.fork_id, - parent_commitment: Some(self.parent_commitment.to_proto()?), - builder: Some(self.builder.to_proto()?), - timestamp: self.timestamp, - protocol_version: self.protocol_version.clone(), - old_state_root: Some(self.old_state_root.to_proto()?), - state_diff_commitment: Some(self.state_diff_commitment.to_proto()?), - transaction_commitment: Some(self.transaction_commitment.to_proto()?), - event_commitment: Some(self.event_commitment.to_proto()?), - receipt_commitment: Some(self.receipt_commitment.to_proto()?), - concatenated_counts: Some(self.concatenated_counts.to_proto()?), - l1_gas_price_fri: Some(self.l1_gas_price_fri.into()), - l1_data_gas_price_fri: Some(self.l1_data_gas_price_fri.into()), - l2_gas_price_fri: Some(self.l2_gas_price_fri.into()), - l2_gas_used: Some(self.l2_gas_used.into()), - l1_da_mode: self.l1_da_mode.to_proto()?, - }) - } -} +// impl Protobuf for ProposalCommitment { +// type Proto = p2p_proto::ProposalCommitment; +// +// fn from_proto(proto: Self::Proto) -> Result { +// Ok(Self { +// height: Height::new(proto.block_number, proto.fork_id), +// parent_commitment: Hash::from_proto( +// proto +// .parent_commitment +// .ok_or_else(|| ProtoError::missing_field::("parent_commitment"))?, +// )?, +// builder: Address::from_proto( +// proto +// .builder +// .ok_or_else(|| ProtoError::missing_field::("builder"))?, +// )?, +// timestamp: proto.timestamp, +// protocol_version: proto.protocol_version, +// old_state_root: Hash::from_proto( +// proto +// .old_state_root +// .ok_or_else(|| ProtoError::missing_field::("old_state_root"))?, +// )?, +// state_diff_commitment: Hash::from_proto(proto.state_diff_commitment.ok_or_else( +// || ProtoError::missing_field::("state_diff_commitment"), +// )?)?, +// transaction_commitment: Hash::from_proto(proto.transaction_commitment.ok_or_else( +// || ProtoError::missing_field::("transaction_commitment"), +// )?)?, +// event_commitment: Hash::from_proto( +// proto +// .event_commitment +// .ok_or_else(|| ProtoError::missing_field::("event_commitment"))?, +// )?, +// receipt_commitment: Hash::from_proto( +// proto.receipt_commitment.ok_or_else(|| { +// ProtoError::missing_field::("receipt_commitment") +// })?, +// )?, +// concatenated_counts: Felt::from_proto( +// proto.concatenated_counts.ok_or_else(|| { +// ProtoError::missing_field::("concatenated_counts") +// })?, +// )?, +// l1_gas_price_fri: proto +// .l1_gas_price_fri +// .ok_or_else(|| ProtoError::missing_field::("l1_gas_price_fri"))? +// .into(), +// l1_data_gas_price_fri: proto +// .l1_data_gas_price_fri +// .ok_or_else(|| ProtoError::missing_field::("l1_data_gas_price_fri"))? +// .into(), +// l2_gas_price_fri: proto +// .l2_gas_price_fri +// .ok_or_else(|| ProtoError::missing_field::("l2_gas_price_fri"))? +// .into(), +// l2_gas_used: proto +// .l2_gas_used +// .ok_or_else(|| ProtoError::missing_field::("l2_gas_used"))? +// .into(), +// l1_da_mode: L1DataAvailabilityMode::from_proto(proto.l1_da_mode)?, +// }) +// } +// +// fn to_proto(&self) -> Result { +// Ok(Self::Proto { +// block_number: self.height.block_number, +// fork_id: self.height.fork_id, +// parent_commitment: Some(self.parent_commitment.to_proto()?), +// builder: Some(self.builder.to_proto()?), +// timestamp: self.timestamp, +// protocol_version: self.protocol_version.clone(), +// old_state_root: Some(self.old_state_root.to_proto()?), +// state_diff_commitment: Some(self.state_diff_commitment.to_proto()?), +// transaction_commitment: Some(self.transaction_commitment.to_proto()?), +// event_commitment: Some(self.event_commitment.to_proto()?), +// receipt_commitment: Some(self.receipt_commitment.to_proto()?), +// concatenated_counts: Some(self.concatenated_counts.to_proto()?), +// l1_gas_price_fri: Some(self.l1_gas_price_fri.into()), +// l1_data_gas_price_fri: Some(self.l1_data_gas_price_fri.into()), +// l2_gas_price_fri: Some(self.l2_gas_price_fri.into()), +// l2_gas_used: Some(self.l2_gas_used.into()), +// l1_da_mode: self.l1_da_mode.to_proto()?, +// }) +// } +// } diff --git a/code/crates/starknet/p2p-types/src/proposal_part.rs b/code/crates/starknet/p2p-types/src/proposal_part.rs index be4140e02..8d38b5384 100644 --- a/code/crates/starknet/p2p-types/src/proposal_part.rs +++ b/code/crates/starknet/p2p-types/src/proposal_part.rs @@ -3,7 +3,7 @@ use malachitebft_core_types::Round; use malachitebft_proto as proto; use malachitebft_starknet_p2p_proto::{self as p2p_proto}; -use crate::{Address, BlockInfo, Hash, Height, ProposalCommitment, TransactionBatch}; +use crate::{Address, BlockInfo, Hash, Height, TransactionBatch}; #[derive(Clone, Debug, PartialEq, Eq)] pub struct ProposalInit { @@ -23,7 +23,7 @@ pub enum ProposalPart { Init(ProposalInit), BlockInfo(BlockInfo), Transactions(TransactionBatch), - Commitment(Box), + // Commitment(Box), Fin(ProposalFin), } @@ -32,7 +32,7 @@ pub enum PartType { Init, BlockInfo, Transactions, - ProposalCommitment, + // ProposalCommitment, Fin, } @@ -42,7 +42,7 @@ impl ProposalPart { Self::Init(_) => PartType::Init, Self::BlockInfo(_) => PartType::BlockInfo, Self::Transactions(_) => PartType::Transactions, - Self::Commitment(_) => PartType::ProposalCommitment, + // Self::Commitment(_) => PartType::ProposalCommitment, Self::Fin(_) => PartType::Fin, } } @@ -86,13 +86,13 @@ impl ProposalPart { } } - pub fn as_commitment(&self) -> Option<&ProposalCommitment> { - if let Self::Commitment(v) = self { - Some(v) - } else { - None - } - } + // pub fn as_commitment(&self) -> Option<&ProposalCommitment> { + // if let Self::Commitment(v) = self { + // Some(v) + // } else { + // None + // } + // } pub fn as_fin(&self) -> Option<&ProposalFin> { if let Self::Fin(v) = self { @@ -108,14 +108,14 @@ impl proto::Protobuf for ProposalPart { #[cfg_attr(coverage_nightly, coverage(off))] fn from_proto(proto: Self::Proto) -> Result { - use p2p_proto::proposal_part::Messages; + use p2p_proto::proposal_part::Message; let message = proto - .messages - .ok_or_else(|| proto::Error::missing_field::("messages"))?; + .message + .ok_or_else(|| proto::Error::missing_field::("message"))?; Ok(match message { - Messages::Init(init) => ProposalPart::Init(ProposalInit { + Message::Init(init) => ProposalPart::Init(ProposalInit { height: Height::new(init.height, 0), round: Round::new(init.round), valid_round: init.valid_round.into(), @@ -125,20 +125,19 @@ impl proto::Protobuf for ProposalPart { )?, }), - Messages::BlockInfo(block_info) => { + Message::BlockInfo(block_info) => { ProposalPart::BlockInfo(BlockInfo::from_proto(block_info)?) } - Messages::Transactions(txes) => { + Message::Transactions(txes) => { let transactions = TransactionBatch::from_proto(txes)?; ProposalPart::Transactions(transactions) } - Messages::Commitment(commitment) => { - ProposalPart::Commitment(Box::new(ProposalCommitment::from_proto(commitment)?)) - } - - Messages::Fin(fin) => ProposalPart::Fin(ProposalFin { + // Message::Commitment(commitment) => { + // ProposalPart::Commitment(Box::new(ProposalCommitment::from_proto(commitment)?)) + // } + Message::Fin(fin) => ProposalPart::Fin(ProposalFin { proposal_commitment_hash: Hash::from_proto(fin.proposal_commitment.ok_or_else( || proto::Error::missing_field::("proposal_commitment"), )?)?, @@ -148,18 +147,18 @@ impl proto::Protobuf for ProposalPart { #[cfg_attr(coverage_nightly, coverage(off))] fn to_proto(&self) -> Result { - use p2p_proto::proposal_part::Messages; + use p2p_proto::proposal_part::Message; let message = match self { - ProposalPart::Init(init) => Messages::Init(p2p_proto::ProposalInit { + ProposalPart::Init(init) => Message::Init(p2p_proto::ProposalInit { height: init.height.block_number, round: init.round.as_u32().expect("round should not be nil"), valid_round: init.valid_round.as_u32(), proposer: Some(init.proposer.to_proto()?), }), - ProposalPart::BlockInfo(block_info) => Messages::BlockInfo(block_info.to_proto()?), + ProposalPart::BlockInfo(block_info) => Message::BlockInfo(block_info.to_proto()?), ProposalPart::Transactions(txes) => { - Messages::Transactions(p2p_proto::TransactionBatch { + Message::Transactions(p2p_proto::TransactionBatch { transactions: txes .as_slice() .iter() @@ -167,14 +166,14 @@ impl proto::Protobuf for ProposalPart { .collect::, _>>()?, }) } - ProposalPart::Commitment(commitment) => Messages::Commitment(commitment.to_proto()?), - ProposalPart::Fin(fin) => Messages::Fin(p2p_proto::ProposalFin { + // ProposalPart::Commitment(commitment) => Message::Commitment(commitment.to_proto()?), + ProposalPart::Fin(fin) => Message::Fin(p2p_proto::ProposalFin { proposal_commitment: Some(fin.proposal_commitment_hash.to_proto()?), }), }; Ok(p2p_proto::ProposalPart { - messages: Some(message), + message: Some(message), }) } } diff --git a/code/crates/starknet/p2p-types/src/vote.rs b/code/crates/starknet/p2p-types/src/vote.rs index e1d54a923..382fc20ef 100644 --- a/code/crates/starknet/p2p-types/src/vote.rs +++ b/code/crates/starknet/p2p-types/src/vote.rs @@ -60,7 +60,8 @@ impl proto::Protobuf for Vote { Ok(Self { vote_type, - height: Height::new(proto.block_number, proto.fork_id), + // height: Height::new(proto.block_number, proto.fork_id), + height: Height::new(proto.height, 0), round: Round::new(proto.round), block_hash: match proto.block_hash { Some(block_hash) => NilOrVal::Val(BlockHash::from_proto(block_hash)?), @@ -78,8 +79,9 @@ impl proto::Protobuf for Vote { fn to_proto(&self) -> Result { Ok(Self::Proto { vote_type: common_to_proto_vote_type(self.vote_type).into(), - block_number: self.height.block_number, - fork_id: self.height.fork_id, + height: self.height.block_number, + // block_number: self.height.block_number, + // fork_id: self.height.fork_id, round: self.round.as_u32().expect("round should not be nil"), block_hash: match &self.block_hash { NilOrVal::Nil => None, From 1f297dbfd9ff395bc82440e597f3787acc085959 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Mon, 17 Mar 2025 11:45:59 +0100 Subject: [PATCH 12/54] Fix handling of sha256 topic hashes --- code/crates/network/src/channel.rs | 13 ++++++++----- code/crates/network/src/lib.rs | 14 +++++++------- code/crates/test/mempool/src/behaviour.rs | 4 ++-- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/code/crates/network/src/channel.rs b/code/crates/network/src/channel.rs index f21833c06..ce1f5798d 100644 --- a/code/crates/network/src/channel.rs +++ b/code/crates/network/src/channel.rs @@ -50,11 +50,14 @@ impl Channel { } pub fn from_gossipsub_topic_hash(topic: &gossipsub::TopicHash) -> Option { - match topic.as_str() { - "consensus_votes" => Some(Channel::Consensus), - "consensus_proposals" => Some(Channel::ProposalParts), - "sync" => Some(Channel::Sync), - _ => None, + if topic == &Self::Consensus.to_gossipsub_topic().hash() { + Some(Self::Consensus) + } else if topic == &Self::ProposalParts.to_gossipsub_topic().hash() { + Some(Self::ProposalParts) + } else if topic == &Self::Sync.to_gossipsub_topic().hash() { + Some(Self::Sync) + } else { + None } } diff --git a/code/crates/network/src/lib.rs b/code/crates/network/src/lib.rs index 9a5cc1efb..c6446e49c 100644 --- a/code/crates/network/src/lib.rs +++ b/code/crates/network/src/lib.rs @@ -515,23 +515,23 @@ async fn handle_gossipsub_event( _state: &mut State, tx_event: &mpsc::Sender, ) -> ControlFlow<()> { - match event { + match dbg!(event) { gossipsub::Event::Subscribed { peer_id, topic } => { - if !Channel::has_gossipsub_topic(&topic) { + let Some(channel) = Channel::from_gossipsub_topic_hash(&topic) else { trace!("Peer {peer_id} tried to subscribe to unknown topic: {topic}"); return ControlFlow::Continue(()); - } + }; - trace!("Peer {peer_id} subscribed to {topic}"); + trace!("Peer {peer_id} subscribed to {channel}"); } gossipsub::Event::Unsubscribed { peer_id, topic } => { - if !Channel::has_gossipsub_topic(&topic) { + let Some(channel) = Channel::from_gossipsub_topic_hash(&topic) else { trace!("Peer {peer_id} tried to unsubscribe from unknown topic: {topic}"); return ControlFlow::Continue(()); - } + }; - trace!("Peer {peer_id} unsubscribed from {topic}"); + trace!("Peer {peer_id} unsubscribed from {channel}"); } gossipsub::Event::Message { diff --git a/code/crates/test/mempool/src/behaviour.rs b/code/crates/test/mempool/src/behaviour.rs index 371ab1636..9b9b1126c 100644 --- a/code/crates/test/mempool/src/behaviour.rs +++ b/code/crates/test/mempool/src/behaviour.rs @@ -30,7 +30,7 @@ fn message_id(message: &gossipsub::Message) -> gossipsub::MessageId { } fn gossipsub_config() -> gossipsub::Config { - dbg!(gossipsub::ConfigBuilder::default() + gossipsub::ConfigBuilder::default() .protocol_id_prefix("/meshsub") .max_transmit_size(MAX_TRANSMIT_SIZE) .opportunistic_graft_ticks(3) @@ -44,7 +44,7 @@ fn gossipsub_config() -> gossipsub::Config { .mesh_n(3) .message_id_fn(message_id) .build() - .unwrap()) + .unwrap() } impl Behaviour { From 5259eab137a0a7209fa0945d422d4bd47e6f4673 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Mon, 17 Mar 2025 16:04:44 +0100 Subject: [PATCH 13/54] Fix last compatibility issues - Use `starknet_api`'s `ContractAddress` type for addresses - Propose empty blocks - Fix `BlockInfo` proposal part to match the sequencer's version - Add validator address in genesis and private key file --- code/Cargo.lock | 2044 ++++++++++++++++- code/Cargo.toml | 1 + code/crates/engine/src/network.rs | 4 + code/crates/network/src/lib.rs | 2 +- .../crates/starknet/host/src/host/proposal.rs | 140 +- code/crates/starknet/host/src/node.rs | 33 +- code/crates/starknet/host/src/spawn.rs | 2 +- .../proto/p2p/proto/consensus/consensus.proto | 2 +- code/crates/starknet/p2p-types/Cargo.toml | 1 + code/crates/starknet/p2p-types/src/address.rs | 43 +- .../starknet/p2p-types/src/block_info.rs | 15 +- code/crates/starknet/p2p-types/src/context.rs | 2 +- .../starknet/p2p-types/src/validator.rs | 4 +- .../test/mbt/src/tests/streaming/utils.rs | 11 +- code/crates/starknet/test/src/lib.rs | 9 +- .../test/cli/src/cmd/distributed_testnet.rs | 2 +- code/crates/test/cli/src/cmd/testnet.rs | 2 +- code/sn/0/config/config.toml | 91 + code/sn/0/config/genesis.json | 28 + code/sn/0/config/priv_validator_key.json | 14 + code/sn/1/config/config.toml | 93 + code/sn/1/config/genesis.json | 22 + code/sn/1/config/priv_validator_key.json | 11 + 23 files changed, 2336 insertions(+), 240 deletions(-) create mode 100644 code/sn/0/config/config.toml create mode 100644 code/sn/0/config/genesis.json create mode 100644 code/sn/0/config/priv_validator_key.json create mode 100644 code/sn/1/config/config.toml create mode 100644 code/sn/1/config/genesis.json create mode 100644 code/sn/1/config/priv_validator_key.json diff --git a/code/Cargo.lock b/code/Cargo.lock index 258aa6350..6998e6fbd 100644 --- a/code/Cargo.lock +++ b/code/Cargo.lock @@ -172,12 +172,226 @@ version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.2", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.98", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.2", +] + +[[package]] +name = "ark-secp256k1" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bd211c48debd3037b48873a7aa22c3aba034e83388aa4124795c9f220b88c7" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-secp256r1" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf8be5820de567729bfa73a410ddd07cec8ad102d9a4bf61fd6b2e60db264e8" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + [[package]] name = "arrayref" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "ascii-canvas" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1e3e699d84ab1b0911a1010c5c106aa34ae89aeac103be5ce0c3859db1e891" +dependencies = [ + "term", +] + [[package]] name = "asn1-rs" version = "0.6.2" @@ -202,7 +416,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", "synstructure", ] @@ -214,9 +428,15 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + [[package]] name = "async-channel" version = "2.3.1" @@ -267,7 +487,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -278,7 +498,7 @@ checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -423,6 +643,40 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "serde", + "unty", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitflags" version = "1.3.2" @@ -435,6 +689,18 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "blake2" version = "0.10.6" @@ -482,46 +748,632 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn", + "syn 2.0.98", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bstr" +version = "1.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +dependencies = [ + "serde", +] + +[[package]] +name = "bytesize" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2c12f985c78475a6b8d629afd0c360260ef34cfef52efccdcfd31972f81c2e" +dependencies = [ + "serde", +] + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "cairo-lang-casm" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99b3c953c0321df1d7ce9101c7a94e2d4007aa8c3362ee96be54bbe77916ef60" +dependencies = [ + "cairo-lang-utils", + "indoc", + "num-bigint", + "num-traits", + "parity-scale-codec", + "serde", +] + +[[package]] +name = "cairo-lang-compiler" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cd5bec42d0c4e9f1ac6c373c177c98c73a760fabb4066757edd32ef9db467e" +dependencies = [ + "anyhow", + "cairo-lang-defs", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-lowering", + "cairo-lang-parser", + "cairo-lang-project", + "cairo-lang-semantic", + "cairo-lang-sierra", + "cairo-lang-sierra-generator", + "cairo-lang-syntax", + "cairo-lang-utils", + "indoc", + "rayon", + "rust-analyzer-salsa", + "semver", + "smol_str", + "thiserror 2.0.11", +] + +[[package]] +name = "cairo-lang-debug" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea55d64b6e7aa9186bb65ca32f50f386d6518d467930e53fcf47658dec74a2e" +dependencies = [ + "cairo-lang-utils", +] + +[[package]] +name = "cairo-lang-defs" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093146c748e95400230a40dc6171ac192399484addd96c6ac70ec36b0a2e45b0" +dependencies = [ + "cairo-lang-debug", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-parser", + "cairo-lang-syntax", + "cairo-lang-utils", + "itertools 0.14.0", + "rust-analyzer-salsa", + "smol_str", +] + +[[package]] +name = "cairo-lang-diagnostics" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c85890af7f0d0b6e0d15686e0a5169d3396e2861cb3adac3c594f82ae5ed42c" +dependencies = [ + "cairo-lang-debug", + "cairo-lang-filesystem", + "cairo-lang-utils", + "itertools 0.14.0", +] + +[[package]] +name = "cairo-lang-eq-solver" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a54937f1baca684547159af847ba5332ec8015de442878b8e4d6dbbaeec714c" +dependencies = [ + "cairo-lang-utils", + "good_lp", +] + +[[package]] +name = "cairo-lang-filesystem" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e07492644cfa43e50cfc334a80c12c9e4d8e2a4248b3d2240301c99a025010a" +dependencies = [ + "cairo-lang-debug", + "cairo-lang-utils", + "path-clean", + "rust-analyzer-salsa", + "semver", + "serde", + "smol_str", + "toml", +] + +[[package]] +name = "cairo-lang-formatter" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c26c988d6b522c45b5f70add3808fcae13c921822d1c48724c394b450adcf7f9" +dependencies = [ + "anyhow", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-parser", + "cairo-lang-syntax", + "cairo-lang-utils", + "diffy", + "ignore", + "itertools 0.14.0", + "rust-analyzer-salsa", + "serde", + "thiserror 2.0.11", +] + +[[package]] +name = "cairo-lang-lowering" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90577e4dc391e2384041763120618ed2017a8f709f20dfcaa2c1246f908dd374" +dependencies = [ + "bincode 1.3.3", + "cairo-lang-debug", + "cairo-lang-defs", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-parser", + "cairo-lang-proc-macros", + "cairo-lang-semantic", + "cairo-lang-syntax", + "cairo-lang-utils", + "id-arena", + "itertools 0.14.0", + "log", + "num-bigint", + "num-integer", + "num-traits", + "rust-analyzer-salsa", + "serde", + "smol_str", +] + +[[package]] +name = "cairo-lang-parser" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b7985c0ee345ead0e0f713474ec6490e3fac80c3c3889ab9e67b1588d30337" +dependencies = [ + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-primitive-token", + "cairo-lang-syntax", + "cairo-lang-syntax-codegen", + "cairo-lang-utils", + "colored", + "itertools 0.14.0", + "num-bigint", + "num-traits", + "rust-analyzer-salsa", + "smol_str", + "unescaper", +] + +[[package]] +name = "cairo-lang-plugins" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "697772ca0b096e36cb98cfc9b1231b115a15eebf8ac7295f7b50252f5a1e6aea" +dependencies = [ + "cairo-lang-defs", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-parser", + "cairo-lang-syntax", + "cairo-lang-utils", + "indent", + "indoc", + "itertools 0.14.0", + "rust-analyzer-salsa", + "smol_str", +] + +[[package]] +name = "cairo-lang-primitive-token" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "123ac0ecadf31bacae77436d72b88fa9caef2b8e92c89ce63a125ae911a12fae" + +[[package]] +name = "cairo-lang-proc-macros" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23a956924e4f53cb1b69a7cee4758f0bcf50e23bbb8769f632625956a574f736" +dependencies = [ + "cairo-lang-debug", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "cairo-lang-project" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "088f29ca8d06722bd92001d098b619a25979dcbfa5face7a6de5d8c7232f0454" +dependencies = [ + "cairo-lang-filesystem", + "cairo-lang-utils", + "serde", + "thiserror 2.0.11", + "toml", +] + +[[package]] +name = "cairo-lang-runnable-utils" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b63a8fe2e8f2ae6280392bcc8ab98b981db75832b16c98974b81978d3d1b26" +dependencies = [ + "cairo-lang-casm", + "cairo-lang-sierra", + "cairo-lang-sierra-ap-change", + "cairo-lang-sierra-gas", + "cairo-lang-sierra-to-casm", + "cairo-lang-sierra-type-size", + "cairo-lang-utils", + "cairo-vm", + "itertools 0.14.0", + "thiserror 2.0.11", +] + +[[package]] +name = "cairo-lang-runner" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db16efd33b13cecb1ca5b843a65f1e8e3eab4e18abf0c39522b04d741e51e7" +dependencies = [ + "ark-ff 0.5.0", + "ark-secp256k1", + "ark-secp256r1", + "cairo-lang-casm", + "cairo-lang-lowering", + "cairo-lang-runnable-utils", + "cairo-lang-sierra", + "cairo-lang-sierra-generator", + "cairo-lang-sierra-to-casm", + "cairo-lang-starknet", + "cairo-lang-utils", + "cairo-vm", + "itertools 0.14.0", + "keccak", + "num-bigint", + "num-integer", + "num-traits", + "rand 0.9.0", + "sha2 0.10.8", + "smol_str", + "starknet-types-core", + "thiserror 2.0.11", +] + +[[package]] +name = "cairo-lang-semantic" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a3d35463c096f1e3ab6830e28c762b22a7b5c3fbf0df5c2e9a265d290d22ee5" +dependencies = [ + "cairo-lang-debug", + "cairo-lang-defs", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-parser", + "cairo-lang-plugins", + "cairo-lang-proc-macros", + "cairo-lang-syntax", + "cairo-lang-test-utils", + "cairo-lang-utils", + "id-arena", + "indoc", + "itertools 0.14.0", + "num-bigint", + "num-traits", + "rust-analyzer-salsa", + "sha3", + "smol_str", + "toml", +] + +[[package]] +name = "cairo-lang-sierra" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e02d4df410965f122b67967936b722352eddbfde550883b054e019dc54beeef" +dependencies = [ + "anyhow", + "cairo-lang-utils", + "const-fnv1a-hash", + "convert_case 0.7.1", + "derivative", + "itertools 0.14.0", + "lalrpop", + "lalrpop-util", + "num-bigint", + "num-integer", + "num-traits", + "regex", + "rust-analyzer-salsa", + "serde", + "serde_json", + "sha3", + "smol_str", + "starknet-types-core", + "thiserror 2.0.11", +] + +[[package]] +name = "cairo-lang-sierra-ap-change" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c0d3be06212edb4d79be1296cd999b246d22e1541b49432db74dca16fe0c523" +dependencies = [ + "cairo-lang-eq-solver", + "cairo-lang-sierra", + "cairo-lang-sierra-type-size", + "cairo-lang-utils", + "itertools 0.14.0", + "num-bigint", + "num-traits", + "thiserror 2.0.11", +] + +[[package]] +name = "cairo-lang-sierra-gas" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7f246adb40ac69242231642cdf2571c83463068086a00b5ae9131f7dfc74b5" +dependencies = [ + "cairo-lang-eq-solver", + "cairo-lang-sierra", + "cairo-lang-sierra-type-size", + "cairo-lang-utils", + "itertools 0.14.0", + "num-bigint", + "num-traits", + "thiserror 2.0.11", +] + +[[package]] +name = "cairo-lang-sierra-generator" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2ca1fbf8d29528d5fdf6a7e3b2ccdd4f3e9b57066057c30f9bc2c3118867571" +dependencies = [ + "cairo-lang-debug", + "cairo-lang-defs", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-lowering", + "cairo-lang-parser", + "cairo-lang-semantic", + "cairo-lang-sierra", + "cairo-lang-syntax", + "cairo-lang-utils", + "itertools 0.14.0", + "num-traits", + "rust-analyzer-salsa", + "serde", + "serde_json", + "smol_str", +] + +[[package]] +name = "cairo-lang-sierra-to-casm" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbb42e872cff7d050d2348978e2f12a94b4b29aee6f5ba5a7eca76a5294c900" +dependencies = [ + "assert_matches", + "cairo-lang-casm", + "cairo-lang-sierra", + "cairo-lang-sierra-ap-change", + "cairo-lang-sierra-gas", + "cairo-lang-sierra-type-size", + "cairo-lang-utils", + "indoc", + "itertools 0.14.0", + "num-bigint", + "num-traits", + "starknet-types-core", + "thiserror 2.0.11", +] + +[[package]] +name = "cairo-lang-sierra-type-size" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8217d84f5434c36c68f54b5bbac9c91ff981a3738f2e6bc51b102f5beae3fd8" +dependencies = [ + "cairo-lang-sierra", + "cairo-lang-utils", +] + +[[package]] +name = "cairo-lang-starknet" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70aca831fef1f41b29c5e62a464a8ddd7964ed2414d3dafb6e1530bff1ae3cbd" +dependencies = [ + "anyhow", + "cairo-lang-compiler", + "cairo-lang-defs", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-lowering", + "cairo-lang-plugins", + "cairo-lang-semantic", + "cairo-lang-sierra", + "cairo-lang-sierra-generator", + "cairo-lang-starknet-classes", + "cairo-lang-syntax", + "cairo-lang-utils", + "const_format", + "indent", + "indoc", + "itertools 0.14.0", + "serde", + "serde_json", + "smol_str", + "starknet-types-core", + "thiserror 2.0.11", +] + +[[package]] +name = "cairo-lang-starknet-classes" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e9b59bb3d46e68730266b27e3f0ad524c076eebab1bcc9352256a8957d6b88" +dependencies = [ + "cairo-lang-casm", + "cairo-lang-sierra", + "cairo-lang-sierra-to-casm", + "cairo-lang-utils", + "convert_case 0.7.1", + "itertools 0.14.0", + "num-bigint", + "num-integer", + "num-traits", + "serde", + "serde_json", + "sha3", + "smol_str", + "starknet-types-core", + "thiserror 2.0.11", ] [[package]] -name = "bs58" -version = "0.5.1" +name = "cairo-lang-syntax" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +checksum = "686aea0cd9730af809010a74c0a8583b3acb99a08e5f97a07ed205f37b9e75ae" dependencies = [ - "tinyvec", + "cairo-lang-debug", + "cairo-lang-filesystem", + "cairo-lang-primitive-token", + "cairo-lang-utils", + "num-bigint", + "num-traits", + "rust-analyzer-salsa", + "serde", + "smol_str", + "unescaper", ] [[package]] -name = "bumpalo" -version = "3.17.0" +name = "cairo-lang-syntax-codegen" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "ef844093fbe46c1e2ead60316591f5be2d3e4b8fad93194a7302a8bb977328ab" +dependencies = [ + "genco", + "xshell", +] [[package]] -name = "byteorder" -version = "1.5.0" +name = "cairo-lang-test-utils" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "199eb0e7ac78ba7dfbf6551ab7eab14dd45fdcf21675fd5472ca695dc6da96f1" +dependencies = [ + "cairo-lang-formatter", + "cairo-lang-utils", + "colored", + "log", + "pretty_assertions", +] [[package]] -name = "bytes" -version = "1.10.0" +name = "cairo-lang-utils" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "e621368454b62603ae035d04864770a70952e6ca8341b78c1ac50a0088939e3f" dependencies = [ + "hashbrown 0.15.2", + "indexmap 2.7.1", + "itertools 0.14.0", + "num-bigint", + "num-traits", + "schemars", "serde", ] [[package]] -name = "bytesize" -version = "1.3.2" +name = "cairo-vm" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2c12f985c78475a6b8d629afd0c360260ef34cfef52efccdcfd31972f81c2e" +checksum = "7fa8b4b56ee66cebcade4d85128e55b2bfdf046502187aeaa8c2768a427684dc" dependencies = [ + "anyhow", + "bincode 2.0.1", + "bitvec", + "generic-array", + "hashbrown 0.14.5", + "hex", + "keccak", + "lazy_static", + "nom", + "num-bigint", + "num-integer", + "num-prime", + "num-traits", + "rand 0.8.5", + "rust_decimal", "serde", + "serde_json", + "sha2 0.10.8", + "sha3", + "starknet-crypto 0.6.2", + "starknet-types-core", + "thiserror-no-std", + "zip", ] [[package]] @@ -576,6 +1428,8 @@ version = "1.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -694,10 +1548,10 @@ version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -739,6 +1593,15 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "colored" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -760,12 +1623,59 @@ dependencies = [ "toml", ] +[[package]] +name = "const-fnv1a-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" + [[package]] name = "const-oid" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "convert_case" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -941,7 +1851,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -978,7 +1888,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.98", ] [[package]] @@ -989,7 +1899,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -1029,7 +1939,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18e4fdb82bd54a12e42fb58a800dcae6b9e13982238ce2296dc3570b92148e1f" dependencies = [ "data-encoding", - "syn", + "syn 2.0.98", ] [[package]] @@ -1067,6 +1977,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "derive-where" version = "1.2.7" @@ -1075,7 +1996,20 @@ checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", +] + +[[package]] +name = "derive_more" +version = "0.99.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" +dependencies = [ + "convert_case 0.4.0", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.98", ] [[package]] @@ -1084,6 +2018,15 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" +[[package]] +name = "diffy" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b545b8c50194bdd008283985ab0b31dba153cfd5b3066a92770634fbc0d7d291" +dependencies = [ + "nu-ansi-term 0.50.1", +] + [[package]] name = "digest" version = "0.9.0" @@ -1134,7 +2077,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -1143,6 +2086,12 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +[[package]] +name = "dyn-clone" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" + [[package]] name = "ecdsa" version = "0.16.9" @@ -1197,6 +2146,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "either" version = "1.13.0" @@ -1223,16 +2184,45 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ena" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + [[package]] name = "enum-as-inner" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn", + "syn 2.0.98", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] @@ -1304,12 +2294,30 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fixedbitset" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + [[package]] name = "flate2" version = "1.0.35" @@ -1341,6 +2349,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.31" @@ -1418,7 +2432,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -1483,6 +2497,28 @@ version = "0.99.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b32dfe1fdfc0bbde1f22a5da25355514b5e450c33a6af6770884c8750aedfbc" +[[package]] +name = "genco" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a35958104272e516c2a5f66a9d82fba4784d2b585fc1e2358b8f96e15d342995" +dependencies = [ + "genco-macros", + "relative-path", + "smallvec", +] + +[[package]] +name = "genco-macros" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43eaff6bbc0b3a878361aced5ec6a2818ee7c541c5b33b5880dfa9a86c23e9e7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "generator" version = "0.8.4" @@ -1554,6 +2590,29 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +[[package]] +name = "globset" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "good_lp" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ada2d4e8d3e6fb80d007479bbcf318882e65c21798c6587a693dffcf271e3f3e" +dependencies = [ + "fnv", + "microlp", +] + [[package]] name = "group" version = "0.13.0" @@ -1607,6 +2666,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", + "allocator-api2", + "serde", ] [[package]] @@ -1618,6 +2679,7 @@ dependencies = [ "allocator-api2", "equivalent", "foldhash", + "serde", ] [[package]] @@ -1629,6 +2691,12 @@ dependencies = [ "hashbrown 0.14.5", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "heck" version = "0.5.0" @@ -1727,6 +2795,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "hostname" version = "0.3.1" @@ -1989,9 +3066,15 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + [[package]] name = "ident_case" version = "1.0.1" @@ -2053,25 +3136,76 @@ dependencies = [ ] [[package]] -name = "igd-next" -version = "0.15.1" +name = "igd-next" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76b0d7d4541def58a37bf8efc559683f21edce7c82f0d866c93ac21f7e098f93" +dependencies = [ + "async-trait", + "attohttpc", + "bytes", + "futures", + "http 1.2.0", + "http-body-util", + "hyper", + "hyper-util", + "log", + "rand 0.8.5", + "tokio", + "url", + "xmltree", +] + +[[package]] +name = "ignore" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.9", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "indent" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b0d7d4541def58a37bf8efc559683f21edce7c82f0d866c93ac21f7e098f93" -dependencies = [ - "async-trait", - "attohttpc", - "bytes", - "futures", - "http 1.2.0", - "http-body-util", - "hyper", - "hyper-util", - "log", - "rand 0.8.5", - "tokio", - "url", - "xmltree", -] +checksum = "d9f1a0777d972970f204fdf8ef319f1f4f8459131636d7e3c96c5d59570d0fa6" [[package]] name = "indenter" @@ -2101,6 +3235,12 @@ dependencies = [ "serde", ] +[[package]] +name = "indoc" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + [[package]] name = "informalsystems-malachitebft-app" version = "0.0.1" @@ -2437,7 +3577,8 @@ dependencies = [ "serde", "sha3", "starknet-core", - "starknet-crypto", + "starknet-crypto 0.7.4", + "starknet_api", ] [[package]] @@ -2721,6 +3862,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -2730,6 +3880,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itf" version = "0.2.4" @@ -2749,6 +3908,15 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.77" @@ -2768,6 +3936,38 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "lalrpop" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7047a26de42016abf8f181b46b398aef0b77ad46711df41847f6ed869a2a1d5b" +dependencies = [ + "ascii-canvas", + "bit-set", + "ena", + "itertools 0.14.0", + "lalrpop-util", + "petgraph 0.7.1", + "pico-args", + "regex", + "regex-syntax 0.8.5", + "sha3", + "string_cache", + "term", + "unicode-xid", + "walkdir", +] + +[[package]] +name = "lalrpop-util" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d05b3fe34b8bd562c338db725dfa9beb9451a48f65f129ccb9538b48d2c93b" +dependencies = [ + "regex-automata 0.4.9", + "rustversion", +] + [[package]] name = "lambdaworks-crypto" version = "0.10.0" @@ -2795,6 +3995,9 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin 0.9.8", +] [[package]] name = "libc" @@ -2999,7 +4202,7 @@ dependencies = [ "smallvec", "thiserror 2.0.11", "tracing", - "uint", + "uint 0.10.0", "web-time", ] @@ -3166,10 +4369,10 @@ version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206e0aa0ebe004d778d79fb0966aa0de996c19894e2c0605ba2f8524dd4443d8" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -3327,12 +4530,32 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "matrixmultiply" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +dependencies = [ + "autocfg", + "rawpointer", +] + [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "microlp" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d1790c73b93164ff65868f63164497cb32339458a9297e17e212d91df62258" +dependencies = [ + "log", + "sprs", +] + [[package]] name = "mime" version = "0.3.17" @@ -3454,6 +4677,21 @@ dependencies = [ "unsigned-varint 0.7.2", ] +[[package]] +name = "ndarray" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", +] + [[package]] name = "netlink-packet-core" version = "0.7.0" @@ -3518,6 +4756,12 @@ dependencies = [ "tokio", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.26.4" @@ -3576,6 +4820,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "nu-ansi-term" +version = "0.50.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -3584,9 +4837,19 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", + "rand 0.8.5", "serde", ] +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -3602,6 +4865,33 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-modular" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a5fe11d4135c3bcdf3a95b18b194afa9608a5f6ff034f5d857bc9a27fb0119" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-prime" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e238432a7881ec7164503ccc516c014bf009be7984cde1ba56837862543bdec3" +dependencies = [ + "bitvec", + "either", + "lru", + "num-bigint", + "num-integer", + "num-modular", + "num-traits", + "rand 0.8.5", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -3687,6 +4977,34 @@ dependencies = [ "sha2 0.10.8", ] +[[package]] +name = "parity-scale-codec" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "parking" version = "2.2.1" @@ -3716,18 +5034,47 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "path-clean" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17359afc20d7ab31fdb42bb844c8b3bb1dabd7dcf7e68428492da7f16966fcef" + [[package]] name = "pathdiff" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", + "hmac", + "password-hash", + "sha2 0.10.8", +] + [[package]] name = "pem" version = "3.0.4" @@ -3759,10 +5106,35 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ - "fixedbitset", + "fixedbitset 0.4.2", + "indexmap 2.7.1", +] + +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset 0.5.7", "indexmap 2.7.1", ] +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + [[package]] name = "pin-project" version = "1.1.9" @@ -3780,7 +5152,7 @@ checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -3805,6 +5177,12 @@ dependencies = [ "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "plotters" version = "0.3.7" @@ -3877,6 +5255,15 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -3892,6 +5279,12 @@ dependencies = [ "zerocopy 0.7.35", ] +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "pretty_assertions" version = "1.4.1" @@ -3909,7 +5302,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.98", ] [[package]] @@ -3921,6 +5314,27 @@ dependencies = [ "elliptic-curve", ] +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-serde", + "uint 0.9.5", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro2" version = "1.0.93" @@ -3950,7 +5364,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -3969,17 +5383,17 @@ version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" dependencies = [ - "heck", - "itertools 0.10.5", + "heck 0.5.0", + "itertools 0.13.0", "log", "multimap", "once_cell", - "petgraph", + "petgraph 0.6.5", "prettyplease", "prost", "prost-types", "regex", - "syn", + "syn 2.0.98", "tempfile", ] @@ -3990,10 +5404,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.13.0", "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -4044,7 +5458,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", + "rustc-hash 2.1.1", "rustls", "socket2", "thiserror 2.0.11", @@ -4062,7 +5476,7 @@ dependencies = [ "getrandom 0.2.15", "rand 0.8.5", "ring 0.17.8", - "rustc-hash", + "rustc-hash 2.1.1", "rustls", "rustls-pki-types", "slab", @@ -4106,11 +5520,17 @@ dependencies = [ "dashmap", "futures", "once_cell", - "strum", + "strum 0.26.3", "tokio", "tracing", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -4172,6 +5592,12 @@ dependencies = [ "zerocopy 0.8.17", ] +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + [[package]] name = "rayon" version = "1.10.0" @@ -4277,6 +5703,12 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + [[package]] name = "resolv-conf" version = "0.7.0" @@ -4331,18 +5763,57 @@ dependencies = [ name = "rtnetlink" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a552eb82d19f38c3beed3f786bd23aa434ceb9ac43ab44419ca6d67a7e186c0" +checksum = "7a552eb82d19f38c3beed3f786bd23aa434ceb9ac43ab44419ca6d67a7e186c0" +dependencies = [ + "futures", + "log", + "netlink-packet-core", + "netlink-packet-route", + "netlink-packet-utils", + "netlink-proto", + "netlink-sys", + "nix 0.26.4", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "rust-analyzer-salsa" +version = "0.17.0-pre.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719825638c59fd26a55412a24561c7c5bcf54364c88b9a7a04ba08a6eafaba8d" +dependencies = [ + "indexmap 2.7.1", + "lock_api", + "oorandom", + "parking_lot", + "rust-analyzer-salsa-macros", + "rustc-hash 1.1.0", + "smallvec", + "tracing", + "triomphe", +] + +[[package]] +name = "rust-analyzer-salsa-macros" +version = "0.17.0-pre.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d96498e9684848c6676c399032ebc37c52da95ecbefa83d71ccc53b9f8a4a8e" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "rust_decimal" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" dependencies = [ - "futures", - "log", - "netlink-packet-core", - "netlink-packet-route", - "netlink-packet-utils", - "netlink-proto", - "netlink-sys", - "nix 0.26.4", - "thiserror 1.0.69", - "tokio", + "arrayvec", + "num-traits", ] [[package]] @@ -4351,12 +5822,24 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc-hash" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + [[package]] name = "rustc_version" version = "0.4.1" @@ -4464,6 +5947,31 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.98", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -4522,7 +6030,18 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] @@ -4621,7 +6140,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -4633,7 +6152,18 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.98", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", ] [[package]] @@ -4704,6 +6234,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" @@ -4719,6 +6255,15 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + [[package]] name = "snow" version = "0.9.6" @@ -4768,6 +6313,18 @@ dependencies = [ "der", ] +[[package]] +name = "sprs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bff8419009a08f6cb7519a602c5590241fbff1446bcc823c07af15386eb801b" +dependencies = [ + "ndarray", + "num-complex", + "num-traits", + "smallvec", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -4789,10 +6346,30 @@ dependencies = [ "serde_json_pythonic", "serde_with 2.3.3", "sha3", - "starknet-crypto", + "starknet-crypto 0.7.4", "starknet-types-core", ] +[[package]] +name = "starknet-crypto" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e2c30c01e8eb0fc913c4ee3cf676389fffc1d1182bfe5bb9670e4e72e968064" +dependencies = [ + "crypto-bigint", + "hex", + "hmac", + "num-bigint", + "num-integer", + "num-traits", + "rfc6979", + "sha2 0.10.8", + "starknet-crypto-codegen", + "starknet-curve 0.4.2", + "starknet-ff", + "zeroize", +] + [[package]] name = "starknet-crypto" version = "0.7.4" @@ -4807,11 +6384,31 @@ dependencies = [ "num-traits", "rfc6979", "sha2 0.10.8", - "starknet-curve", + "starknet-curve 0.5.1", "starknet-types-core", "zeroize", ] +[[package]] +name = "starknet-crypto-codegen" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc159a1934c7be9761c237333a57febe060ace2bc9e3b337a59a37af206d19f" +dependencies = [ + "starknet-curve 0.4.2", + "starknet-ff", + "syn 2.0.98", +] + +[[package]] +name = "starknet-curve" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c383518bb312751e4be80f53e8644034aa99a0afb29d7ac41b89a997db875b" +dependencies = [ + "starknet-ff", +] + [[package]] name = "starknet-curve" version = "0.5.1" @@ -4821,6 +6418,18 @@ dependencies = [ "starknet-types-core", ] +[[package]] +name = "starknet-ff" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abf1b44ec5b18d87c1ae5f54590ca9d0699ef4dd5b2ffa66fc97f24613ec585" +dependencies = [ + "ark-ff 0.4.2", + "crypto-bigint", + "getrandom 0.2.15", + "hex", +] + [[package]] name = "starknet-types-core" version = "0.1.7" @@ -4829,31 +6438,91 @@ checksum = "fa1b9e01ccb217ab6d475c5cda05dbb22c30029f7bb52b192a010a00d77a3d74" dependencies = [ "lambdaworks-crypto", "lambdaworks-math", + "lazy_static", "num-bigint", "num-integer", "num-traits", "serde", ] +[[package]] +name = "starknet_api" +version = "0.14.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04a4abb49dfcddf92cc54c0f89725183999bbaae2133e446e7f4be93f65c4d58" +dependencies = [ + "bitvec", + "cairo-lang-runner", + "cairo-lang-starknet-classes", + "derive_more", + "hex", + "indexmap 2.7.1", + "itertools 0.12.1", + "num-bigint", + "num-traits", + "pretty_assertions", + "primitive-types", + "semver", + "serde", + "serde_json", + "sha3", + "starknet-crypto 0.7.4", + "starknet-types-core", + "strum 0.25.0", + "strum_macros 0.25.3", + "thiserror 1.0.69", +] + [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "string_cache" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "938d512196766101d333398efde81bc1f37b00cb42c2f8350e5df639f040bbbe" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" + [[package]] name = "strum" version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros", + "strum_macros 0.26.4", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.98", ] [[package]] @@ -4862,11 +6531,11 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.98", ] [[package]] @@ -4881,6 +6550,17 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.98" @@ -4906,7 +6586,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -4950,6 +6630,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" version = "3.16.0" @@ -4964,6 +6650,16 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "term" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3bb6001afcea98122260987f8b7b5da969ecad46dbf0b5453702f776b491a41" +dependencies = [ + "home", + "windows-sys 0.52.0", +] + [[package]] name = "testdir" version = "0.9.3" @@ -5005,7 +6701,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -5016,7 +6712,27 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", +] + +[[package]] +name = "thiserror-impl-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e6318948b519ba6dc2b442a6d0b904ebfb8d411a3ad3e07843615a72249758" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "thiserror-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ad459d94dd517257cc96add8a43190ee620011bb6e6cdc82dafd97dfafafea" +dependencies = [ + "thiserror-impl-no-std", ] [[package]] @@ -5142,7 +6858,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -5252,7 +6968,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -5303,7 +7019,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", - "nu-ansi-term", + "nu-ansi-term 0.46.0", "once_cell", "regex", "serde", @@ -5317,6 +7033,16 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "triomphe" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" +dependencies = [ + "serde", + "stable_deref_trait", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -5339,6 +7065,18 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "uint" version = "0.10.0" @@ -5351,12 +7089,33 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unescaper" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c878a167baa8afd137494101a688ef8c67125089ff2249284bd2b5f9bfedb815" +dependencies = [ + "thiserror 1.0.69", +] + [[package]] name = "unicode-ident" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "universal-hash" version = "0.5.1" @@ -5391,6 +7150,12 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + [[package]] name = "url" version = "2.5.4" @@ -5503,7 +7268,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.98", "wasm-bindgen-shared", ] @@ -5525,7 +7290,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5667,7 +7432,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -5678,7 +7443,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -5897,6 +7662,15 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "x25519-dalek" version = "2.0.1" @@ -5941,6 +7715,21 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "xshell" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e7290c623014758632efe00737145b6867b66292c42167f2ec381eb566a373d" +dependencies = [ + "xshell-macros", +] + +[[package]] +name = "xshell-macros" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32ac00cd3f8ec9c1d33fb3e7958a82df6989c42d747bd326c822b1d625283547" + [[package]] name = "yamux" version = "0.12.1" @@ -6007,7 +7796,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", "synstructure", ] @@ -6038,7 +7827,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -6049,7 +7838,7 @@ checksum = "06718a168365cad3d5ff0bb133aad346959a2074bd4a85c121255a11304a8626" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -6069,7 +7858,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", "synstructure", ] @@ -6090,7 +7879,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", ] [[package]] @@ -6112,5 +7901,54 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.98", +] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.14+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" +dependencies = [ + "cc", + "pkg-config", ] diff --git a/code/Cargo.toml b/code/Cargo.toml index 9f72edb9a..1c8a6edb0 100644 --- a/code/Cargo.toml +++ b/code/Cargo.toml @@ -101,6 +101,7 @@ malachitebft-starknet-p2p-proto = { version = "0.0.1", package = "informalsystem malachitebft-starknet-p2p-types = { version = "0.0.1", package = "informalsystems-malachitebft-starknet-p2p-types", path = "crates/starknet/p2p-types" } # Starknet +starknet_api = "0.14.0-rc.3" starknet-core = "0.11.1" starknet-crypto = "0.7.3" diff --git a/code/crates/engine/src/network.rs b/code/crates/engine/src/network.rs index 8f41ffcce..a053c202d 100644 --- a/code/crates/engine/src/network.rs +++ b/code/crates/engine/src/network.rs @@ -329,6 +329,8 @@ where } Msg::NewEvent(Event::Message(Channel::Consensus, from, data)) => { + tracing::debug!(%from, "Received consensus message: {data:?}"); + let msg = match self.codec.decode(data) { Ok(msg) => msg, Err(e) => { @@ -348,6 +350,8 @@ where } Msg::NewEvent(Event::Message(Channel::ProposalParts, from, data)) => { + tracing::debug!(%from, "Received proposal part: {data:?}"); + let msg: StreamMessage = match self.codec.decode(data) { Ok(stream_msg) => stream_msg, Err(e) => { diff --git a/code/crates/network/src/lib.rs b/code/crates/network/src/lib.rs index c6446e49c..5b950ff04 100644 --- a/code/crates/network/src/lib.rs +++ b/code/crates/network/src/lib.rs @@ -515,7 +515,7 @@ async fn handle_gossipsub_event( _state: &mut State, tx_event: &mpsc::Sender, ) -> ControlFlow<()> { - match dbg!(event) { + match event { gossipsub::Event::Subscribed { peer_id, topic } => { let Some(channel) = Channel::from_gossipsub_topic_hash(&topic) else { trace!("Peer {peer_id} tried to subscribe to unknown topic: {topic}"); diff --git a/code/crates/starknet/host/src/host/proposal.rs b/code/crates/starknet/host/src/host/proposal.rs index 74d8ed32f..d707d3f0d 100644 --- a/code/crates/starknet/host/src/host/proposal.rs +++ b/code/crates/starknet/host/src/host/proposal.rs @@ -1,4 +1,4 @@ -#![allow(clippy::too_many_arguments)] +#![allow(unused_imports, clippy::too_many_arguments)] use std::sync::Arc; use std::time::SystemTime; @@ -45,6 +45,7 @@ pub async fn build_proposal_task( } } +#[allow(unused_variables, unused_mut)] async fn run_build_proposal_task( height: Height, round: Round, @@ -52,7 +53,7 @@ async fn run_build_proposal_task( _private_key: PrivateKey, params: StarknetParams, deadline: Instant, - mempool: MempoolRef, + _mempool: MempoolRef, tx_part: mpsc::Sender, tx_value_id: oneshot::Sender, ) -> Result<(), Box> { @@ -86,11 +87,10 @@ async fn run_build_proposal_task( height, builder: proposer, timestamp: now, - l1_gas_price_wei: 0, - l1_data_gas_price_wei: 0, - l2_gas_price_fri: 0, - // eth_to_strk_rate: 0, - eth_to_fri_rate: 0, + l1_gas_price_wei: 1, + l1_data_gas_price_wei: 1, + l2_gas_price_fri: 100000, + eth_to_strk_rate: 1, l1_da_mode: L1DataAvailabilityMode::Blob, }); @@ -98,68 +98,68 @@ async fn run_build_proposal_task( sequence += 1; } - let max_block_size = params.max_block_size.as_u64() as usize; - - 'reap: loop { - let reaped_txes = mempool - .call( - |reply| MempoolMsg::Reap { - height: height.as_u64(), - num_txes: params.txs_per_part, - reply, - }, - Some(build_duration), - ) - .await? - .success_or(eyre!("Failed to reap transactions from the mempool"))?; - - trace!("Reaped {} transactions from the mempool", reaped_txes.len()); - - if reaped_txes.is_empty() { - break 'reap; - } - - let mut txes = Vec::new(); - let mut tx_count = 0; - - 'txes: for tx in reaped_txes { - if block_size + tx.size_bytes() > max_block_size { - continue 'txes; - } - - block_size += tx.size_bytes(); - tx_count += 1; - - txes.push(tx); - } - - block_tx_count += tx_count; - - let exec_time = params.exec_time_per_tx * tx_count as u32; - tokio::time::sleep(exec_time).await; - - trace!( - %sequence, - "Created a tx batch with {tx_count} tx-es of size {} in {:?}", - ByteSize::b(block_size as u64), - start.elapsed() - ); - - // Transactions - { - let part = ProposalPart::Transactions(TransactionBatch::new(txes)); - tx_part.send(part).await?; - sequence += 1; - } - - if block_size > max_block_size { - trace!("Max block size reached, stopping tx generation"); - break 'reap; - } else if start.elapsed() > build_duration { - trace!("Time allowance exceeded, stopping tx generation"); - break 'reap; - } - } + // let max_block_size = params.max_block_size.as_u64() as usize; + // + // 'reap: loop { + // let reaped_txes = mempool + // .call( + // |reply| MempoolMsg::Reap { + // height: height.as_u64(), + // num_txes: params.txs_per_part, + // reply, + // }, + // Some(build_duration), + // ) + // .await? + // .success_or(eyre!("Failed to reap transactions from the mempool"))?; + // + // trace!("Reaped {} transactions from the mempool", reaped_txes.len()); + // + // if reaped_txes.is_empty() { + // break 'reap; + // } + // + // let mut txes = Vec::new(); + // let mut tx_count = 0; + // + // 'txes: for tx in reaped_txes { + // if block_size + tx.size_bytes() > max_block_size { + // continue 'txes; + // } + // + // block_size += tx.size_bytes(); + // tx_count += 1; + // + // txes.push(tx); + // } + // + // block_tx_count += tx_count; + // + // let exec_time = params.exec_time_per_tx * tx_count as u32; + // tokio::time::sleep(exec_time).await; + // + // trace!( + // %sequence, + // "Created a tx batch with {tx_count} tx-es of size {} in {:?}", + // ByteSize::b(block_size as u64), + // start.elapsed() + // ); + // + // // Transactions + // { + // let part = ProposalPart::Transactions(TransactionBatch::new(txes)); + // tx_part.send(part).await?; + // sequence += 1; + // } + // + // if block_size > max_block_size { + // trace!("Max block size reached, stopping tx generation"); + // break 'reap; + // } else if start.elapsed() > build_duration { + // trace!("Time allowance exceeded, stopping tx generation"); + // break 'reap; + // } + // } // // Proposal Commitment // { @@ -187,7 +187,7 @@ async fn run_build_proposal_task( // } // TODO: Compute the actual propoosal commitment hash - let proposal_commitment_hash = Hash::new([42; 32]); + let proposal_commitment_hash = Hash::new([0; 32]); // Fin { diff --git a/code/crates/starknet/host/src/node.rs b/code/crates/starknet/host/src/node.rs index d52ed0bda..406474dc9 100644 --- a/code/crates/starknet/host/src/node.rs +++ b/code/crates/starknet/host/src/node.rs @@ -33,10 +33,9 @@ pub struct PrivateKeyFile { pub address: Address, } -impl From for PrivateKeyFile { - fn from(private_key: PrivateKey) -> Self { +impl PrivateKeyFile { + pub fn new(address: Address, private_key: PrivateKey) -> Self { let public_key = private_key.public_key(); - let address = Address::from_public_key(public_key); Self { private_key, @@ -119,7 +118,8 @@ impl Node for StarknetNode { } fn get_address(&self, pk: &PublicKey) -> Address { - Address::from_public_key(*pk) + let genesis = self.load_genesis().unwrap(); + genesis.validator_set.get_by_public_key(pk).unwrap().address } fn get_public_key(&self, pk: &PrivateKey) -> PublicKey { @@ -155,6 +155,7 @@ impl Node for StarknetNode { let _enter = span.enter(); let priv_key_file = self.load_private_key_file()?; + let address = priv_key_file.address; let private_key = self.load_private_key(priv_key_file); let genesis = self.load_genesis()?; let tx_event = TxEvent::new(); @@ -166,6 +167,7 @@ impl Node for StarknetNode { self.home_dir.clone(), genesis.validator_set, private_key, + address, start_height, tx_event.clone(), span.clone(), @@ -196,15 +198,18 @@ impl CanGeneratePrivateKey for StarknetNode { impl CanMakePrivateKeyFile for StarknetNode { fn make_private_key_file(&self, private_key: PrivateKey) -> Self::PrivateKeyFile { - PrivateKeyFile::from(private_key) + let public_key = self.get_public_key(&private_key); + let address = self.get_address(&public_key); + PrivateKeyFile::new(address, private_key) } } impl CanMakeGenesis for StarknetNode { fn make_genesis(&self, validators: Vec<(PublicKey, VotingPower)>) -> Self::Genesis { - let validators = validators - .into_iter() - .map(|(pk, vp)| Validator::new(pk, vp)); + let validators = validators.into_iter().enumerate().map(|(i, (pk, vp))| { + let address = Address::from(0x64 + i as u64); + Validator::new(address, pk, vp) + }); let validator_set = ValidatorSet::new(validators); @@ -456,12 +461,12 @@ fn test_starknet_node() { let pub_keys = priv_keys.iter().map(|pk| node.get_public_key(pk)).collect(); let genesis = new::generate_genesis(&node, pub_keys, true); - file::save_priv_validator_key( - &node, - &node.private_key_file(), - &PrivateKeyFile::from(priv_keys[0].clone()), - ) - .unwrap(); + // file::save_priv_validator_key( + // &node, + // &node.private_key_file(), + // &PrivateKeyFile::from(priv_keys[0].clone()), + // ) + // .unwrap(); file::save_genesis(&node, &node.genesis_file(), &genesis).unwrap(); diff --git a/code/crates/starknet/host/src/spawn.rs b/code/crates/starknet/host/src/spawn.rs index 40c4b1890..211e162ac 100644 --- a/code/crates/starknet/host/src/spawn.rs +++ b/code/crates/starknet/host/src/spawn.rs @@ -36,6 +36,7 @@ pub async fn spawn_node_actor( home_dir: PathBuf, initial_validator_set: ValidatorSet, private_key: PrivateKey, + address: Address, start_height: Option, tx_event: TxEvent, span: tracing::Span, @@ -46,7 +47,6 @@ pub async fn spawn_node_actor( let registry = SharedRegistry::global().with_moniker(cfg.moniker.as_str()); let metrics = Metrics::register(®istry); - let address = Address::from_public_key(private_key.public_key()); let signing_provider = Ed25519Provider::new(private_key.clone()); // Spawn mempool and its gossip layer diff --git a/code/crates/starknet/p2p-proto/proto/p2p/proto/consensus/consensus.proto b/code/crates/starknet/p2p-proto/proto/p2p/proto/consensus/consensus.proto index b9154cf1d..38729e354 100644 --- a/code/crates/starknet/p2p-proto/proto/p2p/proto/consensus/consensus.proto +++ b/code/crates/starknet/p2p-proto/proto/p2p/proto/consensus/consensus.proto @@ -58,7 +58,7 @@ message BlockInfo { Uint128 l2_gas_price_fri = 5; Uint128 l1_gas_price_wei = 6; Uint128 l1_data_gas_price_wei = 7; - Uint128 eth_to_fri_rate = 8; + uint64 eth_to_strk_rate = 8; } message TransactionBatch { diff --git a/code/crates/starknet/p2p-types/Cargo.toml b/code/crates/starknet/p2p-types/Cargo.toml index e87192c7d..ccdcb78fd 100644 --- a/code/crates/starknet/p2p-types/Cargo.toml +++ b/code/crates/starknet/p2p-types/Cargo.toml @@ -13,6 +13,7 @@ malachitebft-proto.workspace = true malachitebft-starknet-p2p-proto.workspace = true malachitebft-signing-ed25519 = { workspace = true, features = ["serde", "rand"] } +starknet_api.workspace = true starknet-core.workspace = true starknet-crypto.workspace = true diff --git a/code/crates/starknet/p2p-types/src/address.rs b/code/crates/starknet/p2p-types/src/address.rs index 37cf08beb..18b7d7ae4 100644 --- a/code/crates/starknet/p2p-types/src/address.rs +++ b/code/crates/starknet/p2p-types/src/address.rs @@ -1,42 +1,40 @@ use bytes::Bytes; use core::fmt; use serde::{Deserialize, Serialize}; +use starknet_api::core::{ContractAddress, PatriciaKey}; use malachitebft_proto::{Error as ProtoError, Protobuf}; use malachitebft_starknet_p2p_proto as p2p_proto; -use crate::PublicKey; +use crate::Felt; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] #[serde(transparent)] -pub struct Address(PublicKey); +pub struct Address(ContractAddress); impl Address { - #[cfg_attr(coverage_nightly, coverage(off))] - pub fn new(bytes: [u8; 32]) -> Self { - Self::from_public_key(PublicKey::from_bytes(bytes)) + pub fn new(address: ContractAddress) -> Self { + Self(address) } +} - #[cfg_attr(coverage_nightly, coverage(off))] - pub fn from_public_key(public_key: PublicKey) -> Self { - Self(public_key) +impl From for Address { + fn from(address: u64) -> Self { + Self(ContractAddress::from(address)) } } impl fmt::Display for Address { #[cfg_attr(coverage_nightly, coverage(off))] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - for byte in self.0.as_bytes().iter() { - write!(f, "{:02X}", byte)?; - } - Ok(()) + self.0.fmt(f) } } impl fmt::Debug for Address { #[cfg_attr(coverage_nightly, coverage(off))] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "Address({})", self) + write!(f, "Address({})", self.0) } } @@ -46,21 +44,24 @@ impl Protobuf for Address { type Proto = p2p_proto::Address; fn from_proto(proto: Self::Proto) -> Result { + let mut felt = [0; 32]; if proto.elements.len() != 32 { - return Err(ProtoError::Other(format!( - "Invalid address length: expected 32, got {}", - proto.elements.len() - ))); + return Err(ProtoError::invalid_data::("elements")); } - let mut bytes = [0; 32]; - bytes.copy_from_slice(&proto.elements); - Ok(Address::new(bytes)) + felt.copy_from_slice(&proto.elements); + + let hash = Felt::from_bytes_be(&felt); + if let Ok(stark_felt) = PatriciaKey::try_from(hash) { + Ok(Self(ContractAddress(stark_felt))) + } else { + Err(ProtoError::invalid_data::("elements")) + } } fn to_proto(&self) -> Result { Ok(p2p_proto::Address { - elements: Bytes::copy_from_slice(self.0.as_bytes().as_slice()), + elements: Bytes::from(self.0.key().to_bytes_be().to_vec()), }) } } diff --git a/code/crates/starknet/p2p-types/src/block_info.rs b/code/crates/starknet/p2p-types/src/block_info.rs index 99f42c492..98d7c71ea 100644 --- a/code/crates/starknet/p2p-types/src/block_info.rs +++ b/code/crates/starknet/p2p-types/src/block_info.rs @@ -12,8 +12,7 @@ pub struct BlockInfo { pub l1_gas_price_wei: u128, pub l1_data_gas_price_wei: u128, pub l2_gas_price_fri: u128, - // pub eth_to_strk_rate: u128, - pub eth_to_fri_rate: u128, + pub eth_to_strk_rate: u64, pub l1_da_mode: L1DataAvailabilityMode, } @@ -41,14 +40,7 @@ impl Protobuf for BlockInfo { .l2_gas_price_fri .ok_or_else(|| ProtoError::missing_field::("l2_gas_price_fri"))? .into(), - // eth_to_strk_rate: proto - // .eth_to_strk_rate - // .ok_or_else(|| ProtoError::missing_field::("eth_to_strk_rate"))? - // .into(), - eth_to_fri_rate: proto - .eth_to_fri_rate - .ok_or_else(|| ProtoError::missing_field::("eth_to_fri_rate"))? - .into(), + eth_to_strk_rate: proto.eth_to_strk_rate, l1_da_mode: L1DataAvailabilityMode::from_proto(proto.l1_da_mode)?, }) } @@ -63,8 +55,7 @@ impl Protobuf for BlockInfo { l2_gas_price_fri: Some(self.l2_gas_price_fri.into()), l1_gas_price_wei: Some(self.l1_gas_price_wei.into()), l1_data_gas_price_wei: Some(self.l1_data_gas_price_wei.into()), - // eth_to_strk_rate: Some(self.eth_to_strk_rate.into()), - eth_to_fri_rate: Some(self.eth_to_fri_rate.into()), + eth_to_strk_rate: self.eth_to_strk_rate, l1_da_mode: self.l1_da_mode.to_proto()?, }) } diff --git a/code/crates/starknet/p2p-types/src/context.rs b/code/crates/starknet/p2p-types/src/context.rs index 070a42b9f..d628a1cbc 100644 --- a/code/crates/starknet/p2p-types/src/context.rs +++ b/code/crates/starknet/p2p-types/src/context.rs @@ -42,7 +42,7 @@ impl Context for MockContext { let height = height.as_u64() as usize; let round = round.as_i64() as usize; - (height + round + 1) % validator_set.count() + (height + round) % validator_set.count() }; validator_set diff --git a/code/crates/starknet/p2p-types/src/validator.rs b/code/crates/starknet/p2p-types/src/validator.rs index 0de8d1c7e..83a2e3683 100644 --- a/code/crates/starknet/p2p-types/src/validator.rs +++ b/code/crates/starknet/p2p-types/src/validator.rs @@ -13,9 +13,9 @@ pub struct Validator { impl Validator { #[cfg_attr(coverage_nightly, coverage(off))] - pub fn new(public_key: PublicKey, voting_power: VotingPower) -> Self { + pub fn new(address: Address, public_key: PublicKey, voting_power: VotingPower) -> Self { Self { - address: Address::from_public_key(public_key), + address, public_key, voting_power, } diff --git a/code/crates/starknet/test/mbt/src/tests/streaming/utils.rs b/code/crates/starknet/test/mbt/src/tests/streaming/utils.rs index 6f60ac163..2f6631743 100644 --- a/code/crates/starknet/test/mbt/src/tests/streaming/utils.rs +++ b/code/crates/starknet/test/mbt/src/tests/streaming/utils.rs @@ -4,7 +4,7 @@ use crate::streaming::{Buffer, Message}; use malachitebft_core_types::Round; use malachitebft_engine::util::streaming::{Sequence, StreamId}; use malachitebft_engine::util::streaming::{StreamContent, StreamMessage}; -use malachitebft_starknet_host::types::{PrivateKey, TransactionBatch}; +use malachitebft_starknet_host::types::TransactionBatch; use malachitebft_starknet_host::{ streaming::MinHeap, types::{Address, Height, ProposalInit, ProposalPart, Transaction}, @@ -73,14 +73,7 @@ pub fn init_message_to_proposal_init(message: &Option) -> Option ProposalInit { - let bytes: [u8; 32] = [ - 0x08, 0xd7, 0xa2, 0x0f, 0x32, 0x0c, 0x4d, 0x23, 0xd9, 0xad, 0xf3, 0x29, 0xf5, 0x7c, 0x7b, - 0x62, 0x35, 0x9d, 0x97, 0xce, 0x0b, 0xb3, 0xb7, 0x66, 0x19, 0xd8, 0x50, 0x4d, 0x59, 0xa1, - 0x88, 0x4b, - ]; - let private_key = PrivateKey::from(bytes); - - let proposer_addr = Address::new(*private_key.public_key().as_bytes()); + let proposer_addr = Address::from(0x65); let height = Height { block_number: 1, diff --git a/code/crates/starknet/test/src/lib.rs b/code/crates/starknet/test/src/lib.rs index 3dd6c9528..5a860b344 100644 --- a/code/crates/starknet/test/src/lib.rs +++ b/code/crates/starknet/test/src/lib.rs @@ -10,7 +10,9 @@ use rand::rngs::StdRng; use rand::SeedableRng; use malachitebft_starknet_host::node::{ConfigSource, Handle, StarknetNode}; -use malachitebft_starknet_host::types::{Height, MockContext, PrivateKey, Validator, ValidatorSet}; +use malachitebft_starknet_host::types::{ + Address, Height, MockContext, PrivateKey, Validator, ValidatorSet, +}; use malachitebft_test_framework::HasTestRunner; use malachitebft_test_framework::{NodeRunner, TestNode}; @@ -210,9 +212,10 @@ fn make_validators( let mut validators = Vec::new(); let mut private_keys = HashMap::new(); - for node in nodes { + for (i, node) in nodes.iter().enumerate() { let sk = PrivateKey::generate(&mut rng); - let val = Validator::new(sk.public_key(), node.voting_power); + let address = Address::from(0x64 + i as u64); + let val = Validator::new(address, sk.public_key(), node.voting_power); private_keys.insert(node.id, sk); diff --git a/code/crates/test/cli/src/cmd/distributed_testnet.rs b/code/crates/test/cli/src/cmd/distributed_testnet.rs index 48ef1e8bb..95c3f933e 100644 --- a/code/crates/test/cli/src/cmd/distributed_testnet.rs +++ b/code/crates/test/cli/src/cmd/distributed_testnet.rs @@ -178,7 +178,7 @@ where &N::make_distributed_config(i, nodes, machines.clone(), bootstrap_set_size, settings), )?; - let priv_validator_key = node.make_private_key_file((*private_key).clone()); + let priv_validator_key = node.make_private_key_file(private_key.clone()); save_priv_validator_key( node, &args.get_priv_validator_key_file_path()?, diff --git a/code/crates/test/cli/src/cmd/testnet.rs b/code/crates/test/cli/src/cmd/testnet.rs index f83a2daea..8f94c9121 100644 --- a/code/crates/test/cli/src/cmd/testnet.rs +++ b/code/crates/test/cli/src/cmd/testnet.rs @@ -179,7 +179,7 @@ where )?; // Save private key - let priv_validator_key = node.make_private_key_file((*private_key).clone()); + let priv_validator_key = node.make_private_key_file(private_key.clone()); save_priv_validator_key( node, &args.get_priv_validator_key_file_path()?, diff --git a/code/sn/0/config/config.toml b/code/sn/0/config/config.toml new file mode 100644 index 000000000..a16fad3ae --- /dev/null +++ b/code/sn/0/config/config.toml @@ -0,0 +1,91 @@ +moniker = "test-0" + +[logging] +log_level = "debug" +log_format = "plaintext" + +[consensus] +timeout_propose = "3s" +timeout_propose_delta = "500ms" +timeout_prevote = "1s" +timeout_prevote_delta = "500ms" +timeout_precommit = "1s" +timeout_precommit_delta = "500ms" +timeout_commit = "0s" +timeout_step = "30s" + +[consensus.p2p] +listen_addr = "/ip4/127.0.0.1/tcp/27000" +persistent_peers = ["/ip4/127.0.0.1/tcp/27001"] +transport = "tcp" +pubsub_max_size = "4.2 MB" +rpc_max_size = "10.5 MB" + +[consensus.p2p.discovery] +enabled = false +bootstrap_protocol = "full" +selector = "random" +num_outbound_peers = 20 +num_inbound_peers = 20 +ephemeral_connection_timeout = "5s" + +[consensus.p2p.protocol] +type = "gossipsub" +mesh_n = 6 +mesh_n_high = 12 +mesh_n_low = 4 +mesh_outbound_min = 2 + +[consensus.vote_sync] +mode = "request-response" + +[mempool] +max_tx_count = 10000 +gossip_batch_size = 0 + +[mempool.p2p] +listen_addr = "/ip4/127.0.0.1/tcp/28000" +persistent_peers = ["/ip4/127.0.0.1/tcp/28001"] +transport = "tcp" +pubsub_max_size = "4.2 MB" +rpc_max_size = "10.5 MB" + +[mempool.p2p.discovery] +enabled = false +bootstrap_protocol = "full" +selector = "random" +num_outbound_peers = 20 +num_inbound_peers = 20 +ephemeral_connection_timeout = "5s" + +[mempool.p2p.protocol] +type = "gossipsub" +mesh_n = 6 +mesh_n_high = 12 +mesh_n_low = 4 +mesh_outbound_min = 2 + +[value_sync] +enabled = true +status_update_interval = "10s" +request_timeout = "10s" + +[metrics] +enabled = true +listen_addr = "127.0.0.1:29000" + +[runtime] +flavor = "single_threaded" + +[test] +max_block_size = "0 KB" +value_payload = "parts-only" +tx_size = "1.0 KB" +txs_per_part = 256 +time_allowance_factor = 0.5 +exec_time_per_tx = "1ms" +max_retain_blocks = 1000 + +[test.vote_extensions] +enabled = false +size = "0 B" diff --git a/code/sn/0/config/genesis.json b/code/sn/0/config/genesis.json new file mode 100644 index 000000000..7fc2d2f90 --- /dev/null +++ b/code/sn/0/config/genesis.json @@ -0,0 +1,28 @@ +{ + "validator_set": { + "validators": [ + { + "address": { + "type": "tendermint/PubKeyEd25519", + "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" + }, + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" + }, + "voting_power": 1 + }, + { + "address": { + "type": "tendermint/PubKeyEd25519", + "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" + }, + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" + }, + "voting_power": 1 + } + ] + } +} \ No newline at end of file diff --git a/code/sn/0/config/priv_validator_key.json b/code/sn/0/config/priv_validator_key.json new file mode 100644 index 000000000..f746cd51d --- /dev/null +++ b/code/sn/0/config/priv_validator_key.json @@ -0,0 +1,14 @@ +{ + "private_key": { + "type": "tendermint/PrivKeyEd25519", + "value": "moMNWOA0BSeCVSWk9KYukIMUYCCX8JRB67dYROWSllo=" + }, + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" + }, + "address": { + "type": "tendermint/PubKeyEd25519", + "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" + } +} \ No newline at end of file diff --git a/code/sn/1/config/config.toml b/code/sn/1/config/config.toml new file mode 100644 index 000000000..d0556e2cb --- /dev/null +++ b/code/sn/1/config/config.toml @@ -0,0 +1,93 @@ +moniker = "test-1" + +[logging] +log_level = "debug" +log_format = "plaintext" + +[consensus] +value_payload = "parts-only" + +timeout_propose = "10s" +timeout_propose_delta = "500ms" +timeout_prevote = "5s" +timeout_prevote_delta = "500ms" +timeout_precommit = "5s" +timeout_precommit_delta = "500ms" +timeout_commit = "0s" +timeout_step = "300s" + +[consensus.p2p] +listen_addr = "/ip4/127.0.0.1/tcp/27001" +persistent_peers = ["/ip4/127.0.0.1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz"] +transport = "tcp" +pubsub_max_size = "4.2 MB" +rpc_max_size = "10.5 MB" + +[consensus.p2p.discovery] +enabled = false +bootstrap_protocol = "kademlia" +selector = "random" +num_outbound_peers = 1 +num_inbound_peers = 1 +ephemeral_connection_timeout = "5s" +connect_request_max_retries = 10000 + +[consensus.p2p.protocol] +type = "gossipsub" +mesh_n = 6 +mesh_n_high = 12 +mesh_n_low = 4 +mesh_outbound_min = 2 + +[consensus.vote_sync] +mode = "rebroadcast" + +[mempool] +max_tx_count = 10000 +gossip_batch_size = 0 + +[mempool.p2p] +listen_addr = "/ip4/127.0.0.1/tcp/28001" +persistent_peers = [] +transport = "tcp" +pubsub_max_size = "4.2 MB" +rpc_max_size = "10.5 MB" + +[mempool.p2p.discovery] +enabled = false +bootstrap_protocol = "full" +selector = "random" +num_outbound_peers = 20 +num_inbound_peers = 20 +ephemeral_connection_timeout = "5s" + +[mempool.p2p.protocol] +type = "gossipsub" +mesh_n = 6 +mesh_n_high = 12 +mesh_n_low = 4 +mesh_outbound_min = 2 + +[value_sync] +enabled = true +status_update_interval = "10s" +request_timeout = "10s" + +[metrics] +enabled = true +listen_addr = "127.0.0.1:29001" + +[runtime] +flavor = "single_threaded" + +[test] +max_block_size = "1048.6 KB" +tx_size = "1.0 KB" +txs_per_part = 256 +time_allowance_factor = 0.5 +exec_time_per_tx = "1ms" +max_retain_blocks = 1000 + +[test.vote_extensions] +enabled = false +size = "0 B" diff --git a/code/sn/1/config/genesis.json b/code/sn/1/config/genesis.json new file mode 100644 index 000000000..8cffc9e29 --- /dev/null +++ b/code/sn/1/config/genesis.json @@ -0,0 +1,22 @@ +{ + "validator_set": { + "validators": [ + { + "address": "0x0000000000000000000000000000000000000000000000000000000000000065", + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" + }, + "voting_power": 1 + }, + { + "address": "0x0000000000000000000000000000000000000000000000000000000000000064", + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" + }, + "voting_power": 1 + } + ] + } +} diff --git a/code/sn/1/config/priv_validator_key.json b/code/sn/1/config/priv_validator_key.json new file mode 100644 index 000000000..e37a988b9 --- /dev/null +++ b/code/sn/1/config/priv_validator_key.json @@ -0,0 +1,11 @@ +{ + "private_key": { + "type": "tendermint/PrivKeyEd25519", + "value": "z1exB2b1hS8Ajtr/Qf/PvjD0ES/m7RoEwzaT69t2+Ow=" + }, + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" + }, + "address": "0x0000000000000000000000000000000000000000000000000000000000000065" +} From d24f676dd3214bcdbaf3490fdafa552c017112d9 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Mon, 17 Mar 2025 17:31:42 +0100 Subject: [PATCH 14/54] Remove dependency on `starknet_api` --- code/Cargo.lock | 2052 +---------------- code/Cargo.toml | 1 - code/crates/starknet/p2p-types/Cargo.toml | 1 - code/crates/starknet/p2p-types/src/address.rs | 19 +- 4 files changed, 114 insertions(+), 1959 deletions(-) diff --git a/code/Cargo.lock b/code/Cargo.lock index 6998e6fbd..49f84150a 100644 --- a/code/Cargo.lock +++ b/code/Cargo.lock @@ -172,226 +172,12 @@ version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" -[[package]] -name = "ark-ec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-poly", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.2", - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" -dependencies = [ - "ark-ff-asm 0.5.0", - "ark-ff-macros 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "educe", - "itertools 0.13.0", - "num-bigint", - "num-traits", - "paste", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" -dependencies = [ - "quote", - "syn 2.0.98", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "ark-poly" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.2", -] - -[[package]] -name = "ark-secp256k1" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bd211c48debd3037b48873a7aa22c3aba034e83388aa4124795c9f220b88c7" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-secp256r1" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cf8be5820de567729bfa73a410ddd07cec8ad102d9a4bf61fd6b2e60db264e8" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" -dependencies = [ - "ark-serialize-derive", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - [[package]] name = "arrayref" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "ascii-canvas" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1e3e699d84ab1b0911a1010c5c106aa34ae89aeac103be5ce0c3859db1e891" -dependencies = [ - "term", -] - [[package]] name = "asn1-rs" version = "0.6.2" @@ -416,7 +202,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", "synstructure", ] @@ -428,15 +214,9 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] -[[package]] -name = "assert_matches" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" - [[package]] name = "async-channel" version = "2.3.1" @@ -487,7 +267,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -498,7 +278,7 @@ checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -643,40 +423,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bincode" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" -dependencies = [ - "serde", - "unty", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - [[package]] name = "bitflags" version = "1.3.2" @@ -689,18 +435,6 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - [[package]] name = "blake2" version = "0.10.6" @@ -746,634 +480,48 @@ checksum = "2a2af3eac944c12cdf4423eab70d310da0a8e5851a18ffb192c0a5e3f7ae1663" dependencies = [ "darling", "ident_case", - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "bstr" -version = "1.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - -[[package]] -name = "byte-slice-cast" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" -dependencies = [ - "serde", -] - -[[package]] -name = "bytesize" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2c12f985c78475a6b8d629afd0c360260ef34cfef52efccdcfd31972f81c2e" -dependencies = [ - "serde", -] - -[[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.13+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "cairo-lang-casm" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b3c953c0321df1d7ce9101c7a94e2d4007aa8c3362ee96be54bbe77916ef60" -dependencies = [ - "cairo-lang-utils", - "indoc", - "num-bigint", - "num-traits", - "parity-scale-codec", - "serde", -] - -[[package]] -name = "cairo-lang-compiler" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8cd5bec42d0c4e9f1ac6c373c177c98c73a760fabb4066757edd32ef9db467e" -dependencies = [ - "anyhow", - "cairo-lang-defs", - "cairo-lang-diagnostics", - "cairo-lang-filesystem", - "cairo-lang-lowering", - "cairo-lang-parser", - "cairo-lang-project", - "cairo-lang-semantic", - "cairo-lang-sierra", - "cairo-lang-sierra-generator", - "cairo-lang-syntax", - "cairo-lang-utils", - "indoc", - "rayon", - "rust-analyzer-salsa", - "semver", - "smol_str", - "thiserror 2.0.11", -] - -[[package]] -name = "cairo-lang-debug" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea55d64b6e7aa9186bb65ca32f50f386d6518d467930e53fcf47658dec74a2e" -dependencies = [ - "cairo-lang-utils", -] - -[[package]] -name = "cairo-lang-defs" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093146c748e95400230a40dc6171ac192399484addd96c6ac70ec36b0a2e45b0" -dependencies = [ - "cairo-lang-debug", - "cairo-lang-diagnostics", - "cairo-lang-filesystem", - "cairo-lang-parser", - "cairo-lang-syntax", - "cairo-lang-utils", - "itertools 0.14.0", - "rust-analyzer-salsa", - "smol_str", -] - -[[package]] -name = "cairo-lang-diagnostics" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c85890af7f0d0b6e0d15686e0a5169d3396e2861cb3adac3c594f82ae5ed42c" -dependencies = [ - "cairo-lang-debug", - "cairo-lang-filesystem", - "cairo-lang-utils", - "itertools 0.14.0", -] - -[[package]] -name = "cairo-lang-eq-solver" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a54937f1baca684547159af847ba5332ec8015de442878b8e4d6dbbaeec714c" -dependencies = [ - "cairo-lang-utils", - "good_lp", -] - -[[package]] -name = "cairo-lang-filesystem" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e07492644cfa43e50cfc334a80c12c9e4d8e2a4248b3d2240301c99a025010a" -dependencies = [ - "cairo-lang-debug", - "cairo-lang-utils", - "path-clean", - "rust-analyzer-salsa", - "semver", - "serde", - "smol_str", - "toml", -] - -[[package]] -name = "cairo-lang-formatter" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c26c988d6b522c45b5f70add3808fcae13c921822d1c48724c394b450adcf7f9" -dependencies = [ - "anyhow", - "cairo-lang-diagnostics", - "cairo-lang-filesystem", - "cairo-lang-parser", - "cairo-lang-syntax", - "cairo-lang-utils", - "diffy", - "ignore", - "itertools 0.14.0", - "rust-analyzer-salsa", - "serde", - "thiserror 2.0.11", -] - -[[package]] -name = "cairo-lang-lowering" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90577e4dc391e2384041763120618ed2017a8f709f20dfcaa2c1246f908dd374" -dependencies = [ - "bincode 1.3.3", - "cairo-lang-debug", - "cairo-lang-defs", - "cairo-lang-diagnostics", - "cairo-lang-filesystem", - "cairo-lang-parser", - "cairo-lang-proc-macros", - "cairo-lang-semantic", - "cairo-lang-syntax", - "cairo-lang-utils", - "id-arena", - "itertools 0.14.0", - "log", - "num-bigint", - "num-integer", - "num-traits", - "rust-analyzer-salsa", - "serde", - "smol_str", -] - -[[package]] -name = "cairo-lang-parser" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b7985c0ee345ead0e0f713474ec6490e3fac80c3c3889ab9e67b1588d30337" -dependencies = [ - "cairo-lang-diagnostics", - "cairo-lang-filesystem", - "cairo-lang-primitive-token", - "cairo-lang-syntax", - "cairo-lang-syntax-codegen", - "cairo-lang-utils", - "colored", - "itertools 0.14.0", - "num-bigint", - "num-traits", - "rust-analyzer-salsa", - "smol_str", - "unescaper", -] - -[[package]] -name = "cairo-lang-plugins" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697772ca0b096e36cb98cfc9b1231b115a15eebf8ac7295f7b50252f5a1e6aea" -dependencies = [ - "cairo-lang-defs", - "cairo-lang-diagnostics", - "cairo-lang-filesystem", - "cairo-lang-parser", - "cairo-lang-syntax", - "cairo-lang-utils", - "indent", - "indoc", - "itertools 0.14.0", - "rust-analyzer-salsa", - "smol_str", -] - -[[package]] -name = "cairo-lang-primitive-token" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "123ac0ecadf31bacae77436d72b88fa9caef2b8e92c89ce63a125ae911a12fae" - -[[package]] -name = "cairo-lang-proc-macros" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a956924e4f53cb1b69a7cee4758f0bcf50e23bbb8769f632625956a574f736" -dependencies = [ - "cairo-lang-debug", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "cairo-lang-project" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088f29ca8d06722bd92001d098b619a25979dcbfa5face7a6de5d8c7232f0454" -dependencies = [ - "cairo-lang-filesystem", - "cairo-lang-utils", - "serde", - "thiserror 2.0.11", - "toml", -] - -[[package]] -name = "cairo-lang-runnable-utils" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03b63a8fe2e8f2ae6280392bcc8ab98b981db75832b16c98974b81978d3d1b26" -dependencies = [ - "cairo-lang-casm", - "cairo-lang-sierra", - "cairo-lang-sierra-ap-change", - "cairo-lang-sierra-gas", - "cairo-lang-sierra-to-casm", - "cairo-lang-sierra-type-size", - "cairo-lang-utils", - "cairo-vm", - "itertools 0.14.0", - "thiserror 2.0.11", -] - -[[package]] -name = "cairo-lang-runner" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db16efd33b13cecb1ca5b843a65f1e8e3eab4e18abf0c39522b04d741e51e7" -dependencies = [ - "ark-ff 0.5.0", - "ark-secp256k1", - "ark-secp256r1", - "cairo-lang-casm", - "cairo-lang-lowering", - "cairo-lang-runnable-utils", - "cairo-lang-sierra", - "cairo-lang-sierra-generator", - "cairo-lang-sierra-to-casm", - "cairo-lang-starknet", - "cairo-lang-utils", - "cairo-vm", - "itertools 0.14.0", - "keccak", - "num-bigint", - "num-integer", - "num-traits", - "rand 0.9.0", - "sha2 0.10.8", - "smol_str", - "starknet-types-core", - "thiserror 2.0.11", -] - -[[package]] -name = "cairo-lang-semantic" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a3d35463c096f1e3ab6830e28c762b22a7b5c3fbf0df5c2e9a265d290d22ee5" -dependencies = [ - "cairo-lang-debug", - "cairo-lang-defs", - "cairo-lang-diagnostics", - "cairo-lang-filesystem", - "cairo-lang-parser", - "cairo-lang-plugins", - "cairo-lang-proc-macros", - "cairo-lang-syntax", - "cairo-lang-test-utils", - "cairo-lang-utils", - "id-arena", - "indoc", - "itertools 0.14.0", - "num-bigint", - "num-traits", - "rust-analyzer-salsa", - "sha3", - "smol_str", - "toml", -] - -[[package]] -name = "cairo-lang-sierra" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e02d4df410965f122b67967936b722352eddbfde550883b054e019dc54beeef" -dependencies = [ - "anyhow", - "cairo-lang-utils", - "const-fnv1a-hash", - "convert_case 0.7.1", - "derivative", - "itertools 0.14.0", - "lalrpop", - "lalrpop-util", - "num-bigint", - "num-integer", - "num-traits", - "regex", - "rust-analyzer-salsa", - "serde", - "serde_json", - "sha3", - "smol_str", - "starknet-types-core", - "thiserror 2.0.11", -] - -[[package]] -name = "cairo-lang-sierra-ap-change" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c0d3be06212edb4d79be1296cd999b246d22e1541b49432db74dca16fe0c523" -dependencies = [ - "cairo-lang-eq-solver", - "cairo-lang-sierra", - "cairo-lang-sierra-type-size", - "cairo-lang-utils", - "itertools 0.14.0", - "num-bigint", - "num-traits", - "thiserror 2.0.11", -] - -[[package]] -name = "cairo-lang-sierra-gas" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a7f246adb40ac69242231642cdf2571c83463068086a00b5ae9131f7dfc74b5" -dependencies = [ - "cairo-lang-eq-solver", - "cairo-lang-sierra", - "cairo-lang-sierra-type-size", - "cairo-lang-utils", - "itertools 0.14.0", - "num-bigint", - "num-traits", - "thiserror 2.0.11", -] - -[[package]] -name = "cairo-lang-sierra-generator" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ca1fbf8d29528d5fdf6a7e3b2ccdd4f3e9b57066057c30f9bc2c3118867571" -dependencies = [ - "cairo-lang-debug", - "cairo-lang-defs", - "cairo-lang-diagnostics", - "cairo-lang-filesystem", - "cairo-lang-lowering", - "cairo-lang-parser", - "cairo-lang-semantic", - "cairo-lang-sierra", - "cairo-lang-syntax", - "cairo-lang-utils", - "itertools 0.14.0", - "num-traits", - "rust-analyzer-salsa", - "serde", - "serde_json", - "smol_str", -] - -[[package]] -name = "cairo-lang-sierra-to-casm" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbb42e872cff7d050d2348978e2f12a94b4b29aee6f5ba5a7eca76a5294c900" -dependencies = [ - "assert_matches", - "cairo-lang-casm", - "cairo-lang-sierra", - "cairo-lang-sierra-ap-change", - "cairo-lang-sierra-gas", - "cairo-lang-sierra-type-size", - "cairo-lang-utils", - "indoc", - "itertools 0.14.0", - "num-bigint", - "num-traits", - "starknet-types-core", - "thiserror 2.0.11", -] - -[[package]] -name = "cairo-lang-sierra-type-size" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8217d84f5434c36c68f54b5bbac9c91ff981a3738f2e6bc51b102f5beae3fd8" -dependencies = [ - "cairo-lang-sierra", - "cairo-lang-utils", -] - -[[package]] -name = "cairo-lang-starknet" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70aca831fef1f41b29c5e62a464a8ddd7964ed2414d3dafb6e1530bff1ae3cbd" -dependencies = [ - "anyhow", - "cairo-lang-compiler", - "cairo-lang-defs", - "cairo-lang-diagnostics", - "cairo-lang-filesystem", - "cairo-lang-lowering", - "cairo-lang-plugins", - "cairo-lang-semantic", - "cairo-lang-sierra", - "cairo-lang-sierra-generator", - "cairo-lang-starknet-classes", - "cairo-lang-syntax", - "cairo-lang-utils", - "const_format", - "indent", - "indoc", - "itertools 0.14.0", - "serde", - "serde_json", - "smol_str", - "starknet-types-core", - "thiserror 2.0.11", -] - -[[package]] -name = "cairo-lang-starknet-classes" -version = "2.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e9b59bb3d46e68730266b27e3f0ad524c076eebab1bcc9352256a8957d6b88" -dependencies = [ - "cairo-lang-casm", - "cairo-lang-sierra", - "cairo-lang-sierra-to-casm", - "cairo-lang-utils", - "convert_case 0.7.1", - "itertools 0.14.0", - "num-bigint", - "num-integer", - "num-traits", - "serde", - "serde_json", - "sha3", - "smol_str", - "starknet-types-core", - "thiserror 2.0.11", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "cairo-lang-syntax" -version = "2.11.2" +name = "bs58" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686aea0cd9730af809010a74c0a8583b3acb99a08e5f97a07ed205f37b9e75ae" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "cairo-lang-debug", - "cairo-lang-filesystem", - "cairo-lang-primitive-token", - "cairo-lang-utils", - "num-bigint", - "num-traits", - "rust-analyzer-salsa", - "serde", - "smol_str", - "unescaper", + "tinyvec", ] [[package]] -name = "cairo-lang-syntax-codegen" -version = "2.11.2" +name = "bumpalo" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef844093fbe46c1e2ead60316591f5be2d3e4b8fad93194a7302a8bb977328ab" -dependencies = [ - "genco", - "xshell", -] +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] -name = "cairo-lang-test-utils" -version = "2.11.2" +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "199eb0e7ac78ba7dfbf6551ab7eab14dd45fdcf21675fd5472ca695dc6da96f1" -dependencies = [ - "cairo-lang-formatter", - "cairo-lang-utils", - "colored", - "log", - "pretty_assertions", -] +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] -name = "cairo-lang-utils" -version = "2.11.2" +name = "bytes" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e621368454b62603ae035d04864770a70952e6ca8341b78c1ac50a0088939e3f" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" dependencies = [ - "hashbrown 0.15.2", - "indexmap 2.7.1", - "itertools 0.14.0", - "num-bigint", - "num-traits", - "schemars", "serde", ] [[package]] -name = "cairo-vm" -version = "1.0.2" +name = "bytesize" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fa8b4b56ee66cebcade4d85128e55b2bfdf046502187aeaa8c2768a427684dc" +checksum = "2d2c12f985c78475a6b8d629afd0c360260ef34cfef52efccdcfd31972f81c2e" dependencies = [ - "anyhow", - "bincode 2.0.1", - "bitvec", - "generic-array", - "hashbrown 0.14.5", - "hex", - "keccak", - "lazy_static", - "nom", - "num-bigint", - "num-integer", - "num-prime", - "num-traits", - "rand 0.8.5", - "rust_decimal", "serde", - "serde_json", - "sha2 0.10.8", - "sha3", - "starknet-crypto 0.6.2", - "starknet-types-core", - "thiserror-no-std", - "zip", ] [[package]] @@ -1428,8 +576,6 @@ version = "1.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda" dependencies = [ - "jobserver", - "libc", "shlex", ] @@ -1548,10 +694,10 @@ version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -1593,15 +739,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" -[[package]] -name = "colored" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" -dependencies = [ - "windows-sys 0.59.0", -] - [[package]] name = "concurrent-queue" version = "2.5.0" @@ -1623,59 +760,12 @@ dependencies = [ "toml", ] -[[package]] -name = "const-fnv1a-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" - [[package]] name = "const-oid" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "const_format" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "convert_case" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "core-foundation" version = "0.9.4" @@ -1851,7 +941,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -1888,7 +978,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.98", + "syn", ] [[package]] @@ -1899,7 +989,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -1939,7 +1029,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18e4fdb82bd54a12e42fb58a800dcae6b9e13982238ce2296dc3570b92148e1f" dependencies = [ "data-encoding", - "syn 2.0.98", + "syn", ] [[package]] @@ -1977,17 +1067,6 @@ dependencies = [ "serde", ] -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "derive-where" version = "1.2.7" @@ -1996,20 +1075,7 @@ checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "derive_more" -version = "0.99.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" -dependencies = [ - "convert_case 0.4.0", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.98", + "syn", ] [[package]] @@ -2018,15 +1084,6 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" -[[package]] -name = "diffy" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b545b8c50194bdd008283985ab0b31dba153cfd5b3066a92770634fbc0d7d291" -dependencies = [ - "nu-ansi-term 0.50.1", -] - [[package]] name = "digest" version = "0.9.0" @@ -2077,7 +1134,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -2086,12 +1143,6 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" -[[package]] -name = "dyn-clone" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" - [[package]] name = "ecdsa" version = "0.16.9" @@ -2146,18 +1197,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.98", -] - [[package]] name = "either" version = "1.13.0" @@ -2184,45 +1223,16 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ena" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" -dependencies = [ - "log", -] - [[package]] name = "enum-as-inner" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "enum-ordinalize" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" -dependencies = [ + "heck", "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -2294,30 +1304,12 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fixedbitset" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" -[[package]] -name = "fixedbitset" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" - [[package]] name = "flate2" version = "1.0.35" @@ -2349,12 +1341,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "futures" version = "0.3.31" @@ -2432,7 +1418,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -2497,28 +1483,6 @@ version = "0.99.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b32dfe1fdfc0bbde1f22a5da25355514b5e450c33a6af6770884c8750aedfbc" -[[package]] -name = "genco" -version = "0.17.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35958104272e516c2a5f66a9d82fba4784d2b585fc1e2358b8f96e15d342995" -dependencies = [ - "genco-macros", - "relative-path", - "smallvec", -] - -[[package]] -name = "genco-macros" -version = "0.17.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43eaff6bbc0b3a878361aced5ec6a2818ee7c541c5b33b5880dfa9a86c23e9e7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - [[package]] name = "generator" version = "0.8.4" @@ -2590,29 +1554,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" -[[package]] -name = "globset" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "good_lp" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada2d4e8d3e6fb80d007479bbcf318882e65c21798c6587a693dffcf271e3f3e" -dependencies = [ - "fnv", - "microlp", -] - [[package]] name = "group" version = "0.13.0" @@ -2666,8 +1607,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", - "allocator-api2", - "serde", ] [[package]] @@ -2679,7 +1618,6 @@ dependencies = [ "allocator-api2", "equivalent", "foldhash", - "serde", ] [[package]] @@ -2691,12 +1629,6 @@ dependencies = [ "hashbrown 0.14.5", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -2795,15 +1727,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - [[package]] name = "hostname" version = "0.3.1" @@ -3066,15 +1989,9 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] -[[package]] -name = "id-arena" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" - [[package]] name = "ident_case" version = "1.0.1" @@ -3130,82 +2047,31 @@ dependencies = [ "netlink-proto", "netlink-sys", "rtnetlink", - "system-configuration", - "tokio", - "windows 0.53.0", -] - -[[package]] -name = "igd-next" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b0d7d4541def58a37bf8efc559683f21edce7c82f0d866c93ac21f7e098f93" -dependencies = [ - "async-trait", - "attohttpc", - "bytes", - "futures", - "http 1.2.0", - "http-body-util", - "hyper", - "hyper-util", - "log", - "rand 0.8.5", - "tokio", - "url", - "xmltree", -] - -[[package]] -name = "ignore" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" -dependencies = [ - "crossbeam-deque", - "globset", - "log", - "memchr", - "regex-automata 0.4.9", - "same-file", - "walkdir", - "winapi-util", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", + "system-configuration", + "tokio", + "windows 0.53.0", ] [[package]] -name = "indent" -version = "0.1.1" +name = "igd-next" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f1a0777d972970f204fdf8ef319f1f4f8459131636d7e3c96c5d59570d0fa6" +checksum = "76b0d7d4541def58a37bf8efc559683f21edce7c82f0d866c93ac21f7e098f93" +dependencies = [ + "async-trait", + "attohttpc", + "bytes", + "futures", + "http 1.2.0", + "http-body-util", + "hyper", + "hyper-util", + "log", + "rand 0.8.5", + "tokio", + "url", + "xmltree", +] [[package]] name = "indenter" @@ -3235,12 +2101,6 @@ dependencies = [ "serde", ] -[[package]] -name = "indoc" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" - [[package]] name = "informalsystems-malachitebft-app" version = "0.0.1" @@ -3577,8 +2437,7 @@ dependencies = [ "serde", "sha3", "starknet-core", - "starknet-crypto 0.7.4", - "starknet_api", + "starknet-crypto", ] [[package]] @@ -3862,15 +2721,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -3880,15 +2730,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - [[package]] name = "itf" version = "0.2.4" @@ -3908,15 +2749,6 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" -[[package]] -name = "jobserver" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" -dependencies = [ - "libc", -] - [[package]] name = "js-sys" version = "0.3.77" @@ -3936,38 +2768,6 @@ dependencies = [ "cpufeatures", ] -[[package]] -name = "lalrpop" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7047a26de42016abf8f181b46b398aef0b77ad46711df41847f6ed869a2a1d5b" -dependencies = [ - "ascii-canvas", - "bit-set", - "ena", - "itertools 0.14.0", - "lalrpop-util", - "petgraph 0.7.1", - "pico-args", - "regex", - "regex-syntax 0.8.5", - "sha3", - "string_cache", - "term", - "unicode-xid", - "walkdir", -] - -[[package]] -name = "lalrpop-util" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d05b3fe34b8bd562c338db725dfa9beb9451a48f65f129ccb9538b48d2c93b" -dependencies = [ - "regex-automata 0.4.9", - "rustversion", -] - [[package]] name = "lambdaworks-crypto" version = "0.10.0" @@ -3995,9 +2795,6 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin 0.9.8", -] [[package]] name = "libc" @@ -4202,7 +2999,7 @@ dependencies = [ "smallvec", "thiserror 2.0.11", "tracing", - "uint 0.10.0", + "uint", "web-time", ] @@ -4369,10 +3166,10 @@ version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206e0aa0ebe004d778d79fb0966aa0de996c19894e2c0605ba2f8524dd4443d8" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -4530,32 +3327,12 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" -[[package]] -name = "matrixmultiply" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" -dependencies = [ - "autocfg", - "rawpointer", -] - [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "microlp" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d1790c73b93164ff65868f63164497cb32339458a9297e17e212d91df62258" -dependencies = [ - "log", - "sprs", -] - [[package]] name = "mime" version = "0.3.17" @@ -4677,21 +3454,6 @@ dependencies = [ "unsigned-varint 0.7.2", ] -[[package]] -name = "ndarray" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "portable-atomic", - "portable-atomic-util", - "rawpointer", -] - [[package]] name = "netlink-packet-core" version = "0.7.0" @@ -4756,12 +3518,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - [[package]] name = "nix" version = "0.26.4" @@ -4820,15 +3576,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "nu-ansi-term" -version = "0.50.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "num-bigint" version = "0.4.6" @@ -4837,19 +3584,9 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", - "rand 0.8.5", "serde", ] -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - [[package]] name = "num-conv" version = "0.1.0" @@ -4865,33 +3602,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-modular" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a5fe11d4135c3bcdf3a95b18b194afa9608a5f6ff034f5d857bc9a27fb0119" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-prime" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e238432a7881ec7164503ccc516c014bf009be7984cde1ba56837862543bdec3" -dependencies = [ - "bitvec", - "either", - "lru", - "num-bigint", - "num-integer", - "num-modular", - "num-traits", - "rand 0.8.5", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -4977,34 +3687,6 @@ dependencies = [ "sha2 0.10.8", ] -[[package]] -name = "parity-scale-codec" -version = "3.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "const_format", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "rustversion", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.98", -] - [[package]] name = "parking" version = "2.2.1" @@ -5034,47 +3716,18 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "path-clean" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17359afc20d7ab31fdb42bb844c8b3bb1dabd7dcf7e68428492da7f16966fcef" - [[package]] name = "pathdiff" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", - "hmac", - "password-hash", - "sha2 0.10.8", -] - [[package]] name = "pem" version = "3.0.4" @@ -5106,35 +3759,10 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ - "fixedbitset 0.4.2", - "indexmap 2.7.1", -] - -[[package]] -name = "petgraph" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" -dependencies = [ - "fixedbitset 0.5.7", + "fixedbitset", "indexmap 2.7.1", ] -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pico-args" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" - [[package]] name = "pin-project" version = "1.1.9" @@ -5152,7 +3780,7 @@ checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -5177,12 +3805,6 @@ dependencies = [ "spki", ] -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - [[package]] name = "plotters" version = "0.3.7" @@ -5255,15 +3877,6 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" -[[package]] -name = "portable-atomic-util" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" -dependencies = [ - "portable-atomic", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -5279,12 +3892,6 @@ dependencies = [ "zerocopy 0.7.35", ] -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - [[package]] name = "pretty_assertions" version = "1.4.1" @@ -5302,7 +3909,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.98", + "syn", ] [[package]] @@ -5314,27 +3921,6 @@ dependencies = [ "elliptic-curve", ] -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-serde", - "uint 0.9.5", -] - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit", -] - [[package]] name = "proc-macro2" version = "1.0.93" @@ -5364,7 +3950,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -5383,17 +3969,17 @@ version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" dependencies = [ - "heck 0.5.0", + "heck", "itertools 0.13.0", "log", "multimap", "once_cell", - "petgraph 0.6.5", + "petgraph", "prettyplease", "prost", "prost-types", "regex", - "syn 2.0.98", + "syn", "tempfile", ] @@ -5407,7 +3993,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -5458,7 +4044,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.1", + "rustc-hash", "rustls", "socket2", "thiserror 2.0.11", @@ -5476,7 +4062,7 @@ dependencies = [ "getrandom 0.2.15", "rand 0.8.5", "ring 0.17.8", - "rustc-hash 2.1.1", + "rustc-hash", "rustls", "rustls-pki-types", "slab", @@ -5520,17 +4106,11 @@ dependencies = [ "dashmap", "futures", "once_cell", - "strum 0.26.3", + "strum", "tokio", "tracing", ] -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - [[package]] name = "rand" version = "0.8.5" @@ -5592,12 +4172,6 @@ dependencies = [ "zerocopy 0.8.17", ] -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - [[package]] name = "rayon" version = "1.10.0" @@ -5703,12 +4277,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "relative-path" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" - [[package]] name = "resolv-conf" version = "0.7.0" @@ -5761,59 +4329,20 @@ dependencies = [ [[package]] name = "rtnetlink" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a552eb82d19f38c3beed3f786bd23aa434ceb9ac43ab44419ca6d67a7e186c0" -dependencies = [ - "futures", - "log", - "netlink-packet-core", - "netlink-packet-route", - "netlink-packet-utils", - "netlink-proto", - "netlink-sys", - "nix 0.26.4", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "rust-analyzer-salsa" -version = "0.17.0-pre.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719825638c59fd26a55412a24561c7c5bcf54364c88b9a7a04ba08a6eafaba8d" -dependencies = [ - "indexmap 2.7.1", - "lock_api", - "oorandom", - "parking_lot", - "rust-analyzer-salsa-macros", - "rustc-hash 1.1.0", - "smallvec", - "tracing", - "triomphe", -] - -[[package]] -name = "rust-analyzer-salsa-macros" -version = "0.17.0-pre.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d96498e9684848c6676c399032ebc37c52da95ecbefa83d71ccc53b9f8a4a8e" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "syn 2.0.98", -] - -[[package]] -name = "rust_decimal" -version = "1.36.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" +checksum = "7a552eb82d19f38c3beed3f786bd23aa434ceb9ac43ab44419ca6d67a7e186c0" dependencies = [ - "arrayvec", - "num-traits", + "futures", + "log", + "netlink-packet-core", + "netlink-packet-route", + "netlink-packet-utils", + "netlink-proto", + "netlink-sys", + "nix 0.26.4", + "thiserror 1.0.69", + "tokio", ] [[package]] @@ -5822,24 +4351,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hash" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - [[package]] name = "rustc_version" version = "0.4.1" @@ -5947,31 +4464,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "schemars" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" -dependencies = [ - "dyn-clone", - "indexmap 1.9.3", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.98", -] - [[package]] name = "scoped-tls" version = "1.0.1" @@ -6030,18 +4522,7 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -6140,7 +4621,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -6152,18 +4633,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", + "syn", ] [[package]] @@ -6234,12 +4704,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - [[package]] name = "slab" version = "0.4.9" @@ -6255,15 +4719,6 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -[[package]] -name = "smol_str" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" -dependencies = [ - "serde", -] - [[package]] name = "snow" version = "0.9.6" @@ -6313,18 +4768,6 @@ dependencies = [ "der", ] -[[package]] -name = "sprs" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bff8419009a08f6cb7519a602c5590241fbff1446bcc823c07af15386eb801b" -dependencies = [ - "ndarray", - "num-complex", - "num-traits", - "smallvec", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -6346,30 +4789,10 @@ dependencies = [ "serde_json_pythonic", "serde_with 2.3.3", "sha3", - "starknet-crypto 0.7.4", + "starknet-crypto", "starknet-types-core", ] -[[package]] -name = "starknet-crypto" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e2c30c01e8eb0fc913c4ee3cf676389fffc1d1182bfe5bb9670e4e72e968064" -dependencies = [ - "crypto-bigint", - "hex", - "hmac", - "num-bigint", - "num-integer", - "num-traits", - "rfc6979", - "sha2 0.10.8", - "starknet-crypto-codegen", - "starknet-curve 0.4.2", - "starknet-ff", - "zeroize", -] - [[package]] name = "starknet-crypto" version = "0.7.4" @@ -6384,31 +4807,11 @@ dependencies = [ "num-traits", "rfc6979", "sha2 0.10.8", - "starknet-curve 0.5.1", + "starknet-curve", "starknet-types-core", "zeroize", ] -[[package]] -name = "starknet-crypto-codegen" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbc159a1934c7be9761c237333a57febe060ace2bc9e3b337a59a37af206d19f" -dependencies = [ - "starknet-curve 0.4.2", - "starknet-ff", - "syn 2.0.98", -] - -[[package]] -name = "starknet-curve" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1c383518bb312751e4be80f53e8644034aa99a0afb29d7ac41b89a997db875b" -dependencies = [ - "starknet-ff", -] - [[package]] name = "starknet-curve" version = "0.5.1" @@ -6418,18 +4821,6 @@ dependencies = [ "starknet-types-core", ] -[[package]] -name = "starknet-ff" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abf1b44ec5b18d87c1ae5f54590ca9d0699ef4dd5b2ffa66fc97f24613ec585" -dependencies = [ - "ark-ff 0.4.2", - "crypto-bigint", - "getrandom 0.2.15", - "hex", -] - [[package]] name = "starknet-types-core" version = "0.1.7" @@ -6438,91 +4829,31 @@ checksum = "fa1b9e01ccb217ab6d475c5cda05dbb22c30029f7bb52b192a010a00d77a3d74" dependencies = [ "lambdaworks-crypto", "lambdaworks-math", - "lazy_static", "num-bigint", "num-integer", "num-traits", "serde", ] -[[package]] -name = "starknet_api" -version = "0.14.0-rc.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04a4abb49dfcddf92cc54c0f89725183999bbaae2133e446e7f4be93f65c4d58" -dependencies = [ - "bitvec", - "cairo-lang-runner", - "cairo-lang-starknet-classes", - "derive_more", - "hex", - "indexmap 2.7.1", - "itertools 0.12.1", - "num-bigint", - "num-traits", - "pretty_assertions", - "primitive-types", - "semver", - "serde", - "serde_json", - "sha3", - "starknet-crypto 0.7.4", - "starknet-types-core", - "strum 0.25.0", - "strum_macros 0.25.3", - "thiserror 1.0.69", -] - [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "string_cache" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938d512196766101d333398efde81bc1f37b00cb42c2f8350e5df639f040bbbe" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared", - "precomputed-hash", -] - [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" - [[package]] name = "strum" version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.98", + "strum_macros", ] [[package]] @@ -6531,11 +4862,11 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "rustversion", - "syn 2.0.98", + "syn", ] [[package]] @@ -6550,17 +4881,6 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.98" @@ -6586,7 +4906,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -6630,12 +4950,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "tempfile" version = "3.16.0" @@ -6650,16 +4964,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "term" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3bb6001afcea98122260987f8b7b5da969ecad46dbf0b5453702f776b491a41" -dependencies = [ - "home", - "windows-sys 0.52.0", -] - [[package]] name = "testdir" version = "0.9.3" @@ -6701,7 +5005,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -6712,27 +5016,7 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "thiserror-impl-no-std" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e6318948b519ba6dc2b442a6d0b904ebfb8d411a3ad3e07843615a72249758" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "thiserror-no-std" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3ad459d94dd517257cc96add8a43190ee620011bb6e6cdc82dafd97dfafafea" -dependencies = [ - "thiserror-impl-no-std", + "syn", ] [[package]] @@ -6858,7 +5142,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -6968,7 +5252,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -7019,7 +5303,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", - "nu-ansi-term 0.46.0", + "nu-ansi-term", "once_cell", "regex", "serde", @@ -7033,16 +5317,6 @@ dependencies = [ "tracing-serde", ] -[[package]] -name = "triomphe" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" -dependencies = [ - "serde", - "stable_deref_trait", -] - [[package]] name = "try-lock" version = "0.2.5" @@ -7065,18 +5339,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "uint" version = "0.10.0" @@ -7089,33 +5351,12 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "unescaper" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c878a167baa8afd137494101a688ef8c67125089ff2249284bd2b5f9bfedb815" -dependencies = [ - "thiserror 1.0.69", -] - [[package]] name = "unicode-ident" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "universal-hash" version = "0.5.1" @@ -7150,12 +5391,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" -[[package]] -name = "unty" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" - [[package]] name = "url" version = "2.5.4" @@ -7268,7 +5503,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.98", + "syn", "wasm-bindgen-shared", ] @@ -7290,7 +5525,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7432,7 +5667,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -7443,7 +5678,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -7662,15 +5897,6 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "x25519-dalek" version = "2.0.1" @@ -7715,21 +5941,6 @@ dependencies = [ "xml-rs", ] -[[package]] -name = "xshell" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e7290c623014758632efe00737145b6867b66292c42167f2ec381eb566a373d" -dependencies = [ - "xshell-macros", -] - -[[package]] -name = "xshell-macros" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ac00cd3f8ec9c1d33fb3e7958a82df6989c42d747bd326c822b1d625283547" - [[package]] name = "yamux" version = "0.12.1" @@ -7796,7 +6007,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", "synstructure", ] @@ -7827,7 +6038,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -7838,7 +6049,7 @@ checksum = "06718a168365cad3d5ff0bb133aad346959a2074bd4a85c121255a11304a8626" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -7858,7 +6069,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", "synstructure", ] @@ -7879,7 +6090,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -7901,54 +6112,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "zip" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" -dependencies = [ - "aes", - "byteorder", - "bzip2", - "constant_time_eq", - "crc32fast", - "crossbeam-utils", - "flate2", - "hmac", - "pbkdf2", - "sha1", - "time", - "zstd", -] - -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.14+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" -dependencies = [ - "cc", - "pkg-config", + "syn", ] diff --git a/code/Cargo.toml b/code/Cargo.toml index 1c8a6edb0..9f72edb9a 100644 --- a/code/Cargo.toml +++ b/code/Cargo.toml @@ -101,7 +101,6 @@ malachitebft-starknet-p2p-proto = { version = "0.0.1", package = "informalsystem malachitebft-starknet-p2p-types = { version = "0.0.1", package = "informalsystems-malachitebft-starknet-p2p-types", path = "crates/starknet/p2p-types" } # Starknet -starknet_api = "0.14.0-rc.3" starknet-core = "0.11.1" starknet-crypto = "0.7.3" diff --git a/code/crates/starknet/p2p-types/Cargo.toml b/code/crates/starknet/p2p-types/Cargo.toml index ccdcb78fd..e87192c7d 100644 --- a/code/crates/starknet/p2p-types/Cargo.toml +++ b/code/crates/starknet/p2p-types/Cargo.toml @@ -13,7 +13,6 @@ malachitebft-proto.workspace = true malachitebft-starknet-p2p-proto.workspace = true malachitebft-signing-ed25519 = { workspace = true, features = ["serde", "rand"] } -starknet_api.workspace = true starknet-core.workspace = true starknet-crypto.workspace = true diff --git a/code/crates/starknet/p2p-types/src/address.rs b/code/crates/starknet/p2p-types/src/address.rs index 18b7d7ae4..675d89f54 100644 --- a/code/crates/starknet/p2p-types/src/address.rs +++ b/code/crates/starknet/p2p-types/src/address.rs @@ -1,7 +1,6 @@ use bytes::Bytes; use core::fmt; use serde::{Deserialize, Serialize}; -use starknet_api::core::{ContractAddress, PatriciaKey}; use malachitebft_proto::{Error as ProtoError, Protobuf}; use malachitebft_starknet_p2p_proto as p2p_proto; @@ -10,17 +9,17 @@ use crate::Felt; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] #[serde(transparent)] -pub struct Address(ContractAddress); +pub struct Address(Felt); impl Address { - pub fn new(address: ContractAddress) -> Self { - Self(address) + pub fn new(felt: Felt) -> Self { + Self(felt) } } impl From for Address { - fn from(address: u64) -> Self { - Self(ContractAddress::from(address)) + fn from(n: u64) -> Self { + Self(Felt::from(n)) } } @@ -52,16 +51,12 @@ impl Protobuf for Address { felt.copy_from_slice(&proto.elements); let hash = Felt::from_bytes_be(&felt); - if let Ok(stark_felt) = PatriciaKey::try_from(hash) { - Ok(Self(ContractAddress(stark_felt))) - } else { - Err(ProtoError::invalid_data::("elements")) - } + Ok(Self(hash)) } fn to_proto(&self) -> Result { Ok(p2p_proto::Address { - elements: Bytes::from(self.0.key().to_bytes_be().to_vec()), + elements: Bytes::from(self.0.to_bytes_be().to_vec()), }) } } From b4e37b9583f5129c87f0240da451da7515a58abb Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 18 Mar 2025 11:10:36 +0100 Subject: [PATCH 15/54] Revert changes made to discovery --- code/crates/discovery/src/behaviour.rs | 12 ++--- .../discovery/src/handlers/connect_request.rs | 32 ++++++------- .../discovery/src/handlers/extension.rs | 2 +- .../discovery/src/handlers/peers_request.rs | 46 +++++++++---------- code/crates/discovery/src/lib.rs | 2 - code/crates/network/src/behaviour.rs | 4 -- code/crates/starknet/host/src/spawn.rs | 1 + 7 files changed, 47 insertions(+), 52 deletions(-) diff --git a/code/crates/discovery/src/behaviour.rs b/code/crates/discovery/src/behaviour.rs index f99219bfe..3a68b7f37 100644 --- a/code/crates/discovery/src/behaviour.rs +++ b/code/crates/discovery/src/behaviour.rs @@ -65,7 +65,7 @@ where #[behaviour(to_swarm = "NetworkEvent")] pub struct Behaviour { pub kademlia: Toggle>, - pub request_response: Toggle>, + pub request_response: request_response::cbor::Behaviour, } fn kademlia_config() -> kad::Config { @@ -106,14 +106,14 @@ impl Behaviour { ), ); - // let request_response = request_response::cbor::Behaviour::new( - // request_response_protocol(), - // request_response_config(), - // ); + let request_response = request_response::cbor::Behaviour::new( + request_response_protocol(), + request_response_config(), + ); Self { kademlia, - request_response: Toggle::from(None), + request_response, } } } diff --git a/code/crates/discovery/src/handlers/connect_request.rs b/code/crates/discovery/src/handlers/connect_request.rs index c481eb49a..843d68afb 100644 --- a/code/crates/discovery/src/handlers/connect_request.rs +++ b/code/crates/discovery/src/handlers/connect_request.rs @@ -48,13 +48,13 @@ where request_data.retry.count() ); - // let request_id = swarm - // .behaviour_mut() - // .send_request(&request_data.peer_id(), behaviour::Request::Connect()); - // - // self.controller - // .connect_request - // .register_in_progress(request_id, request_data); + let request_id = swarm + .behaviour_mut() + .send_request(&request_data.peer_id(), behaviour::Request::Connect()); + + self.controller + .connect_request + .register_in_progress(request_id, request_data); } pub(crate) fn handle_connect_request( @@ -85,15 +85,15 @@ where self.update_connections_metrics(); - // if swarm - // .behaviour_mut() - // .send_response(channel, behaviour::Response::Connect(accepted)) - // .is_err() - // { - // error!("Error sending connect response to {peer}"); - // } else { - // trace!("Sent connect response to {peer}"); - // } + if swarm + .behaviour_mut() + .send_response(channel, behaviour::Response::Connect(accepted)) + .is_err() + { + error!("Error sending connect response to {peer}"); + } else { + trace!("Sent connect response to {peer}"); + } } pub(crate) fn handle_connect_response( diff --git a/code/crates/discovery/src/handlers/extension.rs b/code/crates/discovery/src/handlers/extension.rs index 7cc9dc697..d807d0de6 100644 --- a/code/crates/discovery/src/handlers/extension.rs +++ b/code/crates/discovery/src/handlers/extension.rs @@ -87,7 +87,7 @@ where self.metrics.elapsed().as_millis() ); - // self.adjust_connections(swarm); + self.adjust_connections(swarm); self.state = State::Idle; } else { diff --git a/code/crates/discovery/src/handlers/peers_request.rs b/code/crates/discovery/src/handlers/peers_request.rs index 8bafcede6..30de07e23 100644 --- a/code/crates/discovery/src/handlers/peers_request.rs +++ b/code/crates/discovery/src/handlers/peers_request.rs @@ -50,14 +50,14 @@ where request_data.retry.count() ); - // let request_id = swarm.behaviour_mut().send_request( - // &request_data.peer_id(), - // behaviour::Request::Peers(self.get_all_peers_except(request_data.peer_id())), - // ); - // - // self.controller - // .peers_request - // .register_in_progress(request_id, request_data); + let request_id = swarm.behaviour_mut().send_request( + &request_data.peer_id(), + behaviour::Request::Peers(self.get_all_peers_except(request_data.peer_id())), + ); + + self.controller + .peers_request + .register_in_progress(request_id, request_data); } pub(crate) fn handle_peers_request( @@ -69,21 +69,21 @@ where ) { // Compute the difference between the discovered peers and the requested peers // to avoid sending the requesting peer the peers it already knows. - // let peers_difference = self - // .get_all_peers_except(peer) - // .difference(&peers) - // .cloned() - // .collect(); - - // if swarm - // .behaviour_mut() - // .send_response(channel, behaviour::Response::Peers(peers_difference)) - // .is_err() - // { - // error!("Error sending peers to {peer}"); - // } else { - // trace!("Sent peers to {peer}"); - // } + let peers_difference = self + .get_all_peers_except(peer) + .difference(&peers) + .cloned() + .collect(); + + if swarm + .behaviour_mut() + .send_response(channel, behaviour::Response::Peers(peers_difference)) + .is_err() + { + error!("Error sending peers to {peer}"); + } else { + trace!("Sent peers to {peer}"); + } } pub(crate) fn handle_peers_response( diff --git a/code/crates/discovery/src/lib.rs b/code/crates/discovery/src/lib.rs index 8b4327642..6563c13e3 100644 --- a/code/crates/discovery/src/lib.rs +++ b/code/crates/discovery/src/lib.rs @@ -1,5 +1,3 @@ -#![allow(unused_variables, unused_imports, dead_code, unused_assignments)] - use std::collections::HashMap; use tracing::{debug, error, info, warn}; diff --git a/code/crates/network/src/behaviour.rs b/code/crates/network/src/behaviour.rs index 64bea4b57..464d0be91 100644 --- a/code/crates/network/src/behaviour.rs +++ b/code/crates/network/src/behaviour.rs @@ -106,8 +106,6 @@ impl discovery::DiscoveryClient for Behaviour { .as_mut() .unwrap() .request_response - .as_mut() - .unwrap() .send_request(peer_id, req) } @@ -120,8 +118,6 @@ impl discovery::DiscoveryClient for Behaviour { .as_mut() .unwrap() .request_response - .as_mut() - .unwrap() .send_response(ch, rs) } } diff --git a/code/crates/starknet/host/src/spawn.rs b/code/crates/starknet/host/src/spawn.rs index 211e162ac..934514bb7 100644 --- a/code/crates/starknet/host/src/spawn.rs +++ b/code/crates/starknet/host/src/spawn.rs @@ -31,6 +31,7 @@ use crate::mempool::{Mempool, MempoolRef}; use crate::types::MockContext; use crate::types::{Address, Height, PrivateKey, ValidatorSet}; +#[allow(clippy::too_many_arguments)] pub async fn spawn_node_actor( cfg: Config, home_dir: PathBuf, From 5494c5f1a43ce7e4e0832c60f742ac405e3aa2a1 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 18 Mar 2025 11:38:13 +0100 Subject: [PATCH 16/54] Only enable the network behaviours which are actually required --- code/crates/app/src/spawn.rs | 1 + code/crates/config/src/lib.rs | 11 ++++ code/crates/network/src/behaviour.rs | 72 +++++++++++++++----------- code/crates/network/src/lib.rs | 54 +++++++++++-------- code/crates/network/src/pubsub.rs | 45 ++++++++-------- code/crates/network/test/src/lib.rs | 1 + code/crates/starknet/host/src/spawn.rs | 1 + 7 files changed, 109 insertions(+), 76 deletions(-) diff --git a/code/crates/app/src/spawn.rs b/code/crates/app/src/spawn.rs index 67d9f80dd..26435a6e6 100644 --- a/code/crates/app/src/spawn.rs +++ b/code/crates/app/src/spawn.rs @@ -200,5 +200,6 @@ fn make_gossip_config(cfg: &ConsensusConfig) -> NetworkConfig { }, rpc_max_size: cfg.p2p.rpc_max_size.as_u64() as usize, pubsub_max_size: cfg.p2p.pubsub_max_size.as_u64() as usize, + enable_sync: cfg.vote_sync.mode.is_request_response(), } } diff --git a/code/crates/config/src/lib.rs b/code/crates/config/src/lib.rs index 67ef9129e..9576b3299 100644 --- a/code/crates/config/src/lib.rs +++ b/code/crates/config/src/lib.rs @@ -379,10 +379,21 @@ pub enum VoteSyncMode { /// The lagging node sends a request to a peer for the missing votes #[default] RequestResponse, + /// Nodes rebroadcast their last vote to all peers Rebroadcast, } +impl VoteSyncMode { + pub fn is_request_response(&self) -> bool { + matches!(self, Self::RequestResponse) + } + + pub fn is_rebroadcast(&self) -> bool { + matches!(self, Self::Rebroadcast) + } +} + /// Message types required by consensus to deliver the value being proposed #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] diff --git a/code/crates/network/src/behaviour.rs b/code/crates/network/src/behaviour.rs index 464d0be91..6eb56d76a 100644 --- a/code/crates/network/src/behaviour.rs +++ b/code/crates/network/src/behaviour.rs @@ -14,7 +14,7 @@ use malachitebft_discovery as discovery; use malachitebft_metrics::Registry; use malachitebft_sync as sync; -use crate::{Config, GossipSubConfig, PROTOCOL}; +use crate::{Config, GossipSubConfig, PubSubProtocol, PROTOCOL}; #[derive(Debug)] pub enum NetworkEvent { @@ -66,8 +66,8 @@ impl From for NetworkEvent { #[behaviour(to_swarm = "NetworkEvent")] pub struct Behaviour { pub identify: identify::Behaviour, - pub ping: Toggle, - pub gossipsub: gossipsub::Behaviour, + pub ping: ping::Behaviour, + pub gossipsub: Toggle, pub broadcast: Toggle, pub sync: Toggle, pub discovery: Toggle, @@ -84,7 +84,7 @@ impl discovery::DiscoveryClient for Behaviour { fn add_address(&mut self, peer: &PeerId, address: Multiaddr) -> libp2p::kad::RoutingUpdate { self.discovery .as_mut() - .unwrap() + .expect("Discovery behaviour should be available") .kademlia .as_mut() .expect("Kademlia behaviour should be available") @@ -94,7 +94,7 @@ impl discovery::DiscoveryClient for Behaviour { fn kbuckets(&mut self) -> impl Iterator, Addresses>> { self.discovery .as_mut() - .unwrap() + .expect("Discovery behaviour should be available") .kademlia .as_mut() .expect("Kademlia behaviour should be available") @@ -158,35 +158,45 @@ impl Behaviour { let ping = ping::Behaviour::new(ping::Config::new().with_interval(Duration::from_secs(5))); - let gossipsub = gossipsub::Behaviour::new_with_metrics( - gossipsub::MessageAuthenticity::Signed(keypair.clone()), - gossipsub_config(config.gossipsub, config.pubsub_max_size), - registry.sub_registry_with_prefix("gossipsub"), - Default::default(), - ) - .unwrap(); - - let broadcast = broadcast::Behaviour::new_with_metrics( - broadcast::Config { - max_buf_size: config.pubsub_max_size, - }, - registry.sub_registry_with_prefix("broadcast"), - ); - - let sync = sync::Behaviour::new_with_metrics( - sync::Config::default().with_max_response_size(config.rpc_max_size), - registry.sub_registry_with_prefix("sync"), - ); - - let discovery = discovery::Behaviour::new(keypair, config.discovery); + let gossipsub = config.pubsub_protocol.is_gossipsub().then(|| { + gossipsub::Behaviour::new_with_metrics( + gossipsub::MessageAuthenticity::Signed(keypair.clone()), + gossipsub_config(config.gossipsub, config.pubsub_max_size), + registry.sub_registry_with_prefix("gossipsub"), + Default::default(), + ) + .unwrap() + }); + + let enable_broadcast = config.pubsub_protocol.is_broadcast() || config.enable_sync; + let broadcast = enable_broadcast.then(|| { + broadcast::Behaviour::new_with_metrics( + broadcast::Config { + max_buf_size: config.pubsub_max_size, + }, + registry.sub_registry_with_prefix("broadcast"), + ) + }); + + let sync = config.enable_sync.then(|| { + sync::Behaviour::new_with_metrics( + sync::Config::default().with_max_response_size(config.rpc_max_size), + registry.sub_registry_with_prefix("sync"), + ) + }); + + let discovery = config + .discovery + .enabled + .then(|| discovery::Behaviour::new(keypair, config.discovery)); Self { identify, - ping: Toggle::from(None), - gossipsub, - broadcast: Toggle::from(None), - sync: Toggle::from(None), - discovery: Toggle::from(Some(discovery)), + ping, + sync: Toggle::from(sync), + gossipsub: Toggle::from(gossipsub), + broadcast: Toggle::from(broadcast), + discovery: Toggle::from(discovery), } } } diff --git a/code/crates/network/src/lib.rs b/code/crates/network/src/lib.rs index 5b950ff04..65e83fd72 100644 --- a/code/crates/network/src/lib.rs +++ b/code/crates/network/src/lib.rs @@ -96,6 +96,7 @@ pub struct Config { pub pubsub_protocol: PubSubProtocol, pub rpc_max_size: usize, pub pubsub_max_size: usize, + pub enable_sync: bool, } impl Config { @@ -234,10 +235,12 @@ async fn run( return; }; - // if let Err(e) = pubsub::subscribe(&mut swarm, PubSubProtocol::Broadcast, &[Channel::Sync]) { - // error!("Error subscribing to Sync channel: {e}"); - // return; - // }; + if config.enable_sync { + if let Err(e) = pubsub::subscribe(&mut swarm, PubSubProtocol::Broadcast, &[Channel::Sync]) { + error!("Error subscribing to Sync channel: {e}"); + return; + }; + } loop { let result = tokio::select! { @@ -297,24 +300,29 @@ async fn handle_ctrl_msg( } CtrlMsg::Broadcast(channel, data) => { - // let msg_size = data.len(); - // let result = pubsub::publish(swarm, PubSubProtocol::Broadcast, channel, data); - // - // match result { - // Ok(()) => debug!(%channel, size = %msg_size, "Broadcasted message"), - // Err(e) => error!(%channel, "Error broadcasting message: {e}"), - // } + if channel == Channel::Sync && !config.enable_sync { + trace!("Ignoring broadcast message to Sync channel: Sync not enabled"); + return ControlFlow::Continue(()); + } + + let msg_size = data.len(); + let result = pubsub::publish(swarm, PubSubProtocol::Broadcast, channel, data); + + match result { + Ok(()) => debug!(%channel, size = %msg_size, "Broadcasted message"), + Err(e) => error!(%channel, "Error broadcasting message: {e}"), + } ControlFlow::Continue(()) } CtrlMsg::SyncRequest(peer_id, request, reply_to) => { - let request_id = swarm - .behaviour_mut() - .sync - .as_mut() - .unwrap() - .send_request(peer_id.to_libp2p(), request); + let Some(sync) = swarm.behaviour_mut().sync.as_mut() else { + error!("Cannot request Sync from peer: Sync not enabled"); + return ControlFlow::Continue(()); + }; + + let request_id = sync.send_request(peer_id.to_libp2p(), request); if let Err(e) = reply_to.send(request_id) { error!(%peer_id, "Error sending Sync request: {e}"); @@ -324,17 +332,17 @@ async fn handle_ctrl_msg( } CtrlMsg::SyncReply(request_id, data) => { + let Some(sync) = swarm.behaviour_mut().sync.as_mut() else { + error!("Cannot send Sync response to peer: Sync not enabled"); + return ControlFlow::Continue(()); + }; + let Some(channel) = state.sync_channels.remove(&request_id) else { error!(%request_id, "Received Sync reply for unknown request ID"); return ControlFlow::Continue(()); }; - let result = swarm - .behaviour_mut() - .sync - .as_mut() - .unwrap() - .send_response(channel, data); + let result = sync.send_response(channel, data); match result { Ok(()) => debug!(%request_id, "Replied to Sync request"), diff --git a/code/crates/network/src/pubsub.rs b/code/crates/network/src/pubsub.rs index f0dd0601d..149bd411c 100644 --- a/code/crates/network/src/pubsub.rs +++ b/code/crates/network/src/pubsub.rs @@ -1,5 +1,6 @@ use bytes::Bytes; use libp2p::swarm; +use tracing::trace; use crate::behaviour::Behaviour; use crate::{Channel, PubSubProtocol}; @@ -11,21 +12,21 @@ pub fn subscribe( ) -> Result<(), eyre::Report> { match protocol { PubSubProtocol::GossipSub => { - for channel in channels { - swarm - .behaviour_mut() - .gossipsub - .subscribe(&channel.to_gossipsub_topic())?; + if let Some(gossipsub) = swarm.behaviour_mut().gossipsub.as_mut() { + for channel in channels { + gossipsub.subscribe(&channel.to_gossipsub_topic())?; + } + } else { + return Err(eyre::eyre!("GossipSub not enabled")); } } PubSubProtocol::Broadcast => { - for channel in channels { - swarm - .behaviour_mut() - .broadcast - .as_mut() - .unwrap() - .subscribe(channel.to_broadcast_topic()); + if let Some(broadcast) = swarm.behaviour_mut().broadcast.as_mut() { + for channel in channels { + broadcast.subscribe(channel.to_broadcast_topic()); + } + } else { + return Err(eyre::eyre!("Broadcast not enabled")); } } } @@ -41,18 +42,18 @@ pub fn publish( ) -> Result<(), eyre::Report> { match protocol { PubSubProtocol::GossipSub => { - swarm - .behaviour_mut() - .gossipsub - .publish(channel.to_gossipsub_topic(), data)?; + if let Some(gossipsub) = swarm.behaviour_mut().gossipsub.as_mut() { + gossipsub.publish(channel.to_gossipsub_topic(), data)?; + } else { + return Err(eyre::eyre!("GossipSub not enabled")); + } } PubSubProtocol::Broadcast => { - swarm - .behaviour_mut() - .broadcast - .as_mut() - .unwrap() - .broadcast(&channel.to_broadcast_topic(), data); + if let Some(broadcast) = swarm.behaviour_mut().broadcast.as_mut() { + broadcast.broadcast(&channel.to_broadcast_topic(), data); + } else { + return Err(eyre::eyre!("Broadcast not enabled")); + } } } diff --git a/code/crates/network/test/src/lib.rs b/code/crates/network/test/src/lib.rs index 1d6e32b70..404ed9009 100644 --- a/code/crates/network/test/src/lib.rs +++ b/code/crates/network/test/src/lib.rs @@ -162,6 +162,7 @@ impl Test { pubsub_protocol: malachitebft_network::PubSubProtocol::default(), rpc_max_size: 10 * 1024 * 1024, // 10 MiB pubsub_max_size: 4 * 1024 * 1024, // 4 MiB + enable_sync: false, }) } diff --git a/code/crates/starknet/host/src/spawn.rs b/code/crates/starknet/host/src/spawn.rs index 934514bb7..a3a28748a 100644 --- a/code/crates/starknet/host/src/spawn.rs +++ b/code/crates/starknet/host/src/spawn.rs @@ -248,6 +248,7 @@ async fn spawn_network_actor( }, rpc_max_size: cfg.consensus.p2p.rpc_max_size.as_u64() as usize, pubsub_max_size: cfg.consensus.p2p.pubsub_max_size.as_u64() as usize, + enable_sync: false, }; let keypair = make_keypair(private_key); From bd180f5eabdf690df77ae3247f9f05bf3f0ba271 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 18 Mar 2025 11:50:23 +0100 Subject: [PATCH 17/54] Fix unit tests --- code/crates/starknet/host/src/node.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/code/crates/starknet/host/src/node.rs b/code/crates/starknet/host/src/node.rs index 406474dc9..ff8a09039 100644 --- a/code/crates/starknet/host/src/node.rs +++ b/code/crates/starknet/host/src/node.rs @@ -118,8 +118,12 @@ impl Node for StarknetNode { } fn get_address(&self, pk: &PublicKey) -> Address { - let genesis = self.load_genesis().unwrap(); - genesis.validator_set.get_by_public_key(pk).unwrap().address + if let Ok(genesis) = self.load_genesis() { + genesis.validator_set.get_by_public_key(pk).unwrap().address + } else { + // FIXME: Figure out a way to specify the address for a public key. + Address::from(0x65) + } } fn get_public_key(&self, pk: &PrivateKey) -> PublicKey { @@ -460,13 +464,14 @@ fn test_starknet_node() { let priv_keys = new::generate_private_keys(&node, 1, true); let pub_keys = priv_keys.iter().map(|pk| node.get_public_key(pk)).collect(); let genesis = new::generate_genesis(&node, pub_keys, true); + let address = Address::from(0x64); - // file::save_priv_validator_key( - // &node, - // &node.private_key_file(), - // &PrivateKeyFile::from(priv_keys[0].clone()), - // ) - // .unwrap(); + file::save_priv_validator_key( + &node, + &node.private_key_file(), + &PrivateKeyFile::new(address, priv_keys[0].clone()), + ) + .unwrap(); file::save_genesis(&node, &node.genesis_file(), &genesis).unwrap(); From 53330ea8cf951d194f97f7431dbaff4cfe4f7db3 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 18 Mar 2025 12:22:27 +0100 Subject: [PATCH 18/54] Revert back Kad protocol name change --- code/crates/discovery/src/behaviour.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/crates/discovery/src/behaviour.rs b/code/crates/discovery/src/behaviour.rs index 3a68b7f37..6113a11eb 100644 --- a/code/crates/discovery/src/behaviour.rs +++ b/code/crates/discovery/src/behaviour.rs @@ -15,7 +15,7 @@ use serde::{Deserialize, Serialize}; use crate::config::BootstrapProtocol; use crate::Config; -const DISCOVERY_KAD_PROTOCOL: &str = "/starknet/kad/MY_CUSTOM_CHAIN_ID/1.0.0"; +const DISCOVERY_KAD_PROTOCOL: &str = "/malachitebft-discovery/kad/v1beta1"; const DISCOVERY_REQRES_PROTOCOL: &str = "/malachitebft-discovery/reqres/v1beta1"; #[derive(Clone, Debug, Serialize, Deserialize)] From f6eb2fee67e685d25912f410453e83b964d0f46e Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Wed, 26 Mar 2025 11:19:19 +0100 Subject: [PATCH 19/54] fix: dial backoff --- code/crates/discovery/src/handlers/dial.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/crates/discovery/src/handlers/dial.rs b/code/crates/discovery/src/handlers/dial.rs index d041d0bf6..81a955589 100644 --- a/code/crates/discovery/src/handlers/dial.rs +++ b/code/crates/discovery/src/handlers/dial.rs @@ -121,10 +121,11 @@ where // Retry dialing after a delay connection_data.retry.inc_count(); - self.controller.dial.add_to_queue( - connection_data.clone(), - Some(connection_data.retry.next_delay()), - ); + let next_delay = connection_data.retry.next_delay(); + + self.controller + .dial + .add_to_queue(connection_data.clone(), Some(next_delay)); } else { // No more trials left error!( From da7c1cbbb79f47ab40ace05e48111479a671d10b Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Wed, 26 Mar 2025 15:40:22 +0100 Subject: [PATCH 20/54] feat: attempt for #849 --- code/crates/app/src/spawn.rs | 1 + code/crates/discovery/src/config.rs | 6 ++-- code/crates/network/src/channel.rs | 43 ++++++++++++++++++++++---- code/crates/network/src/lib.rs | 3 +- code/crates/network/test/src/lib.rs | 1 + code/crates/starknet/host/src/spawn.rs | 1 + 6 files changed, 45 insertions(+), 10 deletions(-) diff --git a/code/crates/app/src/spawn.rs b/code/crates/app/src/spawn.rs index 26435a6e6..be99253fa 100644 --- a/code/crates/app/src/spawn.rs +++ b/code/crates/app/src/spawn.rs @@ -198,6 +198,7 @@ fn make_gossip_config(cfg: &ConsensusConfig) -> NetworkConfig { }, PubSubProtocol::Broadcast => GossipSubConfig::default(), }, + channel_names: malachitebft_network::ChannelNames::default(), rpc_max_size: cfg.p2p.rpc_max_size.as_u64() as usize, pubsub_max_size: cfg.p2p.pubsub_max_size.as_u64() as usize, enable_sync: cfg.vote_sync.mode.is_request_response(), diff --git a/code/crates/discovery/src/config.rs b/code/crates/discovery/src/config.rs index 5c2a4f6dc..26701255a 100644 --- a/code/crates/discovery/src/config.rs +++ b/code/crates/discovery/src/config.rs @@ -5,9 +5,9 @@ const DEFAULT_NUM_INBOUND_PEERS: usize = 20; const DEFAULT_EPHEMERAL_CONNECTION_TIMEOUT: Duration = Duration::from_secs(15); -const DEFAULT_DIAL_MAX_RETRIES: usize = 10_000; -const DEFAULT_PEERS_REQUEST_MAX_RETRIES: usize = 10_000; -const DEFAULT_CONNECT_REQUEST_MAX_RETRIES: usize = 10_000; +const DEFAULT_DIAL_MAX_RETRIES: usize = 5; +const DEFAULT_PEERS_REQUEST_MAX_RETRIES: usize = 5; +const DEFAULT_CONNECT_REQUEST_MAX_RETRIES: usize = 0; #[derive(Copy, Clone, Debug, PartialEq, Eq, Default)] pub enum BootstrapProtocol { diff --git a/code/crates/network/src/channel.rs b/code/crates/network/src/channel.rs index ce1f5798d..fec80f407 100644 --- a/code/crates/network/src/channel.rs +++ b/code/crates/network/src/channel.rs @@ -1,9 +1,30 @@ use core::fmt; +use std::sync::OnceLock; +use futures::channel; use libp2p::gossipsub; use libp2p_broadcast as broadcast; use serde::{Deserialize, Serialize}; +#[derive(Clone, Debug)] +pub struct ChannelNames { + pub consensus: &'static str, + pub proposal_parts: &'static str, + pub sync: &'static str, +} + +impl Default for ChannelNames { + fn default() -> Self { + Self { + consensus: "consensus_votes", + proposal_parts: "consensus_proposals", + sync: "sync", + } + } +} + +static CHANNEL_NAMES: OnceLock = OnceLock::new(); + #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum Channel { Consensus, @@ -12,6 +33,14 @@ pub enum Channel { } impl Channel { + pub fn init_channel_names(channel_names: ChannelNames) -> Result<(), ChannelNames> { + CHANNEL_NAMES.set(channel_names) + } + + fn get_channel_names() -> &'static ChannelNames { + CHANNEL_NAMES.get_or_init(ChannelNames::default) + } + pub fn all() -> &'static [Channel] { &[Channel::Consensus, Channel::ProposalParts, Channel::Sync] } @@ -30,10 +59,11 @@ impl Channel { } pub fn as_str(&self) -> &'static str { + let channel_names = Self::get_channel_names(); match self { - Channel::Consensus => "consensus_votes", - Channel::ProposalParts => "consensus_proposals", - Channel::Sync => "sync", + Channel::Consensus => channel_names.consensus, + Channel::ProposalParts => channel_names.proposal_parts, + Channel::Sync => channel_names.sync, } } @@ -62,10 +92,11 @@ impl Channel { } pub fn from_broadcast_topic(topic: &broadcast::Topic) -> Option { + let channel_names = Self::get_channel_names(); match topic.as_ref() { - b"consensus_votes" => Some(Channel::Consensus), - b"consensus_proposals" => Some(Channel::ProposalParts), - b"sync" => Some(Channel::Sync), + name if name == channel_names.consensus.as_bytes() => Some(Self::Consensus), + name if name == channel_names.proposal_parts.as_bytes() => Some(Self::ProposalParts), + name if name == channel_names.sync.as_bytes() => Some(Self::Sync), _ => None, } } diff --git a/code/crates/network/src/lib.rs b/code/crates/network/src/lib.rs index 65e83fd72..4bc717c2a 100644 --- a/code/crates/network/src/lib.rs +++ b/code/crates/network/src/lib.rs @@ -30,7 +30,7 @@ pub mod handle; pub mod pubsub; mod channel; -pub use channel::Channel; +pub use channel::{Channel, ChannelNames}; use behaviour::{Behaviour, NetworkEvent}; use handle::Handle; @@ -94,6 +94,7 @@ pub struct Config { pub transport: TransportProtocol, pub gossipsub: GossipSubConfig, pub pubsub_protocol: PubSubProtocol, + pub channel_names: ChannelNames, pub rpc_max_size: usize, pub pubsub_max_size: usize, pub enable_sync: bool, diff --git a/code/crates/network/test/src/lib.rs b/code/crates/network/test/src/lib.rs index 404ed9009..a7c2b6927 100644 --- a/code/crates/network/test/src/lib.rs +++ b/code/crates/network/test/src/lib.rs @@ -160,6 +160,7 @@ impl Test { transport: malachitebft_network::TransportProtocol::Quic, gossipsub: malachitebft_network::GossipSubConfig::default(), pubsub_protocol: malachitebft_network::PubSubProtocol::default(), + channel_names: malachitebft_network::ChannelNames::default(), rpc_max_size: 10 * 1024 * 1024, // 10 MiB pubsub_max_size: 4 * 1024 * 1024, // 4 MiB enable_sync: false, diff --git a/code/crates/starknet/host/src/spawn.rs b/code/crates/starknet/host/src/spawn.rs index a3a28748a..68c49d110 100644 --- a/code/crates/starknet/host/src/spawn.rs +++ b/code/crates/starknet/host/src/spawn.rs @@ -246,6 +246,7 @@ async fn spawn_network_actor( }, config::PubSubProtocol::Broadcast => gossip::GossipSubConfig::default(), }, + channel_names: malachitebft_network::ChannelNames::default(), rpc_max_size: cfg.consensus.p2p.rpc_max_size.as_u64() as usize, pubsub_max_size: cfg.consensus.p2p.pubsub_max_size.as_u64() as usize, enable_sync: false, From de6e18dff3e326a3b0393705998980f98db26a8c Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Thu, 27 Mar 2025 10:51:21 +0100 Subject: [PATCH 21/54] fix: channel names not static --- code/crates/network/src/channel.rs | 54 ++++++++++++++---------------- code/crates/network/src/lib.rs | 54 +++++++++++++++++++++++------- code/crates/network/src/pubsub.rs | 12 ++++--- 3 files changed, 74 insertions(+), 46 deletions(-) diff --git a/code/crates/network/src/channel.rs b/code/crates/network/src/channel.rs index fec80f407..553029269 100644 --- a/code/crates/network/src/channel.rs +++ b/code/crates/network/src/channel.rs @@ -6,7 +6,7 @@ use libp2p::gossipsub; use libp2p_broadcast as broadcast; use serde::{Deserialize, Serialize}; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Copy)] pub struct ChannelNames { pub consensus: &'static str, pub proposal_parts: &'static str, @@ -23,8 +23,6 @@ impl Default for ChannelNames { } } -static CHANNEL_NAMES: OnceLock = OnceLock::new(); - #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum Channel { Consensus, @@ -33,14 +31,6 @@ pub enum Channel { } impl Channel { - pub fn init_channel_names(channel_names: ChannelNames) -> Result<(), ChannelNames> { - CHANNEL_NAMES.set(channel_names) - } - - fn get_channel_names() -> &'static ChannelNames { - CHANNEL_NAMES.get_or_init(ChannelNames::default) - } - pub fn all() -> &'static [Channel] { &[Channel::Consensus, Channel::ProposalParts, Channel::Sync] } @@ -49,17 +39,16 @@ impl Channel { &[Channel::Consensus, Channel::ProposalParts] } - pub fn to_gossipsub_topic(self) -> gossipsub::Sha256Topic { + pub fn to_gossipsub_topic(self, channel_names: ChannelNames) -> gossipsub::Sha256Topic { // gossipsub::IdentTopic::new(self.as_str()) - gossipsub::Sha256Topic::new(self.as_str()) + gossipsub::Sha256Topic::new(self.as_str(channel_names)) } - pub fn to_broadcast_topic(self) -> broadcast::Topic { - broadcast::Topic::new(self.as_str().as_bytes()) + pub fn to_broadcast_topic(self, channel_names: ChannelNames) -> broadcast::Topic { + broadcast::Topic::new(self.as_str(channel_names).as_bytes()) } - pub fn as_str(&self) -> &'static str { - let channel_names = Self::get_channel_names(); + pub fn as_str(&self, channel_names: ChannelNames) -> &'static str { match self { Channel::Consensus => channel_names.consensus, Channel::ProposalParts => channel_names.proposal_parts, @@ -67,32 +56,40 @@ impl Channel { } } - pub fn has_gossipsub_topic(topic_hash: &gossipsub::TopicHash) -> bool { + pub fn has_gossipsub_topic( + topic_hash: &gossipsub::TopicHash, + channel_names: ChannelNames, + ) -> bool { Self::all() .iter() - .any(|channel| &channel.to_gossipsub_topic().hash() == topic_hash) + .any(|channel| &channel.to_gossipsub_topic(channel_names).hash() == topic_hash) } - pub fn has_broadcast_topic(topic: &broadcast::Topic) -> bool { + pub fn has_broadcast_topic(topic: &broadcast::Topic, channel_names: ChannelNames) -> bool { Self::all() .iter() - .any(|channel| &channel.to_broadcast_topic() == topic) + .any(|channel| &channel.to_broadcast_topic(channel_names) == topic) } - pub fn from_gossipsub_topic_hash(topic: &gossipsub::TopicHash) -> Option { - if topic == &Self::Consensus.to_gossipsub_topic().hash() { + pub fn from_gossipsub_topic_hash( + topic: &gossipsub::TopicHash, + channel_names: ChannelNames, + ) -> Option { + if topic == &Self::Consensus.to_gossipsub_topic(channel_names).hash() { Some(Self::Consensus) - } else if topic == &Self::ProposalParts.to_gossipsub_topic().hash() { + } else if topic == &Self::ProposalParts.to_gossipsub_topic(channel_names).hash() { Some(Self::ProposalParts) - } else if topic == &Self::Sync.to_gossipsub_topic().hash() { + } else if topic == &Self::Sync.to_gossipsub_topic(channel_names).hash() { Some(Self::Sync) } else { None } } - pub fn from_broadcast_topic(topic: &broadcast::Topic) -> Option { - let channel_names = Self::get_channel_names(); + pub fn from_broadcast_topic( + topic: &broadcast::Topic, + channel_names: ChannelNames, + ) -> Option { match topic.as_ref() { name if name == channel_names.consensus.as_bytes() => Some(Self::Consensus), name if name == channel_names.proposal_parts.as_bytes() => Some(Self::ProposalParts), @@ -104,6 +101,7 @@ impl Channel { impl fmt::Display for Channel { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.as_str().fmt(f) + // TODO: how to use the correct channel names? + self.as_str(ChannelNames::default()).fmt(f) } } diff --git a/code/crates/network/src/lib.rs b/code/crates/network/src/lib.rs index 4bc717c2a..4ce087a77 100644 --- a/code/crates/network/src/lib.rs +++ b/code/crates/network/src/lib.rs @@ -231,13 +231,23 @@ async fn run( state.discovery.dial_bootstrap_nodes(&swarm); - if let Err(e) = pubsub::subscribe(&mut swarm, config.pubsub_protocol, Channel::consensus()) { + if let Err(e) = pubsub::subscribe( + &mut swarm, + config.pubsub_protocol, + Channel::consensus(), + config.channel_names, + ) { error!("Error subscribing to consensus channels: {e}"); return; }; if config.enable_sync { - if let Err(e) = pubsub::subscribe(&mut swarm, PubSubProtocol::Broadcast, &[Channel::Sync]) { + if let Err(e) = pubsub::subscribe( + &mut swarm, + PubSubProtocol::Broadcast, + &[Channel::Sync], + config.channel_names, + ) { error!("Error subscribing to Sync channel: {e}"); return; }; @@ -290,7 +300,13 @@ async fn handle_ctrl_msg( match msg { CtrlMsg::Publish(channel, data) => { let msg_size = data.len(); - let result = pubsub::publish(swarm, config.pubsub_protocol, channel, data); + let result = pubsub::publish( + swarm, + config.pubsub_protocol, + channel, + config.channel_names, + data, + ); match result { Ok(()) => debug!(%channel, size = %msg_size, "Published message"), @@ -307,7 +323,13 @@ async fn handle_ctrl_msg( } let msg_size = data.len(); - let result = pubsub::publish(swarm, PubSubProtocol::Broadcast, channel, data); + let result = pubsub::publish( + swarm, + PubSubProtocol::Broadcast, + channel, + config.channel_names, + data, + ); match result { Ok(()) => debug!(%channel, size = %msg_size, "Broadcasted message"), @@ -359,7 +381,7 @@ async fn handle_ctrl_msg( async fn handle_swarm_event( event: SwarmEvent, - _config: &Config, + config: &Config, metrics: &Metrics, swarm: &mut swarm::Swarm, state: &mut State, @@ -494,11 +516,11 @@ async fn handle_swarm_event( } SwarmEvent::Behaviour(NetworkEvent::GossipSub(event)) => { - return handle_gossipsub_event(event, metrics, swarm, state, tx_event).await; + return handle_gossipsub_event(event, config, metrics, swarm, state, tx_event).await; } SwarmEvent::Behaviour(NetworkEvent::Broadcast(event)) => { - return handle_broadcast_event(event, metrics, swarm, state, tx_event).await; + return handle_broadcast_event(event, config, metrics, swarm, state, tx_event).await; } SwarmEvent::Behaviour(NetworkEvent::Sync(event)) => { @@ -519,6 +541,7 @@ async fn handle_swarm_event( async fn handle_gossipsub_event( event: gossipsub::Event, + config: &Config, _metrics: &Metrics, _swarm: &mut swarm::Swarm, _state: &mut State, @@ -526,7 +549,8 @@ async fn handle_gossipsub_event( ) -> ControlFlow<()> { match event { gossipsub::Event::Subscribed { peer_id, topic } => { - let Some(channel) = Channel::from_gossipsub_topic_hash(&topic) else { + let Some(channel) = Channel::from_gossipsub_topic_hash(&topic, config.channel_names) + else { trace!("Peer {peer_id} tried to subscribe to unknown topic: {topic}"); return ControlFlow::Continue(()); }; @@ -535,7 +559,8 @@ async fn handle_gossipsub_event( } gossipsub::Event::Unsubscribed { peer_id, topic } => { - let Some(channel) = Channel::from_gossipsub_topic_hash(&topic) else { + let Some(channel) = Channel::from_gossipsub_topic_hash(&topic, config.channel_names) + else { trace!("Peer {peer_id} tried to unsubscribe from unknown topic: {topic}"); return ControlFlow::Continue(()); }; @@ -552,7 +577,9 @@ async fn handle_gossipsub_event( return ControlFlow::Continue(()); }; - let Some(channel) = Channel::from_gossipsub_topic_hash(&message.topic) else { + let Some(channel) = + Channel::from_gossipsub_topic_hash(&message.topic, config.channel_names) + else { trace!( "Received message {message_id} from {peer_id} on different channel: {}", message.topic @@ -598,6 +625,7 @@ async fn handle_gossipsub_event( async fn handle_broadcast_event( event: broadcast::Event, + config: &Config, _metrics: &Metrics, _swarm: &mut swarm::Swarm, _state: &mut State, @@ -605,7 +633,7 @@ async fn handle_broadcast_event( ) -> ControlFlow<()> { match event { broadcast::Event::Subscribed(peer_id, topic) => { - if !Channel::has_broadcast_topic(&topic) { + if !Channel::has_broadcast_topic(&topic, config.channel_names) { trace!("Peer {peer_id} tried to subscribe to unknown topic: {topic:?}"); return ControlFlow::Continue(()); } @@ -614,7 +642,7 @@ async fn handle_broadcast_event( } broadcast::Event::Unsubscribed(peer_id, topic) => { - if !Channel::has_broadcast_topic(&topic) { + if !Channel::has_broadcast_topic(&topic, config.channel_names) { trace!("Peer {peer_id} tried to unsubscribe from unknown topic: {topic:?}"); return ControlFlow::Continue(()); } @@ -623,7 +651,7 @@ async fn handle_broadcast_event( } broadcast::Event::Received(peer_id, topic, message) => { - let Some(channel) = Channel::from_broadcast_topic(&topic) else { + let Some(channel) = Channel::from_broadcast_topic(&topic, config.channel_names) else { trace!("Received message from {peer_id} on different channel: {topic:?}"); return ControlFlow::Continue(()); }; diff --git a/code/crates/network/src/pubsub.rs b/code/crates/network/src/pubsub.rs index 149bd411c..2dc7e623a 100644 --- a/code/crates/network/src/pubsub.rs +++ b/code/crates/network/src/pubsub.rs @@ -3,18 +3,19 @@ use libp2p::swarm; use tracing::trace; use crate::behaviour::Behaviour; -use crate::{Channel, PubSubProtocol}; +use crate::{Channel, ChannelNames, PubSubProtocol}; pub fn subscribe( swarm: &mut swarm::Swarm, protocol: PubSubProtocol, channels: &[Channel], + channel_names: ChannelNames, ) -> Result<(), eyre::Report> { match protocol { PubSubProtocol::GossipSub => { if let Some(gossipsub) = swarm.behaviour_mut().gossipsub.as_mut() { for channel in channels { - gossipsub.subscribe(&channel.to_gossipsub_topic())?; + gossipsub.subscribe(&channel.to_gossipsub_topic(channel_names))?; } } else { return Err(eyre::eyre!("GossipSub not enabled")); @@ -23,7 +24,7 @@ pub fn subscribe( PubSubProtocol::Broadcast => { if let Some(broadcast) = swarm.behaviour_mut().broadcast.as_mut() { for channel in channels { - broadcast.subscribe(channel.to_broadcast_topic()); + broadcast.subscribe(channel.to_broadcast_topic(channel_names)); } } else { return Err(eyre::eyre!("Broadcast not enabled")); @@ -38,19 +39,20 @@ pub fn publish( swarm: &mut swarm::Swarm, protocol: PubSubProtocol, channel: Channel, + channel_names: ChannelNames, data: Bytes, ) -> Result<(), eyre::Report> { match protocol { PubSubProtocol::GossipSub => { if let Some(gossipsub) = swarm.behaviour_mut().gossipsub.as_mut() { - gossipsub.publish(channel.to_gossipsub_topic(), data)?; + gossipsub.publish(channel.to_gossipsub_topic(channel_names), data)?; } else { return Err(eyre::eyre!("GossipSub not enabled")); } } PubSubProtocol::Broadcast => { if let Some(broadcast) = swarm.behaviour_mut().broadcast.as_mut() { - broadcast.broadcast(&channel.to_broadcast_topic(), data); + broadcast.broadcast(&channel.to_broadcast_topic(channel_names), data); } else { return Err(eyre::eyre!("Broadcast not enabled")); } From f07b6b4a44d6c000951d9d481af994e3e580e3c4 Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Thu, 27 Mar 2025 22:10:25 +0100 Subject: [PATCH 22/54] feat: initial Starknet interop setup --- qa/starknet/.gitignore | 4 + qa/starknet/README.md | 34 +++++++ .../malachite-node-1/config/config.toml | 93 +++++++++++++++++++ .../malachite-node-1/config/genesis.json | 22 +++++ .../config/priv_validator_key.json | 11 +++ .../config/sequencer-node-1/config.json | 3 + qa/starknet/docker-compose.yml | 66 +++++++++++++ qa/starknet/logs/README.md | 3 + qa/starknet/malachite.Dockerfile | 7 ++ qa/starknet/sequencer.Dockerfile | 13 +++ 10 files changed, 256 insertions(+) create mode 100644 qa/starknet/.gitignore create mode 100644 qa/starknet/README.md create mode 100644 qa/starknet/config/malachite-node-1/config/config.toml create mode 100644 qa/starknet/config/malachite-node-1/config/genesis.json create mode 100644 qa/starknet/config/malachite-node-1/config/priv_validator_key.json create mode 100644 qa/starknet/config/sequencer-node-1/config.json create mode 100644 qa/starknet/docker-compose.yml create mode 100644 qa/starknet/logs/README.md create mode 100644 qa/starknet/malachite.Dockerfile create mode 100644 qa/starknet/sequencer.Dockerfile diff --git a/qa/starknet/.gitignore b/qa/starknet/.gitignore new file mode 100644 index 000000000..c06e73c05 --- /dev/null +++ b/qa/starknet/.gitignore @@ -0,0 +1,4 @@ +logs/* +!logs/README.md +config/malachite-node-*/* +!config/malachite-node-*/config/ diff --git a/qa/starknet/README.md b/qa/starknet/README.md new file mode 100644 index 000000000..4755fdd0c --- /dev/null +++ b/qa/starknet/README.md @@ -0,0 +1,34 @@ +# Starknet Interopeability Setup + +## Setup + +> [!CAUTION] +> The setup assumes that both malachite and sequencer repositories are cloned in the same directory. + +```bash +docker compose up -d +``` + +Then, you need to manually enter into the containers to start the nodes. + +```bash +docker exec -it /bin/bash +``` + +The names can be found in the `docker-compose.yml` file. + +## Run + +### Malachite + +```bash +rm -rf /config/malachite-node-/db /config/malachite-node-/wal +cargo run --bin informalsystems-malachitebft-starknet-app -- start --home /config/malachite-node- +``` + +### Sequencer + +```bash +rm -rf /logs/sequencer-node-1/* +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 2 +``` diff --git a/qa/starknet/config/malachite-node-1/config/config.toml b/qa/starknet/config/malachite-node-1/config/config.toml new file mode 100644 index 000000000..e3c315444 --- /dev/null +++ b/qa/starknet/config/malachite-node-1/config/config.toml @@ -0,0 +1,93 @@ +moniker = "node-1" + +[logging] +log_level = "debug" +log_format = "plaintext" + +[consensus] +value_payload = "parts-only" + +timeout_propose = "10s" +timeout_propose_delta = "500ms" +timeout_prevote = "5s" +timeout_prevote_delta = "500ms" +timeout_precommit = "5s" +timeout_precommit_delta = "500ms" +timeout_commit = "0s" +timeout_step = "300s" + +[consensus.p2p] +listen_addr = "/ip4/127.0.0.1/tcp/27000" +persistent_peers = ["/dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz"] +transport = "tcp" +pubsub_max_size = "4.2 MB" +rpc_max_size = "10.5 MB" + +[consensus.p2p.discovery] +enabled = false +bootstrap_protocol = "kademlia" +selector = "random" +num_outbound_peers = 1 +num_inbound_peers = 1 +ephemeral_connection_timeout = "5s" +connect_request_max_retries = 10000 + +[consensus.p2p.protocol] +type = "gossipsub" +mesh_n = 6 +mesh_n_high = 12 +mesh_n_low = 4 +mesh_outbound_min = 2 + +[consensus.vote_sync] +mode = "rebroadcast" + +[mempool] +max_tx_count = 10000 +gossip_batch_size = 0 + +[mempool.p2p] +listen_addr = "/ip4/127.0.0.1/tcp/28000" +persistent_peers = [] +transport = "tcp" +pubsub_max_size = "4.2 MB" +rpc_max_size = "10.5 MB" + +[mempool.p2p.discovery] +enabled = false +bootstrap_protocol = "full" +selector = "random" +num_outbound_peers = 20 +num_inbound_peers = 20 +ephemeral_connection_timeout = "5s" + +[mempool.p2p.protocol] +type = "gossipsub" +mesh_n = 6 +mesh_n_high = 12 +mesh_n_low = 4 +mesh_outbound_min = 2 + +[value_sync] +enabled = true +status_update_interval = "10s" +request_timeout = "10s" + +[metrics] +enabled = true +listen_addr = "127.0.0.1:29000" + +[runtime] +flavor = "single_threaded" + +[test] +max_block_size = "1048.6 KB" +tx_size = "1.0 KB" +txs_per_part = 256 +time_allowance_factor = 0.5 +exec_time_per_tx = "1ms" +max_retain_blocks = 1000 + +[test.vote_extensions] +enabled = false +size = "0 B" diff --git a/qa/starknet/config/malachite-node-1/config/genesis.json b/qa/starknet/config/malachite-node-1/config/genesis.json new file mode 100644 index 000000000..8cffc9e29 --- /dev/null +++ b/qa/starknet/config/malachite-node-1/config/genesis.json @@ -0,0 +1,22 @@ +{ + "validator_set": { + "validators": [ + { + "address": "0x0000000000000000000000000000000000000000000000000000000000000065", + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" + }, + "voting_power": 1 + }, + { + "address": "0x0000000000000000000000000000000000000000000000000000000000000064", + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" + }, + "voting_power": 1 + } + ] + } +} diff --git a/qa/starknet/config/malachite-node-1/config/priv_validator_key.json b/qa/starknet/config/malachite-node-1/config/priv_validator_key.json new file mode 100644 index 000000000..e37a988b9 --- /dev/null +++ b/qa/starknet/config/malachite-node-1/config/priv_validator_key.json @@ -0,0 +1,11 @@ +{ + "private_key": { + "type": "tendermint/PrivKeyEd25519", + "value": "z1exB2b1hS8Ajtr/Qf/PvjD0ES/m7RoEwzaT69t2+Ow=" + }, + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" + }, + "address": "0x0000000000000000000000000000000000000000000000000000000000000065" +} diff --git a/qa/starknet/config/sequencer-node-1/config.json b/qa/starknet/config/sequencer-node-1/config.json new file mode 100644 index 000000000..7d3373054 --- /dev/null +++ b/qa/starknet/config/sequencer-node-1/config.json @@ -0,0 +1,3 @@ +{ + "TODO": "Fill in the sequencer node configuration" +} \ No newline at end of file diff --git a/qa/starknet/docker-compose.yml b/qa/starknet/docker-compose.yml new file mode 100644 index 000000000..fdf6131bc --- /dev/null +++ b/qa/starknet/docker-compose.yml @@ -0,0 +1,66 @@ +volumes: + + logs: + driver: local + driver_opts: + type: none + device: ./logs + o: bind + + config: + driver: local + driver_opts: + type: none + device: ./config + o: bind + + malachite: + driver: local + driver_opts: + type: none + device: ../../code + o: bind + + sequencer: + driver: local + driver_opts: + type: none + device: ../../../sequencer + o: bind + +networks: + + test-network: + driver: bridge + +services: + + malachite-node-1: + container_name: malachite-node-1 + build: + context: . + dockerfile: malachite.Dockerfile + volumes: + - malachite:/malachite + - logs:/logs + - config:/config + networks: + - test-network + working_dir: /malachite + tty: true + stdin_open: true + + sequencer-node-1: + container_name: sequencer-node-1 + build: + context: ../../../ + dockerfile: malachite/qa/starknet/sequencer.Dockerfile + volumes: + - sequencer:/sequencer + - logs:/logs + - config:/config + networks: + - test-network + working_dir: /sequencer + tty: true + stdin_open: true diff --git a/qa/starknet/logs/README.md b/qa/starknet/logs/README.md new file mode 100644 index 000000000..ca985f268 --- /dev/null +++ b/qa/starknet/logs/README.md @@ -0,0 +1,3 @@ +# Logs directory + +This directory is mounted in all containers at /logs. It can be used to persist nodes logs and other debug information. diff --git a/qa/starknet/malachite.Dockerfile b/qa/starknet/malachite.Dockerfile new file mode 100644 index 000000000..2702aaed0 --- /dev/null +++ b/qa/starknet/malachite.Dockerfile @@ -0,0 +1,7 @@ +FROM rust:latest + +RUN apt-get update && apt-get install -y bash bash-completion protobuf-compiler && \ + echo 'set editing-mode emacs' >> /etc/inputrc && \ + echo '[[ $PS1 && -f /etc/bash_completion ]] && . /etc/bash_completion' >> /etc/bash.bashrc + +SHELL [ "/bin/bash", "-c" ] diff --git a/qa/starknet/sequencer.Dockerfile b/qa/starknet/sequencer.Dockerfile new file mode 100644 index 000000000..87ffba120 --- /dev/null +++ b/qa/starknet/sequencer.Dockerfile @@ -0,0 +1,13 @@ +FROM rust:latest + +RUN apt-get update && apt-get install -y bash bash-completion && \ + echo 'set editing-mode emacs' >> /etc/inputrc && \ + echo '[[ $PS1 && -f /etc/bash_completion ]] && . /etc/bash_completion' >> /etc/bash.bashrc + +COPY sequencer/scripts/install_build_tools.sh . + +COPY sequencer/scripts/dependencies.sh . + +RUN ./install_build_tools.sh + +SHELL [ "/bin/bash", "-c" ] From 8a0638c5ed3e40740d68d960396e469a06bb5b6d Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Sat, 29 Mar 2025 00:24:01 +0100 Subject: [PATCH 23/54] feat: 4-node starknet interop setup --- qa/starknet/.gitignore | 2 + qa/starknet/README.md | 13 +- qa/starknet/build/README.md | 3 + .../malachite-node-1/config/config.toml | 9 +- .../malachite-node-1/config/genesis.json | 18 +- .../malachite-node-2/config/config.toml | 96 +++++++ .../malachite-node-2/config/genesis.json | 38 +++ .../config/priv_validator_key.json | 11 + .../config/sequencer-node-1/config.json | 263 ++++++++++++++++- .../config/sequencer-node-2/config.json | 264 ++++++++++++++++++ qa/starknet/docker-compose.yml | 53 ++++ 11 files changed, 762 insertions(+), 8 deletions(-) create mode 100644 qa/starknet/build/README.md create mode 100644 qa/starknet/config/malachite-node-2/config/config.toml create mode 100644 qa/starknet/config/malachite-node-2/config/genesis.json create mode 100644 qa/starknet/config/malachite-node-2/config/priv_validator_key.json create mode 100644 qa/starknet/config/sequencer-node-2/config.json diff --git a/qa/starknet/.gitignore b/qa/starknet/.gitignore index c06e73c05..0b8437fbd 100644 --- a/qa/starknet/.gitignore +++ b/qa/starknet/.gitignore @@ -2,3 +2,5 @@ logs/* !logs/README.md config/malachite-node-*/* !config/malachite-node-*/config/ +build/*/* +!build/README.md diff --git a/qa/starknet/README.md b/qa/starknet/README.md index 4755fdd0c..cb451908c 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -1,4 +1,4 @@ -# Starknet Interopeability Setup +# Starknet Interoperability Setup ## Setup @@ -26,9 +26,16 @@ rm -rf /config/malachite-node-/db /config/malachite-node-/wal cargo run --bin informalsystems-malachitebft-starknet-app -- start --home /config/malachite-node- ``` -### Sequencer +### Sequencer #1 ```bash rm -rf /logs/sequencer-node-1/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 2 +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 +``` + +### Sequencer #1 + +```bash +rm -rf /logs/sequencer-node-1/* +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x67 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false ``` diff --git a/qa/starknet/build/README.md b/qa/starknet/build/README.md new file mode 100644 index 000000000..4906af059 --- /dev/null +++ b/qa/starknet/build/README.md @@ -0,0 +1,3 @@ +# Build directory + +This directory is mounted in all containers at /build. It is used to persist cargo builds. diff --git a/qa/starknet/config/malachite-node-1/config/config.toml b/qa/starknet/config/malachite-node-1/config/config.toml index e3c315444..fa6f578a7 100644 --- a/qa/starknet/config/malachite-node-1/config/config.toml +++ b/qa/starknet/config/malachite-node-1/config/config.toml @@ -17,8 +17,11 @@ timeout_commit = "0s" timeout_step = "300s" [consensus.p2p] -listen_addr = "/ip4/127.0.0.1/tcp/27000" -persistent_peers = ["/dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz"] +listen_addr = "/ip4/0.0.0.0/tcp/27000" +persistent_peers = [ + "/dns/sequencer-node-1/tcp/27000", + "/dns/sequencer-node-2/tcp/27000", +] transport = "tcp" pubsub_max_size = "4.2 MB" rpc_max_size = "10.5 MB" @@ -28,7 +31,7 @@ enabled = false bootstrap_protocol = "kademlia" selector = "random" num_outbound_peers = 1 -num_inbound_peers = 1 +num_inbound_peers = 5 ephemeral_connection_timeout = "5s" connect_request_max_retries = 10000 diff --git a/qa/starknet/config/malachite-node-1/config/genesis.json b/qa/starknet/config/malachite-node-1/config/genesis.json index 8cffc9e29..9fa3caf49 100644 --- a/qa/starknet/config/malachite-node-1/config/genesis.json +++ b/qa/starknet/config/malachite-node-1/config/genesis.json @@ -9,6 +9,14 @@ }, "voting_power": 1 }, + { + "address": "0x0000000000000000000000000000000000000000000000000000000000000066", + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "KUTbBESGSHQiX+cLM8+RBJPb931S+KE5V91TVW3Zxas=" + }, + "voting_power": 1 + }, { "address": "0x0000000000000000000000000000000000000000000000000000000000000064", "public_key": { @@ -16,7 +24,15 @@ "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" }, "voting_power": 1 + }, + { + "address": "0x0000000000000000000000000000000000000000000000000000000000000067", + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "F8t5+ytBIPKx7GXkGY1uiyjoE/6x5KQIObheGAgM4AA=" + }, + "voting_power": 1 } ] } -} +} \ No newline at end of file diff --git a/qa/starknet/config/malachite-node-2/config/config.toml b/qa/starknet/config/malachite-node-2/config/config.toml new file mode 100644 index 000000000..82e3ae7e3 --- /dev/null +++ b/qa/starknet/config/malachite-node-2/config/config.toml @@ -0,0 +1,96 @@ +moniker = "node-2" + +[logging] +log_level = "debug" +log_format = "plaintext" + +[consensus] +value_payload = "parts-only" + +timeout_propose = "10s" +timeout_propose_delta = "500ms" +timeout_prevote = "5s" +timeout_prevote_delta = "500ms" +timeout_precommit = "5s" +timeout_precommit_delta = "500ms" +timeout_commit = "0s" +timeout_step = "300s" + +[consensus.p2p] +listen_addr = "/ip4/0.0.0.0/tcp/27000" +persistent_peers = [ + "/dns/sequencer-node-1/tcp/27000", + "/dns/sequencer-node-2/tcp/27000", +] +transport = "tcp" +pubsub_max_size = "4.2 MB" +rpc_max_size = "10.5 MB" + +[consensus.p2p.discovery] +enabled = false +bootstrap_protocol = "kademlia" +selector = "random" +num_outbound_peers = 1 +num_inbound_peers = 5 +ephemeral_connection_timeout = "5s" +connect_request_max_retries = 10000 + +[consensus.p2p.protocol] +type = "gossipsub" +mesh_n = 6 +mesh_n_high = 12 +mesh_n_low = 4 +mesh_outbound_min = 2 + +[consensus.vote_sync] +mode = "rebroadcast" + +[mempool] +max_tx_count = 10000 +gossip_batch_size = 0 + +[mempool.p2p] +listen_addr = "/ip4/127.0.0.1/tcp/28000" +persistent_peers = [] +transport = "tcp" +pubsub_max_size = "4.2 MB" +rpc_max_size = "10.5 MB" + +[mempool.p2p.discovery] +enabled = false +bootstrap_protocol = "full" +selector = "random" +num_outbound_peers = 20 +num_inbound_peers = 20 +ephemeral_connection_timeout = "5s" + +[mempool.p2p.protocol] +type = "gossipsub" +mesh_n = 6 +mesh_n_high = 12 +mesh_n_low = 4 +mesh_outbound_min = 2 + +[value_sync] +enabled = true +status_update_interval = "10s" +request_timeout = "10s" + +[metrics] +enabled = true +listen_addr = "127.0.0.1:29000" + +[runtime] +flavor = "single_threaded" + +[test] +max_block_size = "1048.6 KB" +tx_size = "1.0 KB" +txs_per_part = 256 +time_allowance_factor = 0.5 +exec_time_per_tx = "1ms" +max_retain_blocks = 1000 + +[test.vote_extensions] +enabled = false +size = "0 B" diff --git a/qa/starknet/config/malachite-node-2/config/genesis.json b/qa/starknet/config/malachite-node-2/config/genesis.json new file mode 100644 index 000000000..9fa3caf49 --- /dev/null +++ b/qa/starknet/config/malachite-node-2/config/genesis.json @@ -0,0 +1,38 @@ +{ + "validator_set": { + "validators": [ + { + "address": "0x0000000000000000000000000000000000000000000000000000000000000065", + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" + }, + "voting_power": 1 + }, + { + "address": "0x0000000000000000000000000000000000000000000000000000000000000066", + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "KUTbBESGSHQiX+cLM8+RBJPb931S+KE5V91TVW3Zxas=" + }, + "voting_power": 1 + }, + { + "address": "0x0000000000000000000000000000000000000000000000000000000000000064", + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" + }, + "voting_power": 1 + }, + { + "address": "0x0000000000000000000000000000000000000000000000000000000000000067", + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "F8t5+ytBIPKx7GXkGY1uiyjoE/6x5KQIObheGAgM4AA=" + }, + "voting_power": 1 + } + ] + } +} \ No newline at end of file diff --git a/qa/starknet/config/malachite-node-2/config/priv_validator_key.json b/qa/starknet/config/malachite-node-2/config/priv_validator_key.json new file mode 100644 index 000000000..cc1965264 --- /dev/null +++ b/qa/starknet/config/malachite-node-2/config/priv_validator_key.json @@ -0,0 +1,11 @@ +{ + "private_key": { + "type": "tendermint/PrivKeyEd25519", + "value": "AXCWFA8nYrqNrDKdlUpG78A7umsi2zHFKdE0hcpggtY=" + }, + "public_key": { + "type": "tendermint/PubKeyEd25519", + "value": "uVe2CKLsf9dcGG2i6IWVkYAMBFZAPeFLzIdK1bjWf80=" + }, + "address": "0x0000000000000000000000000000000000000000000000000000000000000066" +} \ No newline at end of file diff --git a/qa/starknet/config/sequencer-node-1/config.json b/qa/starknet/config/sequencer-node-1/config.json index 7d3373054..95502b458 100644 --- a/qa/starknet/config/sequencer-node-1/config.json +++ b/qa/starknet/config/sequencer-node-1/config.json @@ -1,3 +1,264 @@ { - "TODO": "Fill in the sequencer node configuration" + "base_layer_config.node_url": "http://invalid_address.com", + "base_layer_config.starknet_contract_address": "0xc662c410C0ECf747543f5bA90660f6ABeBD9C8c4", + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.add_mod": 156250, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.bitwise": 39062, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.ec_op": 2441, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.ecdsa": 1220, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.keccak": 1220, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.mul_mod": 156250, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.pedersen": 78125, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.poseidon": 78125, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.range_check": 156250, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.range_check96": 156250, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.l1_gas": 2500000, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.message_segment_length": 3700, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.n_events": 5000, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.n_steps": 2500000, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.sierra_gas": 250000000, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.state_diff_size": 4000, + "batcher_config.block_builder_config.chain_info.chain_id": "MY_CUSTOM_CHAIN_ID", + "batcher_config.block_builder_config.chain_info.fee_token_addresses.eth_fee_token_address": "0x1001", + "batcher_config.block_builder_config.chain_info.fee_token_addresses.strk_fee_token_address": "0x1002", + "batcher_config.block_builder_config.execute_config.concurrency_config.chunk_size": 0, + "batcher_config.block_builder_config.execute_config.concurrency_config.enabled": false, + "batcher_config.block_builder_config.execute_config.concurrency_config.n_workers": 0, + "batcher_config.block_builder_config.execute_config.stack_size": 62914560, + "batcher_config.block_builder_config.tx_chunk_size": 100, + "batcher_config.block_builder_config.versioned_constants_overrides.invoke_tx_max_n_steps": 10000000, + "batcher_config.block_builder_config.versioned_constants_overrides.max_recursion_depth": 50, + "batcher_config.block_builder_config.versioned_constants_overrides.validate_max_n_steps": 1000000, + "batcher_config.contract_class_manager_config.cairo_native_run_config.channel_size": 2000, + "batcher_config.contract_class_manager_config.cairo_native_run_config.run_cairo_native": false, + "batcher_config.contract_class_manager_config.cairo_native_run_config.wait_on_native_compilation": false, + "batcher_config.contract_class_manager_config.contract_cache_size": 600, + "batcher_config.contract_class_manager_config.native_compiler_config.max_casm_bytecode_size": 81920, + "batcher_config.contract_class_manager_config.native_compiler_config.max_cpu_time": 20, + "batcher_config.contract_class_manager_config.native_compiler_config.max_memory_usage": 5368709120, + "batcher_config.contract_class_manager_config.native_compiler_config.max_native_bytecode_size": 15728640, + "batcher_config.contract_class_manager_config.native_compiler_config.sierra_to_native_compiler_path": null, + "batcher_config.input_stream_content_buffer_size": 400, + "batcher_config.max_l1_handler_txs_per_block_proposal": 3, + "batcher_config.outstream_content_buffer_size": 100, + "batcher_config.storage.db_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "batcher_config.storage.db_config.enforce_file_exists": false, + "batcher_config.storage.db_config.growth_step": 4294967296, + "batcher_config.storage.db_config.max_size": 1099511627776, + "batcher_config.storage.db_config.min_size": 1048576, + "batcher_config.storage.db_config.path_prefix": "/logs/sequencer-node-1/batcher_data", + "batcher_config.storage.mmap_file_config.growth_step": 1073741824, + "batcher_config.storage.mmap_file_config.max_object_size": 268435456, + "batcher_config.storage.mmap_file_config.max_size": 1099511627776, + "batcher_config.storage.scope": "StateOnly", + "chain_id": "MY_CUSTOM_CHAIN_ID", + "class_manager_config.class_manager_config.cached_class_storage_config.class_cache_size": 10, + "class_manager_config.class_manager_config.cached_class_storage_config.deprecated_class_cache_size": 10, + "class_manager_config.class_storage_config.class_hash_storage_config.enforce_file_exists": false, + "class_manager_config.class_storage_config.class_hash_storage_config.max_size": 1048576, + "class_manager_config.class_storage_config.class_hash_storage_config.path_prefix": "/logs/sequencer-node-1/class_manager_data", + "class_manager_config.class_storage_config.persistent_root": "/classes", + "compiler_config.max_casm_bytecode_size": 81920, + "compiler_config.max_cpu_time": 20, + "compiler_config.max_memory_usage": 5368709120, + "compiler_config.max_native_bytecode_size": 15728640, + "compiler_config.sierra_to_native_compiler_path": null, + "components.batcher.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.batcher.ip": "0.0.0.0", + "components.batcher.local_server_config.channel_buffer_size": 32, + "components.batcher.max_concurrency": 10, + "components.batcher.port": 0, + "components.batcher.remote_client_config.idle_connections": 18446744073709551615, + "components.batcher.remote_client_config.idle_timeout": 90, + "components.batcher.remote_client_config.retries": 3, + "components.batcher.url": "localhost", + "components.class_manager.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.class_manager.ip": "0.0.0.0", + "components.class_manager.local_server_config.channel_buffer_size": 32, + "components.class_manager.max_concurrency": 10, + "components.class_manager.port": 0, + "components.class_manager.remote_client_config.idle_connections": 18446744073709551615, + "components.class_manager.remote_client_config.idle_timeout": 90, + "components.class_manager.remote_client_config.retries": 3, + "components.class_manager.url": "localhost", + "components.consensus_manager.execution_mode": "Enabled", + "components.gateway.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.gateway.ip": "0.0.0.0", + "components.gateway.local_server_config.channel_buffer_size": 32, + "components.gateway.max_concurrency": 10, + "components.gateway.port": 0, + "components.gateway.remote_client_config.idle_connections": 18446744073709551615, + "components.gateway.remote_client_config.idle_timeout": 90, + "components.gateway.remote_client_config.retries": 3, + "components.gateway.url": "localhost", + "components.http_server.execution_mode": "Enabled", + "components.l1_provider.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.l1_provider.ip": "0.0.0.0", + "components.l1_provider.local_server_config.channel_buffer_size": 32, + "components.l1_provider.max_concurrency": 10, + "components.l1_provider.port": 0, + "components.l1_provider.remote_client_config.idle_connections": 18446744073709551615, + "components.l1_provider.remote_client_config.idle_timeout": 90, + "components.l1_provider.remote_client_config.retries": 3, + "components.l1_provider.url": "localhost", + "components.l1_scraper.execution_mode": "Enabled", + "components.mempool.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.mempool.ip": "0.0.0.0", + "components.mempool.local_server_config.channel_buffer_size": 32, + "components.mempool.max_concurrency": 10, + "components.mempool.port": 0, + "components.mempool.remote_client_config.idle_connections": 18446744073709551615, + "components.mempool.remote_client_config.idle_timeout": 90, + "components.mempool.remote_client_config.retries": 3, + "components.mempool.url": "localhost", + "components.mempool_p2p.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.mempool_p2p.ip": "0.0.0.0", + "components.mempool_p2p.local_server_config.channel_buffer_size": 32, + "components.mempool_p2p.max_concurrency": 10, + "components.mempool_p2p.port": 0, + "components.mempool_p2p.remote_client_config.idle_connections": 18446744073709551615, + "components.mempool_p2p.remote_client_config.idle_timeout": 90, + "components.mempool_p2p.remote_client_config.retries": 3, + "components.mempool_p2p.url": "localhost", + "components.monitoring_endpoint.execution_mode": "Enabled", + "components.sierra_compiler.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.sierra_compiler.ip": "0.0.0.0", + "components.sierra_compiler.local_server_config.channel_buffer_size": 32, + "components.sierra_compiler.max_concurrency": 10, + "components.sierra_compiler.port": 0, + "components.sierra_compiler.remote_client_config.idle_connections": 18446744073709551615, + "components.sierra_compiler.remote_client_config.idle_timeout": 90, + "components.sierra_compiler.remote_client_config.retries": 3, + "components.sierra_compiler.url": "localhost", + "components.state_sync.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.state_sync.ip": "0.0.0.0", + "components.state_sync.local_server_config.channel_buffer_size": 32, + "components.state_sync.max_concurrency": 10, + "components.state_sync.port": 0, + "components.state_sync.remote_client_config.idle_connections": 18446744073709551615, + "components.state_sync.remote_client_config.idle_timeout": 90, + "components.state_sync.remote_client_config.retries": 3, + "components.state_sync.url": "localhost", + "consensus_manager_config.broadcast_buffer_size": 10000, + "consensus_manager_config.cende_config.certificates_file_path": null, + "consensus_manager_config.cende_config.recorder_url": "http://invalid_address.com", + "consensus_manager_config.cende_config.skip_write_height": null, + "consensus_manager_config.consensus_config.future_height_limit": 10, + "consensus_manager_config.consensus_config.future_height_round_limit": 1, + "consensus_manager_config.consensus_config.future_round_limit": 10, + "consensus_manager_config.consensus_config.startup_delay": 5, + "consensus_manager_config.consensus_config.sync_retry_interval": 1.0, + "consensus_manager_config.consensus_config.timeouts.precommit_timeout": 1.0, + "consensus_manager_config.consensus_config.timeouts.prevote_timeout": 1.0, + "consensus_manager_config.consensus_config.timeouts.proposal_timeout": 3.0, + "consensus_manager_config.consensus_config.validator_id": "0x64", + "consensus_manager_config.context_config.batcher_build_buffer": 100, + "consensus_manager_config.context_config.block_timestamp_window": 1, + "consensus_manager_config.context_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "consensus_manager_config.context_config.l1_da_mode": true, + "consensus_manager_config.context_config.num_validators": 2, + "consensus_manager_config.immediate_active_height": 0, + "consensus_manager_config.network_config.advertised_multiaddr": null, + "consensus_manager_config.network_config.bootstrap_peer_multiaddr": null, + "consensus_manager_config.network_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "consensus_manager_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis": 2, + "consensus_manager_config.network_config.discovery_config.bootstrap_dial_retry_config.factor": 5, + "consensus_manager_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds": 5, + "consensus_manager_config.network_config.discovery_config.heartbeat_interval": 100, + "consensus_manager_config.network_config.idle_connection_timeout": 120, + "consensus_manager_config.network_config.peer_manager_config.malicious_timeout_seconds": 1, + "consensus_manager_config.network_config.peer_manager_config.unstable_timeout_millis": 1000, + "consensus_manager_config.network_config.secret_key": "0x1111111111111111111111111111111111111111111111111111111111111111", + "consensus_manager_config.network_config.session_timeout": 120, + "consensus_manager_config.network_config.tcp_port": 27000, + "consensus_manager_config.proposals_topic": "consensus_proposals", + "consensus_manager_config.revert_config.revert_up_to_and_including": 18446744073709551615, + "consensus_manager_config.revert_config.should_revert": false, + "consensus_manager_config.votes_topic": "consensus_votes", + "eth_fee_token_address": "0x1001", + "gateway_config.chain_info.chain_id": "MY_CUSTOM_CHAIN_ID", + "gateway_config.chain_info.fee_token_addresses.eth_fee_token_address": "0x1001", + "gateway_config.chain_info.fee_token_addresses.strk_fee_token_address": "0x1002", + "gateway_config.stateful_tx_validator_config.max_nonce_for_validation_skip": "0x1", + "gateway_config.stateful_tx_validator_config.versioned_constants_overrides.invoke_tx_max_n_steps": 10000000, + "gateway_config.stateful_tx_validator_config.versioned_constants_overrides.max_recursion_depth": 50, + "gateway_config.stateful_tx_validator_config.versioned_constants_overrides.validate_max_n_steps": 1000000, + "gateway_config.stateless_tx_validator_config.max_calldata_length": 4000, + "gateway_config.stateless_tx_validator_config.max_contract_class_object_size": 4089446, + "gateway_config.stateless_tx_validator_config.max_sierra_version.major": 1, + "gateway_config.stateless_tx_validator_config.max_sierra_version.minor": 5, + "gateway_config.stateless_tx_validator_config.max_sierra_version.patch": 18446744073709551615, + "gateway_config.stateless_tx_validator_config.max_signature_length": 4000, + "gateway_config.stateless_tx_validator_config.min_sierra_version.major": 1, + "gateway_config.stateless_tx_validator_config.min_sierra_version.minor": 1, + "gateway_config.stateless_tx_validator_config.min_sierra_version.patch": 0, + "gateway_config.stateless_tx_validator_config.validate_non_zero_l1_data_gas_fee": false, + "gateway_config.stateless_tx_validator_config.validate_non_zero_l1_gas_fee": true, + "gateway_config.stateless_tx_validator_config.validate_non_zero_l2_gas_fee": false, + "http_server_config.ip": "0.0.0.0", + "http_server_config.port": 13000, + "l1_provider_config.bootstrap_catch_up_height": 0, + "l1_provider_config.provider_startup_height": 1, + "l1_provider_config.startup_sync_sleep_retry_interval": 0.0, + "l1_scraper_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "l1_scraper_config.finality": 0, + "l1_scraper_config.polling_interval": 1, + "l1_scraper_config.startup_rewind_time": 0, + "mempool_p2p_config.network_buffer_size": 10000, + "mempool_p2p_config.network_config.advertised_multiaddr": null, + "mempool_p2p_config.network_config.bootstrap_peer_multiaddr": null, + "mempool_p2p_config.network_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis": 2, + "mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.factor": 5, + "mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds": 5, + "mempool_p2p_config.network_config.discovery_config.heartbeat_interval": 100, + "mempool_p2p_config.network_config.idle_connection_timeout": 120, + "mempool_p2p_config.network_config.peer_manager_config.malicious_timeout_seconds": 1, + "mempool_p2p_config.network_config.peer_manager_config.unstable_timeout_millis": 1000, + "mempool_p2p_config.network_config.secret_key": "", + "mempool_p2p_config.network_config.session_timeout": 120, + "mempool_p2p_config.network_config.tcp_port": 11000, + "monitoring_endpoint_config.collect_metrics": true, + "monitoring_endpoint_config.ip": "0.0.0.0", + "monitoring_endpoint_config.port": 14000, + "recorder_url": "http://invalid_address.com", + "revert_config.revert_up_to_and_including": 18446744073709551615, + "revert_config.should_revert": false, + "state_sync_config.central_sync_client_config": null, + "state_sync_config.network_config.advertised_multiaddr": null, + "state_sync_config.network_config.bootstrap_peer_multiaddr": null, + "state_sync_config.network_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "state_sync_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis": 2, + "state_sync_config.network_config.discovery_config.bootstrap_dial_retry_config.factor": 5, + "state_sync_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds": 5, + "state_sync_config.network_config.discovery_config.heartbeat_interval": 100, + "state_sync_config.network_config.idle_connection_timeout": 120, + "state_sync_config.network_config.peer_manager_config.malicious_timeout_seconds": 1, + "state_sync_config.network_config.peer_manager_config.unstable_timeout_millis": 1000, + "state_sync_config.network_config.secret_key": "0x2222222222222222222222222222222222222222222222222222222222222222", + "state_sync_config.network_config.session_timeout": 120, + "state_sync_config.network_config.tcp_port": 12000, + "state_sync_config.p2p_sync_client_config.buffer_size": 100000, + "state_sync_config.p2p_sync_client_config.num_block_classes_per_query": 100, + "state_sync_config.p2p_sync_client_config.num_block_state_diffs_per_query": 100, + "state_sync_config.p2p_sync_client_config.num_block_transactions_per_query": 100, + "state_sync_config.p2p_sync_client_config.num_headers_per_query": 10000, + "state_sync_config.p2p_sync_client_config.wait_period_for_new_data": 50, + "state_sync_config.p2p_sync_client_config.wait_period_for_other_protocol": 50, + "state_sync_config.revert_config.revert_up_to_and_including": 18446744073709551615, + "state_sync_config.revert_config.should_revert": false, + "state_sync_config.storage_config.db_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "state_sync_config.storage_config.db_config.enforce_file_exists": false, + "state_sync_config.storage_config.db_config.growth_step": 4294967296, + "state_sync_config.storage_config.db_config.max_size": 1099511627776, + "state_sync_config.storage_config.db_config.min_size": 1048576, + "state_sync_config.storage_config.db_config.path_prefix": "/logs/sequencer-node-1/sync_data", + "state_sync_config.storage_config.mmap_file_config.growth_step": 1073741824, + "state_sync_config.storage_config.mmap_file_config.max_object_size": 268435456, + "state_sync_config.storage_config.mmap_file_config.max_size": 1099511627776, + "state_sync_config.storage_config.scope": "FullArchive", + "strk_fee_token_address": "0x1002", + "validator_id": "0x64", + "versioned_constants_overrides.invoke_tx_max_n_steps": 10000000, + "versioned_constants_overrides.max_recursion_depth": 50, + "versioned_constants_overrides.validate_max_n_steps": 1000000 } \ No newline at end of file diff --git a/qa/starknet/config/sequencer-node-2/config.json b/qa/starknet/config/sequencer-node-2/config.json new file mode 100644 index 000000000..95502b458 --- /dev/null +++ b/qa/starknet/config/sequencer-node-2/config.json @@ -0,0 +1,264 @@ +{ + "base_layer_config.node_url": "http://invalid_address.com", + "base_layer_config.starknet_contract_address": "0xc662c410C0ECf747543f5bA90660f6ABeBD9C8c4", + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.add_mod": 156250, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.bitwise": 39062, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.ec_op": 2441, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.ecdsa": 1220, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.keccak": 1220, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.mul_mod": 156250, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.pedersen": 78125, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.poseidon": 78125, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.range_check": 156250, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.range_check96": 156250, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.l1_gas": 2500000, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.message_segment_length": 3700, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.n_events": 5000, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.n_steps": 2500000, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.sierra_gas": 250000000, + "batcher_config.block_builder_config.bouncer_config.block_max_capacity.state_diff_size": 4000, + "batcher_config.block_builder_config.chain_info.chain_id": "MY_CUSTOM_CHAIN_ID", + "batcher_config.block_builder_config.chain_info.fee_token_addresses.eth_fee_token_address": "0x1001", + "batcher_config.block_builder_config.chain_info.fee_token_addresses.strk_fee_token_address": "0x1002", + "batcher_config.block_builder_config.execute_config.concurrency_config.chunk_size": 0, + "batcher_config.block_builder_config.execute_config.concurrency_config.enabled": false, + "batcher_config.block_builder_config.execute_config.concurrency_config.n_workers": 0, + "batcher_config.block_builder_config.execute_config.stack_size": 62914560, + "batcher_config.block_builder_config.tx_chunk_size": 100, + "batcher_config.block_builder_config.versioned_constants_overrides.invoke_tx_max_n_steps": 10000000, + "batcher_config.block_builder_config.versioned_constants_overrides.max_recursion_depth": 50, + "batcher_config.block_builder_config.versioned_constants_overrides.validate_max_n_steps": 1000000, + "batcher_config.contract_class_manager_config.cairo_native_run_config.channel_size": 2000, + "batcher_config.contract_class_manager_config.cairo_native_run_config.run_cairo_native": false, + "batcher_config.contract_class_manager_config.cairo_native_run_config.wait_on_native_compilation": false, + "batcher_config.contract_class_manager_config.contract_cache_size": 600, + "batcher_config.contract_class_manager_config.native_compiler_config.max_casm_bytecode_size": 81920, + "batcher_config.contract_class_manager_config.native_compiler_config.max_cpu_time": 20, + "batcher_config.contract_class_manager_config.native_compiler_config.max_memory_usage": 5368709120, + "batcher_config.contract_class_manager_config.native_compiler_config.max_native_bytecode_size": 15728640, + "batcher_config.contract_class_manager_config.native_compiler_config.sierra_to_native_compiler_path": null, + "batcher_config.input_stream_content_buffer_size": 400, + "batcher_config.max_l1_handler_txs_per_block_proposal": 3, + "batcher_config.outstream_content_buffer_size": 100, + "batcher_config.storage.db_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "batcher_config.storage.db_config.enforce_file_exists": false, + "batcher_config.storage.db_config.growth_step": 4294967296, + "batcher_config.storage.db_config.max_size": 1099511627776, + "batcher_config.storage.db_config.min_size": 1048576, + "batcher_config.storage.db_config.path_prefix": "/logs/sequencer-node-1/batcher_data", + "batcher_config.storage.mmap_file_config.growth_step": 1073741824, + "batcher_config.storage.mmap_file_config.max_object_size": 268435456, + "batcher_config.storage.mmap_file_config.max_size": 1099511627776, + "batcher_config.storage.scope": "StateOnly", + "chain_id": "MY_CUSTOM_CHAIN_ID", + "class_manager_config.class_manager_config.cached_class_storage_config.class_cache_size": 10, + "class_manager_config.class_manager_config.cached_class_storage_config.deprecated_class_cache_size": 10, + "class_manager_config.class_storage_config.class_hash_storage_config.enforce_file_exists": false, + "class_manager_config.class_storage_config.class_hash_storage_config.max_size": 1048576, + "class_manager_config.class_storage_config.class_hash_storage_config.path_prefix": "/logs/sequencer-node-1/class_manager_data", + "class_manager_config.class_storage_config.persistent_root": "/classes", + "compiler_config.max_casm_bytecode_size": 81920, + "compiler_config.max_cpu_time": 20, + "compiler_config.max_memory_usage": 5368709120, + "compiler_config.max_native_bytecode_size": 15728640, + "compiler_config.sierra_to_native_compiler_path": null, + "components.batcher.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.batcher.ip": "0.0.0.0", + "components.batcher.local_server_config.channel_buffer_size": 32, + "components.batcher.max_concurrency": 10, + "components.batcher.port": 0, + "components.batcher.remote_client_config.idle_connections": 18446744073709551615, + "components.batcher.remote_client_config.idle_timeout": 90, + "components.batcher.remote_client_config.retries": 3, + "components.batcher.url": "localhost", + "components.class_manager.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.class_manager.ip": "0.0.0.0", + "components.class_manager.local_server_config.channel_buffer_size": 32, + "components.class_manager.max_concurrency": 10, + "components.class_manager.port": 0, + "components.class_manager.remote_client_config.idle_connections": 18446744073709551615, + "components.class_manager.remote_client_config.idle_timeout": 90, + "components.class_manager.remote_client_config.retries": 3, + "components.class_manager.url": "localhost", + "components.consensus_manager.execution_mode": "Enabled", + "components.gateway.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.gateway.ip": "0.0.0.0", + "components.gateway.local_server_config.channel_buffer_size": 32, + "components.gateway.max_concurrency": 10, + "components.gateway.port": 0, + "components.gateway.remote_client_config.idle_connections": 18446744073709551615, + "components.gateway.remote_client_config.idle_timeout": 90, + "components.gateway.remote_client_config.retries": 3, + "components.gateway.url": "localhost", + "components.http_server.execution_mode": "Enabled", + "components.l1_provider.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.l1_provider.ip": "0.0.0.0", + "components.l1_provider.local_server_config.channel_buffer_size": 32, + "components.l1_provider.max_concurrency": 10, + "components.l1_provider.port": 0, + "components.l1_provider.remote_client_config.idle_connections": 18446744073709551615, + "components.l1_provider.remote_client_config.idle_timeout": 90, + "components.l1_provider.remote_client_config.retries": 3, + "components.l1_provider.url": "localhost", + "components.l1_scraper.execution_mode": "Enabled", + "components.mempool.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.mempool.ip": "0.0.0.0", + "components.mempool.local_server_config.channel_buffer_size": 32, + "components.mempool.max_concurrency": 10, + "components.mempool.port": 0, + "components.mempool.remote_client_config.idle_connections": 18446744073709551615, + "components.mempool.remote_client_config.idle_timeout": 90, + "components.mempool.remote_client_config.retries": 3, + "components.mempool.url": "localhost", + "components.mempool_p2p.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.mempool_p2p.ip": "0.0.0.0", + "components.mempool_p2p.local_server_config.channel_buffer_size": 32, + "components.mempool_p2p.max_concurrency": 10, + "components.mempool_p2p.port": 0, + "components.mempool_p2p.remote_client_config.idle_connections": 18446744073709551615, + "components.mempool_p2p.remote_client_config.idle_timeout": 90, + "components.mempool_p2p.remote_client_config.retries": 3, + "components.mempool_p2p.url": "localhost", + "components.monitoring_endpoint.execution_mode": "Enabled", + "components.sierra_compiler.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.sierra_compiler.ip": "0.0.0.0", + "components.sierra_compiler.local_server_config.channel_buffer_size": 32, + "components.sierra_compiler.max_concurrency": 10, + "components.sierra_compiler.port": 0, + "components.sierra_compiler.remote_client_config.idle_connections": 18446744073709551615, + "components.sierra_compiler.remote_client_config.idle_timeout": 90, + "components.sierra_compiler.remote_client_config.retries": 3, + "components.sierra_compiler.url": "localhost", + "components.state_sync.execution_mode": "LocalExecutionWithRemoteDisabled", + "components.state_sync.ip": "0.0.0.0", + "components.state_sync.local_server_config.channel_buffer_size": 32, + "components.state_sync.max_concurrency": 10, + "components.state_sync.port": 0, + "components.state_sync.remote_client_config.idle_connections": 18446744073709551615, + "components.state_sync.remote_client_config.idle_timeout": 90, + "components.state_sync.remote_client_config.retries": 3, + "components.state_sync.url": "localhost", + "consensus_manager_config.broadcast_buffer_size": 10000, + "consensus_manager_config.cende_config.certificates_file_path": null, + "consensus_manager_config.cende_config.recorder_url": "http://invalid_address.com", + "consensus_manager_config.cende_config.skip_write_height": null, + "consensus_manager_config.consensus_config.future_height_limit": 10, + "consensus_manager_config.consensus_config.future_height_round_limit": 1, + "consensus_manager_config.consensus_config.future_round_limit": 10, + "consensus_manager_config.consensus_config.startup_delay": 5, + "consensus_manager_config.consensus_config.sync_retry_interval": 1.0, + "consensus_manager_config.consensus_config.timeouts.precommit_timeout": 1.0, + "consensus_manager_config.consensus_config.timeouts.prevote_timeout": 1.0, + "consensus_manager_config.consensus_config.timeouts.proposal_timeout": 3.0, + "consensus_manager_config.consensus_config.validator_id": "0x64", + "consensus_manager_config.context_config.batcher_build_buffer": 100, + "consensus_manager_config.context_config.block_timestamp_window": 1, + "consensus_manager_config.context_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "consensus_manager_config.context_config.l1_da_mode": true, + "consensus_manager_config.context_config.num_validators": 2, + "consensus_manager_config.immediate_active_height": 0, + "consensus_manager_config.network_config.advertised_multiaddr": null, + "consensus_manager_config.network_config.bootstrap_peer_multiaddr": null, + "consensus_manager_config.network_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "consensus_manager_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis": 2, + "consensus_manager_config.network_config.discovery_config.bootstrap_dial_retry_config.factor": 5, + "consensus_manager_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds": 5, + "consensus_manager_config.network_config.discovery_config.heartbeat_interval": 100, + "consensus_manager_config.network_config.idle_connection_timeout": 120, + "consensus_manager_config.network_config.peer_manager_config.malicious_timeout_seconds": 1, + "consensus_manager_config.network_config.peer_manager_config.unstable_timeout_millis": 1000, + "consensus_manager_config.network_config.secret_key": "0x1111111111111111111111111111111111111111111111111111111111111111", + "consensus_manager_config.network_config.session_timeout": 120, + "consensus_manager_config.network_config.tcp_port": 27000, + "consensus_manager_config.proposals_topic": "consensus_proposals", + "consensus_manager_config.revert_config.revert_up_to_and_including": 18446744073709551615, + "consensus_manager_config.revert_config.should_revert": false, + "consensus_manager_config.votes_topic": "consensus_votes", + "eth_fee_token_address": "0x1001", + "gateway_config.chain_info.chain_id": "MY_CUSTOM_CHAIN_ID", + "gateway_config.chain_info.fee_token_addresses.eth_fee_token_address": "0x1001", + "gateway_config.chain_info.fee_token_addresses.strk_fee_token_address": "0x1002", + "gateway_config.stateful_tx_validator_config.max_nonce_for_validation_skip": "0x1", + "gateway_config.stateful_tx_validator_config.versioned_constants_overrides.invoke_tx_max_n_steps": 10000000, + "gateway_config.stateful_tx_validator_config.versioned_constants_overrides.max_recursion_depth": 50, + "gateway_config.stateful_tx_validator_config.versioned_constants_overrides.validate_max_n_steps": 1000000, + "gateway_config.stateless_tx_validator_config.max_calldata_length": 4000, + "gateway_config.stateless_tx_validator_config.max_contract_class_object_size": 4089446, + "gateway_config.stateless_tx_validator_config.max_sierra_version.major": 1, + "gateway_config.stateless_tx_validator_config.max_sierra_version.minor": 5, + "gateway_config.stateless_tx_validator_config.max_sierra_version.patch": 18446744073709551615, + "gateway_config.stateless_tx_validator_config.max_signature_length": 4000, + "gateway_config.stateless_tx_validator_config.min_sierra_version.major": 1, + "gateway_config.stateless_tx_validator_config.min_sierra_version.minor": 1, + "gateway_config.stateless_tx_validator_config.min_sierra_version.patch": 0, + "gateway_config.stateless_tx_validator_config.validate_non_zero_l1_data_gas_fee": false, + "gateway_config.stateless_tx_validator_config.validate_non_zero_l1_gas_fee": true, + "gateway_config.stateless_tx_validator_config.validate_non_zero_l2_gas_fee": false, + "http_server_config.ip": "0.0.0.0", + "http_server_config.port": 13000, + "l1_provider_config.bootstrap_catch_up_height": 0, + "l1_provider_config.provider_startup_height": 1, + "l1_provider_config.startup_sync_sleep_retry_interval": 0.0, + "l1_scraper_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "l1_scraper_config.finality": 0, + "l1_scraper_config.polling_interval": 1, + "l1_scraper_config.startup_rewind_time": 0, + "mempool_p2p_config.network_buffer_size": 10000, + "mempool_p2p_config.network_config.advertised_multiaddr": null, + "mempool_p2p_config.network_config.bootstrap_peer_multiaddr": null, + "mempool_p2p_config.network_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis": 2, + "mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.factor": 5, + "mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds": 5, + "mempool_p2p_config.network_config.discovery_config.heartbeat_interval": 100, + "mempool_p2p_config.network_config.idle_connection_timeout": 120, + "mempool_p2p_config.network_config.peer_manager_config.malicious_timeout_seconds": 1, + "mempool_p2p_config.network_config.peer_manager_config.unstable_timeout_millis": 1000, + "mempool_p2p_config.network_config.secret_key": "", + "mempool_p2p_config.network_config.session_timeout": 120, + "mempool_p2p_config.network_config.tcp_port": 11000, + "monitoring_endpoint_config.collect_metrics": true, + "monitoring_endpoint_config.ip": "0.0.0.0", + "monitoring_endpoint_config.port": 14000, + "recorder_url": "http://invalid_address.com", + "revert_config.revert_up_to_and_including": 18446744073709551615, + "revert_config.should_revert": false, + "state_sync_config.central_sync_client_config": null, + "state_sync_config.network_config.advertised_multiaddr": null, + "state_sync_config.network_config.bootstrap_peer_multiaddr": null, + "state_sync_config.network_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "state_sync_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis": 2, + "state_sync_config.network_config.discovery_config.bootstrap_dial_retry_config.factor": 5, + "state_sync_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds": 5, + "state_sync_config.network_config.discovery_config.heartbeat_interval": 100, + "state_sync_config.network_config.idle_connection_timeout": 120, + "state_sync_config.network_config.peer_manager_config.malicious_timeout_seconds": 1, + "state_sync_config.network_config.peer_manager_config.unstable_timeout_millis": 1000, + "state_sync_config.network_config.secret_key": "0x2222222222222222222222222222222222222222222222222222222222222222", + "state_sync_config.network_config.session_timeout": 120, + "state_sync_config.network_config.tcp_port": 12000, + "state_sync_config.p2p_sync_client_config.buffer_size": 100000, + "state_sync_config.p2p_sync_client_config.num_block_classes_per_query": 100, + "state_sync_config.p2p_sync_client_config.num_block_state_diffs_per_query": 100, + "state_sync_config.p2p_sync_client_config.num_block_transactions_per_query": 100, + "state_sync_config.p2p_sync_client_config.num_headers_per_query": 10000, + "state_sync_config.p2p_sync_client_config.wait_period_for_new_data": 50, + "state_sync_config.p2p_sync_client_config.wait_period_for_other_protocol": 50, + "state_sync_config.revert_config.revert_up_to_and_including": 18446744073709551615, + "state_sync_config.revert_config.should_revert": false, + "state_sync_config.storage_config.db_config.chain_id": "MY_CUSTOM_CHAIN_ID", + "state_sync_config.storage_config.db_config.enforce_file_exists": false, + "state_sync_config.storage_config.db_config.growth_step": 4294967296, + "state_sync_config.storage_config.db_config.max_size": 1099511627776, + "state_sync_config.storage_config.db_config.min_size": 1048576, + "state_sync_config.storage_config.db_config.path_prefix": "/logs/sequencer-node-1/sync_data", + "state_sync_config.storage_config.mmap_file_config.growth_step": 1073741824, + "state_sync_config.storage_config.mmap_file_config.max_object_size": 268435456, + "state_sync_config.storage_config.mmap_file_config.max_size": 1099511627776, + "state_sync_config.storage_config.scope": "FullArchive", + "strk_fee_token_address": "0x1002", + "validator_id": "0x64", + "versioned_constants_overrides.invoke_tx_max_n_steps": 10000000, + "versioned_constants_overrides.max_recursion_depth": 50, + "versioned_constants_overrides.validate_max_n_steps": 1000000 +} \ No newline at end of file diff --git a/qa/starknet/docker-compose.yml b/qa/starknet/docker-compose.yml index fdf6131bc..cfcc9db64 100644 --- a/qa/starknet/docker-compose.yml +++ b/qa/starknet/docker-compose.yml @@ -14,6 +14,13 @@ volumes: device: ./config o: bind + build: + driver: local + driver_opts: + type: none + device: ./build + o: bind + malachite: driver: local driver_opts: @@ -40,10 +47,33 @@ services: build: context: . dockerfile: malachite.Dockerfile + environment: + - CARGO_HOME=/build/malachite-node-1 + - CARGO_TARGET_DIR=/build/malachite-node-1 volumes: - malachite:/malachite - logs:/logs - config:/config + - build:/build + networks: + - test-network + working_dir: /malachite + tty: true + stdin_open: true + + malachite-node-2: + container_name: malachite-node-2 + build: + context: . + dockerfile: malachite.Dockerfile + environment: + - CARGO_HOME=/build/malachite-node-2 + - CARGO_TARGET_DIR=/build/malachite-node-2 + volumes: + - malachite:/malachite + - logs:/logs + - config:/config + - build:/build networks: - test-network working_dir: /malachite @@ -55,10 +85,33 @@ services: build: context: ../../../ dockerfile: malachite/qa/starknet/sequencer.Dockerfile + environment: + - CARGO_HOME=/build/sequencer-node-1 + - CARGO_TARGET_DIR=/build/sequencer-node-1 + volumes: + - sequencer:/sequencer + - logs:/logs + - config:/config + - build:/build + networks: + - test-network + working_dir: /sequencer + tty: true + stdin_open: true + + sequencer-node-2: + container_name: sequencer-node-2 + build: + context: ../../../ + dockerfile: malachite/qa/starknet/sequencer.Dockerfile + environment: + - CARGO_HOME=/build/sequencer-node-2 + - CARGO_TARGET_DIR=/build/sequencer-node-2 volumes: - sequencer:/sequencer - logs:/logs - config:/config + - build:/build networks: - test-network working_dir: /sequencer From 7e6b5e45d9fa7bf8f8a5da42738879860f0bb710 Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Sat, 29 Mar 2025 11:32:09 +0100 Subject: [PATCH 24/54] feat: tc rules --- qa/starknet/.gitignore | 2 +- qa/starknet/README.md | 8 +++ qa/starknet/build/malachite-node-1/README.md | 1 + qa/starknet/build/malachite-node-2/README.md | 1 + qa/starknet/build/sequencer-node-1/README.md | 1 + qa/starknet/build/sequencer-node-2/README.md | 1 + qa/starknet/docker-compose.yml | 23 ++++++++ qa/starknet/malachite.Dockerfile | 2 +- qa/starknet/scripts/apply-tc-rules-all.sh | 6 +++ qa/starknet/scripts/apply-tc-rules.py | 57 ++++++++++++++++++++ qa/starknet/scripts/latencies.csv | 5 ++ qa/starknet/sequencer.Dockerfile | 2 +- 12 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 qa/starknet/build/malachite-node-1/README.md create mode 100644 qa/starknet/build/malachite-node-2/README.md create mode 100644 qa/starknet/build/sequencer-node-1/README.md create mode 100644 qa/starknet/build/sequencer-node-2/README.md create mode 100755 qa/starknet/scripts/apply-tc-rules-all.sh create mode 100755 qa/starknet/scripts/apply-tc-rules.py create mode 100644 qa/starknet/scripts/latencies.csv diff --git a/qa/starknet/.gitignore b/qa/starknet/.gitignore index 0b8437fbd..c18ac5ca4 100644 --- a/qa/starknet/.gitignore +++ b/qa/starknet/.gitignore @@ -3,4 +3,4 @@ logs/* config/malachite-node-*/* !config/malachite-node-*/config/ build/*/* -!build/README.md +!build/*/README.md diff --git a/qa/starknet/README.md b/qa/starknet/README.md index cb451908c..056cbcbf7 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -17,6 +17,14 @@ docker exec -it /bin/bash The names can be found in the `docker-compose.yml` file. +### Latency + +Latencies between nodes is defined in `scripts/latencies.csv`. To apply it, run: + +```bash +./scripts/apply-tc-rules-all.sh +``` + ## Run ### Malachite diff --git a/qa/starknet/build/malachite-node-1/README.md b/qa/starknet/build/malachite-node-1/README.md new file mode 100644 index 000000000..e5bf933f1 --- /dev/null +++ b/qa/starknet/build/malachite-node-1/README.md @@ -0,0 +1 @@ +# Malachite node 1 build diff --git a/qa/starknet/build/malachite-node-2/README.md b/qa/starknet/build/malachite-node-2/README.md new file mode 100644 index 000000000..3bf5bc2bc --- /dev/null +++ b/qa/starknet/build/malachite-node-2/README.md @@ -0,0 +1 @@ +# Malachite node 2 build diff --git a/qa/starknet/build/sequencer-node-1/README.md b/qa/starknet/build/sequencer-node-1/README.md new file mode 100644 index 000000000..87da5dc49 --- /dev/null +++ b/qa/starknet/build/sequencer-node-1/README.md @@ -0,0 +1 @@ +# Sequencer node 1 build diff --git a/qa/starknet/build/sequencer-node-2/README.md b/qa/starknet/build/sequencer-node-2/README.md new file mode 100644 index 000000000..58c0f7a42 --- /dev/null +++ b/qa/starknet/build/sequencer-node-2/README.md @@ -0,0 +1 @@ +# Sequencer node 2 build diff --git a/qa/starknet/docker-compose.yml b/qa/starknet/docker-compose.yml index cfcc9db64..3ca2a86a6 100644 --- a/qa/starknet/docker-compose.yml +++ b/qa/starknet/docker-compose.yml @@ -21,6 +21,13 @@ volumes: device: ./build o: bind + scripts: + driver: local + driver_opts: + type: none + device: ./scripts + o: bind + malachite: driver: local driver_opts: @@ -50,13 +57,17 @@ services: environment: - CARGO_HOME=/build/malachite-node-1 - CARGO_TARGET_DIR=/build/malachite-node-1 + - LOCAL_DNS=malachite-node-1 volumes: - malachite:/malachite - logs:/logs - config:/config - build:/build + - scripts:/scripts networks: - test-network + cap_add: + - NET_ADMIN working_dir: /malachite tty: true stdin_open: true @@ -69,13 +80,17 @@ services: environment: - CARGO_HOME=/build/malachite-node-2 - CARGO_TARGET_DIR=/build/malachite-node-2 + - LOCAL_DNS=malachite-node-2 volumes: - malachite:/malachite - logs:/logs - config:/config - build:/build + - scripts:/scripts networks: - test-network + cap_add: + - NET_ADMIN working_dir: /malachite tty: true stdin_open: true @@ -88,13 +103,17 @@ services: environment: - CARGO_HOME=/build/sequencer-node-1 - CARGO_TARGET_DIR=/build/sequencer-node-1 + - LOCAL_DNS=sequencer-node-1 volumes: - sequencer:/sequencer - logs:/logs - config:/config - build:/build + - scripts:/scripts networks: - test-network + cap_add: + - NET_ADMIN working_dir: /sequencer tty: true stdin_open: true @@ -107,13 +126,17 @@ services: environment: - CARGO_HOME=/build/sequencer-node-2 - CARGO_TARGET_DIR=/build/sequencer-node-2 + - LOCAL_DNS=sequencer-node-2 volumes: - sequencer:/sequencer - logs:/logs - config:/config - build:/build + - scripts:/scripts networks: - test-network + cap_add: + - NET_ADMIN working_dir: /sequencer tty: true stdin_open: true diff --git a/qa/starknet/malachite.Dockerfile b/qa/starknet/malachite.Dockerfile index 2702aaed0..5fecdfc2f 100644 --- a/qa/starknet/malachite.Dockerfile +++ b/qa/starknet/malachite.Dockerfile @@ -1,6 +1,6 @@ FROM rust:latest -RUN apt-get update && apt-get install -y bash bash-completion protobuf-compiler && \ +RUN apt-get update && apt-get install -y bash bash-completion protobuf-compiler python3 iproute2 && \ echo 'set editing-mode emacs' >> /etc/inputrc && \ echo '[[ $PS1 && -f /etc/bash_completion ]] && . /etc/bash_completion' >> /etc/bash.bashrc diff --git a/qa/starknet/scripts/apply-tc-rules-all.sh b/qa/starknet/scripts/apply-tc-rules-all.sh new file mode 100755 index 000000000..05cbcf0aa --- /dev/null +++ b/qa/starknet/scripts/apply-tc-rules-all.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +for container in $(docker compose ps -q); +do + docker exec "$container" /scripts/apply-tc-rules.py /scripts/latencies.csv +done diff --git a/qa/starknet/scripts/apply-tc-rules.py b/qa/starknet/scripts/apply-tc-rules.py new file mode 100755 index 000000000..fd53c2440 --- /dev/null +++ b/qa/starknet/scripts/apply-tc-rules.py @@ -0,0 +1,57 @@ +#!/usr/bin/python3 +import sys +import csv +import subprocess +import os +import socket + +def read_matrix(csv_file): + with open(csv_file) as f: + reader = csv.reader(f) + header = next(reader)[1:] + matrix = {} + for row in reader: + row_zone = row[0] + matrix[row_zone] = {} + for i, col_zone in enumerate(header): + matrix[row_zone][col_zone] = int(row[i+1]) + return header, matrix + +def resolve_ips(hostnames): + return {host: socket.gethostbyname(host) for host in hostnames} + +def execute_command(cmd): + subprocess.run(cmd, shell=True, check=True) + +def build_tc_commands(header, matrix, local_dns, ip_map): + commands = [] + commands.append("tc qdisc del dev eth0 root 2> /dev/null || true") + commands.append("tc qdisc add dev eth0 root handle 1: htb default 10") + commands.append("tc class add dev eth0 parent 1: classid 1:1 htb rate 1gbit") + commands.append("tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1gbit") + commands.append("tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10") + + handle = 11 + for zone in header: + if zone == local_dns: + continue + latency = matrix[local_dns][zone] + if latency > 0: + delta = latency // 20 or 1 + commands.append(f"tc class add dev eth0 parent 1:1 classid 1:{handle} htb rate 1gbit") + commands.append(f"tc qdisc add dev eth0 parent 1:{handle} handle {handle}: netem delay {latency}ms {delta}ms distribution normal") + commands.append(f"tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dst {ip_map[zone]}/32 flowid 1:{handle}") + handle += 1 + return commands + +def main(): + csv_file = sys.argv[1] + local_dns = os.environ["LOCAL_DNS"] + header, matrix = read_matrix(csv_file) + ip_map = resolve_ips(header) + commands = build_tc_commands(header, matrix, local_dns, ip_map) + for cmd in commands: + execute_command(cmd) + +if __name__ == "__main__": + main() diff --git a/qa/starknet/scripts/latencies.csv b/qa/starknet/scripts/latencies.csv new file mode 100644 index 000000000..6b806af04 --- /dev/null +++ b/qa/starknet/scripts/latencies.csv @@ -0,0 +1,5 @@ +From/to,malachite-node-1,malachite-node-2,sequencer-node-1,sequencer-node-2 +malachite-node-1,50,50,50,50 +malachite-node-2,50,50,50,50 +sequencer-node-1,50,50,50,50 +sequencer-node-2,50,50,50,50 diff --git a/qa/starknet/sequencer.Dockerfile b/qa/starknet/sequencer.Dockerfile index 87ffba120..46f1e4bb9 100644 --- a/qa/starknet/sequencer.Dockerfile +++ b/qa/starknet/sequencer.Dockerfile @@ -1,6 +1,6 @@ FROM rust:latest -RUN apt-get update && apt-get install -y bash bash-completion && \ +RUN apt-get update && apt-get install -y bash bash-completion python3 iproute2 && \ echo 'set editing-mode emacs' >> /etc/inputrc && \ echo '[[ $PS1 && -f /etc/bash_completion ]] && . /etc/bash_completion' >> /etc/bash.bashrc From 89ee3a981e9565befd9c4000c221d6eae7e51cac Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Mon, 31 Mar 2025 13:31:26 +0200 Subject: [PATCH 25/54] fix: starknet interop setup cleaning and optimization --- qa/starknet/.gitignore | 12 ++-- qa/starknet/README.md | 55 ++++++++++++++--- qa/starknet/build/malachite-node-2/README.md | 1 - qa/starknet/build/sequencer-node-2/README.md | 1 - qa/starknet/docker-compose.yml | 61 +++++-------------- qa/starknet/scripts/apply-tc-rules-all.sh | 6 -- qa/starknet/{ => shared}/build/README.md | 0 .../build/malachite}/README.md | 0 .../build/sequencer}/README.md | 0 .../malachite-node-1/config/config.toml | 1 + .../malachite-node-1/config/genesis.json | 0 .../config/priv_validator_key.json | 0 .../malachite-node-2/config/config.toml | 1 + .../malachite-node-2/config/genesis.json | 0 .../config/priv_validator_key.json | 0 .../config/sequencer-node-1/config.json | 0 .../config/sequencer-node-2/config.json | 0 qa/starknet/{ => shared}/logs/README.md | 0 .../shared/scripts/apply-tc-rules-all.sh | 6 ++ .../{ => shared}/scripts/apply-tc-rules.py | 0 .../{ => shared}/scripts/latencies.csv | 0 21 files changed, 74 insertions(+), 70 deletions(-) delete mode 100644 qa/starknet/build/malachite-node-2/README.md delete mode 100644 qa/starknet/build/sequencer-node-2/README.md delete mode 100755 qa/starknet/scripts/apply-tc-rules-all.sh rename qa/starknet/{ => shared}/build/README.md (100%) rename qa/starknet/{build/malachite-node-1 => shared/build/malachite}/README.md (100%) rename qa/starknet/{build/sequencer-node-1 => shared/build/sequencer}/README.md (100%) rename qa/starknet/{ => shared}/config/malachite-node-1/config/config.toml (97%) rename qa/starknet/{ => shared}/config/malachite-node-1/config/genesis.json (100%) rename qa/starknet/{ => shared}/config/malachite-node-1/config/priv_validator_key.json (100%) rename qa/starknet/{ => shared}/config/malachite-node-2/config/config.toml (97%) rename qa/starknet/{ => shared}/config/malachite-node-2/config/genesis.json (100%) rename qa/starknet/{ => shared}/config/malachite-node-2/config/priv_validator_key.json (100%) rename qa/starknet/{ => shared}/config/sequencer-node-1/config.json (100%) rename qa/starknet/{ => shared}/config/sequencer-node-2/config.json (100%) rename qa/starknet/{ => shared}/logs/README.md (100%) create mode 100755 qa/starknet/shared/scripts/apply-tc-rules-all.sh rename qa/starknet/{ => shared}/scripts/apply-tc-rules.py (100%) rename qa/starknet/{ => shared}/scripts/latencies.csv (100%) diff --git a/qa/starknet/.gitignore b/qa/starknet/.gitignore index c18ac5ca4..93e32b8e4 100644 --- a/qa/starknet/.gitignore +++ b/qa/starknet/.gitignore @@ -1,6 +1,6 @@ -logs/* -!logs/README.md -config/malachite-node-*/* -!config/malachite-node-*/config/ -build/*/* -!build/*/README.md +shared/logs/* +!shared/logs/README.md +shared/config/malachite-node-*/* +!shared/config/malachite-node-*/config/ +shared/build/*/* +!shared/build/*/README.md diff --git a/qa/starknet/README.md b/qa/starknet/README.md index 056cbcbf7..222932232 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -25,25 +25,62 @@ Latencies between nodes is defined in `scripts/latencies.csv`. To apply it, run: ./scripts/apply-tc-rules-all.sh ``` +## Build + +You might want to build the nodes to avoid re-building when running with `cargo run`. For that, simply run: + +```bash +cargo build --release +``` + +Once per node type (malachite and sequencer) in one of the respective containers. + +The builds will persist in the `/shared/build` directory and you will not need to rebuild them when restarting the containers. + ## Run -### Malachite +### Build version + +#### Malachite + +```bash +rm -rf /shared/config/malachite-node-/db /shared/config/malachite-node-/wal +/shared/build/malachite/release/informalsystems-malachitebft-starknet-app start --home /shared/config/malachite-node- +``` + +#### Sequencer #1 + +```bash +rm -rf /shared/logs/sequencer-node-1/* +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info /shared/build/sequencer/release/starknet_sequencer_node --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 +``` + +#### Sequencer #2 + +```bash +rm -rf /shared/logs/sequencer-node-2/* +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info /shared/build/sequencer/release/starknet_sequencer_node --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x67 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false +``` + +### Cargo run version + +#### Malachite ```bash -rm -rf /config/malachite-node-/db /config/malachite-node-/wal -cargo run --bin informalsystems-malachitebft-starknet-app -- start --home /config/malachite-node- +rm -rf /shared/config/malachite-node-/db /shared/config/malachite-node-/wal +cargo run --bin informalsystems-malachitebft-starknet-app -- start --home /shared/config/malachite-node- ``` -### Sequencer #1 +#### Sequencer #1 ```bash -rm -rf /logs/sequencer-node-1/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 +rm -rf /shared/logs/sequencer-node-1/* +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 ``` -### Sequencer #1 +#### Sequencer #2 ```bash -rm -rf /logs/sequencer-node-1/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x67 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false +rm -rf /shared/logs/sequencer-node-2/* +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x67 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false ``` diff --git a/qa/starknet/build/malachite-node-2/README.md b/qa/starknet/build/malachite-node-2/README.md deleted file mode 100644 index 3bf5bc2bc..000000000 --- a/qa/starknet/build/malachite-node-2/README.md +++ /dev/null @@ -1 +0,0 @@ -# Malachite node 2 build diff --git a/qa/starknet/build/sequencer-node-2/README.md b/qa/starknet/build/sequencer-node-2/README.md deleted file mode 100644 index 58c0f7a42..000000000 --- a/qa/starknet/build/sequencer-node-2/README.md +++ /dev/null @@ -1 +0,0 @@ -# Sequencer node 2 build diff --git a/qa/starknet/docker-compose.yml b/qa/starknet/docker-compose.yml index 3ca2a86a6..7c0112070 100644 --- a/qa/starknet/docker-compose.yml +++ b/qa/starknet/docker-compose.yml @@ -1,31 +1,10 @@ volumes: - logs: + shared: driver: local driver_opts: type: none - device: ./logs - o: bind - - config: - driver: local - driver_opts: - type: none - device: ./config - o: bind - - build: - driver: local - driver_opts: - type: none - device: ./build - o: bind - - scripts: - driver: local - driver_opts: - type: none - device: ./scripts + device: ./shared o: bind malachite: @@ -55,15 +34,12 @@ services: context: . dockerfile: malachite.Dockerfile environment: - - CARGO_HOME=/build/malachite-node-1 - - CARGO_TARGET_DIR=/build/malachite-node-1 + - CARGO_HOME=/shared/build/malachite + - CARGO_TARGET_DIR=/shared/build/malachite - LOCAL_DNS=malachite-node-1 volumes: - malachite:/malachite - - logs:/logs - - config:/config - - build:/build - - scripts:/scripts + - shared:/shared networks: - test-network cap_add: @@ -78,15 +54,12 @@ services: context: . dockerfile: malachite.Dockerfile environment: - - CARGO_HOME=/build/malachite-node-2 - - CARGO_TARGET_DIR=/build/malachite-node-2 + - CARGO_HOME=/shared/build/malachite + - CARGO_TARGET_DIR=/shared/build/malachite - LOCAL_DNS=malachite-node-2 volumes: - malachite:/malachite - - logs:/logs - - config:/config - - build:/build - - scripts:/scripts + - shared:/shared networks: - test-network cap_add: @@ -101,15 +74,12 @@ services: context: ../../../ dockerfile: malachite/qa/starknet/sequencer.Dockerfile environment: - - CARGO_HOME=/build/sequencer-node-1 - - CARGO_TARGET_DIR=/build/sequencer-node-1 + - CARGO_HOME=/shared/build/sequencer + - CARGO_TARGET_DIR=/shared/build/sequencer - LOCAL_DNS=sequencer-node-1 volumes: - sequencer:/sequencer - - logs:/logs - - config:/config - - build:/build - - scripts:/scripts + - shared:/shared networks: - test-network cap_add: @@ -124,15 +94,12 @@ services: context: ../../../ dockerfile: malachite/qa/starknet/sequencer.Dockerfile environment: - - CARGO_HOME=/build/sequencer-node-2 - - CARGO_TARGET_DIR=/build/sequencer-node-2 + - CARGO_HOME=/shared/build/sequencer + - CARGO_TARGET_DIR=/shared/build/sequencer - LOCAL_DNS=sequencer-node-2 volumes: - sequencer:/sequencer - - logs:/logs - - config:/config - - build:/build - - scripts:/scripts + - shared:/shared networks: - test-network cap_add: diff --git a/qa/starknet/scripts/apply-tc-rules-all.sh b/qa/starknet/scripts/apply-tc-rules-all.sh deleted file mode 100755 index 05cbcf0aa..000000000 --- a/qa/starknet/scripts/apply-tc-rules-all.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -for container in $(docker compose ps -q); -do - docker exec "$container" /scripts/apply-tc-rules.py /scripts/latencies.csv -done diff --git a/qa/starknet/build/README.md b/qa/starknet/shared/build/README.md similarity index 100% rename from qa/starknet/build/README.md rename to qa/starknet/shared/build/README.md diff --git a/qa/starknet/build/malachite-node-1/README.md b/qa/starknet/shared/build/malachite/README.md similarity index 100% rename from qa/starknet/build/malachite-node-1/README.md rename to qa/starknet/shared/build/malachite/README.md diff --git a/qa/starknet/build/sequencer-node-1/README.md b/qa/starknet/shared/build/sequencer/README.md similarity index 100% rename from qa/starknet/build/sequencer-node-1/README.md rename to qa/starknet/shared/build/sequencer/README.md diff --git a/qa/starknet/config/malachite-node-1/config/config.toml b/qa/starknet/shared/config/malachite-node-1/config/config.toml similarity index 97% rename from qa/starknet/config/malachite-node-1/config/config.toml rename to qa/starknet/shared/config/malachite-node-1/config/config.toml index fa6f578a7..1be011db7 100644 --- a/qa/starknet/config/malachite-node-1/config/config.toml +++ b/qa/starknet/shared/config/malachite-node-1/config/config.toml @@ -19,6 +19,7 @@ timeout_step = "300s" [consensus.p2p] listen_addr = "/ip4/0.0.0.0/tcp/27000" persistent_peers = [ + "/dns/malachite-node-2/tcp/27000", "/dns/sequencer-node-1/tcp/27000", "/dns/sequencer-node-2/tcp/27000", ] diff --git a/qa/starknet/config/malachite-node-1/config/genesis.json b/qa/starknet/shared/config/malachite-node-1/config/genesis.json similarity index 100% rename from qa/starknet/config/malachite-node-1/config/genesis.json rename to qa/starknet/shared/config/malachite-node-1/config/genesis.json diff --git a/qa/starknet/config/malachite-node-1/config/priv_validator_key.json b/qa/starknet/shared/config/malachite-node-1/config/priv_validator_key.json similarity index 100% rename from qa/starknet/config/malachite-node-1/config/priv_validator_key.json rename to qa/starknet/shared/config/malachite-node-1/config/priv_validator_key.json diff --git a/qa/starknet/config/malachite-node-2/config/config.toml b/qa/starknet/shared/config/malachite-node-2/config/config.toml similarity index 97% rename from qa/starknet/config/malachite-node-2/config/config.toml rename to qa/starknet/shared/config/malachite-node-2/config/config.toml index 82e3ae7e3..e942e32d8 100644 --- a/qa/starknet/config/malachite-node-2/config/config.toml +++ b/qa/starknet/shared/config/malachite-node-2/config/config.toml @@ -19,6 +19,7 @@ timeout_step = "300s" [consensus.p2p] listen_addr = "/ip4/0.0.0.0/tcp/27000" persistent_peers = [ + "/dns/malachite-node-1/tcp/27000", "/dns/sequencer-node-1/tcp/27000", "/dns/sequencer-node-2/tcp/27000", ] diff --git a/qa/starknet/config/malachite-node-2/config/genesis.json b/qa/starknet/shared/config/malachite-node-2/config/genesis.json similarity index 100% rename from qa/starknet/config/malachite-node-2/config/genesis.json rename to qa/starknet/shared/config/malachite-node-2/config/genesis.json diff --git a/qa/starknet/config/malachite-node-2/config/priv_validator_key.json b/qa/starknet/shared/config/malachite-node-2/config/priv_validator_key.json similarity index 100% rename from qa/starknet/config/malachite-node-2/config/priv_validator_key.json rename to qa/starknet/shared/config/malachite-node-2/config/priv_validator_key.json diff --git a/qa/starknet/config/sequencer-node-1/config.json b/qa/starknet/shared/config/sequencer-node-1/config.json similarity index 100% rename from qa/starknet/config/sequencer-node-1/config.json rename to qa/starknet/shared/config/sequencer-node-1/config.json diff --git a/qa/starknet/config/sequencer-node-2/config.json b/qa/starknet/shared/config/sequencer-node-2/config.json similarity index 100% rename from qa/starknet/config/sequencer-node-2/config.json rename to qa/starknet/shared/config/sequencer-node-2/config.json diff --git a/qa/starknet/logs/README.md b/qa/starknet/shared/logs/README.md similarity index 100% rename from qa/starknet/logs/README.md rename to qa/starknet/shared/logs/README.md diff --git a/qa/starknet/shared/scripts/apply-tc-rules-all.sh b/qa/starknet/shared/scripts/apply-tc-rules-all.sh new file mode 100755 index 000000000..16a268980 --- /dev/null +++ b/qa/starknet/shared/scripts/apply-tc-rules-all.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +for container in $(docker compose ps -q); +do + docker exec "$container" /shared/scripts/apply-tc-rules.py /shared/scripts/latencies.csv +done diff --git a/qa/starknet/scripts/apply-tc-rules.py b/qa/starknet/shared/scripts/apply-tc-rules.py similarity index 100% rename from qa/starknet/scripts/apply-tc-rules.py rename to qa/starknet/shared/scripts/apply-tc-rules.py diff --git a/qa/starknet/scripts/latencies.csv b/qa/starknet/shared/scripts/latencies.csv similarity index 100% rename from qa/starknet/scripts/latencies.csv rename to qa/starknet/shared/scripts/latencies.csv From 263dd3b46c757fcc552e375915e3343eceabf079 Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Mon, 31 Mar 2025 15:14:18 +0200 Subject: [PATCH 26/54] fix: README typos --- qa/starknet/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qa/starknet/README.md b/qa/starknet/README.md index 222932232..273a2b274 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -19,10 +19,10 @@ The names can be found in the `docker-compose.yml` file. ### Latency -Latencies between nodes is defined in `scripts/latencies.csv`. To apply it, run: +Latencies between nodes is defined in `shared/scripts/latencies.csv`. To apply it, run: ```bash -./scripts/apply-tc-rules-all.sh +./shared/scripts/apply-tc-rules-all.sh ``` ## Build From 43836bf876793f26cde54931a25ecdd072df01b5 Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Mon, 31 Mar 2025 18:12:43 +0200 Subject: [PATCH 27/54] fix: sync + README --- code/crates/starknet/host/src/spawn.rs | 2 +- qa/starknet/README.md | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/code/crates/starknet/host/src/spawn.rs b/code/crates/starknet/host/src/spawn.rs index 68c49d110..636d5e6bd 100644 --- a/code/crates/starknet/host/src/spawn.rs +++ b/code/crates/starknet/host/src/spawn.rs @@ -249,7 +249,7 @@ async fn spawn_network_actor( channel_names: malachitebft_network::ChannelNames::default(), rpc_max_size: cfg.consensus.p2p.rpc_max_size.as_u64() as usize, pubsub_max_size: cfg.consensus.p2p.pubsub_max_size.as_u64() as usize, - enable_sync: false, + enable_sync: cfg.value_sync.enabled, }; let keypair = make_keypair(private_key); diff --git a/qa/starknet/README.md b/qa/starknet/README.md index 273a2b274..7cbb40eda 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -41,11 +41,18 @@ The builds will persist in the `/shared/build` directory and you will not need t ### Build version -#### Malachite +#### Malachite #1 ```bash -rm -rf /shared/config/malachite-node-/db /shared/config/malachite-node-/wal -/shared/build/malachite/release/informalsystems-malachitebft-starknet-app start --home /shared/config/malachite-node- +rm -rf /shared/config/malachite-node-1/db /shared/config/malachite-node-1/wal +/shared/build/malachite/release/informalsystems-malachitebft-starknet-app start --home /shared/config/malachite-node-1 +``` + +#### Malachite #2 + +```bash +rm -rf /shared/config/malachite-node-2/db /shared/config/malachite-node-2/wal +/shared/build/malachite/release/informalsystems-malachitebft-starknet-app start --home /shared/config/malachite-node-2 ``` #### Sequencer #1 From fcc736431856a9883e4096c4e6230df4f94da7e5 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 1 Apr 2025 14:03:53 +0200 Subject: [PATCH 28/54] feat(code/starknet): Derive address from public key (#949) * feat(code/starknet): Derive address from public key * Allow sync to be enabled via config --------- Co-authored-by: Anca Zamfir --- code/crates/engine/src/consensus.rs | 3 ++- code/crates/starknet/host/src/node.rs | 22 ++++++++---------- code/crates/starknet/p2p-types/src/address.rs | 23 +++++++++++++++++-- code/crates/starknet/test/src/lib.rs | 2 +- code/scripts/spawn.bash | 4 ++-- 5 files changed, 36 insertions(+), 18 deletions(-) diff --git a/code/crates/engine/src/consensus.rs b/code/crates/engine/src/consensus.rs index 3e2ec47c0..ce461e153 100644 --- a/code/crates/engine/src/consensus.rs +++ b/code/crates/engine/src/consensus.rs @@ -1152,7 +1152,8 @@ where skip_all, fields( height = %state.consensus.height(), - round = %state.consensus.round() + round = %state.consensus.round(), + address = %state.consensus.address() ) )] async fn post_start( diff --git a/code/crates/starknet/host/src/node.rs b/code/crates/starknet/host/src/node.rs index ff8a09039..398976e60 100644 --- a/code/crates/starknet/host/src/node.rs +++ b/code/crates/starknet/host/src/node.rs @@ -118,12 +118,7 @@ impl Node for StarknetNode { } fn get_address(&self, pk: &PublicKey) -> Address { - if let Ok(genesis) = self.load_genesis() { - genesis.validator_set.get_by_public_key(pk).unwrap().address - } else { - // FIXME: Figure out a way to specify the address for a public key. - Address::from(0x65) - } + Address::from(pk) } fn get_public_key(&self, pk: &PrivateKey) -> PublicKey { @@ -210,10 +205,9 @@ impl CanMakePrivateKeyFile for StarknetNode { impl CanMakeGenesis for StarknetNode { fn make_genesis(&self, validators: Vec<(PublicKey, VotingPower)>) -> Self::Genesis { - let validators = validators.into_iter().enumerate().map(|(i, (pk, vp))| { - let address = Address::from(0x64 + i as u64); - Validator::new(address, pk, vp) - }); + let validators = validators + .into_iter() + .map(|(pk, vp)| Validator::new(self.get_address(&pk), pk, vp)); let validator_set = ValidatorSet::new(validators); @@ -462,9 +456,13 @@ fn test_starknet_node() { use malachitebft_test_cli::*; let priv_keys = new::generate_private_keys(&node, 1, true); - let pub_keys = priv_keys.iter().map(|pk| node.get_public_key(pk)).collect(); + let pub_keys = priv_keys + .iter() + .map(|pk| node.get_public_key(pk)) + .collect::>(); + + let address = node.get_address(&pub_keys[0]); let genesis = new::generate_genesis(&node, pub_keys, true); - let address = Address::from(0x64); file::save_priv_validator_key( &node, diff --git a/code/crates/starknet/p2p-types/src/address.rs b/code/crates/starknet/p2p-types/src/address.rs index 675d89f54..7ebaadc13 100644 --- a/code/crates/starknet/p2p-types/src/address.rs +++ b/code/crates/starknet/p2p-types/src/address.rs @@ -1,5 +1,6 @@ use bytes::Bytes; use core::fmt; +use malachitebft_signing_ed25519::PublicKey; use serde::{Deserialize, Serialize}; use malachitebft_proto::{Error as ProtoError, Protobuf}; @@ -23,17 +24,35 @@ impl From for Address { } } +impl From<[u8; 32]> for Address { + fn from(bytes: [u8; 32]) -> Self { + Self(Felt::from_bytes_be(&bytes)) + } +} + +impl From for Address { + fn from(public_key: PublicKey) -> Self { + Self::from(*public_key.as_bytes()) + } +} + +impl From<&PublicKey> for Address { + fn from(public_key: &PublicKey) -> Self { + Self::from(*public_key.as_bytes()) + } +} + impl fmt::Display for Address { #[cfg_attr(coverage_nightly, coverage(off))] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.0.fmt(f) + write!(f, "{:#x}", self.0) } } impl fmt::Debug for Address { #[cfg_attr(coverage_nightly, coverage(off))] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "Address({})", self.0) + write!(f, "Address({:#x})", self.0) } } diff --git a/code/crates/starknet/test/src/lib.rs b/code/crates/starknet/test/src/lib.rs index 5a860b344..e00051e10 100644 --- a/code/crates/starknet/test/src/lib.rs +++ b/code/crates/starknet/test/src/lib.rs @@ -214,7 +214,7 @@ fn make_validators( for (i, node) in nodes.iter().enumerate() { let sk = PrivateKey::generate(&mut rng); - let address = Address::from(0x64 + i as u64); + let address = Address::from(sk.public_key()); let val = Validator::new(address, sk.public_key(), node.voting_power); private_keys.insert(node.id, sk); diff --git a/code/scripts/spawn.bash b/code/scripts/spawn.bash index 667197999..05816f555 100755 --- a/code/scripts/spawn.bash +++ b/code/scripts/spawn.bash @@ -46,13 +46,13 @@ export MALACHITE__CONSENSUS__TIMEOUT_COMMIT="0s" # Set the timeout step to 2 seconds to trigger the vote sync and polka certificate faster export MALACHITE__CONSENSUS__TIMEOUT_STEP="2s" # Set to request-response to be able to sync polka certificates, "broadcast" does not yet send the certificates -export MALACHITE__CONSENSUS__VOTE_SYNC__MODE="request-response" +export MALACHITE__CONSENSUS__VOTE_SYNC__MODE="rebroadcast" export MALACHITE__MEMPOOL__MAX_TX_COUNT="10000" export MALACHITE__MEMPOOL__GOSSIP_BATCH_SIZE=0 export MALACHITE__TEST__MAX_BLOCK_SIZE="50KiB" # Only use "parts-only" with starknet app for now, but for the channel app use "proposal-and-parts". # "proposal-and-parts" also works for starknet app -export MALACHITE__TEST__VALUE_PAYLOAD="proposal-and-parts" +export MALACHITE__TEST__VALUE_PAYLOAD="parts-only" export MALACHITE__TEST__TX_SIZE="1KiB" export MALACHITE__TEST__TXS_PER_PART=256 export MALACHITE__TEST__TIME_ALLOWANCE_FACTOR=0.3 From ae157508e05582f225a18931a23762062ef514cc Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Thu, 3 Apr 2025 17:54:33 +0200 Subject: [PATCH 29/54] fix: setup with new validator IDs handling --- code/crates/starknet/test/src/lib.rs | 2 +- qa/starknet/README.md | 33 +++++++++++++++---- qa/starknet/shared/build/sequencer/README.md | 1 - .../malachite-node-1/config/config.toml | 2 +- .../malachite-node-1/config/genesis.json | 10 +++--- .../config/priv_validator_key.json | 8 ++--- .../malachite-node-2/config/config.toml | 2 +- .../malachite-node-2/config/genesis.json | 10 +++--- .../config/priv_validator_key.json | 6 ++-- 9 files changed, 46 insertions(+), 28 deletions(-) delete mode 100644 qa/starknet/shared/build/sequencer/README.md diff --git a/code/crates/starknet/test/src/lib.rs b/code/crates/starknet/test/src/lib.rs index e00051e10..97a5e4ee8 100644 --- a/code/crates/starknet/test/src/lib.rs +++ b/code/crates/starknet/test/src/lib.rs @@ -212,7 +212,7 @@ fn make_validators( let mut validators = Vec::new(); let mut private_keys = HashMap::new(); - for (i, node) in nodes.iter().enumerate() { + for (_, node) in nodes.iter().enumerate() { let sk = PrivateKey::generate(&mut rng); let address = Address::from(sk.public_key()); let val = Validator::new(address, sk.public_key(), node.voting_power); diff --git a/qa/starknet/README.md b/qa/starknet/README.md index 7cbb40eda..8527e214f 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -2,10 +2,19 @@ ## Setup +Clone the Starknet sequencer fork: + +```bash +git clone https://github.com/bastienfaivre/sequencer.git +cd sequencer +git checkout for_informalsystems/mock_batcher_to_return_empty_proposals +``` + > [!CAUTION] > The setup assumes that both malachite and sequencer repositories are cloned in the same directory. ```bash +cd malachite/qa/starknet docker compose up -d ``` @@ -33,6 +42,9 @@ You might want to build the nodes to avoid re-building when running with `cargo cargo build --release ``` +>[!NOTE] +> The flag `--release` is not necessary. But if you remove it, you need to change the path of all executables in the commands below to `/shared/build//debug/`. + Once per node type (malachite and sequencer) in one of the respective containers. The builds will persist in the `/shared/build` directory and you will not need to rebuild them when restarting the containers. @@ -59,35 +71,42 @@ rm -rf /shared/config/malachite-node-2/db /shared/config/malachite-node-2/wal ```bash rm -rf /shared/logs/sequencer-node-1/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info /shared/build/sequencer/release/starknet_sequencer_node --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info /shared/build/sequencer/release/starknet_sequencer_node --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 ``` #### Sequencer #2 ```bash rm -rf /shared/logs/sequencer-node-2/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info /shared/build/sequencer/release/starknet_sequencer_node --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x67 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info /shared/build/sequencer/release/starknet_sequencer_node --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x65 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false ``` ### Cargo run version -#### Malachite +#### Malachite #1 ```bash -rm -rf /shared/config/malachite-node-/db /shared/config/malachite-node-/wal -cargo run --bin informalsystems-malachitebft-starknet-app -- start --home /shared/config/malachite-node- +rm -rf /shared/config/malachite-node-1/db /shared/config/malachite-node-1/wal +cargo run --bin informalsystems-malachitebft-starknet-app -- start --home /shared/config/malachite-node-1 +``` + +#### Malachite #2 + +```bash +rm -rf /shared/config/malachite-node-2/db /shared/config/malachite-node-2/wal +cargo run --bin informalsystems-malachitebft-starknet-app -- start --home /shared/config/malachite-node-2 ``` #### Sequencer #1 ```bash rm -rf /shared/logs/sequencer-node-1/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 ``` #### Sequencer #2 ```bash rm -rf /shared/logs/sequencer-node-2/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x67 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x67 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false ``` diff --git a/qa/starknet/shared/build/sequencer/README.md b/qa/starknet/shared/build/sequencer/README.md deleted file mode 100644 index 87da5dc49..000000000 --- a/qa/starknet/shared/build/sequencer/README.md +++ /dev/null @@ -1 +0,0 @@ -# Sequencer node 1 build diff --git a/qa/starknet/shared/config/malachite-node-1/config/config.toml b/qa/starknet/shared/config/malachite-node-1/config/config.toml index 1be011db7..f9982d18e 100644 --- a/qa/starknet/shared/config/malachite-node-1/config/config.toml +++ b/qa/starknet/shared/config/malachite-node-1/config/config.toml @@ -73,7 +73,7 @@ mesh_n_low = 4 mesh_outbound_min = 2 [value_sync] -enabled = true +enabled = false status_update_interval = "10s" request_timeout = "10s" diff --git a/qa/starknet/shared/config/malachite-node-1/config/genesis.json b/qa/starknet/shared/config/malachite-node-1/config/genesis.json index 9fa3caf49..c9f677b98 100644 --- a/qa/starknet/shared/config/malachite-node-1/config/genesis.json +++ b/qa/starknet/shared/config/malachite-node-1/config/genesis.json @@ -2,18 +2,18 @@ "validator_set": { "validators": [ { - "address": "0x0000000000000000000000000000000000000000000000000000000000000065", + "address": "0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8", "public_key": { "type": "tendermint/PubKeyEd25519", - "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" + "value": "UPLh0RyuczU8XN6GfMD9XYHjlY1SZS7FRlJuj4AC0QI=" }, "voting_power": 1 }, { - "address": "0x0000000000000000000000000000000000000000000000000000000000000066", + "address": "0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a", "public_key": { "type": "tendermint/PubKeyEd25519", - "value": "KUTbBESGSHQiX+cLM8+RBJPb931S+KE5V91TVW3Zxas=" + "value": "bLWO9y+9GkCABubrWE0xsW6Bakjgv/FlMoBON4A5WJc=" }, "voting_power": 1 }, @@ -26,7 +26,7 @@ "voting_power": 1 }, { - "address": "0x0000000000000000000000000000000000000000000000000000000000000067", + "address": "0x0000000000000000000000000000000000000000000000000000000000000065", "public_key": { "type": "tendermint/PubKeyEd25519", "value": "F8t5+ytBIPKx7GXkGY1uiyjoE/6x5KQIObheGAgM4AA=" diff --git a/qa/starknet/shared/config/malachite-node-1/config/priv_validator_key.json b/qa/starknet/shared/config/malachite-node-1/config/priv_validator_key.json index e37a988b9..2f530b7b1 100644 --- a/qa/starknet/shared/config/malachite-node-1/config/priv_validator_key.json +++ b/qa/starknet/shared/config/malachite-node-1/config/priv_validator_key.json @@ -1,11 +1,11 @@ { "private_key": { "type": "tendermint/PrivKeyEd25519", - "value": "z1exB2b1hS8Ajtr/Qf/PvjD0ES/m7RoEwzaT69t2+Ow=" + "value": "Z3XxCitCu85qI9/Nx7hveX6ii3U+fIpFh0JRkbzEsOM=" }, "public_key": { "type": "tendermint/PubKeyEd25519", - "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" + "value": "bLWO9y+9GkCABubrWE0xsW6Bakjgv/FlMoBON4A5WJc=" }, - "address": "0x0000000000000000000000000000000000000000000000000000000000000065" -} + "address": "0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a" +} \ No newline at end of file diff --git a/qa/starknet/shared/config/malachite-node-2/config/config.toml b/qa/starknet/shared/config/malachite-node-2/config/config.toml index e942e32d8..db60cf05a 100644 --- a/qa/starknet/shared/config/malachite-node-2/config/config.toml +++ b/qa/starknet/shared/config/malachite-node-2/config/config.toml @@ -73,7 +73,7 @@ mesh_n_low = 4 mesh_outbound_min = 2 [value_sync] -enabled = true +enabled = false status_update_interval = "10s" request_timeout = "10s" diff --git a/qa/starknet/shared/config/malachite-node-2/config/genesis.json b/qa/starknet/shared/config/malachite-node-2/config/genesis.json index 9fa3caf49..c9f677b98 100644 --- a/qa/starknet/shared/config/malachite-node-2/config/genesis.json +++ b/qa/starknet/shared/config/malachite-node-2/config/genesis.json @@ -2,18 +2,18 @@ "validator_set": { "validators": [ { - "address": "0x0000000000000000000000000000000000000000000000000000000000000065", + "address": "0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8", "public_key": { "type": "tendermint/PubKeyEd25519", - "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" + "value": "UPLh0RyuczU8XN6GfMD9XYHjlY1SZS7FRlJuj4AC0QI=" }, "voting_power": 1 }, { - "address": "0x0000000000000000000000000000000000000000000000000000000000000066", + "address": "0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a", "public_key": { "type": "tendermint/PubKeyEd25519", - "value": "KUTbBESGSHQiX+cLM8+RBJPb931S+KE5V91TVW3Zxas=" + "value": "bLWO9y+9GkCABubrWE0xsW6Bakjgv/FlMoBON4A5WJc=" }, "voting_power": 1 }, @@ -26,7 +26,7 @@ "voting_power": 1 }, { - "address": "0x0000000000000000000000000000000000000000000000000000000000000067", + "address": "0x0000000000000000000000000000000000000000000000000000000000000065", "public_key": { "type": "tendermint/PubKeyEd25519", "value": "F8t5+ytBIPKx7GXkGY1uiyjoE/6x5KQIObheGAgM4AA=" diff --git a/qa/starknet/shared/config/malachite-node-2/config/priv_validator_key.json b/qa/starknet/shared/config/malachite-node-2/config/priv_validator_key.json index cc1965264..36f024337 100644 --- a/qa/starknet/shared/config/malachite-node-2/config/priv_validator_key.json +++ b/qa/starknet/shared/config/malachite-node-2/config/priv_validator_key.json @@ -1,11 +1,11 @@ { "private_key": { "type": "tendermint/PrivKeyEd25519", - "value": "AXCWFA8nYrqNrDKdlUpG78A7umsi2zHFKdE0hcpggtY=" + "value": "n7TinGnpMpRKcyi2jwifkjQTfmV1A1lT/QJ76DFnS/Q=" }, "public_key": { "type": "tendermint/PubKeyEd25519", - "value": "uVe2CKLsf9dcGG2i6IWVkYAMBFZAPeFLzIdK1bjWf80=" + "value": "UPLh0RyuczU8XN6GfMD9XYHjlY1SZS7FRlJuj4AC0QI=" }, - "address": "0x0000000000000000000000000000000000000000000000000000000000000066" + "address": "0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8" } \ No newline at end of file From 71df2f59e873b4c6d9ad9c876db67b5696ec30af Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Mon, 7 Apr 2025 11:04:38 +0200 Subject: [PATCH 30/54] feat: latency-limit config --- qa/starknet/README.md | 8 ++++---- .../config/malachite-node-1/config/config.toml | 12 ++++++------ .../config/malachite-node-2/config/config.toml | 12 ++++++------ qa/starknet/shared/scripts/latencies.csv | 8 ++++---- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/qa/starknet/README.md b/qa/starknet/README.md index 8527e214f..b7caecc29 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -71,14 +71,14 @@ rm -rf /shared/config/malachite-node-2/db /shared/config/malachite-node-2/wal ```bash rm -rf /shared/logs/sequencer-node-1/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info /shared/build/sequencer/release/starknet_sequencer_node --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info /shared/build/sequencer/release/starknet_sequencer_node --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 --consensus_manager_config.consensus_config.timeouts.precommit_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.prevote_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.proposal_timeout 1.1 ``` #### Sequencer #2 ```bash rm -rf /shared/logs/sequencer-node-2/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info /shared/build/sequencer/release/starknet_sequencer_node --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x65 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info /shared/build/sequencer/release/starknet_sequencer_node --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x65 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false --consensus_manager_config.consensus_config.timeouts.precommit_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.prevote_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.proposal_timeout 1.1 ``` ### Cargo run version @@ -101,12 +101,12 @@ cargo run --bin informalsystems-malachitebft-starknet-app -- start --home /share ```bash rm -rf /shared/logs/sequencer-node-1/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 --consensus_manager_config.consensus_config.timeouts.precommit_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.prevote_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.proposal_timeout 1.1 ``` #### Sequencer #2 ```bash rm -rf /shared/logs/sequencer-node-2/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x67 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x67 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false --consensus_manager_config.consensus_config.timeouts.precommit_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.prevote_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.proposal_timeout 1.1 ``` diff --git a/qa/starknet/shared/config/malachite-node-1/config/config.toml b/qa/starknet/shared/config/malachite-node-1/config/config.toml index f9982d18e..d50bb70d1 100644 --- a/qa/starknet/shared/config/malachite-node-1/config/config.toml +++ b/qa/starknet/shared/config/malachite-node-1/config/config.toml @@ -7,12 +7,12 @@ log_format = "plaintext" [consensus] value_payload = "parts-only" -timeout_propose = "10s" -timeout_propose_delta = "500ms" -timeout_prevote = "5s" -timeout_prevote_delta = "500ms" -timeout_precommit = "5s" -timeout_precommit_delta = "500ms" +timeout_propose = "1100ms" +timeout_propose_delta = "0ms" +timeout_prevote = "1100ms" +timeout_prevote_delta = "0ms" +timeout_precommit = "1100ms" +timeout_precommit_delta = "0ms" timeout_commit = "0s" timeout_step = "300s" diff --git a/qa/starknet/shared/config/malachite-node-2/config/config.toml b/qa/starknet/shared/config/malachite-node-2/config/config.toml index db60cf05a..e6b1b8590 100644 --- a/qa/starknet/shared/config/malachite-node-2/config/config.toml +++ b/qa/starknet/shared/config/malachite-node-2/config/config.toml @@ -7,12 +7,12 @@ log_format = "plaintext" [consensus] value_payload = "parts-only" -timeout_propose = "10s" -timeout_propose_delta = "500ms" -timeout_prevote = "5s" -timeout_prevote_delta = "500ms" -timeout_precommit = "5s" -timeout_precommit_delta = "500ms" +timeout_propose = "1100ms" +timeout_propose_delta = "0ms" +timeout_prevote = "1100ms" +timeout_prevote_delta = "0ms" +timeout_precommit = "1100ms" +timeout_precommit_delta = "0ms" timeout_commit = "0s" timeout_step = "300s" diff --git a/qa/starknet/shared/scripts/latencies.csv b/qa/starknet/shared/scripts/latencies.csv index 6b806af04..b55ba1c87 100644 --- a/qa/starknet/shared/scripts/latencies.csv +++ b/qa/starknet/shared/scripts/latencies.csv @@ -1,5 +1,5 @@ From/to,malachite-node-1,malachite-node-2,sequencer-node-1,sequencer-node-2 -malachite-node-1,50,50,50,50 -malachite-node-2,50,50,50,50 -sequencer-node-1,50,50,50,50 -sequencer-node-2,50,50,50,50 +malachite-node-1,100,100,100,100 +malachite-node-2,100,100,100,100 +sequencer-node-1,100,100,100,100 +sequencer-node-2,100,100,100,100 From c13eb10d1a5000309bbc3c9b82b43006cda2eb13 Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Wed, 9 Apr 2025 17:30:47 +0200 Subject: [PATCH 31/54] feat: automated flexible setup --- qa/starknet/.gitignore | 7 +- qa/starknet/README.md | 156 ++++----- qa/starknet/apply-latency.sh | 29 ++ qa/starknet/docker-compose.yml | 109 ------- qa/starknet/generate.py | 295 ++++++++++++++++++ qa/starknet/manage.sh | 44 +++ qa/starknet/sequencer.Dockerfile | 4 +- qa/starknet/setup/macos.sh | 49 +++ qa/starknet/setup/requirements.txt | 3 + .../malachite-node-1/config/genesis.json | 38 --- .../config/priv_validator_key.json | 11 - .../malachite-node-2/config/config.toml | 97 ------ .../malachite-node-2/config/genesis.json | 38 --- .../config/priv_validator_key.json | 11 - .../config/sequencer-node-1/config.json | 264 ---------------- .../config/sequencer-node-2/config.json | 264 ---------------- qa/starknet/shared/logs/README.md | 3 - .../shared/scripts/apply-tc-rules-all.sh | 6 - qa/starknet/shared/scripts/apply-tc-rules.py | 20 +- qa/starknet/shared/scripts/latencies.csv | 5 - qa/starknet/templates/bashrc.j2 | 3 + qa/starknet/templates/docker-compose.j2 | 72 +++++ qa/starknet/templates/malachite-cli-reset.j2 | 3 + qa/starknet/templates/malachite-cli-start.j2 | 3 + .../malachite-config.j2} | 18 +- qa/starknet/templates/sequencer-cli-reset.j2 | 3 + qa/starknet/templates/sequencer-cli-start.j2 | 26 ++ 27 files changed, 627 insertions(+), 954 deletions(-) create mode 100755 qa/starknet/apply-latency.sh delete mode 100644 qa/starknet/docker-compose.yml create mode 100644 qa/starknet/generate.py create mode 100755 qa/starknet/manage.sh create mode 100755 qa/starknet/setup/macos.sh create mode 100644 qa/starknet/setup/requirements.txt delete mode 100644 qa/starknet/shared/config/malachite-node-1/config/genesis.json delete mode 100644 qa/starknet/shared/config/malachite-node-1/config/priv_validator_key.json delete mode 100644 qa/starknet/shared/config/malachite-node-2/config/config.toml delete mode 100644 qa/starknet/shared/config/malachite-node-2/config/genesis.json delete mode 100644 qa/starknet/shared/config/malachite-node-2/config/priv_validator_key.json delete mode 100644 qa/starknet/shared/config/sequencer-node-1/config.json delete mode 100644 qa/starknet/shared/config/sequencer-node-2/config.json delete mode 100644 qa/starknet/shared/logs/README.md delete mode 100755 qa/starknet/shared/scripts/apply-tc-rules-all.sh delete mode 100644 qa/starknet/shared/scripts/latencies.csv create mode 100644 qa/starknet/templates/bashrc.j2 create mode 100644 qa/starknet/templates/docker-compose.j2 create mode 100644 qa/starknet/templates/malachite-cli-reset.j2 create mode 100644 qa/starknet/templates/malachite-cli-start.j2 rename qa/starknet/{shared/config/malachite-node-1/config/config.toml => templates/malachite-config.j2} (80%) create mode 100644 qa/starknet/templates/sequencer-cli-reset.j2 create mode 100644 qa/starknet/templates/sequencer-cli-start.j2 diff --git a/qa/starknet/.gitignore b/qa/starknet/.gitignore index 93e32b8e4..72867043f 100644 --- a/qa/starknet/.gitignore +++ b/qa/starknet/.gitignore @@ -1,6 +1,5 @@ -shared/logs/* -!shared/logs/README.md -shared/config/malachite-node-*/* -!shared/config/malachite-node-*/config/ +shared/* +!shared/build +!shared/scripts shared/build/*/* !shared/build/*/README.md diff --git a/qa/starknet/README.md b/qa/starknet/README.md index b7caecc29..c2830b07d 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -1,112 +1,92 @@ # Starknet Interoperability Setup -## Setup +This setup generates networks composed of any combination of Malachite and Sequencer nodes. It uses a containerized architecture with configurable latency between nodes. -Clone the Starknet sequencer fork: +## Usage -```bash -git clone https://github.com/bastienfaivre/sequencer.git -cd sequencer -git checkout for_informalsystems/mock_batcher_to_return_empty_proposals -``` - -> [!CAUTION] -> The setup assumes that both malachite and sequencer repositories are cloned in the same directory. - -```bash -cd malachite/qa/starknet -docker compose up -d -``` - -Then, you need to manually enter into the containers to start the nodes. - -```bash -docker exec -it /bin/bash -``` - -The names can be found in the `docker-compose.yml` file. - -### Latency - -Latencies between nodes is defined in `shared/scripts/latencies.csv`. To apply it, run: - -```bash -./shared/scripts/apply-tc-rules-all.sh -``` - -## Build - -You might want to build the nodes to avoid re-building when running with `cargo run`. For that, simply run: - -```bash -cargo build --release -``` +1. Install dependencies: + + Run the appropriate script based on your OS from the `setup/` folder. >[!NOTE] -> The flag `--release` is not necessary. But if you remove it, you need to change the path of all executables in the commands below to `/shared/build//debug/`. +> If you encounter an `error: externally-managed-environment` error while running the script, please refer to the last section of this document. + +2. Clone the Starknet sequencer fork: + ```bash + git clone https://github.com/bastienfaivre/sequencer.git + cd sequencer + git checkout shahak/for_informalsystems/mock_batcher_to_return_empty_proposals + ``` + +3. Generate a network: + ```bash + python3 generate.py --help + ``` + +4. Apply the latency: + ```bash + ./apply-latency.sh + ``` + +5. Spawn the network: + ```bash + ./manage.sh up + ``` -Once per node type (malachite and sequencer) in one of the respective containers. - -The builds will persist in the `/shared/build` directory and you will not need to rebuild them when restarting the containers. - -## Run - -### Build version - -#### Malachite #1 +>[!NOTE] +> Spawning the network does not mean that the nodes have started yet. It only means that the containers are up and running. You need to start the nodes manually. The `manage.sh` script provides the commands to enter the containers. -```bash -rm -rf /shared/config/malachite-node-1/db /shared/config/malachite-node-1/wal -/shared/build/malachite/release/informalsystems-malachitebft-starknet-app start --home /shared/config/malachite-node-1 -``` +6. Build the nodes: + + If it is the first time you are running the nodes, or if you made changes to the code, you need to build the nodes. You can do this by running the following command: + ```bash + # INSIDE THE CONTAINER + build + ``` + You only need to do it once per node type (malachite and sequencer). All containers from the same node type share the same build. -#### Malachite #2 +7. Start the nodes: + ```bash + # INSIDE THE CONTAINER + start + ``` -```bash -rm -rf /shared/config/malachite-node-2/db /shared/config/malachite-node-2/wal -/shared/build/malachite/release/informalsystems-malachitebft-starknet-app start --home /shared/config/malachite-node-2 -``` +8. Reset the state: -#### Sequencer #1 + Y ou might want to reset the state (db, wal, etc.) of the nodes. You can do this by running the following command: + ```bash + # INSIDE THE CONTAINER + reset + ``` -```bash -rm -rf /shared/logs/sequencer-node-1/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info /shared/build/sequencer/release/starknet_sequencer_node --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 --consensus_manager_config.consensus_config.timeouts.precommit_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.prevote_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.proposal_timeout 1.1 -``` +9. Stop the network: + ```bash + ./manage.sh down + ``` -#### Sequencer #2 +## Advanced usage -```bash -rm -rf /shared/logs/sequencer-node-2/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info /shared/build/sequencer/release/starknet_sequencer_node --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x65 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false --consensus_manager_config.consensus_config.timeouts.precommit_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.prevote_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.proposal_timeout 1.1 -``` +You might want to make modifications to the config files of the nodes. You can find them under the `shared/networks///` folder. The config files are mounted in the containers so that you can edit them directly from your host machine. -### Cargo run version +>[!WARNING] +> Some Docker engines (e.g., Docker Desktop) sometimes have synchronization issues with mounted volumes, leading to corrupted config files in the containers. If you encounter such issues, stop the network, make your changes to the config files, and start the network again. It will ensure that the changes are applied correctly. -#### Malachite #1 +Moreover, for the latency, you can edit it in detail in the `shared/networks//latencies.csv` file. Then, you can apply it again by running the `./apply-latency.sh ` command. It will update the latency between the nodes without stopping the network. -```bash -rm -rf /shared/config/malachite-node-1/db /shared/config/malachite-node-1/wal -cargo run --bin informalsystems-malachitebft-starknet-app -- start --home /shared/config/malachite-node-1 -``` +If you plan to make more long-term changes to the configuration, feel free to edit the templates under the `templates/` directory. -#### Malachite #2 +## Troubleshooting -```bash -rm -rf /shared/config/malachite-node-2/db /shared/config/malachite-node-2/wal -cargo run --bin informalsystems-malachitebft-starknet-app -- start --home /shared/config/malachite-node-2 -``` +### Error: `error: externally-managed-environment` -#### Sequencer #1 +The easiest way to fix this error without using `--break-system-packages` is to create a global virtual environment imitating the system environment. It can be done by running the following setup: ```bash -rm -rf /shared/logs/sequencer-node-1/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-1/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-1/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-1/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x1111111111111111111111111111111111111111111111111111111111111111 --state_sync_config.network_config.secret_key 0x2222222222222222222222222222222222222222222222222222222222222222 --validator_id 0x64 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 --consensus_manager_config.consensus_config.timeouts.precommit_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.prevote_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.proposal_timeout 1.1 +# 1. Create a virtual environment +python3 -m venv ~/.venv +# 2. Create aliases to activate/deactivate the virtual environment anywhere +echo "alias py-start='source ~/.venv/bin/activate'" >> ~/.bashrc +echo "alias py-stop='deactivate'" >> ~/.bashrc ``` -#### Sequencer #2 - -```bash -rm -rf /shared/logs/sequencer-node-2/* -RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info cargo run --bin starknet_sequencer_node -- --chain_id MY_CUSTOM_CHAIN_ID --eth_fee_token_address 0x1001 --strk_fee_token_address 0x1002 --recorder_url http://invalid_address.com --base_layer_config.node_url http://invalid_address.com --batcher_config.storage.db_config.path_prefix /shared/logs/sequencer-node-2/batcher_data --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/logs/sequencer-node-2/class_manager_data --state_sync_config.storage_config.db_config.path_prefix /shared/logs/sequencer-node-2/sync_data --consensus_manager_config.network_config.tcp_port 27000 --mempool_p2p_config.network_config.tcp_port 11000 --state_sync_config.network_config.tcp_port 12000 --http_server_config.port 13000 --monitoring_endpoint_config.port 14000 --consensus_manager_config.network_config.secret_key 0x3333333333333333333333333333333333333333333333333333333333333333 --state_sync_config.network_config.secret_key 0x4444444444444444444444444444444444444444444444444444444444444444 --validator_id 0x67 --consensus_manager_config.context_config.num_validators 4 --consensus_manager_config.context_config.validator_ids 0x64,0x65,0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a,0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8 --consensus_manager_config.network_config.bootstrap_peer_multiaddr /dns/sequencer-node-1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false --consensus_manager_config.consensus_config.timeouts.precommit_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.prevote_timeout 1.1 --consensus_manager_config.consensus_config.timeouts.proposal_timeout 1.1 -``` +Then, you can activate the virtual environment by running `py-start` and deactivate it by running `py-stop`. You should now be able to install any package without any issues. diff --git a/qa/starknet/apply-latency.sh b/qa/starknet/apply-latency.sh new file mode 100755 index 000000000..2b60bde2c --- /dev/null +++ b/qa/starknet/apply-latency.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +set -e + +print_help() { + echo "Usage: $0 " + echo + echo "Apply TC rules to all containers in the given Docker Compose network." + echo + echo "Arguments:" + echo " network_name Name of the network (e.g., m2-s3)" + exit 1 +} + +if [[ "$1" == "-h" || "$1" == "--help" || -z "$1" ]]; then + print_help +fi + +network_name="$1" +compose_file="shared/networks/${network_name}/docker-compose.yml" + +if [[ ! -f "$compose_file" ]]; then + echo "Error: Compose file not found at $compose_file" + exit 1 +fi + +for container in $(docker compose -f "$compose_file" ps -q); do + docker exec "$container" /shared/scripts/apply-tc-rules.py /shared/networks/$network_name/latencies.csv +done diff --git a/qa/starknet/docker-compose.yml b/qa/starknet/docker-compose.yml deleted file mode 100644 index 7c0112070..000000000 --- a/qa/starknet/docker-compose.yml +++ /dev/null @@ -1,109 +0,0 @@ -volumes: - - shared: - driver: local - driver_opts: - type: none - device: ./shared - o: bind - - malachite: - driver: local - driver_opts: - type: none - device: ../../code - o: bind - - sequencer: - driver: local - driver_opts: - type: none - device: ../../../sequencer - o: bind - -networks: - - test-network: - driver: bridge - -services: - - malachite-node-1: - container_name: malachite-node-1 - build: - context: . - dockerfile: malachite.Dockerfile - environment: - - CARGO_HOME=/shared/build/malachite - - CARGO_TARGET_DIR=/shared/build/malachite - - LOCAL_DNS=malachite-node-1 - volumes: - - malachite:/malachite - - shared:/shared - networks: - - test-network - cap_add: - - NET_ADMIN - working_dir: /malachite - tty: true - stdin_open: true - - malachite-node-2: - container_name: malachite-node-2 - build: - context: . - dockerfile: malachite.Dockerfile - environment: - - CARGO_HOME=/shared/build/malachite - - CARGO_TARGET_DIR=/shared/build/malachite - - LOCAL_DNS=malachite-node-2 - volumes: - - malachite:/malachite - - shared:/shared - networks: - - test-network - cap_add: - - NET_ADMIN - working_dir: /malachite - tty: true - stdin_open: true - - sequencer-node-1: - container_name: sequencer-node-1 - build: - context: ../../../ - dockerfile: malachite/qa/starknet/sequencer.Dockerfile - environment: - - CARGO_HOME=/shared/build/sequencer - - CARGO_TARGET_DIR=/shared/build/sequencer - - LOCAL_DNS=sequencer-node-1 - volumes: - - sequencer:/sequencer - - shared:/shared - networks: - - test-network - cap_add: - - NET_ADMIN - working_dir: /sequencer - tty: true - stdin_open: true - - sequencer-node-2: - container_name: sequencer-node-2 - build: - context: ../../../ - dockerfile: malachite/qa/starknet/sequencer.Dockerfile - environment: - - CARGO_HOME=/shared/build/sequencer - - CARGO_TARGET_DIR=/shared/build/sequencer - - LOCAL_DNS=sequencer-node-2 - volumes: - - sequencer:/sequencer - - shared:/shared - networks: - - test-network - cap_add: - - NET_ADMIN - working_dir: /sequencer - tty: true - stdin_open: true diff --git a/qa/starknet/generate.py b/qa/starknet/generate.py new file mode 100644 index 000000000..2d81eaffd --- /dev/null +++ b/qa/starknet/generate.py @@ -0,0 +1,295 @@ +#!/usr/bin/env python3 + +import os +import argparse +import base64 +import json +import csv +import libp2p.peer.id as PeerID +import libp2p.crypto.ed25519 as Ed25519 +from jinja2 import Environment, FileSystemLoader +from eth_hash.auto import keccak +from nacl.signing import SigningKey + +ADDRESS_LENGTH = 31 + + +def generate_key(): + signing_key = SigningKey.generate() + verify_key = signing_key.verify_key + + private_key_bytes = signing_key.encode() + public_key_bytes = verify_key.encode() + private_key_b64 = base64.b64encode(private_key_bytes).decode() + public_key_b64 = base64.b64encode(public_key_bytes).decode() + private_key_hex = "0x" + private_key_bytes.hex() + address = "0x" + keccak(public_key_bytes)[:ADDRESS_LENGTH].hex() + + key_data = { + "private_key": {"type": "tendermint/PrivKeyEd25519", "value": private_key_b64}, + "public_key": {"type": "tendermint/PubKeyEd25519", "value": public_key_b64}, + "address": address, + } + + peer_id = PeerID.ID.from_pubkey( + Ed25519.Ed25519PublicKey.from_bytes(public_key_bytes) + ) + + return key_data, private_key_hex, peer_id + + +def save_malachite_config(dir, rendered_config, genesis, key_data): + os.makedirs(dir, exist_ok=True) + with open(f"{dir}/config.toml", "w") as c: + c.write(rendered_config) + with open(f"{dir}/genesis.json", "w") as g: + g.write(json.dumps(genesis, indent=4)) + with open(f"{dir}/priv_validator_key.json", "w") as p: + p.write(json.dumps(key_data, indent=4)) + + +def save_sequencer_config(dir, rendered_config): + os.makedirs(dir, exist_ok=True) + with open(f"{dir}/config.json", "w") as c: + c.write(json.dumps(rendered_config, indent=4)) + + +def save_cli(dir, cmd, rendered_cli): + os.makedirs(dir, exist_ok=True) + with open(f"{dir}/{cmd}.sh", "w") as c: + c.write(rendered_cli) + os.chmod(f"{dir}/{cmd}.sh", 0o755) + + +def save_bashrc(dir, rendered_bashrc): + os.makedirs(dir, exist_ok=True) + with open(f"{dir}/.bashrc", "w") as c: + c.write(rendered_bashrc) + os.chmod(f"{dir}/.bashrc", 0o755) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--name", type=str, required=False, help="Name of the network") + parser.add_argument( + "--malachite_path", + type=str, + required=True, + help="Absolute path to malachite repository", + ) + parser.add_argument( + "--sequencer_path", + type=str, + required=True, + help="Absolute path to sequencer repository", + ) + parser.add_argument( + "--malachite_nodes", type=int, required=True, help="Number of malachite nodes" + ) + parser.add_argument( + "--sequencer_nodes", type=int, required=True, help="Number of sequencer nodes" + ) + parser.add_argument( + "--proposal_timeout", + type=int, + required=False, + default=500, + help="Proposal timeout (in ms)", + ) + parser.add_argument( + "--prevote_timeout", + type=int, + required=False, + default=500, + help="Prevote timeout (in ms)", + ) + parser.add_argument( + "--precommit_timeout", + type=int, + required=False, + default=500, + help="Precommit timeout (in ms)", + ) + parser.add_argument( + "--latency", + type=int, + required=False, + default=0, + help="Latency (in ms) between nodes", + ) + args = parser.parse_args() + + if not args.name: + args.name = f"m{args.malachite_nodes}-s{args.sequencer_nodes}" + + # Create base directory for the network + base_dir = f"./shared/networks/{args.name}" + os.makedirs(base_dir, exist_ok=True) + + env = Environment(loader=FileSystemLoader(".")) + + compose_template = env.get_template("templates/docker-compose.j2") + rendered_compose = compose_template.render( + network_name=args.name, + malachite_path=args.malachite_path, + sequencer_path=args.sequencer_path, + malachite_count=args.malachite_nodes, + sequencer_count=args.sequencer_nodes, + ) + with open(f"{base_dir}/docker-compose.yml", "w") as f: + f.write(rendered_compose) + + malachite_data = [] + sequencer_data = [] + genesis = {"validator_set": {"validators": []}} + addresses = [] + + # Generate keys and configs for malachite nodes + malachite_config_template = env.get_template("templates/malachite-config.j2") + for i in range(1, args.malachite_nodes + 1): + peers = [] + for j in range(1, args.malachite_nodes + 1): + if j != i: + peers.append(f"malachite-node-{j}") + for k in range(1, args.sequencer_nodes + 1): + peers.append(f"sequencer-node-{k}") + + rendered_config = malachite_config_template.render( + persistent_peers=peers, + proposal_timeout=f"{args.proposal_timeout}ms", + prevote_timeout=f"{args.prevote_timeout}ms", + precommit_timeout=f"{args.precommit_timeout}ms", + ) + key_data, _, _ = generate_key() + + malachite_data.append( + { + "rendered_config": rendered_config, + "key_data": key_data, + } + ) + + genesis["validator_set"]["validators"].append( + { + "address": key_data["address"], + "public_key": key_data["public_key"], + "voting_power": 1, + } + ) + + addresses.append(key_data["address"]) + + # Generate keys and config for sequencer nodes + # TODO: for now, there is no config file for sequencer nodes + for i in range(1, args.sequencer_nodes + 1): + key_data, private_key_hex, peer_id = generate_key() + + sequencer_data.append( + { + "key_data": key_data, + "private_key_hex": private_key_hex, + "peer_id": peer_id, + } + ) + + genesis["validator_set"]["validators"].append( + { + "address": key_data["address"], + "public_key": key_data["public_key"], + "voting_power": 1, + } + ) + + addresses.append(key_data["address"]) + + # Save malachite configs + for i, data in enumerate(malachite_data): + save_malachite_config( + f"{base_dir}/malachite-node-{i + 1}/config", + data["rendered_config"], + genesis, + data["key_data"], + ) + + # Save sequencer configs + # TODO: for now, there is no config file for sequencer nodes + + bashrc_template = env.get_template("templates/bashrc.j2") + + # Generate and save malachite cli + malachite_cli_start_template = env.get_template("templates/malachite-cli-start.j2") + malachite_cli_reset_template = env.get_template("templates/malachite-cli-reset.j2") + for i in range(1, args.malachite_nodes + 1): + rendered_cli = malachite_cli_start_template.render(network_name=args.name, id=i) + save_cli(f"{base_dir}/malachite-node-{i}/", "start", rendered_cli) + rendered_cli = malachite_cli_reset_template.render(network_name=args.name, id=i) + save_cli(f"{base_dir}/malachite-node-{i}/", "reset", rendered_cli) + + rendered_bashrc = bashrc_template.render( + network_name=args.name, + node_type="malachite", + id=i, + ) + save_bashrc(f"{base_dir}/malachite-node-{i}/", rendered_bashrc) + + # Generate and save sequencer cli + sequencer_cli_start_template = env.get_template("templates/sequencer-cli-start.j2") + sequencer_cli_reset_template = env.get_template("templates/sequencer-cli-reset.j2") + + if args.proposal_timeout <= 1000: + print( + "Warning: Proposal timeout should be > 1s for the sequencer. Setting it to 1001ms." + ) + args.proposal_timeout = 1001 + + for i in range(1, args.sequencer_nodes + 1): + rendered_cli = sequencer_cli_start_template.render( + network_name=args.name, + id=i, + consensus_secret_key=sequencer_data[i - 1]["private_key_hex"], + validator_id=sequencer_data[i - 1]["key_data"]["address"], + num_validators=args.malachite_nodes + args.sequencer_nodes, + validator_ids=",".join(addresses), + bootstrap_peer=( + f'/dns/sequencer-node-{((i - 2) % args.sequencer_nodes) + 1}/tcp/27000/p2p/{sequencer_data[(i - 2) % args.sequencer_nodes]["peer_id"]}' + if args.sequencer_nodes >= 2 + else None + ), + proposal_timeout=args.proposal_timeout / 1000, + prevote_timeout=args.prevote_timeout / 1000, + precommit_timeout=args.precommit_timeout / 1000, + ) + save_cli(f"{base_dir}/sequencer-node-{i}/", "start", rendered_cli) + rendered_cli = sequencer_cli_reset_template.render(network_name=args.name, id=i) + save_cli(f"{base_dir}/sequencer-node-{i}/", "reset", rendered_cli) + + rendered_bashrc = bashrc_template.render( + network_name=args.name, + node_type="sequencer", + id=i, + ) + save_bashrc(f"{base_dir}/sequencer-node-{i}/", rendered_bashrc) + + # Generate and save latency config + data = [ + ["From/To"] + + [f"malachite-node-{i}" for i in range(1, args.malachite_nodes + 1)] + + [f"sequencer-node-{i}" for i in range(1, args.sequencer_nodes + 1)] + ] + for i in range(1, args.malachite_nodes + 1): + row = [f"malachite-node-{i}"] + [args.latency] * ( + args.malachite_nodes + args.sequencer_nodes + ) + data.append(row) + for i in range(1, args.sequencer_nodes + 1): + row = [f"sequencer-node-{i}"] + [args.latency] * ( + args.malachite_nodes + args.sequencer_nodes + ) + data.append(row) + with open(f"{base_dir}/latencies.csv", "w", newline="") as f: + writer = csv.writer(f) + writer.writerows(data) + + +if __name__ == "__main__": + main() diff --git a/qa/starknet/manage.sh b/qa/starknet/manage.sh new file mode 100755 index 000000000..508fe3228 --- /dev/null +++ b/qa/starknet/manage.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +set -e + +print_help() { + echo "Usage: $0 " + echo + echo "Manage Docker Compose for the given network." + echo + echo "Arguments:" + echo " network_name Name of the network (e.g., m2-s3)" + echo " action up | down" + exit 1 +} + +if [[ "$1" == "-h" || "$1" == "--help" || -z "$1" || -z "$2" ]]; then + print_help +fi + +network_name="$1" +action="$2" +compose_file="shared/networks/${network_name}/docker-compose.yml" + +if [[ ! -f "$compose_file" ]]; then + echo "Error: Compose file not found at $compose_file" + exit 1 +fi + +case "$action" in + up) + docker compose -f "$compose_file" up -d || exit 1 + echo "Enter the nodes container with:" + for container in $(docker compose -f "$compose_file" ps --format '{{.Name}}'); do + echo -e "\tdocker exec -it $container /bin/bash" + done + ;; + down) + docker compose -f "$compose_file" down + ;; + *) + echo "Error: Invalid action '$action'. Use 'up' or 'down'." + print_help + ;; +esac diff --git a/qa/starknet/sequencer.Dockerfile b/qa/starknet/sequencer.Dockerfile index 46f1e4bb9..a6bd716d2 100644 --- a/qa/starknet/sequencer.Dockerfile +++ b/qa/starknet/sequencer.Dockerfile @@ -4,9 +4,9 @@ RUN apt-get update && apt-get install -y bash bash-completion python3 iproute2 & echo 'set editing-mode emacs' >> /etc/inputrc && \ echo '[[ $PS1 && -f /etc/bash_completion ]] && . /etc/bash_completion' >> /etc/bash.bashrc -COPY sequencer/scripts/install_build_tools.sh . +COPY scripts/install_build_tools.sh . -COPY sequencer/scripts/dependencies.sh . +COPY scripts/dependencies.sh . RUN ./install_build_tools.sh diff --git a/qa/starknet/setup/macos.sh b/qa/starknet/setup/macos.sh new file mode 100755 index 000000000..80d9fcbe0 --- /dev/null +++ b/qa/starknet/setup/macos.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +set -e +trap 'echo "An error occurred. Exiting..."; exit 1;' ERR + +cd "$(dirname "$0")" || exit 1 + +echo "Checking for Homebrew..." +if ! command -v brew &>/dev/null; then + echo "Error: Homebrew is not installed. Please install it from https://brew.sh/ and re-run this script." + exit 1 +fi + +echo "Checking for pip3..." +if ! command -v pip3 &>/dev/null; then + echo "Error: pip3 is not installed. Please install Python 3 and pip3 before continuing." + exit 1 +fi + +echo "Installing Python requirements..." +pip3 install -r requirements.txt + +echo "Checking for GMP..." +if ! brew list gmp &>/dev/null; then + echo "Installing GMP via Homebrew..." + brew install gmp +else + echo "GMP already installed." +fi + +echo "Relinking GMP..." +brew unlink gmp && brew link gmp + +ARCH=$(uname -m) +if [ "$ARCH" = "arm64" ]; then + # Apple Silicon + export CFLAGS="-I/opt/homebrew/include" + export LDFLAGS="-L/opt/homebrew/lib" +else + # Intel + export CFLAGS="-I/usr/local/include" + export LDFLAGS="-L/usr/local/lib" +fi + +echo "Installing libp2p with correct compile flags..." +pip3 install libp2p==0.2.4 + +trap - ERR +echo "Setup complete!" diff --git a/qa/starknet/setup/requirements.txt b/qa/starknet/setup/requirements.txt new file mode 100644 index 000000000..c78ca7248 --- /dev/null +++ b/qa/starknet/setup/requirements.txt @@ -0,0 +1,3 @@ +jinja2 +eth-hash +pynacl diff --git a/qa/starknet/shared/config/malachite-node-1/config/genesis.json b/qa/starknet/shared/config/malachite-node-1/config/genesis.json deleted file mode 100644 index c9f677b98..000000000 --- a/qa/starknet/shared/config/malachite-node-1/config/genesis.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "validator_set": { - "validators": [ - { - "address": "0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8", - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "UPLh0RyuczU8XN6GfMD9XYHjlY1SZS7FRlJuj4AC0QI=" - }, - "voting_power": 1 - }, - { - "address": "0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a", - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "bLWO9y+9GkCABubrWE0xsW6Bakjgv/FlMoBON4A5WJc=" - }, - "voting_power": 1 - }, - { - "address": "0x0000000000000000000000000000000000000000000000000000000000000064", - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" - }, - "voting_power": 1 - }, - { - "address": "0x0000000000000000000000000000000000000000000000000000000000000065", - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "F8t5+ytBIPKx7GXkGY1uiyjoE/6x5KQIObheGAgM4AA=" - }, - "voting_power": 1 - } - ] - } -} \ No newline at end of file diff --git a/qa/starknet/shared/config/malachite-node-1/config/priv_validator_key.json b/qa/starknet/shared/config/malachite-node-1/config/priv_validator_key.json deleted file mode 100644 index 2f530b7b1..000000000 --- a/qa/starknet/shared/config/malachite-node-1/config/priv_validator_key.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "private_key": { - "type": "tendermint/PrivKeyEd25519", - "value": "Z3XxCitCu85qI9/Nx7hveX6ii3U+fIpFh0JRkbzEsOM=" - }, - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "bLWO9y+9GkCABubrWE0xsW6Bakjgv/FlMoBON4A5WJc=" - }, - "address": "0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a" -} \ No newline at end of file diff --git a/qa/starknet/shared/config/malachite-node-2/config/config.toml b/qa/starknet/shared/config/malachite-node-2/config/config.toml deleted file mode 100644 index e6b1b8590..000000000 --- a/qa/starknet/shared/config/malachite-node-2/config/config.toml +++ /dev/null @@ -1,97 +0,0 @@ -moniker = "node-2" - -[logging] -log_level = "debug" -log_format = "plaintext" - -[consensus] -value_payload = "parts-only" - -timeout_propose = "1100ms" -timeout_propose_delta = "0ms" -timeout_prevote = "1100ms" -timeout_prevote_delta = "0ms" -timeout_precommit = "1100ms" -timeout_precommit_delta = "0ms" -timeout_commit = "0s" -timeout_step = "300s" - -[consensus.p2p] -listen_addr = "/ip4/0.0.0.0/tcp/27000" -persistent_peers = [ - "/dns/malachite-node-1/tcp/27000", - "/dns/sequencer-node-1/tcp/27000", - "/dns/sequencer-node-2/tcp/27000", -] -transport = "tcp" -pubsub_max_size = "4.2 MB" -rpc_max_size = "10.5 MB" - -[consensus.p2p.discovery] -enabled = false -bootstrap_protocol = "kademlia" -selector = "random" -num_outbound_peers = 1 -num_inbound_peers = 5 -ephemeral_connection_timeout = "5s" -connect_request_max_retries = 10000 - -[consensus.p2p.protocol] -type = "gossipsub" -mesh_n = 6 -mesh_n_high = 12 -mesh_n_low = 4 -mesh_outbound_min = 2 - -[consensus.vote_sync] -mode = "rebroadcast" - -[mempool] -max_tx_count = 10000 -gossip_batch_size = 0 - -[mempool.p2p] -listen_addr = "/ip4/127.0.0.1/tcp/28000" -persistent_peers = [] -transport = "tcp" -pubsub_max_size = "4.2 MB" -rpc_max_size = "10.5 MB" - -[mempool.p2p.discovery] -enabled = false -bootstrap_protocol = "full" -selector = "random" -num_outbound_peers = 20 -num_inbound_peers = 20 -ephemeral_connection_timeout = "5s" - -[mempool.p2p.protocol] -type = "gossipsub" -mesh_n = 6 -mesh_n_high = 12 -mesh_n_low = 4 -mesh_outbound_min = 2 - -[value_sync] -enabled = false -status_update_interval = "10s" -request_timeout = "10s" - -[metrics] -enabled = true -listen_addr = "127.0.0.1:29000" - -[runtime] -flavor = "single_threaded" - -[test] -max_block_size = "1048.6 KB" -tx_size = "1.0 KB" -txs_per_part = 256 -time_allowance_factor = 0.5 -exec_time_per_tx = "1ms" -max_retain_blocks = 1000 - -[test.vote_extensions] -enabled = false -size = "0 B" diff --git a/qa/starknet/shared/config/malachite-node-2/config/genesis.json b/qa/starknet/shared/config/malachite-node-2/config/genesis.json deleted file mode 100644 index c9f677b98..000000000 --- a/qa/starknet/shared/config/malachite-node-2/config/genesis.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "validator_set": { - "validators": [ - { - "address": "0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8", - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "UPLh0RyuczU8XN6GfMD9XYHjlY1SZS7FRlJuj4AC0QI=" - }, - "voting_power": 1 - }, - { - "address": "0x4b58ef72fbd19638006e6eb584d31b16e816a48e0bff16532804e378039588a", - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "bLWO9y+9GkCABubrWE0xsW6Bakjgv/FlMoBON4A5WJc=" - }, - "voting_power": 1 - }, - { - "address": "0x0000000000000000000000000000000000000000000000000000000000000064", - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" - }, - "voting_power": 1 - }, - { - "address": "0x0000000000000000000000000000000000000000000000000000000000000065", - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "F8t5+ytBIPKx7GXkGY1uiyjoE/6x5KQIObheGAgM4AA=" - }, - "voting_power": 1 - } - ] - } -} \ No newline at end of file diff --git a/qa/starknet/shared/config/malachite-node-2/config/priv_validator_key.json b/qa/starknet/shared/config/malachite-node-2/config/priv_validator_key.json deleted file mode 100644 index 36f024337..000000000 --- a/qa/starknet/shared/config/malachite-node-2/config/priv_validator_key.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "private_key": { - "type": "tendermint/PrivKeyEd25519", - "value": "n7TinGnpMpRKcyi2jwifkjQTfmV1A1lT/QJ76DFnS/Q=" - }, - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "UPLh0RyuczU8XN6GfMD9XYHjlY1SZS7FRlJuj4AC0QI=" - }, - "address": "0xf2e1d11cae728b3c5cde867cc0fd5d81e3958d52652ec546526e8f8002d0f8" -} \ No newline at end of file diff --git a/qa/starknet/shared/config/sequencer-node-1/config.json b/qa/starknet/shared/config/sequencer-node-1/config.json deleted file mode 100644 index 95502b458..000000000 --- a/qa/starknet/shared/config/sequencer-node-1/config.json +++ /dev/null @@ -1,264 +0,0 @@ -{ - "base_layer_config.node_url": "http://invalid_address.com", - "base_layer_config.starknet_contract_address": "0xc662c410C0ECf747543f5bA90660f6ABeBD9C8c4", - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.add_mod": 156250, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.bitwise": 39062, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.ec_op": 2441, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.ecdsa": 1220, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.keccak": 1220, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.mul_mod": 156250, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.pedersen": 78125, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.poseidon": 78125, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.range_check": 156250, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.range_check96": 156250, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.l1_gas": 2500000, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.message_segment_length": 3700, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.n_events": 5000, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.n_steps": 2500000, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.sierra_gas": 250000000, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.state_diff_size": 4000, - "batcher_config.block_builder_config.chain_info.chain_id": "MY_CUSTOM_CHAIN_ID", - "batcher_config.block_builder_config.chain_info.fee_token_addresses.eth_fee_token_address": "0x1001", - "batcher_config.block_builder_config.chain_info.fee_token_addresses.strk_fee_token_address": "0x1002", - "batcher_config.block_builder_config.execute_config.concurrency_config.chunk_size": 0, - "batcher_config.block_builder_config.execute_config.concurrency_config.enabled": false, - "batcher_config.block_builder_config.execute_config.concurrency_config.n_workers": 0, - "batcher_config.block_builder_config.execute_config.stack_size": 62914560, - "batcher_config.block_builder_config.tx_chunk_size": 100, - "batcher_config.block_builder_config.versioned_constants_overrides.invoke_tx_max_n_steps": 10000000, - "batcher_config.block_builder_config.versioned_constants_overrides.max_recursion_depth": 50, - "batcher_config.block_builder_config.versioned_constants_overrides.validate_max_n_steps": 1000000, - "batcher_config.contract_class_manager_config.cairo_native_run_config.channel_size": 2000, - "batcher_config.contract_class_manager_config.cairo_native_run_config.run_cairo_native": false, - "batcher_config.contract_class_manager_config.cairo_native_run_config.wait_on_native_compilation": false, - "batcher_config.contract_class_manager_config.contract_cache_size": 600, - "batcher_config.contract_class_manager_config.native_compiler_config.max_casm_bytecode_size": 81920, - "batcher_config.contract_class_manager_config.native_compiler_config.max_cpu_time": 20, - "batcher_config.contract_class_manager_config.native_compiler_config.max_memory_usage": 5368709120, - "batcher_config.contract_class_manager_config.native_compiler_config.max_native_bytecode_size": 15728640, - "batcher_config.contract_class_manager_config.native_compiler_config.sierra_to_native_compiler_path": null, - "batcher_config.input_stream_content_buffer_size": 400, - "batcher_config.max_l1_handler_txs_per_block_proposal": 3, - "batcher_config.outstream_content_buffer_size": 100, - "batcher_config.storage.db_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "batcher_config.storage.db_config.enforce_file_exists": false, - "batcher_config.storage.db_config.growth_step": 4294967296, - "batcher_config.storage.db_config.max_size": 1099511627776, - "batcher_config.storage.db_config.min_size": 1048576, - "batcher_config.storage.db_config.path_prefix": "/logs/sequencer-node-1/batcher_data", - "batcher_config.storage.mmap_file_config.growth_step": 1073741824, - "batcher_config.storage.mmap_file_config.max_object_size": 268435456, - "batcher_config.storage.mmap_file_config.max_size": 1099511627776, - "batcher_config.storage.scope": "StateOnly", - "chain_id": "MY_CUSTOM_CHAIN_ID", - "class_manager_config.class_manager_config.cached_class_storage_config.class_cache_size": 10, - "class_manager_config.class_manager_config.cached_class_storage_config.deprecated_class_cache_size": 10, - "class_manager_config.class_storage_config.class_hash_storage_config.enforce_file_exists": false, - "class_manager_config.class_storage_config.class_hash_storage_config.max_size": 1048576, - "class_manager_config.class_storage_config.class_hash_storage_config.path_prefix": "/logs/sequencer-node-1/class_manager_data", - "class_manager_config.class_storage_config.persistent_root": "/classes", - "compiler_config.max_casm_bytecode_size": 81920, - "compiler_config.max_cpu_time": 20, - "compiler_config.max_memory_usage": 5368709120, - "compiler_config.max_native_bytecode_size": 15728640, - "compiler_config.sierra_to_native_compiler_path": null, - "components.batcher.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.batcher.ip": "0.0.0.0", - "components.batcher.local_server_config.channel_buffer_size": 32, - "components.batcher.max_concurrency": 10, - "components.batcher.port": 0, - "components.batcher.remote_client_config.idle_connections": 18446744073709551615, - "components.batcher.remote_client_config.idle_timeout": 90, - "components.batcher.remote_client_config.retries": 3, - "components.batcher.url": "localhost", - "components.class_manager.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.class_manager.ip": "0.0.0.0", - "components.class_manager.local_server_config.channel_buffer_size": 32, - "components.class_manager.max_concurrency": 10, - "components.class_manager.port": 0, - "components.class_manager.remote_client_config.idle_connections": 18446744073709551615, - "components.class_manager.remote_client_config.idle_timeout": 90, - "components.class_manager.remote_client_config.retries": 3, - "components.class_manager.url": "localhost", - "components.consensus_manager.execution_mode": "Enabled", - "components.gateway.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.gateway.ip": "0.0.0.0", - "components.gateway.local_server_config.channel_buffer_size": 32, - "components.gateway.max_concurrency": 10, - "components.gateway.port": 0, - "components.gateway.remote_client_config.idle_connections": 18446744073709551615, - "components.gateway.remote_client_config.idle_timeout": 90, - "components.gateway.remote_client_config.retries": 3, - "components.gateway.url": "localhost", - "components.http_server.execution_mode": "Enabled", - "components.l1_provider.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.l1_provider.ip": "0.0.0.0", - "components.l1_provider.local_server_config.channel_buffer_size": 32, - "components.l1_provider.max_concurrency": 10, - "components.l1_provider.port": 0, - "components.l1_provider.remote_client_config.idle_connections": 18446744073709551615, - "components.l1_provider.remote_client_config.idle_timeout": 90, - "components.l1_provider.remote_client_config.retries": 3, - "components.l1_provider.url": "localhost", - "components.l1_scraper.execution_mode": "Enabled", - "components.mempool.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.mempool.ip": "0.0.0.0", - "components.mempool.local_server_config.channel_buffer_size": 32, - "components.mempool.max_concurrency": 10, - "components.mempool.port": 0, - "components.mempool.remote_client_config.idle_connections": 18446744073709551615, - "components.mempool.remote_client_config.idle_timeout": 90, - "components.mempool.remote_client_config.retries": 3, - "components.mempool.url": "localhost", - "components.mempool_p2p.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.mempool_p2p.ip": "0.0.0.0", - "components.mempool_p2p.local_server_config.channel_buffer_size": 32, - "components.mempool_p2p.max_concurrency": 10, - "components.mempool_p2p.port": 0, - "components.mempool_p2p.remote_client_config.idle_connections": 18446744073709551615, - "components.mempool_p2p.remote_client_config.idle_timeout": 90, - "components.mempool_p2p.remote_client_config.retries": 3, - "components.mempool_p2p.url": "localhost", - "components.monitoring_endpoint.execution_mode": "Enabled", - "components.sierra_compiler.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.sierra_compiler.ip": "0.0.0.0", - "components.sierra_compiler.local_server_config.channel_buffer_size": 32, - "components.sierra_compiler.max_concurrency": 10, - "components.sierra_compiler.port": 0, - "components.sierra_compiler.remote_client_config.idle_connections": 18446744073709551615, - "components.sierra_compiler.remote_client_config.idle_timeout": 90, - "components.sierra_compiler.remote_client_config.retries": 3, - "components.sierra_compiler.url": "localhost", - "components.state_sync.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.state_sync.ip": "0.0.0.0", - "components.state_sync.local_server_config.channel_buffer_size": 32, - "components.state_sync.max_concurrency": 10, - "components.state_sync.port": 0, - "components.state_sync.remote_client_config.idle_connections": 18446744073709551615, - "components.state_sync.remote_client_config.idle_timeout": 90, - "components.state_sync.remote_client_config.retries": 3, - "components.state_sync.url": "localhost", - "consensus_manager_config.broadcast_buffer_size": 10000, - "consensus_manager_config.cende_config.certificates_file_path": null, - "consensus_manager_config.cende_config.recorder_url": "http://invalid_address.com", - "consensus_manager_config.cende_config.skip_write_height": null, - "consensus_manager_config.consensus_config.future_height_limit": 10, - "consensus_manager_config.consensus_config.future_height_round_limit": 1, - "consensus_manager_config.consensus_config.future_round_limit": 10, - "consensus_manager_config.consensus_config.startup_delay": 5, - "consensus_manager_config.consensus_config.sync_retry_interval": 1.0, - "consensus_manager_config.consensus_config.timeouts.precommit_timeout": 1.0, - "consensus_manager_config.consensus_config.timeouts.prevote_timeout": 1.0, - "consensus_manager_config.consensus_config.timeouts.proposal_timeout": 3.0, - "consensus_manager_config.consensus_config.validator_id": "0x64", - "consensus_manager_config.context_config.batcher_build_buffer": 100, - "consensus_manager_config.context_config.block_timestamp_window": 1, - "consensus_manager_config.context_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "consensus_manager_config.context_config.l1_da_mode": true, - "consensus_manager_config.context_config.num_validators": 2, - "consensus_manager_config.immediate_active_height": 0, - "consensus_manager_config.network_config.advertised_multiaddr": null, - "consensus_manager_config.network_config.bootstrap_peer_multiaddr": null, - "consensus_manager_config.network_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "consensus_manager_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis": 2, - "consensus_manager_config.network_config.discovery_config.bootstrap_dial_retry_config.factor": 5, - "consensus_manager_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds": 5, - "consensus_manager_config.network_config.discovery_config.heartbeat_interval": 100, - "consensus_manager_config.network_config.idle_connection_timeout": 120, - "consensus_manager_config.network_config.peer_manager_config.malicious_timeout_seconds": 1, - "consensus_manager_config.network_config.peer_manager_config.unstable_timeout_millis": 1000, - "consensus_manager_config.network_config.secret_key": "0x1111111111111111111111111111111111111111111111111111111111111111", - "consensus_manager_config.network_config.session_timeout": 120, - "consensus_manager_config.network_config.tcp_port": 27000, - "consensus_manager_config.proposals_topic": "consensus_proposals", - "consensus_manager_config.revert_config.revert_up_to_and_including": 18446744073709551615, - "consensus_manager_config.revert_config.should_revert": false, - "consensus_manager_config.votes_topic": "consensus_votes", - "eth_fee_token_address": "0x1001", - "gateway_config.chain_info.chain_id": "MY_CUSTOM_CHAIN_ID", - "gateway_config.chain_info.fee_token_addresses.eth_fee_token_address": "0x1001", - "gateway_config.chain_info.fee_token_addresses.strk_fee_token_address": "0x1002", - "gateway_config.stateful_tx_validator_config.max_nonce_for_validation_skip": "0x1", - "gateway_config.stateful_tx_validator_config.versioned_constants_overrides.invoke_tx_max_n_steps": 10000000, - "gateway_config.stateful_tx_validator_config.versioned_constants_overrides.max_recursion_depth": 50, - "gateway_config.stateful_tx_validator_config.versioned_constants_overrides.validate_max_n_steps": 1000000, - "gateway_config.stateless_tx_validator_config.max_calldata_length": 4000, - "gateway_config.stateless_tx_validator_config.max_contract_class_object_size": 4089446, - "gateway_config.stateless_tx_validator_config.max_sierra_version.major": 1, - "gateway_config.stateless_tx_validator_config.max_sierra_version.minor": 5, - "gateway_config.stateless_tx_validator_config.max_sierra_version.patch": 18446744073709551615, - "gateway_config.stateless_tx_validator_config.max_signature_length": 4000, - "gateway_config.stateless_tx_validator_config.min_sierra_version.major": 1, - "gateway_config.stateless_tx_validator_config.min_sierra_version.minor": 1, - "gateway_config.stateless_tx_validator_config.min_sierra_version.patch": 0, - "gateway_config.stateless_tx_validator_config.validate_non_zero_l1_data_gas_fee": false, - "gateway_config.stateless_tx_validator_config.validate_non_zero_l1_gas_fee": true, - "gateway_config.stateless_tx_validator_config.validate_non_zero_l2_gas_fee": false, - "http_server_config.ip": "0.0.0.0", - "http_server_config.port": 13000, - "l1_provider_config.bootstrap_catch_up_height": 0, - "l1_provider_config.provider_startup_height": 1, - "l1_provider_config.startup_sync_sleep_retry_interval": 0.0, - "l1_scraper_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "l1_scraper_config.finality": 0, - "l1_scraper_config.polling_interval": 1, - "l1_scraper_config.startup_rewind_time": 0, - "mempool_p2p_config.network_buffer_size": 10000, - "mempool_p2p_config.network_config.advertised_multiaddr": null, - "mempool_p2p_config.network_config.bootstrap_peer_multiaddr": null, - "mempool_p2p_config.network_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis": 2, - "mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.factor": 5, - "mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds": 5, - "mempool_p2p_config.network_config.discovery_config.heartbeat_interval": 100, - "mempool_p2p_config.network_config.idle_connection_timeout": 120, - "mempool_p2p_config.network_config.peer_manager_config.malicious_timeout_seconds": 1, - "mempool_p2p_config.network_config.peer_manager_config.unstable_timeout_millis": 1000, - "mempool_p2p_config.network_config.secret_key": "", - "mempool_p2p_config.network_config.session_timeout": 120, - "mempool_p2p_config.network_config.tcp_port": 11000, - "monitoring_endpoint_config.collect_metrics": true, - "monitoring_endpoint_config.ip": "0.0.0.0", - "monitoring_endpoint_config.port": 14000, - "recorder_url": "http://invalid_address.com", - "revert_config.revert_up_to_and_including": 18446744073709551615, - "revert_config.should_revert": false, - "state_sync_config.central_sync_client_config": null, - "state_sync_config.network_config.advertised_multiaddr": null, - "state_sync_config.network_config.bootstrap_peer_multiaddr": null, - "state_sync_config.network_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "state_sync_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis": 2, - "state_sync_config.network_config.discovery_config.bootstrap_dial_retry_config.factor": 5, - "state_sync_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds": 5, - "state_sync_config.network_config.discovery_config.heartbeat_interval": 100, - "state_sync_config.network_config.idle_connection_timeout": 120, - "state_sync_config.network_config.peer_manager_config.malicious_timeout_seconds": 1, - "state_sync_config.network_config.peer_manager_config.unstable_timeout_millis": 1000, - "state_sync_config.network_config.secret_key": "0x2222222222222222222222222222222222222222222222222222222222222222", - "state_sync_config.network_config.session_timeout": 120, - "state_sync_config.network_config.tcp_port": 12000, - "state_sync_config.p2p_sync_client_config.buffer_size": 100000, - "state_sync_config.p2p_sync_client_config.num_block_classes_per_query": 100, - "state_sync_config.p2p_sync_client_config.num_block_state_diffs_per_query": 100, - "state_sync_config.p2p_sync_client_config.num_block_transactions_per_query": 100, - "state_sync_config.p2p_sync_client_config.num_headers_per_query": 10000, - "state_sync_config.p2p_sync_client_config.wait_period_for_new_data": 50, - "state_sync_config.p2p_sync_client_config.wait_period_for_other_protocol": 50, - "state_sync_config.revert_config.revert_up_to_and_including": 18446744073709551615, - "state_sync_config.revert_config.should_revert": false, - "state_sync_config.storage_config.db_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "state_sync_config.storage_config.db_config.enforce_file_exists": false, - "state_sync_config.storage_config.db_config.growth_step": 4294967296, - "state_sync_config.storage_config.db_config.max_size": 1099511627776, - "state_sync_config.storage_config.db_config.min_size": 1048576, - "state_sync_config.storage_config.db_config.path_prefix": "/logs/sequencer-node-1/sync_data", - "state_sync_config.storage_config.mmap_file_config.growth_step": 1073741824, - "state_sync_config.storage_config.mmap_file_config.max_object_size": 268435456, - "state_sync_config.storage_config.mmap_file_config.max_size": 1099511627776, - "state_sync_config.storage_config.scope": "FullArchive", - "strk_fee_token_address": "0x1002", - "validator_id": "0x64", - "versioned_constants_overrides.invoke_tx_max_n_steps": 10000000, - "versioned_constants_overrides.max_recursion_depth": 50, - "versioned_constants_overrides.validate_max_n_steps": 1000000 -} \ No newline at end of file diff --git a/qa/starknet/shared/config/sequencer-node-2/config.json b/qa/starknet/shared/config/sequencer-node-2/config.json deleted file mode 100644 index 95502b458..000000000 --- a/qa/starknet/shared/config/sequencer-node-2/config.json +++ /dev/null @@ -1,264 +0,0 @@ -{ - "base_layer_config.node_url": "http://invalid_address.com", - "base_layer_config.starknet_contract_address": "0xc662c410C0ECf747543f5bA90660f6ABeBD9C8c4", - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.add_mod": 156250, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.bitwise": 39062, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.ec_op": 2441, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.ecdsa": 1220, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.keccak": 1220, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.mul_mod": 156250, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.pedersen": 78125, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.poseidon": 78125, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.range_check": 156250, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.range_check96": 156250, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.l1_gas": 2500000, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.message_segment_length": 3700, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.n_events": 5000, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.n_steps": 2500000, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.sierra_gas": 250000000, - "batcher_config.block_builder_config.bouncer_config.block_max_capacity.state_diff_size": 4000, - "batcher_config.block_builder_config.chain_info.chain_id": "MY_CUSTOM_CHAIN_ID", - "batcher_config.block_builder_config.chain_info.fee_token_addresses.eth_fee_token_address": "0x1001", - "batcher_config.block_builder_config.chain_info.fee_token_addresses.strk_fee_token_address": "0x1002", - "batcher_config.block_builder_config.execute_config.concurrency_config.chunk_size": 0, - "batcher_config.block_builder_config.execute_config.concurrency_config.enabled": false, - "batcher_config.block_builder_config.execute_config.concurrency_config.n_workers": 0, - "batcher_config.block_builder_config.execute_config.stack_size": 62914560, - "batcher_config.block_builder_config.tx_chunk_size": 100, - "batcher_config.block_builder_config.versioned_constants_overrides.invoke_tx_max_n_steps": 10000000, - "batcher_config.block_builder_config.versioned_constants_overrides.max_recursion_depth": 50, - "batcher_config.block_builder_config.versioned_constants_overrides.validate_max_n_steps": 1000000, - "batcher_config.contract_class_manager_config.cairo_native_run_config.channel_size": 2000, - "batcher_config.contract_class_manager_config.cairo_native_run_config.run_cairo_native": false, - "batcher_config.contract_class_manager_config.cairo_native_run_config.wait_on_native_compilation": false, - "batcher_config.contract_class_manager_config.contract_cache_size": 600, - "batcher_config.contract_class_manager_config.native_compiler_config.max_casm_bytecode_size": 81920, - "batcher_config.contract_class_manager_config.native_compiler_config.max_cpu_time": 20, - "batcher_config.contract_class_manager_config.native_compiler_config.max_memory_usage": 5368709120, - "batcher_config.contract_class_manager_config.native_compiler_config.max_native_bytecode_size": 15728640, - "batcher_config.contract_class_manager_config.native_compiler_config.sierra_to_native_compiler_path": null, - "batcher_config.input_stream_content_buffer_size": 400, - "batcher_config.max_l1_handler_txs_per_block_proposal": 3, - "batcher_config.outstream_content_buffer_size": 100, - "batcher_config.storage.db_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "batcher_config.storage.db_config.enforce_file_exists": false, - "batcher_config.storage.db_config.growth_step": 4294967296, - "batcher_config.storage.db_config.max_size": 1099511627776, - "batcher_config.storage.db_config.min_size": 1048576, - "batcher_config.storage.db_config.path_prefix": "/logs/sequencer-node-1/batcher_data", - "batcher_config.storage.mmap_file_config.growth_step": 1073741824, - "batcher_config.storage.mmap_file_config.max_object_size": 268435456, - "batcher_config.storage.mmap_file_config.max_size": 1099511627776, - "batcher_config.storage.scope": "StateOnly", - "chain_id": "MY_CUSTOM_CHAIN_ID", - "class_manager_config.class_manager_config.cached_class_storage_config.class_cache_size": 10, - "class_manager_config.class_manager_config.cached_class_storage_config.deprecated_class_cache_size": 10, - "class_manager_config.class_storage_config.class_hash_storage_config.enforce_file_exists": false, - "class_manager_config.class_storage_config.class_hash_storage_config.max_size": 1048576, - "class_manager_config.class_storage_config.class_hash_storage_config.path_prefix": "/logs/sequencer-node-1/class_manager_data", - "class_manager_config.class_storage_config.persistent_root": "/classes", - "compiler_config.max_casm_bytecode_size": 81920, - "compiler_config.max_cpu_time": 20, - "compiler_config.max_memory_usage": 5368709120, - "compiler_config.max_native_bytecode_size": 15728640, - "compiler_config.sierra_to_native_compiler_path": null, - "components.batcher.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.batcher.ip": "0.0.0.0", - "components.batcher.local_server_config.channel_buffer_size": 32, - "components.batcher.max_concurrency": 10, - "components.batcher.port": 0, - "components.batcher.remote_client_config.idle_connections": 18446744073709551615, - "components.batcher.remote_client_config.idle_timeout": 90, - "components.batcher.remote_client_config.retries": 3, - "components.batcher.url": "localhost", - "components.class_manager.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.class_manager.ip": "0.0.0.0", - "components.class_manager.local_server_config.channel_buffer_size": 32, - "components.class_manager.max_concurrency": 10, - "components.class_manager.port": 0, - "components.class_manager.remote_client_config.idle_connections": 18446744073709551615, - "components.class_manager.remote_client_config.idle_timeout": 90, - "components.class_manager.remote_client_config.retries": 3, - "components.class_manager.url": "localhost", - "components.consensus_manager.execution_mode": "Enabled", - "components.gateway.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.gateway.ip": "0.0.0.0", - "components.gateway.local_server_config.channel_buffer_size": 32, - "components.gateway.max_concurrency": 10, - "components.gateway.port": 0, - "components.gateway.remote_client_config.idle_connections": 18446744073709551615, - "components.gateway.remote_client_config.idle_timeout": 90, - "components.gateway.remote_client_config.retries": 3, - "components.gateway.url": "localhost", - "components.http_server.execution_mode": "Enabled", - "components.l1_provider.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.l1_provider.ip": "0.0.0.0", - "components.l1_provider.local_server_config.channel_buffer_size": 32, - "components.l1_provider.max_concurrency": 10, - "components.l1_provider.port": 0, - "components.l1_provider.remote_client_config.idle_connections": 18446744073709551615, - "components.l1_provider.remote_client_config.idle_timeout": 90, - "components.l1_provider.remote_client_config.retries": 3, - "components.l1_provider.url": "localhost", - "components.l1_scraper.execution_mode": "Enabled", - "components.mempool.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.mempool.ip": "0.0.0.0", - "components.mempool.local_server_config.channel_buffer_size": 32, - "components.mempool.max_concurrency": 10, - "components.mempool.port": 0, - "components.mempool.remote_client_config.idle_connections": 18446744073709551615, - "components.mempool.remote_client_config.idle_timeout": 90, - "components.mempool.remote_client_config.retries": 3, - "components.mempool.url": "localhost", - "components.mempool_p2p.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.mempool_p2p.ip": "0.0.0.0", - "components.mempool_p2p.local_server_config.channel_buffer_size": 32, - "components.mempool_p2p.max_concurrency": 10, - "components.mempool_p2p.port": 0, - "components.mempool_p2p.remote_client_config.idle_connections": 18446744073709551615, - "components.mempool_p2p.remote_client_config.idle_timeout": 90, - "components.mempool_p2p.remote_client_config.retries": 3, - "components.mempool_p2p.url": "localhost", - "components.monitoring_endpoint.execution_mode": "Enabled", - "components.sierra_compiler.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.sierra_compiler.ip": "0.0.0.0", - "components.sierra_compiler.local_server_config.channel_buffer_size": 32, - "components.sierra_compiler.max_concurrency": 10, - "components.sierra_compiler.port": 0, - "components.sierra_compiler.remote_client_config.idle_connections": 18446744073709551615, - "components.sierra_compiler.remote_client_config.idle_timeout": 90, - "components.sierra_compiler.remote_client_config.retries": 3, - "components.sierra_compiler.url": "localhost", - "components.state_sync.execution_mode": "LocalExecutionWithRemoteDisabled", - "components.state_sync.ip": "0.0.0.0", - "components.state_sync.local_server_config.channel_buffer_size": 32, - "components.state_sync.max_concurrency": 10, - "components.state_sync.port": 0, - "components.state_sync.remote_client_config.idle_connections": 18446744073709551615, - "components.state_sync.remote_client_config.idle_timeout": 90, - "components.state_sync.remote_client_config.retries": 3, - "components.state_sync.url": "localhost", - "consensus_manager_config.broadcast_buffer_size": 10000, - "consensus_manager_config.cende_config.certificates_file_path": null, - "consensus_manager_config.cende_config.recorder_url": "http://invalid_address.com", - "consensus_manager_config.cende_config.skip_write_height": null, - "consensus_manager_config.consensus_config.future_height_limit": 10, - "consensus_manager_config.consensus_config.future_height_round_limit": 1, - "consensus_manager_config.consensus_config.future_round_limit": 10, - "consensus_manager_config.consensus_config.startup_delay": 5, - "consensus_manager_config.consensus_config.sync_retry_interval": 1.0, - "consensus_manager_config.consensus_config.timeouts.precommit_timeout": 1.0, - "consensus_manager_config.consensus_config.timeouts.prevote_timeout": 1.0, - "consensus_manager_config.consensus_config.timeouts.proposal_timeout": 3.0, - "consensus_manager_config.consensus_config.validator_id": "0x64", - "consensus_manager_config.context_config.batcher_build_buffer": 100, - "consensus_manager_config.context_config.block_timestamp_window": 1, - "consensus_manager_config.context_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "consensus_manager_config.context_config.l1_da_mode": true, - "consensus_manager_config.context_config.num_validators": 2, - "consensus_manager_config.immediate_active_height": 0, - "consensus_manager_config.network_config.advertised_multiaddr": null, - "consensus_manager_config.network_config.bootstrap_peer_multiaddr": null, - "consensus_manager_config.network_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "consensus_manager_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis": 2, - "consensus_manager_config.network_config.discovery_config.bootstrap_dial_retry_config.factor": 5, - "consensus_manager_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds": 5, - "consensus_manager_config.network_config.discovery_config.heartbeat_interval": 100, - "consensus_manager_config.network_config.idle_connection_timeout": 120, - "consensus_manager_config.network_config.peer_manager_config.malicious_timeout_seconds": 1, - "consensus_manager_config.network_config.peer_manager_config.unstable_timeout_millis": 1000, - "consensus_manager_config.network_config.secret_key": "0x1111111111111111111111111111111111111111111111111111111111111111", - "consensus_manager_config.network_config.session_timeout": 120, - "consensus_manager_config.network_config.tcp_port": 27000, - "consensus_manager_config.proposals_topic": "consensus_proposals", - "consensus_manager_config.revert_config.revert_up_to_and_including": 18446744073709551615, - "consensus_manager_config.revert_config.should_revert": false, - "consensus_manager_config.votes_topic": "consensus_votes", - "eth_fee_token_address": "0x1001", - "gateway_config.chain_info.chain_id": "MY_CUSTOM_CHAIN_ID", - "gateway_config.chain_info.fee_token_addresses.eth_fee_token_address": "0x1001", - "gateway_config.chain_info.fee_token_addresses.strk_fee_token_address": "0x1002", - "gateway_config.stateful_tx_validator_config.max_nonce_for_validation_skip": "0x1", - "gateway_config.stateful_tx_validator_config.versioned_constants_overrides.invoke_tx_max_n_steps": 10000000, - "gateway_config.stateful_tx_validator_config.versioned_constants_overrides.max_recursion_depth": 50, - "gateway_config.stateful_tx_validator_config.versioned_constants_overrides.validate_max_n_steps": 1000000, - "gateway_config.stateless_tx_validator_config.max_calldata_length": 4000, - "gateway_config.stateless_tx_validator_config.max_contract_class_object_size": 4089446, - "gateway_config.stateless_tx_validator_config.max_sierra_version.major": 1, - "gateway_config.stateless_tx_validator_config.max_sierra_version.minor": 5, - "gateway_config.stateless_tx_validator_config.max_sierra_version.patch": 18446744073709551615, - "gateway_config.stateless_tx_validator_config.max_signature_length": 4000, - "gateway_config.stateless_tx_validator_config.min_sierra_version.major": 1, - "gateway_config.stateless_tx_validator_config.min_sierra_version.minor": 1, - "gateway_config.stateless_tx_validator_config.min_sierra_version.patch": 0, - "gateway_config.stateless_tx_validator_config.validate_non_zero_l1_data_gas_fee": false, - "gateway_config.stateless_tx_validator_config.validate_non_zero_l1_gas_fee": true, - "gateway_config.stateless_tx_validator_config.validate_non_zero_l2_gas_fee": false, - "http_server_config.ip": "0.0.0.0", - "http_server_config.port": 13000, - "l1_provider_config.bootstrap_catch_up_height": 0, - "l1_provider_config.provider_startup_height": 1, - "l1_provider_config.startup_sync_sleep_retry_interval": 0.0, - "l1_scraper_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "l1_scraper_config.finality": 0, - "l1_scraper_config.polling_interval": 1, - "l1_scraper_config.startup_rewind_time": 0, - "mempool_p2p_config.network_buffer_size": 10000, - "mempool_p2p_config.network_config.advertised_multiaddr": null, - "mempool_p2p_config.network_config.bootstrap_peer_multiaddr": null, - "mempool_p2p_config.network_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis": 2, - "mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.factor": 5, - "mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds": 5, - "mempool_p2p_config.network_config.discovery_config.heartbeat_interval": 100, - "mempool_p2p_config.network_config.idle_connection_timeout": 120, - "mempool_p2p_config.network_config.peer_manager_config.malicious_timeout_seconds": 1, - "mempool_p2p_config.network_config.peer_manager_config.unstable_timeout_millis": 1000, - "mempool_p2p_config.network_config.secret_key": "", - "mempool_p2p_config.network_config.session_timeout": 120, - "mempool_p2p_config.network_config.tcp_port": 11000, - "monitoring_endpoint_config.collect_metrics": true, - "monitoring_endpoint_config.ip": "0.0.0.0", - "monitoring_endpoint_config.port": 14000, - "recorder_url": "http://invalid_address.com", - "revert_config.revert_up_to_and_including": 18446744073709551615, - "revert_config.should_revert": false, - "state_sync_config.central_sync_client_config": null, - "state_sync_config.network_config.advertised_multiaddr": null, - "state_sync_config.network_config.bootstrap_peer_multiaddr": null, - "state_sync_config.network_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "state_sync_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis": 2, - "state_sync_config.network_config.discovery_config.bootstrap_dial_retry_config.factor": 5, - "state_sync_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds": 5, - "state_sync_config.network_config.discovery_config.heartbeat_interval": 100, - "state_sync_config.network_config.idle_connection_timeout": 120, - "state_sync_config.network_config.peer_manager_config.malicious_timeout_seconds": 1, - "state_sync_config.network_config.peer_manager_config.unstable_timeout_millis": 1000, - "state_sync_config.network_config.secret_key": "0x2222222222222222222222222222222222222222222222222222222222222222", - "state_sync_config.network_config.session_timeout": 120, - "state_sync_config.network_config.tcp_port": 12000, - "state_sync_config.p2p_sync_client_config.buffer_size": 100000, - "state_sync_config.p2p_sync_client_config.num_block_classes_per_query": 100, - "state_sync_config.p2p_sync_client_config.num_block_state_diffs_per_query": 100, - "state_sync_config.p2p_sync_client_config.num_block_transactions_per_query": 100, - "state_sync_config.p2p_sync_client_config.num_headers_per_query": 10000, - "state_sync_config.p2p_sync_client_config.wait_period_for_new_data": 50, - "state_sync_config.p2p_sync_client_config.wait_period_for_other_protocol": 50, - "state_sync_config.revert_config.revert_up_to_and_including": 18446744073709551615, - "state_sync_config.revert_config.should_revert": false, - "state_sync_config.storage_config.db_config.chain_id": "MY_CUSTOM_CHAIN_ID", - "state_sync_config.storage_config.db_config.enforce_file_exists": false, - "state_sync_config.storage_config.db_config.growth_step": 4294967296, - "state_sync_config.storage_config.db_config.max_size": 1099511627776, - "state_sync_config.storage_config.db_config.min_size": 1048576, - "state_sync_config.storage_config.db_config.path_prefix": "/logs/sequencer-node-1/sync_data", - "state_sync_config.storage_config.mmap_file_config.growth_step": 1073741824, - "state_sync_config.storage_config.mmap_file_config.max_object_size": 268435456, - "state_sync_config.storage_config.mmap_file_config.max_size": 1099511627776, - "state_sync_config.storage_config.scope": "FullArchive", - "strk_fee_token_address": "0x1002", - "validator_id": "0x64", - "versioned_constants_overrides.invoke_tx_max_n_steps": 10000000, - "versioned_constants_overrides.max_recursion_depth": 50, - "versioned_constants_overrides.validate_max_n_steps": 1000000 -} \ No newline at end of file diff --git a/qa/starknet/shared/logs/README.md b/qa/starknet/shared/logs/README.md deleted file mode 100644 index ca985f268..000000000 --- a/qa/starknet/shared/logs/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Logs directory - -This directory is mounted in all containers at /logs. It can be used to persist nodes logs and other debug information. diff --git a/qa/starknet/shared/scripts/apply-tc-rules-all.sh b/qa/starknet/shared/scripts/apply-tc-rules-all.sh deleted file mode 100755 index 16a268980..000000000 --- a/qa/starknet/shared/scripts/apply-tc-rules-all.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -for container in $(docker compose ps -q); -do - docker exec "$container" /shared/scripts/apply-tc-rules.py /shared/scripts/latencies.csv -done diff --git a/qa/starknet/shared/scripts/apply-tc-rules.py b/qa/starknet/shared/scripts/apply-tc-rules.py index fd53c2440..588aca590 100755 --- a/qa/starknet/shared/scripts/apply-tc-rules.py +++ b/qa/starknet/shared/scripts/apply-tc-rules.py @@ -5,6 +5,7 @@ import os import socket + def read_matrix(csv_file): with open(csv_file) as f: reader = csv.reader(f) @@ -14,15 +15,18 @@ def read_matrix(csv_file): row_zone = row[0] matrix[row_zone] = {} for i, col_zone in enumerate(header): - matrix[row_zone][col_zone] = int(row[i+1]) + matrix[row_zone][col_zone] = int(row[i + 1]) return header, matrix + def resolve_ips(hostnames): return {host: socket.gethostbyname(host) for host in hostnames} + def execute_command(cmd): subprocess.run(cmd, shell=True, check=True) + def build_tc_commands(header, matrix, local_dns, ip_map): commands = [] commands.append("tc qdisc del dev eth0 root 2> /dev/null || true") @@ -38,12 +42,19 @@ def build_tc_commands(header, matrix, local_dns, ip_map): latency = matrix[local_dns][zone] if latency > 0: delta = latency // 20 or 1 - commands.append(f"tc class add dev eth0 parent 1:1 classid 1:{handle} htb rate 1gbit") - commands.append(f"tc qdisc add dev eth0 parent 1:{handle} handle {handle}: netem delay {latency}ms {delta}ms distribution normal") - commands.append(f"tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dst {ip_map[zone]}/32 flowid 1:{handle}") + commands.append( + f"tc class add dev eth0 parent 1:1 classid 1:{handle} htb rate 1gbit" + ) + commands.append( + f"tc qdisc add dev eth0 parent 1:{handle} handle {handle}: netem delay {latency}ms {delta}ms distribution normal" + ) + commands.append( + f"tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dst {ip_map[zone]}/32 flowid 1:{handle}" + ) handle += 1 return commands + def main(): csv_file = sys.argv[1] local_dns = os.environ["LOCAL_DNS"] @@ -53,5 +64,6 @@ def main(): for cmd in commands: execute_command(cmd) + if __name__ == "__main__": main() diff --git a/qa/starknet/shared/scripts/latencies.csv b/qa/starknet/shared/scripts/latencies.csv deleted file mode 100644 index b55ba1c87..000000000 --- a/qa/starknet/shared/scripts/latencies.csv +++ /dev/null @@ -1,5 +0,0 @@ -From/to,malachite-node-1,malachite-node-2,sequencer-node-1,sequencer-node-2 -malachite-node-1,100,100,100,100 -malachite-node-2,100,100,100,100 -sequencer-node-1,100,100,100,100 -sequencer-node-2,100,100,100,100 diff --git a/qa/starknet/templates/bashrc.j2 b/qa/starknet/templates/bashrc.j2 new file mode 100644 index 000000000..ef7bfcfab --- /dev/null +++ b/qa/starknet/templates/bashrc.j2 @@ -0,0 +1,3 @@ +alias build="cargo build --release --manifest-path /{{ node_type }}/Cargo.toml" +alias start="/shared/networks/{{ network_name }}/{{ node_type }}-node-{{ id }}/start.sh" +alias reset="/shared/networks/{{ network_name }}/{{ node_type }}-node-{{ id }}/reset.sh" diff --git a/qa/starknet/templates/docker-compose.j2 b/qa/starknet/templates/docker-compose.j2 new file mode 100644 index 000000000..88688b02f --- /dev/null +++ b/qa/starknet/templates/docker-compose.j2 @@ -0,0 +1,72 @@ +volumes: + + shared: + driver: local + driver_opts: + type: none + device: ../../../shared + o: bind +{% if malachite_count > 0 %} + malachite: + driver: local + driver_opts: + type: none + device: {{ malachite_path }}/code + o: bind{% endif %} +{% if sequencer_count > 0 %} + sequencer: + driver: local + driver_opts: + type: none + device: {{ sequencer_path }} + o: bind{% endif %} + +networks: + test-network: + driver: bridge + +services: +{% for i in range(1, malachite_count+1) %} + malachite-node-{{ i }}: + container_name: malachite-node-{{ i }} + build: + context: {{ malachite_path }}/qa/starknet + dockerfile: malachite.Dockerfile + environment: + - CARGO_HOME=/shared/build/malachite + - CARGO_TARGET_DIR=/shared/build/malachite + - LOCAL_DNS=malachite-node-{{ i }} + volumes: + - malachite:/malachite + - shared:/shared + - ../../../shared/networks/{{ network_name }}/malachite-node-{{ i }}/.bashrc:/root/.bashrc + networks: + - test-network + cap_add: + - NET_ADMIN + working_dir: / + tty: true + stdin_open: true +{% endfor %} +{% for i in range(1, sequencer_count+1) %} + sequencer-node-{{ i }}: + container_name: sequencer-node-{{ i }} + build: + context: {{ sequencer_path }} + dockerfile: {{ malachite_path }}/qa/starknet/sequencer.Dockerfile + environment: + - CARGO_HOME=/shared/build/sequencer + - CARGO_TARGET_DIR=/shared/build/sequencer + - LOCAL_DNS=sequencer-node-{{ i }} + volumes: + - sequencer:/sequencer + - shared:/shared + - ../../../shared/networks/{{ network_name }}/sequencer-node-{{ i }}/.bashrc:/root/.bashrc + networks: + - test-network + cap_add: + - NET_ADMIN + working_dir: / + tty: true + stdin_open: true +{% endfor %} diff --git a/qa/starknet/templates/malachite-cli-reset.j2 b/qa/starknet/templates/malachite-cli-reset.j2 new file mode 100644 index 000000000..a08229cd6 --- /dev/null +++ b/qa/starknet/templates/malachite-cli-reset.j2 @@ -0,0 +1,3 @@ +#!/bin/bash + +rm -rf /shared/networks/{{ network_name }}/malachite-node-{{ id }}/db /shared/networks/{{ network_name }}/malachite-node-{{ id }}/wal diff --git a/qa/starknet/templates/malachite-cli-start.j2 b/qa/starknet/templates/malachite-cli-start.j2 new file mode 100644 index 000000000..0d53956df --- /dev/null +++ b/qa/starknet/templates/malachite-cli-start.j2 @@ -0,0 +1,3 @@ +#!/bin/bash + +/shared/build/malachite/release/informalsystems-malachitebft-starknet-app start --home /shared/networks/{{ network_name }}/malachite-node-{{ id }} diff --git a/qa/starknet/shared/config/malachite-node-1/config/config.toml b/qa/starknet/templates/malachite-config.j2 similarity index 80% rename from qa/starknet/shared/config/malachite-node-1/config/config.toml rename to qa/starknet/templates/malachite-config.j2 index d50bb70d1..3d0f98db7 100644 --- a/qa/starknet/shared/config/malachite-node-1/config/config.toml +++ b/qa/starknet/templates/malachite-config.j2 @@ -7,21 +7,19 @@ log_format = "plaintext" [consensus] value_payload = "parts-only" -timeout_propose = "1100ms" -timeout_propose_delta = "0ms" -timeout_prevote = "1100ms" -timeout_prevote_delta = "0ms" -timeout_precommit = "1100ms" -timeout_precommit_delta = "0ms" +timeout_propose = "{{ proposal_timeout }}" +timeout_propose_delta = "500ms" +timeout_prevote = "{{ prevote_timeout }}" +timeout_prevote_delta = "500ms" +timeout_precommit = "{{ precommit_timeout }}" +timeout_precommit_delta = "500ms" timeout_commit = "0s" timeout_step = "300s" [consensus.p2p] listen_addr = "/ip4/0.0.0.0/tcp/27000" -persistent_peers = [ - "/dns/malachite-node-2/tcp/27000", - "/dns/sequencer-node-1/tcp/27000", - "/dns/sequencer-node-2/tcp/27000", +persistent_peers = [{% for peer in persistent_peers %} + "/dns/{{ peer }}/tcp/27000"{% if not loop.last %},{% endif %}{% endfor %} ] transport = "tcp" pubsub_max_size = "4.2 MB" diff --git a/qa/starknet/templates/sequencer-cli-reset.j2 b/qa/starknet/templates/sequencer-cli-reset.j2 new file mode 100644 index 000000000..b30f09f91 --- /dev/null +++ b/qa/starknet/templates/sequencer-cli-reset.j2 @@ -0,0 +1,3 @@ +#!/bin/bash + +rm -rf /shared/networks/{{ network_name }}/sequencer-node-{{ id }}/storage diff --git a/qa/starknet/templates/sequencer-cli-start.j2 b/qa/starknet/templates/sequencer-cli-start.j2 new file mode 100644 index 000000000..8a74b7f8f --- /dev/null +++ b/qa/starknet/templates/sequencer-cli-start.j2 @@ -0,0 +1,26 @@ +#!/bin/bash + +RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info \ + /shared/build/sequencer/release/starknet_sequencer_node \ + --chain_id MY_CUSTOM_CHAIN_ID \ + --eth_fee_token_address 0x1001 \ + --strk_fee_token_address 0x1002 \ + --recorder_url http://invalid_address.com \ + --base_layer_config.node_url http://invalid_address.com \ + --batcher_config.storage.db_config.path_prefix /shared/networks/{{ network_name }}/sequencer-node-{{ id }}/storage/batcher_data \ + --class_manager_config.class_storage_config.class_hash_storage_config.path_prefix /shared/networks/{{ network_name }}/sequencer-node-{{ id }}/storage/class_manager_data \ + --state_sync_config.storage_config.db_config.path_prefix /shared/networks/{{ network_name }}/sequencer-node-{{ id }}/storage/sync_data \ + --consensus_manager_config.network_config.tcp_port 27000 \ + --mempool_p2p_config.network_config.tcp_port 11000 \ + --state_sync_config.network_config.tcp_port 12000 \ + --http_server_config.port 13000 \ + --monitoring_endpoint_config.port 14000 \ + --consensus_manager_config.network_config.secret_key {{ consensus_secret_key }} \ + --validator_id {{ validator_id }} \ + --consensus_manager_config.context_config.num_validators {{ num_validators }} \ + --consensus_manager_config.context_config.validator_ids {{ validator_ids }} \ + {% if bootstrap_peer is defined and bootstrap_peer %}--consensus_manager_config.network_config.bootstrap_peer_multiaddr {{ bootstrap_peer }} \ + --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false{% endif %} \ + --consensus_manager_config.consensus_config.timeouts.proposal_timeout {{ proposal_timeout }} \ + --consensus_manager_config.consensus_config.timeouts.prevote_timeout {{ prevote_timeout }} \ + --consensus_manager_config.consensus_config.timeouts.precommit_timeout {{ precommit_timeout }} From 43d85adc443477a72fda552fd66ac4e9614e27e4 Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Wed, 9 Apr 2025 17:37:47 +0200 Subject: [PATCH 32/54] fix: typo --- qa/starknet/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/starknet/README.md b/qa/starknet/README.md index c2830b07d..d0a0fa3ae 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -53,7 +53,7 @@ This setup generates networks composed of any combination of Malachite and Seque 8. Reset the state: - Y ou might want to reset the state (db, wal, etc.) of the nodes. You can do this by running the following command: + You might want to reset the state (db, wal, etc.) of the nodes. You can do this by running the following command: ```bash # INSIDE THE CONTAINER reset From 74355b014ea0c3257e3aa51907922ab69879fc78 Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Thu, 10 Apr 2025 13:59:13 +0200 Subject: [PATCH 33/54] feat: global management of nodes --- qa/starknet/.gitignore | 2 +- qa/starknet/README.md | 15 +++++----- qa/starknet/generate.py | 3 ++ qa/starknet/manage.sh | 45 ++++++++++++++++++++++++++---- qa/starknet/shared/build/README.md | 2 +- qa/starknet/templates/bashrc.j2 | 4 +++ 6 files changed, 56 insertions(+), 15 deletions(-) diff --git a/qa/starknet/.gitignore b/qa/starknet/.gitignore index 72867043f..21e51b9a5 100644 --- a/qa/starknet/.gitignore +++ b/qa/starknet/.gitignore @@ -1,5 +1,5 @@ shared/* !shared/build -!shared/scripts shared/build/*/* !shared/build/*/README.md +!shared/scripts diff --git a/qa/starknet/README.md b/qa/starknet/README.md index d0a0fa3ae..de11081c6 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -34,29 +34,25 @@ This setup generates networks composed of any combination of Malachite and Seque ``` >[!NOTE] -> Spawning the network does not mean that the nodes have started yet. It only means that the containers are up and running. You need to start the nodes manually. The `manage.sh` script provides the commands to enter the containers. +> Spawning the network does not mean that the nodes have started yet. It only means that the containers are up and running. The `manage.sh` script outputs the commands to enter the containers if needed. 6. Build the nodes: If it is the first time you are running the nodes, or if you made changes to the code, you need to build the nodes. You can do this by running the following command: ```bash - # INSIDE THE CONTAINER - build + ./manage.sh build ``` - You only need to do it once per node type (malachite and sequencer). All containers from the same node type share the same build. 7. Start the nodes: ```bash - # INSIDE THE CONTAINER - start + ./manage.sh start ``` 8. Reset the state: You might want to reset the state (db, wal, etc.) of the nodes. You can do this by running the following command: ```bash - # INSIDE THE CONTAINER - reset + ./manage.sh reset ``` 9. Stop the network: @@ -64,6 +60,9 @@ This setup generates networks composed of any combination of Malachite and Seque ./manage.sh down ``` +>[!NOTE] +> The `build`, `start`, and `reset` commands are also available inside each node's container. This can be useful if you want to run a command inside a specific node. Simply enter the container (with the command provided by the `manage.sh` script) and run the command: `build`, `start`, or `reset`. + ## Advanced usage You might want to make modifications to the config files of the nodes. You can find them under the `shared/networks///` folder. The config files are mounted in the containers so that you can edit them directly from your host machine. diff --git a/qa/starknet/generate.py b/qa/starknet/generate.py index 2d81eaffd..40e02c2cd 100644 --- a/qa/starknet/generate.py +++ b/qa/starknet/generate.py @@ -290,6 +290,9 @@ def main(): writer = csv.writer(f) writer.writerows(data) + # Create logs directory + os.makedirs(f"{base_dir}/logs", exist_ok=True) + if __name__ == "__main__": main() diff --git a/qa/starknet/manage.sh b/qa/starknet/manage.sh index 508fe3228..5e3ba5b1d 100755 --- a/qa/starknet/manage.sh +++ b/qa/starknet/manage.sh @@ -3,13 +3,14 @@ set -e print_help() { - echo "Usage: $0 " + echo "Usage: $0 [duration]" echo echo "Manage Docker Compose for the given network." echo echo "Arguments:" echo " network_name Name of the network (e.g., m2-s3)" - echo " action up | down" + echo " action up | down | build | start | reset" + echo " duration Number of seconds (required only if action=start)" exit 1 } @@ -29,16 +30,50 @@ fi case "$action" in up) docker compose -f "$compose_file" up -d || exit 1 - echo "Enter the nodes container with:" for container in $(docker compose -f "$compose_file" ps --format '{{.Name}}'); do - echo -e "\tdocker exec -it $container /bin/bash" + echo "docker exec -it $container /bin/bash" done ;; down) docker compose -f "$compose_file" down ;; + build) + containers=( $(docker compose -f "$compose_file" ps --format '{{.Name}}' \ + | grep -E '^(malachite-node-1|sequencer-node-1)$') ) + for container in "${containers[@]}"; do + docker exec -it "$container" /bin/bash -lic "build" + done + ;; + start) + duration="$3" + if [[ -z "$duration" ]]; then + echo "Error: 'start' requires a duration in seconds" + exit 1 + fi + echo "Starting the nodes..." + containers=( $(docker compose -f "$compose_file" ps --format '{{.Name}}' ) ) + for container in "${containers[@]}"; do + if [[ "$container" =~ ^malachite-node- ]]; then + docker exec -it "$container" /bin/bash -lic "sleep 5 && start > /shared/networks/${network_name}/logs/${container}.log 2>&1 &" + else + docker exec -it "$container" /bin/bash -lic "start > /shared/networks/${network_name}/logs/${container}.log 2>&1 &" + fi + done + sleep 5 # The sequencer takes about 5 seconds to start + echo "Running for $duration seconds..." + sleep "$duration" + for container in "${containers[@]}"; do + docker exec -it "$container" /bin/bash -lic "pkill -f start" + done + ;; + reset) + containers=( $(docker compose -f "$compose_file" ps --format '{{.Name}}' ) ) + for container in "${containers[@]}"; do + docker exec -it "$container" /bin/bash -lic "reset" + done + ;; *) - echo "Error: Invalid action '$action'. Use 'up' or 'down'." + echo "Error: Invalid action '$action'. Use 'up', 'down', 'build', or 'start'." print_help ;; esac diff --git a/qa/starknet/shared/build/README.md b/qa/starknet/shared/build/README.md index 4906af059..520487388 100644 --- a/qa/starknet/shared/build/README.md +++ b/qa/starknet/shared/build/README.md @@ -1,3 +1,3 @@ # Build directory -This directory is mounted in all containers at /build. It is used to persist cargo builds. +This directory is mounted in all containers at /shared/build. It is used to persist cargo builds. diff --git a/qa/starknet/templates/bashrc.j2 b/qa/starknet/templates/bashrc.j2 index ef7bfcfab..305cca8d5 100644 --- a/qa/starknet/templates/bashrc.j2 +++ b/qa/starknet/templates/bashrc.j2 @@ -1,3 +1,7 @@ +export CARGO_HOME=/shared/build/{{ node_type }} +export CARGO_TARGET_DIR=/shared/build/{{ node_type }} +export PATH=/usr/local/cargo/bin:$PATH + alias build="cargo build --release --manifest-path /{{ node_type }}/Cargo.toml" alias start="/shared/networks/{{ network_name }}/{{ node_type }}-node-{{ id }}/start.sh" alias reset="/shared/networks/{{ network_name }}/{{ node_type }}-node-{{ id }}/reset.sh" From f2edcb84549d6c3878aae33da46867f62a49dca7 Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Thu, 10 Apr 2025 14:56:33 +0200 Subject: [PATCH 34/54] fix: stop pkill pattern --- qa/starknet/manage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/starknet/manage.sh b/qa/starknet/manage.sh index 5e3ba5b1d..46aa50a90 100755 --- a/qa/starknet/manage.sh +++ b/qa/starknet/manage.sh @@ -63,7 +63,7 @@ case "$action" in echo "Running for $duration seconds..." sleep "$duration" for container in "${containers[@]}"; do - docker exec -it "$container" /bin/bash -lic "pkill -f start" + docker exec -it "$container" /bin/bash -lic "pkill -f shared" done ;; reset) From 0b98d3c27abb2d838de57990147bd88e5b941102 Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Mon, 14 Apr 2025 09:42:47 +0200 Subject: [PATCH 35/54] doc: mention logs location --- qa/starknet/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/qa/starknet/README.md b/qa/starknet/README.md index de11081c6..c3ea905e1 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -47,6 +47,7 @@ This setup generates networks composed of any combination of Malachite and Seque ```bash ./manage.sh start ``` + The logs are located in the `shared/networks//logs/` folder. 8. Reset the state: From 4c25b597bc8b8f2eead4c48cb089a65cedcd6743 Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Mon, 14 Apr 2025 16:15:16 +0200 Subject: [PATCH 36/54] fix: moniker + container names --- qa/starknet/generate.py | 1 + qa/starknet/templates/docker-compose.j2 | 4 ++-- qa/starknet/templates/malachite-config.j2 | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/qa/starknet/generate.py b/qa/starknet/generate.py index 40e02c2cd..df0702b3e 100644 --- a/qa/starknet/generate.py +++ b/qa/starknet/generate.py @@ -155,6 +155,7 @@ def main(): peers.append(f"sequencer-node-{k}") rendered_config = malachite_config_template.render( + id=i, persistent_peers=peers, proposal_timeout=f"{args.proposal_timeout}ms", prevote_timeout=f"{args.prevote_timeout}ms", diff --git a/qa/starknet/templates/docker-compose.j2 b/qa/starknet/templates/docker-compose.j2 index 88688b02f..dc783a99d 100644 --- a/qa/starknet/templates/docker-compose.j2 +++ b/qa/starknet/templates/docker-compose.j2 @@ -28,7 +28,7 @@ networks: services: {% for i in range(1, malachite_count+1) %} malachite-node-{{ i }}: - container_name: malachite-node-{{ i }} + container_name: {{ network_name }}-malachite-node-{{ i }} build: context: {{ malachite_path }}/qa/starknet dockerfile: malachite.Dockerfile @@ -50,7 +50,7 @@ services: {% endfor %} {% for i in range(1, sequencer_count+1) %} sequencer-node-{{ i }}: - container_name: sequencer-node-{{ i }} + container_name: {{ network_name }}-sequencer-node-{{ i }} build: context: {{ sequencer_path }} dockerfile: {{ malachite_path }}/qa/starknet/sequencer.Dockerfile diff --git a/qa/starknet/templates/malachite-config.j2 b/qa/starknet/templates/malachite-config.j2 index 3d0f98db7..b2239bceb 100644 --- a/qa/starknet/templates/malachite-config.j2 +++ b/qa/starknet/templates/malachite-config.j2 @@ -1,4 +1,4 @@ -moniker = "node-1" +moniker = "malachite-node-{{ id }}" [logging] log_level = "debug" From 4d556172838780317575afc1324c1bb8863b5fbc Mon Sep 17 00:00:00 2001 From: Bastien Faivre Date: Tue, 15 Apr 2025 10:35:22 +0200 Subject: [PATCH 37/54] doc: explain latency file --- qa/starknet/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/starknet/README.md b/qa/starknet/README.md index c3ea905e1..7816ae6c4 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -71,7 +71,7 @@ You might want to make modifications to the config files of the nodes. You can f >[!WARNING] > Some Docker engines (e.g., Docker Desktop) sometimes have synchronization issues with mounted volumes, leading to corrupted config files in the containers. If you encounter such issues, stop the network, make your changes to the config files, and start the network again. It will ensure that the changes are applied correctly. -Moreover, for the latency, you can edit it in detail in the `shared/networks//latencies.csv` file. Then, you can apply it again by running the `./apply-latency.sh ` command. It will update the latency between the nodes without stopping the network. +Moreover, for the latency, you can edit it in detail in the `shared/networks//latencies.csv` file. Then, you can apply it again by running the `./apply-latency.sh ` command. It will update the latency between the nodes without stopping the network. The `latencies.csv` file is a _from/to_ matrix, where the first column is the source node and the first row is the destination node. The values are the latencies in milliseconds. If you plan to make more long-term changes to the configuration, feel free to edit the templates under the `templates/` directory. From 9fc49953bad6287c8b726392e19533335bc5a670 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Thu, 22 May 2025 15:55:40 +0200 Subject: [PATCH 38/54] Make sure the validator set is ordered the same way as in genesis.json --- code/crates/starknet/host/src/host.rs | 4 +-- .../crates/starknet/host/src/host/starknet.rs | 3 +- .../starknet/p2p-types/src/validator_set.rs | 31 +++++++++---------- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/code/crates/starknet/host/src/host.rs b/code/crates/starknet/host/src/host.rs index 9abc437ca..338360fe8 100644 --- a/code/crates/starknet/host/src/host.rs +++ b/code/crates/starknet/host/src/host.rs @@ -1,5 +1,3 @@ -use std::collections::BTreeSet; - use async_trait::async_trait; use tokio::sync::{mpsc, oneshot}; use tokio::time::Instant; @@ -83,7 +81,7 @@ pub trait Host { /// - address - tells the networking layer where to send messages. /// - public_key - used for signature verification and identification. /// - voting_power - used for quorum calculations. - async fn validators(&self, height: Self::Height) -> Option>; + async fn validators(&self, height: Self::Height) -> Option>; /// Sign the given message hash async fn sign(&self, message: Self::MessageHash) -> Self::Signature; diff --git a/code/crates/starknet/host/src/host/starknet.rs b/code/crates/starknet/host/src/host/starknet.rs index 1dc6fd938..ea0a4d86d 100644 --- a/code/crates/starknet/host/src/host/starknet.rs +++ b/code/crates/starknet/host/src/host/starknet.rs @@ -1,4 +1,3 @@ -use std::collections::BTreeSet; use std::time::Duration; use async_trait::async_trait; @@ -145,7 +144,7 @@ impl Host for StarknetHost { /// - address - tells the networking layer where to send messages. /// - public_key - used for signature verification and identification. /// - voting_power - used for quorum calculations. - async fn validators(&self, _height: Self::Height) -> Option> { + async fn validators(&self, _height: Self::Height) -> Option> { Some(self.validator_set.validators.iter().cloned().collect()) } diff --git a/code/crates/starknet/p2p-types/src/validator_set.rs b/code/crates/starknet/p2p-types/src/validator_set.rs index 2640e74fd..90bc886b5 100644 --- a/code/crates/starknet/p2p-types/src/validator_set.rs +++ b/code/crates/starknet/p2p-types/src/validator_set.rs @@ -13,8 +13,7 @@ pub struct ValidatorSet { impl ValidatorSet { pub fn new(validators: impl IntoIterator) -> Self { - let mut validators: Vec<_> = validators.into_iter().collect(); - ValidatorSet::sort_validators(&mut validators); + let validators: Vec<_> = validators.into_iter().collect(); assert!(!validators.is_empty()); @@ -37,20 +36,20 @@ impl ValidatorSet { self.validators.iter().find(|v| &v.public_key == public_key) } - /// In place sort and deduplication of a list of validators - fn sort_validators(vals: &mut Vec) { - // Sort the validators according to the current Tendermint requirements - use core::cmp::Reverse; - - // first by validator power descending, then by address ascending - vals.sort_unstable_by(|v1, v2| { - let a = (Reverse(v1.voting_power), &v1.address); - let b = (Reverse(v2.voting_power), &v2.address); - a.cmp(&b) - }); - - vals.dedup(); - } + // /// In place sort and deduplication of a list of validators + // fn sort_validators(vals: &mut Vec) { + // // Sort the validators according to the current Tendermint requirements + // use core::cmp::Reverse; + // + // // first by validator power descending, then by address ascending + // vals.sort_unstable_by(|v1, v2| { + // let a = (Reverse(v1.voting_power), &v1.address); + // let b = (Reverse(v2.voting_power), &v2.address); + // a.cmp(&b) + // }); + // + // vals.dedup(); + // } pub fn get_keys(&self) -> Vec { self.validators.iter().map(|v| v.public_key).collect() From 3704105cc2692e12746f1d8bb738abb6ba7e2104 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Thu, 22 May 2025 15:59:55 +0200 Subject: [PATCH 39/54] qa: Add `stop` command to `manage.sh` --- qa/starknet/manage.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/qa/starknet/manage.sh b/qa/starknet/manage.sh index 46aa50a90..97572897b 100755 --- a/qa/starknet/manage.sh +++ b/qa/starknet/manage.sh @@ -9,7 +9,7 @@ print_help() { echo echo "Arguments:" echo " network_name Name of the network (e.g., m2-s3)" - echo " action up | down | build | start | reset" + echo " action up | down | build | start | stop | reset" echo " duration Number of seconds (required only if action=start)" exit 1 } @@ -39,7 +39,7 @@ case "$action" in ;; build) containers=( $(docker compose -f "$compose_file" ps --format '{{.Name}}' \ - | grep -E '^(malachite-node-1|sequencer-node-1)$') ) + | grep -E '(malachite-node-1|sequencer-node-1)') ) for container in "${containers[@]}"; do docker exec -it "$container" /bin/bash -lic "build" done @@ -54,18 +54,21 @@ case "$action" in containers=( $(docker compose -f "$compose_file" ps --format '{{.Name}}' ) ) for container in "${containers[@]}"; do if [[ "$container" =~ ^malachite-node- ]]; then - docker exec -it "$container" /bin/bash -lic "sleep 5 && start > /shared/networks/${network_name}/logs/${container}.log 2>&1 &" + docker exec -it "$container" /bin/bash -lic "sleep 10 && start > /shared/networks/${network_name}/logs/${container}.log 2>&1 &" else docker exec -it "$container" /bin/bash -lic "start > /shared/networks/${network_name}/logs/${container}.log 2>&1 &" fi done - sleep 5 # The sequencer takes about 5 seconds to start + sleep 10 # The sequencer takes about 5 seconds to start echo "Running for $duration seconds..." sleep "$duration" for container in "${containers[@]}"; do docker exec -it "$container" /bin/bash -lic "pkill -f shared" done ;; + stop) + docker compose -f "$compose_file" stop + ;; reset) containers=( $(docker compose -f "$compose_file" ps --format '{{.Name}}' ) ) for container in "${containers[@]}"; do From 24727f5fedac42d10dce063eafa1f458f666a17e Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Mon, 26 May 2025 15:18:56 +0200 Subject: [PATCH 40/54] Smaller docker images --- qa/starknet/malachite.Dockerfile | 2 +- qa/starknet/sequencer.Dockerfile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/qa/starknet/malachite.Dockerfile b/qa/starknet/malachite.Dockerfile index 5fecdfc2f..49b09783d 100644 --- a/qa/starknet/malachite.Dockerfile +++ b/qa/starknet/malachite.Dockerfile @@ -1,4 +1,4 @@ -FROM rust:latest +FROM rust:1-slim RUN apt-get update && apt-get install -y bash bash-completion protobuf-compiler python3 iproute2 && \ echo 'set editing-mode emacs' >> /etc/inputrc && \ diff --git a/qa/starknet/sequencer.Dockerfile b/qa/starknet/sequencer.Dockerfile index a6bd716d2..fda4d009f 100644 --- a/qa/starknet/sequencer.Dockerfile +++ b/qa/starknet/sequencer.Dockerfile @@ -1,6 +1,6 @@ -FROM rust:latest +FROM rust:1-slim -RUN apt-get update && apt-get install -y bash bash-completion python3 iproute2 && \ +RUN apt-get update && apt-get install -y bash bash-completion python3 iproute2 procps && \ echo 'set editing-mode emacs' >> /etc/inputrc && \ echo '[[ $PS1 && -f /etc/bash_completion ]] && . /etc/bash_completion' >> /etc/bash.bashrc From ef633a2c4afaf918f303fafb7b726c4a1b925043 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Mon, 26 May 2025 15:19:40 +0200 Subject: [PATCH 41/54] Work around sequencer not building in Docker --- .../starknet/p2p-proto/proto/p2p/proto/transaction.proto | 3 ++- qa/starknet/sequencer | 1 + qa/starknet/sequencer.Dockerfile | 7 +++---- 3 files changed, 6 insertions(+), 5 deletions(-) create mode 120000 qa/starknet/sequencer diff --git a/code/crates/starknet/p2p-proto/proto/p2p/proto/transaction.proto b/code/crates/starknet/p2p-proto/proto/p2p/proto/transaction.proto index 1ef63c730..9dfef0552 100644 --- a/code/crates/starknet/p2p-proto/proto/p2p/proto/transaction.proto +++ b/code/crates/starknet/p2p-proto/proto/p2p/proto/transaction.proto @@ -5,7 +5,8 @@ import "p2p/proto/class.proto"; option go_package = "github.com/starknet-io/starknet-p2pspecs/p2p/proto/transaction"; message ResourceLimits { - Felt252 max_amount = 1; + // TODO(shahak, alonl): figure out if max_amount should be uint64 or Felt252 + uint64 max_amount = 1; Felt252 max_price_per_unit = 2; } diff --git a/qa/starknet/sequencer b/qa/starknet/sequencer new file mode 120000 index 000000000..21823bff7 --- /dev/null +++ b/qa/starknet/sequencer @@ -0,0 +1 @@ +../../../sequencer \ No newline at end of file diff --git a/qa/starknet/sequencer.Dockerfile b/qa/starknet/sequencer.Dockerfile index fda4d009f..e8f6db423 100644 --- a/qa/starknet/sequencer.Dockerfile +++ b/qa/starknet/sequencer.Dockerfile @@ -4,10 +4,9 @@ RUN apt-get update && apt-get install -y bash bash-completion python3 iproute2 p echo 'set editing-mode emacs' >> /etc/inputrc && \ echo '[[ $PS1 && -f /etc/bash_completion ]] && . /etc/bash_completion' >> /etc/bash.bashrc -COPY scripts/install_build_tools.sh . +# COPY scripts/install_build_tools.sh . +# COPY scripts/dependencies.sh . -COPY scripts/dependencies.sh . - -RUN ./install_build_tools.sh +# RUN ./install_build_tools.sh SHELL [ "/bin/bash", "-c" ] From 3123e4c57e635084bec95f5cea83b02da7014b84 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Mon, 26 May 2025 15:21:32 +0200 Subject: [PATCH 42/54] Use `--locked` for build command --- qa/starknet/templates/bashrc.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/starknet/templates/bashrc.j2 b/qa/starknet/templates/bashrc.j2 index 305cca8d5..561f69e65 100644 --- a/qa/starknet/templates/bashrc.j2 +++ b/qa/starknet/templates/bashrc.j2 @@ -2,6 +2,6 @@ export CARGO_HOME=/shared/build/{{ node_type }} export CARGO_TARGET_DIR=/shared/build/{{ node_type }} export PATH=/usr/local/cargo/bin:$PATH -alias build="cargo build --release --manifest-path /{{ node_type }}/Cargo.toml" +alias build="cargo build --locked --release --manifest-path /{{ node_type }}/Cargo.toml" alias start="/shared/networks/{{ network_name }}/{{ node_type }}-node-{{ id }}/start.sh" alias reset="/shared/networks/{{ network_name }}/{{ node_type }}-node-{{ id }}/reset.sh" From 8b02010f16dab3cf25a4ea2d4c4f40cf89a7ad14 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Mon, 26 May 2025 15:21:44 +0200 Subject: [PATCH 43/54] Generate `uv` project --- qa/starknet/.python-version | 1 + qa/starknet/pyproject.toml | 12 + qa/starknet/uv.lock | 510 ++++++++++++++++++++++++++++++++++++ 3 files changed, 523 insertions(+) create mode 100644 qa/starknet/.python-version create mode 100644 qa/starknet/pyproject.toml create mode 100644 qa/starknet/uv.lock diff --git a/qa/starknet/.python-version b/qa/starknet/.python-version new file mode 100644 index 000000000..24ee5b1be --- /dev/null +++ b/qa/starknet/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/qa/starknet/pyproject.toml b/qa/starknet/pyproject.toml new file mode 100644 index 000000000..893dcc999 --- /dev/null +++ b/qa/starknet/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "starknet" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.13" +dependencies = [ + "jinja2", + "eth-hash", + "pynacl", + "libp2p==0.2.4", +] diff --git a/qa/starknet/uv.lock b/qa/starknet/uv.lock new file mode 100644 index 000000000..a234ff985 --- /dev/null +++ b/qa/starknet/uv.lock @@ -0,0 +1,510 @@ +version = 1 +revision = 2 +requires-python = ">=3.13" + +[[package]] +name = "async-generator" +version = "1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/b6/6fa6b3b598a03cba5e80f829e0dadbb49d7645f523d209b2fb7ea0bbb02a/async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144", size = 29870, upload-time = "2018-08-01T03:36:21.69Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/52/39d20e03abd0ac9159c162ec24b93fbcaa111e8400308f2465432495ca2b/async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b", size = 18857, upload-time = "2018-08-01T03:36:20.029Z" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, +] + +[[package]] +name = "base58" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/45/8ae61209bb9015f516102fa559a2914178da1d5868428bd86a1b4421141d/base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c", size = 6528, upload-time = "2021-10-30T22:12:17.858Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/45/ec96b29162a402fc4c1c5512d114d7b3787b9d1c2ec241d9568b4816ee23/base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2", size = 5621, upload-time = "2021-10-30T22:12:16.658Z" }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, +] + +[[package]] +name = "coincurve" +version = "21.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/a2/f2a38eb05b747ed3e54e1be33be339d4a14c1f5cc6a6e2b342b5e8160d51/coincurve-21.0.0.tar.gz", hash = "sha256:8b37ce4265a82bebf0e796e21a769e56fdbf8420411ccbe3fafee4ed75b6a6e5", size = 128986, upload-time = "2025-03-08T15:31:24.266Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/40/cce55adaec37a588eb24b67da8eb68926546458e12ed2c4c2a21deb93d4c/coincurve-21.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9df5ceb5de603b9caf270629996710cf5ed1d43346887bc3895a11258644b65b", size = 1391762, upload-time = "2025-03-08T15:30:49.586Z" }, + { url = "https://files.pythonhosted.org/packages/ca/7a/628a30281d246ce98aea56592e0c8e79b03a93ee8b85d688db3388130c2d/coincurve-21.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:154467858d23c48f9e5ab380433bc2625027b50617400e2984cc16f5799ab601", size = 1384921, upload-time = "2025-03-08T15:30:51.103Z" }, + { url = "https://files.pythonhosted.org/packages/61/cc/719c5da31e6ba07e438abcf962f7a365eb69a06a0621ca4f2a484f344e09/coincurve-21.0.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f57f07c44d14d939bed289cdeaba4acb986bba9f729a796b6a341eab1661eedc", size = 1606559, upload-time = "2025-03-08T15:30:53.218Z" }, + { url = "https://files.pythonhosted.org/packages/b2/ee/dd14237013d732e7fc3248c0c33a1d36b88b5378dfa3e624a50a23fb6f19/coincurve-21.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fb03e3a388a93d31ed56a442bdec7983ea404490e21e12af76fb1dbf097082a", size = 1613684, upload-time = "2025-03-08T15:30:55.087Z" }, + { url = "https://files.pythonhosted.org/packages/f0/05/eaa7f36a03376ced1c19e0cb563341cc83fe48f5734b2effe8f16d0ee0ab/coincurve-21.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d09ba4fd9d26b00b06645fcd768c5ad44832a1fa847ebe8fb44970d3204c3cb7", size = 1617001, upload-time = "2025-03-08T15:30:57.036Z" }, + { url = "https://files.pythonhosted.org/packages/39/32/fc75f1dd914ac95eb2704425c7ca1a9f509f982e15d05e0ca895b9e6ea9c/coincurve-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1a1e7ee73bc1b3bcf14c7b0d1f44e6485785d3b53ef7b16173c36d3cefa57f93", size = 1643924, upload-time = "2025-03-08T15:30:58.737Z" }, + { url = "https://files.pythonhosted.org/packages/1a/4b/8c6e65b5755e26fc02077803879747615c1c327047328d1784bccb4ff4c3/coincurve-21.0.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ad05952b6edc593a874df61f1bc79db99d716ec48ba4302d699e14a419fe6f51", size = 1619964, upload-time = "2025-03-08T15:31:00.275Z" }, + { url = "https://files.pythonhosted.org/packages/64/bc/d0a743305ff9fa26e72b4c77b534d5958ec8030b3772555a7172a0c134e5/coincurve-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4d2bf350ced38b73db9efa1ff8fd16a67a1cb35abb2dda50d89661b531f03fd3", size = 1645526, upload-time = "2025-03-08T15:31:01.952Z" }, + { url = "https://files.pythonhosted.org/packages/9d/44/ab082e2dc8c9a45774f1bb9961f58b43c0882b866f5c469ead932d45a35d/coincurve-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:54d9500c56d5499375e579c3917472ffcf804c3584dd79052a79974280985c74", size = 1329285, upload-time = "2025-03-08T15:31:03.591Z" }, + { url = "https://files.pythonhosted.org/packages/f3/94/407f6fc811310f15b1fc7255f436f6a9040854213beeb10093f56b5b7fd3/coincurve-21.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:773917f075ec4b94a7a742637d303a3a082616a115c36568eb6c873a8d950d18", size = 1326027, upload-time = "2025-03-08T15:31:05.318Z" }, +] + +[[package]] +name = "cryptography" +version = "45.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/47/92a8914716f2405f33f1814b97353e3cfa223cd94a77104075d42de3099e/cryptography-45.0.2.tar.gz", hash = "sha256:d784d57b958ffd07e9e226d17272f9af0c41572557604ca7554214def32c26bf", size = 743865, upload-time = "2025-05-18T02:46:34.986Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/2f/46b9e715157643ad16f039ec3c3c47d174da6f825bf5034b1c5f692ab9e2/cryptography-45.0.2-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:61a8b1bbddd9332917485b2453d1de49f142e6334ce1d97b7916d5a85d179c84", size = 7043448, upload-time = "2025-05-18T02:45:12.495Z" }, + { url = "https://files.pythonhosted.org/packages/90/52/49e6c86278e1b5ec226e96b62322538ccc466306517bf9aad8854116a088/cryptography-45.0.2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cc31c66411e14dd70e2f384a9204a859dc25b05e1f303df0f5326691061b839", size = 4201098, upload-time = "2025-05-18T02:45:15.178Z" }, + { url = "https://files.pythonhosted.org/packages/7b/3a/201272539ac5b66b4cb1af89021e423fc0bfacb73498950280c51695fb78/cryptography-45.0.2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:463096533acd5097f8751115bc600b0b64620c4aafcac10c6d0041e6e68f88fe", size = 4429839, upload-time = "2025-05-18T02:45:17.614Z" }, + { url = "https://files.pythonhosted.org/packages/99/89/fa1a84832b8f8f3917875cb15324bba98def5a70175a889df7d21a45dc75/cryptography-45.0.2-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:cdafb86eb673c3211accffbffdb3cdffa3aaafacd14819e0898d23696d18e4d3", size = 4205154, upload-time = "2025-05-18T02:45:19.874Z" }, + { url = "https://files.pythonhosted.org/packages/1c/c5/5225d5230d538ab461725711cf5220560a813d1eb68bafcfb00131b8f631/cryptography-45.0.2-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:05c2385b1f5c89a17df19900cfb1345115a77168f5ed44bdf6fd3de1ce5cc65b", size = 3897145, upload-time = "2025-05-18T02:45:22.209Z" }, + { url = "https://files.pythonhosted.org/packages/fe/24/f19aae32526cc55ae17d473bc4588b1234af2979483d99cbfc57e55ffea6/cryptography-45.0.2-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e9e4bdcd70216b08801e267c0b563316b787f957a46e215249921f99288456f9", size = 4462192, upload-time = "2025-05-18T02:45:24.773Z" }, + { url = "https://files.pythonhosted.org/packages/19/18/4a69ac95b0b3f03355970baa6c3f9502bbfc54e7df81fdb179654a00f48e/cryptography-45.0.2-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b2de529027579e43b6dc1f805f467b102fb7d13c1e54c334f1403ee2b37d0059", size = 4208093, upload-time = "2025-05-18T02:45:27.028Z" }, + { url = "https://files.pythonhosted.org/packages/7c/54/2dea55ccc9558b8fa14f67156250b6ee231e31765601524e4757d0b5db6b/cryptography-45.0.2-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10d68763892a7b19c22508ab57799c4423c7c8cd61d7eee4c5a6a55a46511949", size = 4461819, upload-time = "2025-05-18T02:45:29.39Z" }, + { url = "https://files.pythonhosted.org/packages/37/f1/1b220fcd5ef4b1f0ff3e59e733b61597505e47f945606cc877adab2c1a17/cryptography-45.0.2-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2a90ce2f0f5b695e4785ac07c19a58244092f3c85d57db6d8eb1a2b26d2aad6", size = 4329202, upload-time = "2025-05-18T02:45:31.925Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e0/51d1dc4f96f819a56db70f0b4039b4185055bbb8616135884c3c3acc4c6d/cryptography-45.0.2-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:59c0c8f043dd376bbd9d4f636223836aed50431af4c5a467ed9bf61520294627", size = 4570412, upload-time = "2025-05-18T02:45:34.348Z" }, + { url = "https://files.pythonhosted.org/packages/dc/44/88efb40a3600d15277a77cdc69eeeab45a98532078d2a36cffd9325d3b3f/cryptography-45.0.2-cp311-abi3-win32.whl", hash = "sha256:80303ee6a02ef38c4253160446cbeb5c400c07e01d4ddbd4ff722a89b736d95a", size = 2933584, upload-time = "2025-05-18T02:45:36.198Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a1/bc9f82ba08760442cc8346d1b4e7b769b86d197193c45b42b3595d231e84/cryptography-45.0.2-cp311-abi3-win_amd64.whl", hash = "sha256:7429936146063bd1b2cfc54f0e04016b90ee9b1c908a7bed0800049cbace70eb", size = 3408537, upload-time = "2025-05-18T02:45:38.184Z" }, + { url = "https://files.pythonhosted.org/packages/59/bc/1b6acb1dca366f9c0b3880888ecd7fcfb68023930d57df854847c6da1d10/cryptography-45.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:e86c8d54cd19a13e9081898b3c24351683fd39d726ecf8e774aaa9d8d96f5f3a", size = 7025581, upload-time = "2025-05-18T02:45:40.632Z" }, + { url = "https://files.pythonhosted.org/packages/31/a3/a3e4a298d3db4a04085728f5ae6c8cda157e49c5bb784886d463b9fbff70/cryptography-45.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e328357b6bbf79928363dbf13f4635b7aac0306afb7e5ad24d21d0c5761c3253", size = 4189148, upload-time = "2025-05-18T02:45:42.538Z" }, + { url = "https://files.pythonhosted.org/packages/53/90/100dfadd4663b389cb56972541ec1103490a19ebad0132af284114ba0868/cryptography-45.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49af56491473231159c98c2c26f1a8f3799a60e5cf0e872d00745b858ddac9d2", size = 4424113, upload-time = "2025-05-18T02:45:44.316Z" }, + { url = "https://files.pythonhosted.org/packages/0d/40/e2b9177dbed6f3fcbbf1942e1acea2fd15b17007204b79d675540dd053af/cryptography-45.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f169469d04a23282de9d0be349499cb6683b6ff1b68901210faacac9b0c24b7d", size = 4189696, upload-time = "2025-05-18T02:45:46.622Z" }, + { url = "https://files.pythonhosted.org/packages/70/ae/ec29c79f481e1767c2ff916424ba36f3cf7774de93bbd60428a3c52d1357/cryptography-45.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9cfd1399064b13043082c660ddd97a0358e41c8b0dc7b77c1243e013d305c344", size = 3881498, upload-time = "2025-05-18T02:45:48.884Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4a/72937090e5637a232b2f73801c9361cd08404a2d4e620ca4ec58c7ea4b70/cryptography-45.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f8084b7ca3ce1b8d38bdfe33c48116edf9a08b4d056ef4a96dceaa36d8d965", size = 4451678, upload-time = "2025-05-18T02:45:50.706Z" }, + { url = "https://files.pythonhosted.org/packages/d3/fa/1377fced81fd67a4a27514248261bb0d45c3c1e02169411fe231583088c8/cryptography-45.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2cb03a944a1a412724d15a7c051d50e63a868031f26b6a312f2016965b661942", size = 4192296, upload-time = "2025-05-18T02:45:52.422Z" }, + { url = "https://files.pythonhosted.org/packages/d1/cf/b6fe837c83a08b9df81e63299d75fc5b3c6d82cf24b3e1e0e331050e9e5c/cryptography-45.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a9727a21957d3327cf6b7eb5ffc9e4b663909a25fea158e3fcbc49d4cdd7881b", size = 4451749, upload-time = "2025-05-18T02:45:55.025Z" }, + { url = "https://files.pythonhosted.org/packages/af/d8/5a655675cc635c7190bfc8cffb84bcdc44fc62ce945ad1d844adaa884252/cryptography-45.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ddb8d01aa900b741d6b7cc585a97aff787175f160ab975e21f880e89d810781a", size = 4317601, upload-time = "2025-05-18T02:45:56.911Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d4/75d2375a20d80aa262a8adee77bf56950e9292929e394b9fae2481803f11/cryptography-45.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:c0c000c1a09f069632d8a9eb3b610ac029fcc682f1d69b758e625d6ee713f4ed", size = 4560535, upload-time = "2025-05-18T02:45:59.33Z" }, + { url = "https://files.pythonhosted.org/packages/aa/18/c3a94474987ebcfb88692036b2ec44880d243fefa73794bdcbf748679a6e/cryptography-45.0.2-cp37-abi3-win32.whl", hash = "sha256:08281de408e7eb71ba3cd5098709a356bfdf65eebd7ee7633c3610f0aa80d79b", size = 2922045, upload-time = "2025-05-18T02:46:01.012Z" }, + { url = "https://files.pythonhosted.org/packages/63/63/fb28b30c144182fd44ce93d13ab859791adbf923e43bdfb610024bfecda1/cryptography-45.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:48caa55c528617fa6db1a9c3bf2e37ccb31b73e098ac2b71408d1f2db551dde4", size = 3393321, upload-time = "2025-05-18T02:46:03.441Z" }, +] + +[[package]] +name = "eth-hash" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/38/577b7bc9380ef9dff0f1dffefe0c9a1ded2385e7a06c306fd95afb6f9451/eth_hash-0.7.1.tar.gz", hash = "sha256:d2411a403a0b0a62e8247b4117932d900ffb4c8c64b15f92620547ca5ce46be5", size = 12227, upload-time = "2025-01-13T21:29:21.765Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/db/f8775490669d28aca24871c67dd56b3e72105cb3bcae9a4ec65dd70859b3/eth_hash-0.7.1-py3-none-any.whl", hash = "sha256:0fb1add2adf99ef28883fd6228eb447ef519ea72933535ad1a0b28c6f65f868a", size = 8028, upload-time = "2025-01-13T21:29:19.365Z" }, +] + +[[package]] +name = "fastecdsa" +version = "1.7.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/9a/dbc950929ba56731588c68f34e5a7a1f507eb51f2a59d943020ec8ba399a/fastecdsa-1.7.5.tar.gz", hash = "sha256:bd3b7808cc2bea1e8b3c4dd5928ecfc14072403ab2a47580a7a8350800e6fedd", size = 40426, upload-time = "2019-11-05T06:14:45.006Z" } + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "libp2p" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "base58" }, + { name = "coincurve" }, + { name = "fastecdsa" }, + { name = "lru-dict" }, + { name = "multiaddr" }, + { name = "mypy-protobuf" }, + { name = "noiseprotocol" }, + { name = "protobuf" }, + { name = "pycryptodome" }, + { name = "pymultihash" }, + { name = "pynacl" }, + { name = "rpcudp" }, + { name = "trio" }, + { name = "trio-typing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/a6/5d856001ee91dda7689d6ac654ae384053662572040fd704c6821940dab3/libp2p-0.2.4.tar.gz", hash = "sha256:33caea78da9908a26c2790b1f81c7b3ff17f00fc75b20a18e8af5f6951ad6b44", size = 195863, upload-time = "2025-03-27T21:54:06.263Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/c2/31711c96549827374fc0b475d77d7303bb129a8c5aff624c41a29e21dd84/libp2p-0.2.4-py3-none-any.whl", hash = "sha256:2f2ae8842dfe25a20c2c66d5493ece9a6fa8fc245d020b9a21e2a17feeacb81b", size = 130236, upload-time = "2025-03-27T21:54:05.097Z" }, +] + +[[package]] +name = "lru-dict" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/e3/42c87871920602a3c8300915bd0292f76eccc66c38f782397acbf8a62088/lru-dict-1.3.0.tar.gz", hash = "sha256:54fd1966d6bd1fcde781596cb86068214edeebff1db13a2cea11079e3fd07b6b", size = 13123, upload-time = "2023-11-06T01:40:12.951Z" } + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, +] + +[[package]] +name = "multiaddr" +version = "0.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "base58" }, + { name = "netaddr" }, + { name = "six" }, + { name = "varint" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/12/f4/fa5353022ad8e0fd364bfa8b474f9562c36ce1305fad31fe52b849e30795/multiaddr-0.0.9.tar.gz", hash = "sha256:30b2695189edc3d5b90f1c303abb8f02d963a3a4edf2e7178b975eb417ab0ecf", size = 24726, upload-time = "2019-12-23T07:06:21.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/59/df732566d951c33f00a4022fc5bf9c5d1661b1c2cdaf56e75a1a5fa8f829/multiaddr-0.0.9-py2.py3-none-any.whl", hash = "sha256:5c0f862cbcf19aada2a899f80ef896ddb2e85614e0c8f04dd287c06c69dac95b", size = 16281, upload-time = "2019-12-23T07:06:18.915Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "mypy-protobuf" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, + { name = "types-protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/6f/282d64d66bf48ce60e38a6560753f784e0f88ab245ac2fb5e93f701a36cd/mypy-protobuf-3.6.0.tar.gz", hash = "sha256:02f242eb3409f66889f2b1a3aa58356ec4d909cdd0f93115622e9e70366eca3c", size = 24445, upload-time = "2024-04-01T20:24:42.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/73/d6b999782ae22f16971cc05378b3b33f6a89ede3b9619e8366aa23484bca/mypy_protobuf-3.6.0-py3-none-any.whl", hash = "sha256:56176e4d569070e7350ea620262478b49b7efceba4103d468448f1d21492fd6c", size = 16434, upload-time = "2024-04-01T20:24:40.583Z" }, +] + +[[package]] +name = "netaddr" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/90/188b2a69654f27b221fba92fda7217778208532c962509e959a9cee5229d/netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a", size = 2260504, upload-time = "2024-05-28T21:30:37.743Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/cc/f4fe2c7ce68b92cbf5b2d379ca366e1edae38cccaad00f69f529b460c3ef/netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe", size = 2262023, upload-time = "2024-05-28T21:30:34.191Z" }, +] + +[[package]] +name = "noiseprotocol" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/17/fcf8a90dcf36fe00b475e395f34d92f42c41379c77b25a16066f63002f95/noiseprotocol-0.3.1.tar.gz", hash = "sha256:b092a871b60f6a8f07f17950dc9f7098c8fe7d715b049bd4c24ee3752b90d645", size = 16890, upload-time = "2020-11-25T19:06:48.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/e1/76e4694201d67b93a6f1644b2588b4a3d965419fe189416e3496cf415db5/noiseprotocol-0.3.1-py3-none-any.whl", hash = "sha256:2e1a603a38439636cf0ffd8b3e8b12cee27d368a28b41be7dbe568b2abb23111", size = 20546, upload-time = "2020-03-03T18:51:28.095Z" }, +] + +[[package]] +name = "outcome" +version = "1.3.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/df/77698abfac98571e65ffeb0c1fba8ffd692ab8458d617a0eed7d9a8d38f2/outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", size = 21060, upload-time = "2023-10-26T04:26:04.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b", size = 10692, upload-time = "2023-10-26T04:26:02.532Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "protobuf" +version = "6.31.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/48/718c1e104a2e89970a8ff3b06d87e152834b576c570a6908f8c17ba88d65/protobuf-6.31.0.tar.gz", hash = "sha256:314fab1a6a316469dc2dd46f993cbbe95c861ea6807da910becfe7475bc26ffe", size = 441644, upload-time = "2025-05-14T17:58:27.862Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/77/8671682038b08237c927215fa3296bc1c54e4086fe542c87017c1b626663/protobuf-6.31.0-cp310-abi3-win32.whl", hash = "sha256:10bd62802dfa0588649740a59354090eaf54b8322f772fbdcca19bc78d27f0d6", size = 423437, upload-time = "2025-05-14T17:58:16.116Z" }, + { url = "https://files.pythonhosted.org/packages/e4/07/cc9b0cbf7593f6ef8cf87fa9b0e55cd74c5cb526dd89ad84aa7d6547ef8d/protobuf-6.31.0-cp310-abi3-win_amd64.whl", hash = "sha256:3e987c99fd634be8347246a02123250f394ba20573c953de133dc8b2c107dd71", size = 435118, upload-time = "2025-05-14T17:58:18.591Z" }, + { url = "https://files.pythonhosted.org/packages/21/46/33f884aa8bc59114dc97e0d954ca4618c556483670236008c88fbb7e834f/protobuf-6.31.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2c812f0f96ceb6b514448cefeb1df54ec06dde456783f5099c0e2f8a0f2caa89", size = 425439, upload-time = "2025-05-14T17:58:19.709Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f2/9a676b50229ce37b12777d7b21de90ae7bc0f9505d07e72e2e8d47b8d165/protobuf-6.31.0-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:67ce50195e4e584275623b8e6bc6d3d3dfd93924bf6116b86b3b8975ab9e4571", size = 321950, upload-time = "2025-05-14T17:58:22.04Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a7/243fa2d3c1b7675d54744b32dacf30356f4c27c0d3ad940ca8745a1c6b2c/protobuf-6.31.0-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:5353e38844168a327acd2b2aa440044411cd8d1b6774d5701008bd1dba067c79", size = 320904, upload-time = "2025-05-14T17:58:23.438Z" }, + { url = "https://files.pythonhosted.org/packages/ee/01/1ed1d482960a5718fd99c82f6d79120181947cfd4667ec3944d448ed44a3/protobuf-6.31.0-py3-none-any.whl", hash = "sha256:6ac2e82556e822c17a8d23aa1190bbc1d06efb9c261981da95c71c9da09e9e23", size = 168558, upload-time = "2025-05-14T17:58:26.923Z" }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload-time = "2024-03-30T13:22:22.564Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" }, +] + +[[package]] +name = "pycryptodome" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/a6/8452177684d5e906854776276ddd34eca30d1b1e15aa1ee9cefc289a33f5/pycryptodome-3.23.0.tar.gz", hash = "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef", size = 4921276, upload-time = "2025-05-17T17:21:45.242Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/5d/bdb09489b63cd34a976cc9e2a8d938114f7a53a74d3dd4f125ffa49dce82/pycryptodome-3.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:0011f7f00cdb74879142011f95133274741778abba114ceca229adbf8e62c3e4", size = 2495152, upload-time = "2025-05-17T17:20:20.833Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ce/7840250ed4cc0039c433cd41715536f926d6e86ce84e904068eb3244b6a6/pycryptodome-3.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:90460fc9e088ce095f9ee8356722d4f10f86e5be06e2354230a9880b9c549aae", size = 1639348, upload-time = "2025-05-17T17:20:23.171Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/991da24c55c1f688d6a3b5a11940567353f74590734ee4a64294834ae472/pycryptodome-3.23.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4764e64b269fc83b00f682c47443c2e6e85b18273712b98aa43bcb77f8570477", size = 2184033, upload-time = "2025-05-17T17:20:25.424Z" }, + { url = "https://files.pythonhosted.org/packages/54/16/0e11882deddf00f68b68dd4e8e442ddc30641f31afeb2bc25588124ac8de/pycryptodome-3.23.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb8f24adb74984aa0e5d07a2368ad95276cf38051fe2dc6605cbcf482e04f2a7", size = 2270142, upload-time = "2025-05-17T17:20:27.808Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fc/4347fea23a3f95ffb931f383ff28b3f7b1fe868739182cb76718c0da86a1/pycryptodome-3.23.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d97618c9c6684a97ef7637ba43bdf6663a2e2e77efe0f863cce97a76af396446", size = 2309384, upload-time = "2025-05-17T17:20:30.765Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d9/c5261780b69ce66d8cfab25d2797bd6e82ba0241804694cd48be41add5eb/pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a53a4fe5cb075075d515797d6ce2f56772ea7e6a1e5e4b96cf78a14bac3d265", size = 2183237, upload-time = "2025-05-17T17:20:33.736Z" }, + { url = "https://files.pythonhosted.org/packages/5a/6f/3af2ffedd5cfa08c631f89452c6648c4d779e7772dfc388c77c920ca6bbf/pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:763d1d74f56f031788e5d307029caef067febf890cd1f8bf61183ae142f1a77b", size = 2343898, upload-time = "2025-05-17T17:20:36.086Z" }, + { url = "https://files.pythonhosted.org/packages/9a/dc/9060d807039ee5de6e2f260f72f3d70ac213993a804f5e67e0a73a56dd2f/pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:954af0e2bd7cea83ce72243b14e4fb518b18f0c1649b576d114973e2073b273d", size = 2269197, upload-time = "2025-05-17T17:20:38.414Z" }, + { url = "https://files.pythonhosted.org/packages/f9/34/e6c8ca177cb29dcc4967fef73f5de445912f93bd0343c9c33c8e5bf8cde8/pycryptodome-3.23.0-cp313-cp313t-win32.whl", hash = "sha256:257bb3572c63ad8ba40b89f6fc9d63a2a628e9f9708d31ee26560925ebe0210a", size = 1768600, upload-time = "2025-05-17T17:20:40.688Z" }, + { url = "https://files.pythonhosted.org/packages/e4/1d/89756b8d7ff623ad0160f4539da571d1f594d21ee6d68be130a6eccb39a4/pycryptodome-3.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6501790c5b62a29fcb227bd6b62012181d886a767ce9ed03b303d1f22eb5c625", size = 1799740, upload-time = "2025-05-17T17:20:42.413Z" }, + { url = "https://files.pythonhosted.org/packages/5d/61/35a64f0feaea9fd07f0d91209e7be91726eb48c0f1bfc6720647194071e4/pycryptodome-3.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9a77627a330ab23ca43b48b130e202582e91cc69619947840ea4d2d1be21eb39", size = 1703685, upload-time = "2025-05-17T17:20:44.388Z" }, + { url = "https://files.pythonhosted.org/packages/db/6c/a1f71542c969912bb0e106f64f60a56cc1f0fabecf9396f45accbe63fa68/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27", size = 2495627, upload-time = "2025-05-17T17:20:47.139Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4e/a066527e079fc5002390c8acdd3aca431e6ea0a50ffd7201551175b47323/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843", size = 1640362, upload-time = "2025-05-17T17:20:50.392Z" }, + { url = "https://files.pythonhosted.org/packages/50/52/adaf4c8c100a8c49d2bd058e5b551f73dfd8cb89eb4911e25a0c469b6b4e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490", size = 2182625, upload-time = "2025-05-17T17:20:52.866Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e9/a09476d436d0ff1402ac3867d933c61805ec2326c6ea557aeeac3825604e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575", size = 2268954, upload-time = "2025-05-17T17:20:55.027Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c5/ffe6474e0c551d54cab931918127c46d70cab8f114e0c2b5a3c071c2f484/pycryptodome-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0698f65e5b570426fc31b8162ed4603b0c2841cbb9088e2b01641e3065915b", size = 2308534, upload-time = "2025-05-17T17:20:57.279Z" }, + { url = "https://files.pythonhosted.org/packages/18/28/e199677fc15ecf43010f2463fde4c1a53015d1fe95fb03bca2890836603a/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:53ecbafc2b55353edcebd64bf5da94a2a2cdf5090a6915bcca6eca6cc452585a", size = 2181853, upload-time = "2025-05-17T17:20:59.322Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ea/4fdb09f2165ce1365c9eaefef36625583371ee514db58dc9b65d3a255c4c/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f", size = 2342465, upload-time = "2025-05-17T17:21:03.83Z" }, + { url = "https://files.pythonhosted.org/packages/22/82/6edc3fc42fe9284aead511394bac167693fb2b0e0395b28b8bedaa07ef04/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa", size = 2267414, upload-time = "2025-05-17T17:21:06.72Z" }, + { url = "https://files.pythonhosted.org/packages/59/fe/aae679b64363eb78326c7fdc9d06ec3de18bac68be4b612fc1fe8902693c/pycryptodome-3.23.0-cp37-abi3-win32.whl", hash = "sha256:507dbead45474b62b2bbe318eb1c4c8ee641077532067fec9c1aa82c31f84886", size = 1768484, upload-time = "2025-05-17T17:21:08.535Z" }, + { url = "https://files.pythonhosted.org/packages/54/2f/e97a1b8294db0daaa87012c24a7bb714147c7ade7656973fd6c736b484ff/pycryptodome-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2", size = 1799636, upload-time = "2025-05-17T17:21:10.393Z" }, + { url = "https://files.pythonhosted.org/packages/18/3d/f9441a0d798bf2b1e645adc3265e55706aead1255ccdad3856dbdcffec14/pycryptodome-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c", size = 1703675, upload-time = "2025-05-17T17:21:13.146Z" }, +] + +[[package]] +name = "pymultihash" +version = "0.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/32/64/53a5c75b11fa697d74ae5c52b38ee6c98fa3bf3bfd50e064ae11ef1a0db3/pymultihash-0.8.2.tar.gz", hash = "sha256:49c75a1ae9ecc6d22d259064d4597b3685da3f0258f4ded632e03a3a79af215b", size = 17471, upload-time = "2016-06-12T18:06:00.432Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/1c/570697fafd87adcec479b9ad34dc8371a363aa14bd9edaece5f0b8066903/pymultihash-0.8.2-py3-none-any.whl", hash = "sha256:f7fa840b24bd6acbd6b073fcd330f10e15619387297babf1dd13ca4dae6e8209", size = 13505, upload-time = "2016-06-12T18:05:55.562Z" }, +] + +[[package]] +name = "pynacl" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/22/27582568be639dfe22ddb3902225f91f2f17ceff88ce80e4db396c8986da/PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba", size = 3392854, upload-time = "2022-01-07T22:05:41.134Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1", size = 349920, upload-time = "2022-01-07T22:05:49.156Z" }, + { url = "https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92", size = 601722, upload-time = "2022-01-07T22:05:50.989Z" }, + { url = "https://files.pythonhosted.org/packages/5d/70/87a065c37cca41a75f2ce113a5a2c2aa7533be648b184ade58971b5f7ccc/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394", size = 680087, upload-time = "2022-01-07T22:05:52.539Z" }, + { url = "https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d", size = 856678, upload-time = "2022-01-07T22:05:54.251Z" }, + { url = "https://files.pythonhosted.org/packages/66/28/ca86676b69bf9f90e710571b67450508484388bfce09acf8a46f0b8c785f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858", size = 1133660, upload-time = "2022-01-07T22:05:56.056Z" }, + { url = "https://files.pythonhosted.org/packages/3d/85/c262db650e86812585e2bc59e497a8f59948a005325a11bbbc9ecd3fe26b/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b", size = 663824, upload-time = "2022-01-07T22:05:57.434Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1a/cc308a884bd299b651f1633acb978e8596c71c33ca85e9dc9fa33a5399b9/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff", size = 1117912, upload-time = "2022-01-07T22:05:58.665Z" }, + { url = "https://files.pythonhosted.org/packages/25/2d/b7df6ddb0c2a33afdb358f8af6ea3b8c4d1196ca45497dd37a56f0c122be/PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543", size = 204624, upload-time = "2022-01-07T22:06:00.085Z" }, + { url = "https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93", size = 212141, upload-time = "2022-01-07T22:06:01.861Z" }, +] + +[[package]] +name = "rpcudp" +version = "5.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "u-msgpack-python" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/5b/99ee4dd6080d857f029ad209860d461305f5fba9fef2316548a1d131e4c2/rpcudp-5.0.1.tar.gz", hash = "sha256:b6793b9b3e84e9c8510fa78e259cc3204c1b03fd2bb4fbf0f457cd391933bb78", size = 8777, upload-time = "2025-03-31T01:01:56.602Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/8b/33f35f2a730f848b5e5ac24dcb50c97387b98756e0f199ee8da30ef19fe7/rpcudp-5.0.1-py3-none-any.whl", hash = "sha256:8bf7cf1caed687acbbf2a37b67a92b02d109483a2da28fa13cca93b9ee873b9a", size = 5594, upload-time = "2025-03-31T01:01:55.296Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + +[[package]] +name = "starknet" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "eth-hash" }, + { name = "jinja2" }, + { name = "libp2p" }, + { name = "pynacl" }, +] + +[package.metadata] +requires-dist = [ + { name = "eth-hash" }, + { name = "jinja2" }, + { name = "libp2p", specifier = "==0.2.4" }, + { name = "pynacl" }, +] + +[[package]] +name = "trio" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "cffi", marker = "implementation_name != 'pypy' and os_name == 'nt'" }, + { name = "idna" }, + { name = "outcome" }, + { name = "sniffio" }, + { name = "sortedcontainers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/c1/68d582b4d3a1c1f8118e18042464bb12a7c1b75d64d75111b297687041e3/trio-0.30.0.tar.gz", hash = "sha256:0781c857c0c81f8f51e0089929a26b5bb63d57f927728a5586f7e36171f064df", size = 593776, upload-time = "2025-04-21T00:48:19.507Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/8e/3f6dfda475ecd940e786defe6df6c500734e686c9cd0a0f8ef6821e9b2f2/trio-0.30.0-py3-none-any.whl", hash = "sha256:3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5", size = 499194, upload-time = "2025-04-21T00:48:17.167Z" }, +] + +[[package]] +name = "trio-typing" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-generator" }, + { name = "importlib-metadata" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "trio" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/74/a87aafa40ec3a37089148b859892cbe2eef08d132c816d58a60459be5337/trio-typing-0.10.0.tar.gz", hash = "sha256:065ee684296d52a8ab0e2374666301aec36ee5747ac0e7a61f230250f8907ac3", size = 38747, upload-time = "2023-12-01T02:54:55.508Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/ff/9bd795273eb14fac7f6a59d16cc8c4d0948a619a1193d375437c7f50f3eb/trio_typing-0.10.0-py3-none-any.whl", hash = "sha256:6d0e7ec9d837a2fe03591031a172533fbf4a1a95baf369edebfc51d5a49f0264", size = 42224, upload-time = "2023-12-01T02:54:54.1Z" }, +] + +[[package]] +name = "types-protobuf" +version = "6.30.2.20250516" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/6c/5cf088aaa3927d1cc39910f60f220f5ff573ab1a6485b2836e8b26beb58c/types_protobuf-6.30.2.20250516.tar.gz", hash = "sha256:aecd1881770a9bb225ede66872ef7f0da4505edd0b193108edd9892e48d49a41", size = 62254, upload-time = "2025-05-16T03:06:50.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/66/06a9c161f5dd5deb4f5c016ba29106a8f1903eb9a1ba77d407dd6588fecb/types_protobuf-6.30.2.20250516-py3-none-any.whl", hash = "sha256:8c226d05b5e8b2623111765fa32d6e648bbc24832b4c2fddf0fa340ba5d5b722", size = 76480, upload-time = "2025-05-16T03:06:49.444Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, +] + +[[package]] +name = "u-msgpack-python" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/9d/a40411a475e7d4838994b7f6bcc6bfca9acc5b119ce3a7503608c4428b49/u-msgpack-python-2.8.0.tar.gz", hash = "sha256:b801a83d6ed75e6df41e44518b4f2a9c221dc2da4bcd5380e3a0feda520bc61a", size = 18167, upload-time = "2023-05-18T09:28:12.187Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/5e/512aeb40fd819f4660d00f96f5c7371ee36fc8c6b605128c5ee59e0b28c6/u_msgpack_python-2.8.0-py2.py3-none-any.whl", hash = "sha256:1d853d33e78b72c4228a2025b4db28cda81214076e5b0422ed0ae1b1b2bb586a", size = 10590, upload-time = "2023-05-18T09:28:10.323Z" }, +] + +[[package]] +name = "varint" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/fe/1ea0ba0896dfa47186692655b86db3214c4b7c9e0e76c7b1dc257d101ab1/varint-1.0.2.tar.gz", hash = "sha256:a6ecc02377ac5ee9d65a6a8ad45c9ff1dac8ccee19400a5950fb51d594214ca5", size = 1886, upload-time = "2016-02-24T20:42:38.5Z" } + +[[package]] +name = "zipp" +version = "3.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545, upload-time = "2024-11-10T15:05:20.202Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630, upload-time = "2024-11-10T15:05:19.275Z" }, +] From b7dfa9c8427858c6ac224f05ceb3273f0cc8a6a6 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Mon, 26 May 2025 15:22:13 +0200 Subject: [PATCH 44/54] Do not attempt to decode txes, store their raw bytes instead --- .../starknet/p2p-types/src/transaction.rs | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/code/crates/starknet/p2p-types/src/transaction.rs b/code/crates/starknet/p2p-types/src/transaction.rs index ac4864748..d22aa345e 100644 --- a/code/crates/starknet/p2p-types/src/transaction.rs +++ b/code/crates/starknet/p2p-types/src/transaction.rs @@ -62,25 +62,17 @@ impl proto::Protobuf for Transaction { type Proto = p2p_proto::ConsensusTransaction; fn from_proto(proto: Self::Proto) -> Result { - use malachitebft_starknet_p2p_proto::consensus_transaction::Txn; - let txn = proto .txn .ok_or_else(|| proto::Error::missing_field::("txn"))?; - let hash = proto - .transaction_hash - .ok_or_else(|| proto::Error::missing_field::("transaction_hash"))?; - - match txn { - Txn::Dummy(bytes) => Ok(Self { - data: bytes, - hash: Hash::from_proto(hash)?, - }), - _ => Err(proto::Error::invalid_data::( - "unknown transaction type", - )), - } + let mut txn_bytes = Vec::with_capacity(txn.encoded_len()); + txn.encode(&mut txn_bytes); + + Ok(Self { + data: Bytes::from(txn_bytes), + hash: Hash::new([0; 32]), + }) } fn to_proto(&self) -> Result { From 3db95092758c092017b412a69db4ff82e44afc4c Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Mon, 26 May 2025 15:36:41 +0200 Subject: [PATCH 45/54] Store raw protobuf transaction --- code/Cargo.lock | 1 + code/crates/starknet/host/src/mempool.rs | 3 +- code/crates/starknet/p2p-types/Cargo.toml | 1 + .../starknet/p2p-types/src/transaction.rs | 66 ++++++------------- .../test/mbt/src/tests/streaming/utils.rs | 6 +- 5 files changed, 26 insertions(+), 51 deletions(-) diff --git a/code/Cargo.lock b/code/Cargo.lock index c4770f107..a3e3e0ba5 100644 --- a/code/Cargo.lock +++ b/code/Cargo.lock @@ -2440,6 +2440,7 @@ dependencies = [ "informalsystems-malachitebft-proto", "informalsystems-malachitebft-signing-ed25519", "informalsystems-malachitebft-starknet-p2p-proto", + "prost", "rand 0.8.5", "serde", "sha3", diff --git a/code/crates/starknet/host/src/mempool.rs b/code/crates/starknet/host/src/mempool.rs index 798ab6747..328141404 100644 --- a/code/crates/starknet/host/src/mempool.rs +++ b/code/crates/starknet/host/src/mempool.rs @@ -7,6 +7,7 @@ use ractor::{Actor, ActorProcessingErr, ActorRef, RpcReplyPort}; use rand::RngCore; use tracing::{debug, info, trace}; +use malachitebft_starknet_p2p_proto as p2p_proto; use malachitebft_test_mempool::types::MempoolTransactionBatch; use malachitebft_test_mempool::{Event as NetworkEvent, NetworkMsg, PeerId}; @@ -268,7 +269,7 @@ fn generate_and_broadcast_txes( // Generate transaction let mut tx_bytes = vec![0; size]; rng.fill_bytes(&mut tx_bytes); - let tx = Transaction::new(tx_bytes); + let tx = Transaction::dummy(tx_bytes); if gossip_enabled { tx_batch.push(tx.clone()); diff --git a/code/crates/starknet/p2p-types/Cargo.toml b/code/crates/starknet/p2p-types/Cargo.toml index e87192c7d..b6a3253c9 100644 --- a/code/crates/starknet/p2p-types/Cargo.toml +++ b/code/crates/starknet/p2p-types/Cargo.toml @@ -18,6 +18,7 @@ starknet-crypto.workspace = true bytes.workspace = true rand.workspace = true +prost.workspace = true serde.workspace = true sha3.workspace = true diff --git a/code/crates/starknet/p2p-types/src/transaction.rs b/code/crates/starknet/p2p-types/src/transaction.rs index d22aa345e..a0e3e24c8 100644 --- a/code/crates/starknet/p2p-types/src/transaction.rs +++ b/code/crates/starknet/p2p-types/src/transaction.rs @@ -1,5 +1,3 @@ -use core::fmt; - use bytes::Bytes; use malachitebft_proto::{self as proto}; use malachitebft_starknet_p2p_proto as p2p_proto; @@ -7,38 +5,31 @@ use malachitebft_starknet_p2p_proto as p2p_proto; use crate::Hash; /// Transaction -#[derive(Clone, PartialEq, Eq, Ord, PartialOrd)] -pub struct Transaction { - data: Bytes, - hash: Hash, -} +#[derive(Clone, Debug, PartialEq)] +pub struct Transaction(Box); impl Transaction { - /// Create a new transaction from bytes - pub fn new(data: impl Into) -> Self { - let data = data.into(); - let hash = Self::compute_hash(&data); - Self { data, hash } - } - - /// Get bytes from a transaction - pub fn to_bytes(&self) -> Bytes { - self.data.clone() + /// Create a new transaction from a protobuf message + pub fn new(tx: p2p_proto::ConsensusTransaction) -> Self { + Self(Box::new(tx)) } - /// Get bytes from a transaction - pub fn as_bytes(&self) -> &[u8] { - self.data.as_ref() + /// Crate a new transaction from a bytes + pub fn dummy(bytes: impl Into) -> Self { + Self::new(p2p_proto::ConsensusTransaction { + txn: Some(p2p_proto::consensus_transaction::Txn::Dummy(bytes.into())), + transaction_hash: None, + }) } - /// Size of this transaction in bytes + /// Compute the size of this transaction in bytes pub fn size_bytes(&self) -> usize { - self.data.len() + prost::Message::encoded_len(&self.0) } - /// Hash of this transaction + /// Compute the hash of this transaction pub fn hash(&self) -> Hash { - self.hash + Self::compute_hash(&prost::Message::encode_to_vec(&self.0)) } /// Compute the hash of a transaction @@ -52,39 +43,20 @@ impl Transaction { } } -impl fmt::Debug for Transaction { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "Transaction({}, {} bytes)", self.hash, self.size_bytes()) - } -} - impl proto::Protobuf for Transaction { type Proto = p2p_proto::ConsensusTransaction; fn from_proto(proto: Self::Proto) -> Result { - let txn = proto - .txn - .ok_or_else(|| proto::Error::missing_field::("txn"))?; - - let mut txn_bytes = Vec::with_capacity(txn.encoded_len()); - txn.encode(&mut txn_bytes); - - Ok(Self { - data: Bytes::from(txn_bytes), - hash: Hash::new([0; 32]), - }) + Ok(Self(Box::new(proto))) } fn to_proto(&self) -> Result { - use malachitebft_starknet_p2p_proto::consensus_transaction::Txn; - - Ok(Self::Proto { - transaction_hash: Some(self.hash.to_proto()?), - txn: Some(Txn::Dummy(self.to_bytes())), - }) + Ok(*self.0.clone()) } } +impl Eq for Transaction {} + /// Transaction batch (used by mempool and proposal part) #[derive(Clone, Debug, Default, PartialEq, Eq)] pub struct TransactionBatch(Vec); diff --git a/code/crates/starknet/test/mbt/src/tests/streaming/utils.rs b/code/crates/starknet/test/mbt/src/tests/streaming/utils.rs index 2f6631743..4f7880956 100644 --- a/code/crates/starknet/test/mbt/src/tests/streaming/utils.rs +++ b/code/crates/starknet/test/mbt/src/tests/streaming/utils.rs @@ -92,9 +92,9 @@ pub fn generate_dummy_proposal_init() -> ProposalInit { } pub fn generate_dummy_transactions() -> TransactionBatch { - let tx1 = Transaction::new(vec![0x01, 0x02, 0x03]); - let tx2 = Transaction::new(vec![0x04, 0x05, 0x06]); - let tx3 = Transaction::new(vec![0x07, 0x08, 0x09]); + let tx1 = Transaction::dummy(vec![0x01, 0x02, 0x03]); + let tx2 = Transaction::dummy(vec![0x04, 0x05, 0x06]); + let tx3 = Transaction::dummy(vec![0x07, 0x08, 0x09]); TransactionBatch::new(vec![tx1, tx2, tx3]) } From e5353ba3b20f99c08fd48e76864c26d467ff4465 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Mon, 26 May 2025 16:00:41 +0200 Subject: [PATCH 46/54] Cleanup --- code/crates/starknet/host/src/mempool.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/code/crates/starknet/host/src/mempool.rs b/code/crates/starknet/host/src/mempool.rs index 328141404..2124a49b7 100644 --- a/code/crates/starknet/host/src/mempool.rs +++ b/code/crates/starknet/host/src/mempool.rs @@ -7,7 +7,6 @@ use ractor::{Actor, ActorProcessingErr, ActorRef, RpcReplyPort}; use rand::RngCore; use tracing::{debug, info, trace}; -use malachitebft_starknet_p2p_proto as p2p_proto; use malachitebft_test_mempool::types::MempoolTransactionBatch; use malachitebft_test_mempool::{Event as NetworkEvent, NetworkMsg, PeerId}; From 4a82b52baa0669eacb348fe6c371767ff2cc1a2e Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Mon, 26 May 2025 16:04:12 +0200 Subject: [PATCH 47/54] Less noisy logs --- code/crates/engine/src/network.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/crates/engine/src/network.rs b/code/crates/engine/src/network.rs index a053c202d..d796a6eaa 100644 --- a/code/crates/engine/src/network.rs +++ b/code/crates/engine/src/network.rs @@ -329,7 +329,7 @@ where } Msg::NewEvent(Event::Message(Channel::Consensus, from, data)) => { - tracing::debug!(%from, "Received consensus message: {data:?}"); + tracing::trace!(%from, "Received consensus message: {data:?}"); let msg = match self.codec.decode(data) { Ok(msg) => msg, @@ -350,8 +350,6 @@ where } Msg::NewEvent(Event::Message(Channel::ProposalParts, from, data)) => { - tracing::debug!(%from, "Received proposal part: {data:?}"); - let msg: StreamMessage = match self.codec.decode(data) { Ok(stream_msg) => stream_msg, Err(e) => { From b4dbfd2d0e262efdebbee2c19a5f315f5f5eefb1 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Wed, 28 May 2025 10:04:13 +0200 Subject: [PATCH 48/54] chore(code): Fix clippy warnings on Rust 1.87 (#1047) --- code/crates/engine/src/network.rs | 4 ++-- code/crates/starknet/host/src/block_store.rs | 8 +++++++- code/crates/starknet/host/src/host/state.rs | 2 ++ code/crates/starknet/test/src/lib.rs | 4 ++-- code/crates/test/app/src/store.rs | 8 +++++++- code/crates/test/tests/it/main.rs | 2 +- code/crates/wal/benches/wal.rs | 3 ++- code/crates/wal/tests/it/crashes.rs | 5 +---- code/examples/channel/src/state.rs | 2 +- code/examples/channel/src/store.rs | 8 +++++++- 10 files changed, 32 insertions(+), 14 deletions(-) diff --git a/code/crates/engine/src/network.rs b/code/crates/engine/src/network.rs index 1e4586c42..1c514114d 100644 --- a/code/crates/engine/src/network.rs +++ b/code/crates/engine/src/network.rs @@ -118,7 +118,7 @@ pub enum State { listen_addrs: Vec, peers: BTreeSet, output_port: OutputPort>, - ctrl_handle: CtrlHandle, + ctrl_handle: Box, recv_task: JoinHandle<()>, inbound_requests: HashMap, }, @@ -204,7 +204,7 @@ where listen_addrs: Vec::new(), peers: BTreeSet::new(), output_port: OutputPort::with_capacity(128), - ctrl_handle, + ctrl_handle: Box::new(ctrl_handle), recv_task, inbound_requests: HashMap::new(), }) diff --git a/code/crates/starknet/host/src/block_store.rs b/code/crates/starknet/host/src/block_store.rs index 85b066aa6..2820a2b54 100644 --- a/code/crates/starknet/host/src/block_store.rs +++ b/code/crates/starknet/host/src/block_store.rs @@ -52,7 +52,7 @@ pub enum StoreError { Commit(#[from] redb::CommitError), #[error("Transaction error: {0}")] - Transaction(#[from] redb::TransactionError), + Transaction(#[from] Box), #[error("Failed to encode/decode Protobuf: {0}")] Protobuf(#[from] ProtoError), @@ -61,6 +61,12 @@ pub enum StoreError { TaskJoin(#[from] tokio::task::JoinError), } +impl From for StoreError { + fn from(err: redb::TransactionError) -> Self { + Self::Transaction(Box::new(err)) + } +} + const CERTIFICATES_TABLE: redb::TableDefinition> = redb::TableDefinition::new("certificates"); diff --git a/code/crates/starknet/host/src/host/state.rs b/code/crates/starknet/host/src/host/state.rs index f9e991b28..5d3265b39 100644 --- a/code/crates/starknet/host/src/host/state.rs +++ b/code/crates/starknet/host/src/host/state.rs @@ -172,6 +172,8 @@ impl HostState { } } + // XXX: Starknet interop + #[allow(dead_code)] async fn verify_proposal_validity( &self, fin: &ProposalFin, diff --git a/code/crates/starknet/test/src/lib.rs b/code/crates/starknet/test/src/lib.rs index 79ca4f150..12d0c7f02 100644 --- a/code/crates/starknet/test/src/lib.rs +++ b/code/crates/starknet/test/src/lib.rs @@ -51,7 +51,7 @@ pub struct TestRunner { fn temp_dir(id: NodeId) -> PathBuf { TempDir::with_prefix(format!("malachitebft-test-app-{id}-")) .unwrap() - .into_path() + .keep() } #[async_trait] @@ -217,7 +217,7 @@ fn make_validators( let mut validators = Vec::new(); let mut private_keys = HashMap::new(); - for (_, node) in nodes.iter().enumerate() { + for node in nodes { let sk = PrivateKey::generate(&mut rng); let address = Address::from(sk.public_key()); let val = Validator::new(address, sk.public_key(), node.voting_power); diff --git a/code/crates/test/app/src/store.rs b/code/crates/test/app/src/store.rs index 3ac886391..b2559dd9c 100644 --- a/code/crates/test/app/src/store.rs +++ b/code/crates/test/app/src/store.rs @@ -50,7 +50,7 @@ pub enum StoreError { Commit(#[from] redb::CommitError), #[error("Transaction error: {0}")] - Transaction(#[from] redb::TransactionError), + Transaction(#[from] Box), #[error("Failed to encode/decode Protobuf: {0}")] Protobuf(#[from] ProtoError), @@ -59,6 +59,12 @@ pub enum StoreError { TaskJoin(#[from] tokio::task::JoinError), } +impl From for StoreError { + fn from(err: redb::TransactionError) -> Self { + Self::Transaction(Box::new(err)) + } +} + const CERTIFICATES_TABLE: redb::TableDefinition> = redb::TableDefinition::new("certificates"); diff --git a/code/crates/test/tests/it/main.rs b/code/crates/test/tests/it/main.rs index 7f68d0813..19eebfe58 100644 --- a/code/crates/test/tests/it/main.rs +++ b/code/crates/test/tests/it/main.rs @@ -55,7 +55,7 @@ pub struct TestRunner { fn temp_dir(id: NodeId) -> PathBuf { TempDir::with_prefix(format!("malachitebft-test-app-{id}")) .unwrap() - .into_path() + .keep() } #[derive(Clone)] diff --git a/code/crates/wal/benches/wal.rs b/code/crates/wal/benches/wal.rs index c7a4ce069..28111d092 100644 --- a/code/crates/wal/benches/wal.rs +++ b/code/crates/wal/benches/wal.rs @@ -1,7 +1,8 @@ use std::fs; +use std::hint::black_box; use std::path::PathBuf; -use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; use tempfile::tempdir; use informalsystems_malachitebft_wal::Log; diff --git a/code/crates/wal/tests/it/crashes.rs b/code/crates/wal/tests/it/crashes.rs index 6042052fd..810d7cf45 100644 --- a/code/crates/wal/tests/it/crashes.rs +++ b/code/crates/wal/tests/it/crashes.rs @@ -201,10 +201,7 @@ impl Storage for FailingSync { fn sync_all(&mut self) -> io::Result<()> { if self.should_fail { - return Err(io::Error::new( - io::ErrorKind::Other, - "Simulated power failure during fsync", - )); + return Err(io::Error::other("Simulated power failure during fsync")); } self.inner.sync_all() diff --git a/code/examples/channel/src/state.rs b/code/examples/channel/src/state.rs index 964a2f162..851c8ec4d 100644 --- a/code/examples/channel/src/state.rs +++ b/code/examples/channel/src/state.rs @@ -408,7 +408,7 @@ impl State { /// validators from the genesis validator set. pub fn get_validator_set(&self, height: Height) -> ValidatorSet { let num_validators = self.genesis.validator_set.len(); - let selection_size = (num_validators + 1) / 2; + let selection_size = num_validators.div_ceil(2); if num_validators <= selection_size { return self.genesis.validator_set.clone(); diff --git a/code/examples/channel/src/store.rs b/code/examples/channel/src/store.rs index 663764ff3..f44331e27 100644 --- a/code/examples/channel/src/store.rs +++ b/code/examples/channel/src/store.rs @@ -54,7 +54,7 @@ pub enum StoreError { Commit(#[from] redb::CommitError), #[error("Transaction error: {0}")] - Transaction(#[from] redb::TransactionError), + Transaction(#[from] Box), #[error("Failed to encode/decode Protobuf: {0}")] Protobuf(#[from] ProtoError), @@ -63,6 +63,12 @@ pub enum StoreError { TaskJoin(#[from] tokio::task::JoinError), } +impl From for StoreError { + fn from(err: redb::TransactionError) -> Self { + Self::Transaction(Box::new(err)) + } +} + const CERTIFICATES_TABLE: redb::TableDefinition> = redb::TableDefinition::new("certificates"); From 13a13076a022e0cbe0750d8986793014b047030f Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Wed, 28 May 2025 10:05:40 +0200 Subject: [PATCH 49/54] Adjust proposal parameters again --- code/crates/starknet/host/src/host/proposal.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/crates/starknet/host/src/host/proposal.rs b/code/crates/starknet/host/src/host/proposal.rs index 77ee63561..05cdfa1d0 100644 --- a/code/crates/starknet/host/src/host/proposal.rs +++ b/code/crates/starknet/host/src/host/proposal.rs @@ -89,10 +89,10 @@ async fn run_build_proposal_task( height, builder: proposer, timestamp: now, - l1_gas_price_wei: 0, - l1_data_gas_price_wei: 0, - l2_gas_price_fri: 0, - eth_to_strk_rate: 0, + l1_gas_price_wei: 1, + l1_data_gas_price_wei: 1, + l2_gas_price_fri: 100000, + eth_to_strk_rate: 1, l1_da_mode: L1DataAvailabilityMode::Blob, }); From 6ad93bf6a487fc6d94279616b4b51061f7fcafb6 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 27 May 2025 14:24:14 +0200 Subject: [PATCH 50/54] feat(code): Compute and show in logs the role of the node during a round: Proposer, Validator, or None (#1055) --- code/crates/app-channel/src/connector.rs | 2 ++ code/crates/app-channel/src/msgs.rs | 3 +++ code/crates/core-consensus/src/effect.rs | 4 ++-- code/crates/core-consensus/src/handle/driver.rs | 16 ++++++++++++++-- code/crates/core-consensus/src/types.rs | 11 +++++++++++ code/crates/engine/src/consensus.rs | 8 +++++--- code/crates/engine/src/host.rs | 3 ++- code/crates/engine/src/util/events.rs | 8 ++++---- code/crates/starknet/host/src/actor.rs | 9 +++++++-- code/crates/starknet/host/src/host/state.rs | 3 +++ code/crates/test/app/src/app.rs | 3 ++- code/crates/test/app/src/state.rs | 4 +++- code/crates/test/framework/src/lib.rs | 4 ++-- code/examples/channel/src/app.rs | 3 ++- 14 files changed, 62 insertions(+), 19 deletions(-) diff --git a/code/crates/app-channel/src/connector.rs b/code/crates/app-channel/src/connector.rs index f95cc83ad..2692fdb35 100644 --- a/code/crates/app-channel/src/connector.rs +++ b/code/crates/app-channel/src/connector.rs @@ -79,6 +79,7 @@ where height, round, proposer, + role, } => { let (reply_value, rx_value) = oneshot::channel(); @@ -87,6 +88,7 @@ where height, round, proposer, + role, reply_value, }) .await?; diff --git a/code/crates/app-channel/src/msgs.rs b/code/crates/app-channel/src/msgs.rs index e7d68b5f0..ed62a7b9c 100644 --- a/code/crates/app-channel/src/msgs.rs +++ b/code/crates/app-channel/src/msgs.rs @@ -2,6 +2,7 @@ use std::time::Duration; use bytes::Bytes; use derive_where::derive_where; +use malachitebft_app::consensus::Role; use malachitebft_app::types::core::ValueOrigin; use tokio::sync::mpsc; use tokio::sync::oneshot; @@ -49,6 +50,8 @@ pub enum AppMsg { round: Round, /// Proposer for that round proposer: Ctx::Address, + /// Role that this node is playing in this round + role: Role, /// Channel for sending back previously received undecided values to consensus reply_value: Reply>>, }, diff --git a/code/crates/core-consensus/src/effect.rs b/code/crates/core-consensus/src/effect.rs index b0c2425c6..79e0bc833 100644 --- a/code/crates/core-consensus/src/effect.rs +++ b/code/crates/core-consensus/src/effect.rs @@ -4,7 +4,7 @@ use malachitebft_core_types::*; use crate::input::RequestId; use crate::types::SignedConsensusMsg; -use crate::{ConsensusMsg, VoteExtensionError, WalEntry}; +use crate::{ConsensusMsg, Role, VoteExtensionError, WalEntry}; /// Provides a way to construct the appropriate [`Resume`] value to /// resume execution after handling an [`Effect`]. @@ -77,7 +77,7 @@ where /// Consensus is starting a new round with the given proposer /// /// Resume with: [`resume::Continue`] - StartRound(Ctx::Height, Round, Ctx::Address, resume::Continue), + StartRound(Ctx::Height, Round, Ctx::Address, Role, resume::Continue), /// Publish a message to peers /// diff --git a/code/crates/core-consensus/src/handle/driver.rs b/code/crates/core-consensus/src/handle/driver.rs index a9a014be8..f2938b75f 100644 --- a/code/crates/core-consensus/src/handle/driver.rs +++ b/code/crates/core-consensus/src/handle/driver.rs @@ -10,6 +10,7 @@ use crate::prelude::*; use crate::types::SignedConsensusMsg; use crate::util::pretty::PrettyVal; use crate::LocallyProposedValue; +use crate::Role; use crate::VoteSyncMode; use super::propose::on_propose; @@ -29,12 +30,23 @@ where #[cfg(feature = "metrics")] metrics.round.set(round.as_i64()); - info!(%height, %round, %proposer, "Starting new round"); + let role = if state.address() == proposer { + Role::Proposer + } else if state.is_validator() { + Role::Validator + } else { + Role::None + }; + + info!(%height, %round, %proposer, ?role, "Starting new round"); + + state.last_signed_prevote = None; + state.last_signed_precommit = None; perform!(co, Effect::CancelAllTimeouts(Default::default())); perform!( co, - Effect::StartRound(*height, *round, proposer.clone(), Default::default()) + Effect::StartRound(*height, *round, proposer.clone(), role, Default::default()) ); } diff --git a/code/crates/core-consensus/src/types.rs b/code/crates/core-consensus/src/types.rs index 56184592f..aa877af54 100644 --- a/code/crates/core-consensus/src/types.rs +++ b/code/crates/core-consensus/src/types.rs @@ -10,6 +10,17 @@ pub use malachitebft_core_types::ValuePayload; pub use malachitebft_peer::PeerId; pub use multiaddr::Multiaddr; +/// The role that the node is playing in the consensus protocol during a round. +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub enum Role { + /// The node is the proposer for the current round. + Proposer, + /// The node is a validator for the current round. + Validator, + /// The node is not participating in the consensus protocol for the current round. + None, +} + /// A signed consensus message, ie. a signed vote or a signed proposal. #[derive_where(Clone, Debug, PartialEq, Eq)] pub enum SignedConsensusMsg { diff --git a/code/crates/engine/src/consensus.rs b/code/crates/engine/src/consensus.rs index d2127ce9f..5f3acb795 100644 --- a/code/crates/engine/src/consensus.rs +++ b/code/crates/engine/src/consensus.rs @@ -947,16 +947,18 @@ where Ok(r.resume_with(())) } - Effect::StartRound(height, round, proposer, r) => { + Effect::StartRound(height, round, proposer, role, r) => { self.wal_flush(state.phase).await?; self.host.cast(HostMsg::StartedRound { height, round, - proposer, + proposer: proposer.clone(), + role, })?; - self.tx_event.send(|| Event::StartedRound(height, round)); + self.tx_event + .send(|| Event::StartedRound(height, round, proposer, role)); Ok(r.resume_with(())) } diff --git a/code/crates/engine/src/host.rs b/code/crates/engine/src/host.rs index 3290aae61..07dc92321 100644 --- a/code/crates/engine/src/host.rs +++ b/code/crates/engine/src/host.rs @@ -4,7 +4,7 @@ use std::time::Duration; use derive_where::derive_where; use ractor::{ActorRef, RpcReplyPort}; -use malachitebft_core_consensus::VoteExtensionError; +use malachitebft_core_consensus::{Role, VoteExtensionError}; use malachitebft_core_types::{CommitCertificate, Context, Round, ValueId, VoteExtensions}; use malachitebft_sync::{PeerId, RawDecidedValue}; @@ -27,6 +27,7 @@ pub enum HostMsg { height: Ctx::Height, round: Round, proposer: Ctx::Address, + role: Role, }, /// Request to build a local value to propose diff --git a/code/crates/engine/src/util/events.rs b/code/crates/engine/src/util/events.rs index 0df9e166a..fa5b43a28 100644 --- a/code/crates/engine/src/util/events.rs +++ b/code/crates/engine/src/util/events.rs @@ -6,7 +6,7 @@ use ractor::ActorProcessingErr; use tokio::sync::broadcast; use malachitebft_core_consensus::{ - LocallyProposedValue, ProposedValue, SignedConsensusMsg, WalEntry, + LocallyProposedValue, ProposedValue, Role, SignedConsensusMsg, WalEntry, }; use malachitebft_core_types::{CommitCertificate, Context, Round, SignedVote, ValueOrigin}; @@ -43,7 +43,7 @@ impl Default for TxEvent { #[derive_where(Clone, Debug)] pub enum Event { StartedHeight(Ctx::Height, bool), - StartedRound(Ctx::Height, Round), + StartedRound(Ctx::Height, Round, Ctx::Address, Role), Published(SignedConsensusMsg), ProposedValue(LocallyProposedValue), ReceivedProposedValue(ProposedValue, ValueOrigin), @@ -63,8 +63,8 @@ impl fmt::Display for Event { Event::StartedHeight(height, restart) => { write!(f, "StartedHeight(height: {height}, restart: {restart})") } - Event::StartedRound(height, round) => { - write!(f, "StartedRound(height: {height}, round: {round})") + Event::StartedRound(height, round, proposer, role) => { + write!(f, "StartedRound(height: {height}, round: {round}, proposer: {proposer}, role: {role:?})") } Event::Published(msg) => write!(f, "Published(msg: {msg:?})"), Event::ProposedValue(value) => write!(f, "ProposedValue(value: {value:?})"), diff --git a/code/crates/starknet/host/src/actor.rs b/code/crates/starknet/host/src/actor.rs index e516d54fd..c43e0cc66 100644 --- a/code/crates/starknet/host/src/actor.rs +++ b/code/crates/starknet/host/src/actor.rs @@ -10,7 +10,7 @@ use rand::SeedableRng; use tokio::time::Instant; use tracing::{debug, error, info, trace, warn}; -use malachitebft_core_consensus::{PeerId, VoteExtensionError}; +use malachitebft_core_consensus::{PeerId, Role, VoteExtensionError}; use malachitebft_core_types::{CommitCertificate, Round, Validity, ValueId, ValueOrigin}; use malachitebft_engine::consensus::{ConsensusMsg, ConsensusRef}; use malachitebft_engine::host::{LocallyProposedValue, ProposedValue}; @@ -131,7 +131,8 @@ impl Host { height, round, proposer, - } => on_started_round(state, height, round, proposer).await, + role, + } => on_started_round(state, height, round, proposer, role).await, HostMsg::GetHistoryMinHeight { reply_to } => { on_get_history_min_height(state, reply_to).await @@ -268,10 +269,14 @@ async fn on_started_round( height: Height, round: Round, proposer: Address, + role: Role, ) -> Result<(), ActorProcessingErr> { state.height = height; state.round = round; state.proposer = Some(proposer); + state.role = role; + + info!(%height, %round, %proposer, ?role, "Started new round"); // If we have already built or seen one or more values for this height and round, // feed them back to consensus. This may happen when we are restarting after a crash. diff --git a/code/crates/starknet/host/src/host/state.rs b/code/crates/starknet/host/src/host/state.rs index 5d3265b39..f3623c758 100644 --- a/code/crates/starknet/host/src/host/state.rs +++ b/code/crates/starknet/host/src/host/state.rs @@ -8,6 +8,7 @@ use rand::RngCore; use sha3::Digest; use tracing::{debug, error, trace}; +use malachitebft_core_consensus::Role; use malachitebft_core_types::{Round, Validity}; use malachitebft_engine::consensus::ConsensusRef; use malachitebft_engine::host::ProposedValue; @@ -58,6 +59,7 @@ pub struct HostState { pub height: Height, pub round: Round, pub proposer: Option
, + pub role: Role, pub host: StarknetHost, pub consensus: Option>, pub block_store: BlockStore, @@ -83,6 +85,7 @@ impl HostState { height: Height::new(0, 0), round: Round::Nil, proposer: None, + role: Role::None, host, consensus: None, block_store: BlockStore::new(db_path).await.unwrap(), diff --git a/code/crates/test/app/src/app.rs b/code/crates/test/app/src/app.rs index 026828bc9..62f148911 100644 --- a/code/crates/test/app/src/app.rs +++ b/code/crates/test/app/src/app.rs @@ -56,9 +56,10 @@ pub async fn run( height, round, proposer, + role, reply_value, } => { - info!(%height, %round, %proposer, "Started round"); + info!(%height, %round, %proposer, ?role, "Started round"); // We can use that opportunity to update our internal state state.current_height = height; diff --git a/code/crates/test/app/src/state.rs b/code/crates/test/app/src/state.rs index 0bd2a87a1..4f271e93f 100644 --- a/code/crates/test/app/src/state.rs +++ b/code/crates/test/app/src/state.rs @@ -10,7 +10,7 @@ use rand::{Rng, SeedableRng}; use sha3::Digest; use tracing::{debug, error}; -use malachitebft_app_channel::app::consensus::ProposedValue; +use malachitebft_app_channel::app::consensus::{ProposedValue, Role}; use malachitebft_app_channel::app::streaming::{StreamContent, StreamId, StreamMessage}; use malachitebft_app_channel::app::types::codec::Codec; use malachitebft_app_channel::app::types::core::{CommitCertificate, Round, Validity}; @@ -38,6 +38,7 @@ pub struct State { pub current_height: Height, pub current_round: Round, pub current_proposer: Option
, + pub current_role: Role, pub peers: HashSet, pub store: Store, @@ -67,6 +68,7 @@ impl State { current_height: height, current_round: Round::new(0), current_proposer: None, + current_role: Role::None, streams_map: PartStreamsMap::new(), rng: StdRng::from_entropy(), peers: HashSet::new(), diff --git a/code/crates/test/framework/src/lib.rs b/code/crates/test/framework/src/lib.rs index 8b62bfac5..559cd7d60 100644 --- a/code/crates/test/framework/src/lib.rs +++ b/code/crates/test/framework/src/lib.rs @@ -292,11 +292,11 @@ where return TestResult::Failure(failure); } - let Event::StartedRound(_, round) = event else { + let Event::StartedRound(_, round, _, role) = event else { continue 'inner; }; - info!("Node started round {round}"); + info!(%round, ?role, "Node started round"); if round.as_u32() == Some(target_round) { break 'inner; diff --git a/code/examples/channel/src/app.rs b/code/examples/channel/src/app.rs index da8e735a6..76b9516d9 100644 --- a/code/examples/channel/src/app.rs +++ b/code/examples/channel/src/app.rs @@ -46,9 +46,10 @@ pub async fn run(state: &mut State, channels: &mut Channels) -> eyr height, round, proposer, + role, reply_value, } => { - info!(%height, %round, %proposer, "Started round"); + info!(%height, %round, %proposer, ?role, "Started round"); reload_log_level(height, round); From 3d07135caeac1d791f13a2cc7e13d1938297d613 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Wed, 28 May 2025 15:00:48 +0200 Subject: [PATCH 51/54] Cleanup --- code/sn/0/config/config.toml | 91 ----------------------- code/sn/0/config/genesis.json | 28 ------- code/sn/0/config/priv_validator_key.json | 14 ---- code/sn/1/config/config.toml | 93 ------------------------ code/sn/1/config/genesis.json | 22 ------ code/sn/1/config/priv_validator_key.json | 11 --- 6 files changed, 259 deletions(-) delete mode 100644 code/sn/0/config/config.toml delete mode 100644 code/sn/0/config/genesis.json delete mode 100644 code/sn/0/config/priv_validator_key.json delete mode 100644 code/sn/1/config/config.toml delete mode 100644 code/sn/1/config/genesis.json delete mode 100644 code/sn/1/config/priv_validator_key.json diff --git a/code/sn/0/config/config.toml b/code/sn/0/config/config.toml deleted file mode 100644 index a16fad3ae..000000000 --- a/code/sn/0/config/config.toml +++ /dev/null @@ -1,91 +0,0 @@ -moniker = "test-0" - -[logging] -log_level = "debug" -log_format = "plaintext" - -[consensus] -timeout_propose = "3s" -timeout_propose_delta = "500ms" -timeout_prevote = "1s" -timeout_prevote_delta = "500ms" -timeout_precommit = "1s" -timeout_precommit_delta = "500ms" -timeout_commit = "0s" -timeout_step = "30s" - -[consensus.p2p] -listen_addr = "/ip4/127.0.0.1/tcp/27000" -persistent_peers = ["/ip4/127.0.0.1/tcp/27001"] -transport = "tcp" -pubsub_max_size = "4.2 MB" -rpc_max_size = "10.5 MB" - -[consensus.p2p.discovery] -enabled = false -bootstrap_protocol = "full" -selector = "random" -num_outbound_peers = 20 -num_inbound_peers = 20 -ephemeral_connection_timeout = "5s" - -[consensus.p2p.protocol] -type = "gossipsub" -mesh_n = 6 -mesh_n_high = 12 -mesh_n_low = 4 -mesh_outbound_min = 2 - -[consensus.vote_sync] -mode = "request-response" - -[mempool] -max_tx_count = 10000 -gossip_batch_size = 0 - -[mempool.p2p] -listen_addr = "/ip4/127.0.0.1/tcp/28000" -persistent_peers = ["/ip4/127.0.0.1/tcp/28001"] -transport = "tcp" -pubsub_max_size = "4.2 MB" -rpc_max_size = "10.5 MB" - -[mempool.p2p.discovery] -enabled = false -bootstrap_protocol = "full" -selector = "random" -num_outbound_peers = 20 -num_inbound_peers = 20 -ephemeral_connection_timeout = "5s" - -[mempool.p2p.protocol] -type = "gossipsub" -mesh_n = 6 -mesh_n_high = 12 -mesh_n_low = 4 -mesh_outbound_min = 2 - -[value_sync] -enabled = true -status_update_interval = "10s" -request_timeout = "10s" - -[metrics] -enabled = true -listen_addr = "127.0.0.1:29000" - -[runtime] -flavor = "single_threaded" - -[test] -max_block_size = "0 KB" -value_payload = "parts-only" -tx_size = "1.0 KB" -txs_per_part = 256 -time_allowance_factor = 0.5 -exec_time_per_tx = "1ms" -max_retain_blocks = 1000 - -[test.vote_extensions] -enabled = false -size = "0 B" diff --git a/code/sn/0/config/genesis.json b/code/sn/0/config/genesis.json deleted file mode 100644 index 7fc2d2f90..000000000 --- a/code/sn/0/config/genesis.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "validator_set": { - "validators": [ - { - "address": { - "type": "tendermint/PubKeyEd25519", - "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" - }, - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" - }, - "voting_power": 1 - }, - { - "address": { - "type": "tendermint/PubKeyEd25519", - "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" - }, - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" - }, - "voting_power": 1 - } - ] - } -} \ No newline at end of file diff --git a/code/sn/0/config/priv_validator_key.json b/code/sn/0/config/priv_validator_key.json deleted file mode 100644 index f746cd51d..000000000 --- a/code/sn/0/config/priv_validator_key.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "private_key": { - "type": "tendermint/PrivKeyEd25519", - "value": "moMNWOA0BSeCVSWk9KYukIMUYCCX8JRB67dYROWSllo=" - }, - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" - }, - "address": { - "type": "tendermint/PubKeyEd25519", - "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" - } -} \ No newline at end of file diff --git a/code/sn/1/config/config.toml b/code/sn/1/config/config.toml deleted file mode 100644 index d0556e2cb..000000000 --- a/code/sn/1/config/config.toml +++ /dev/null @@ -1,93 +0,0 @@ -moniker = "test-1" - -[logging] -log_level = "debug" -log_format = "plaintext" - -[consensus] -value_payload = "parts-only" - -timeout_propose = "10s" -timeout_propose_delta = "500ms" -timeout_prevote = "5s" -timeout_prevote_delta = "500ms" -timeout_precommit = "5s" -timeout_precommit_delta = "500ms" -timeout_commit = "0s" -timeout_step = "300s" - -[consensus.p2p] -listen_addr = "/ip4/127.0.0.1/tcp/27001" -persistent_peers = ["/ip4/127.0.0.1/tcp/27000/p2p/12D3KooWPqT2nMDSiXUSx5D7fasaxhxKigVhcqfkKqrLghCq9jxz"] -transport = "tcp" -pubsub_max_size = "4.2 MB" -rpc_max_size = "10.5 MB" - -[consensus.p2p.discovery] -enabled = false -bootstrap_protocol = "kademlia" -selector = "random" -num_outbound_peers = 1 -num_inbound_peers = 1 -ephemeral_connection_timeout = "5s" -connect_request_max_retries = 10000 - -[consensus.p2p.protocol] -type = "gossipsub" -mesh_n = 6 -mesh_n_high = 12 -mesh_n_low = 4 -mesh_outbound_min = 2 - -[consensus.vote_sync] -mode = "rebroadcast" - -[mempool] -max_tx_count = 10000 -gossip_batch_size = 0 - -[mempool.p2p] -listen_addr = "/ip4/127.0.0.1/tcp/28001" -persistent_peers = [] -transport = "tcp" -pubsub_max_size = "4.2 MB" -rpc_max_size = "10.5 MB" - -[mempool.p2p.discovery] -enabled = false -bootstrap_protocol = "full" -selector = "random" -num_outbound_peers = 20 -num_inbound_peers = 20 -ephemeral_connection_timeout = "5s" - -[mempool.p2p.protocol] -type = "gossipsub" -mesh_n = 6 -mesh_n_high = 12 -mesh_n_low = 4 -mesh_outbound_min = 2 - -[value_sync] -enabled = true -status_update_interval = "10s" -request_timeout = "10s" - -[metrics] -enabled = true -listen_addr = "127.0.0.1:29001" - -[runtime] -flavor = "single_threaded" - -[test] -max_block_size = "1048.6 KB" -tx_size = "1.0 KB" -txs_per_part = 256 -time_allowance_factor = 0.5 -exec_time_per_tx = "1ms" -max_retain_blocks = 1000 - -[test.vote_extensions] -enabled = false -size = "0 B" diff --git a/code/sn/1/config/genesis.json b/code/sn/1/config/genesis.json deleted file mode 100644 index 8cffc9e29..000000000 --- a/code/sn/1/config/genesis.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "validator_set": { - "validators": [ - { - "address": "0x0000000000000000000000000000000000000000000000000000000000000065", - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" - }, - "voting_power": 1 - }, - { - "address": "0x0000000000000000000000000000000000000000000000000000000000000064", - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "xZpDiwDi7+uP/4Goz1QChct3qvDZ+IyHr89EqZIgrk0=" - }, - "voting_power": 1 - } - ] - } -} diff --git a/code/sn/1/config/priv_validator_key.json b/code/sn/1/config/priv_validator_key.json deleted file mode 100644 index e37a988b9..000000000 --- a/code/sn/1/config/priv_validator_key.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "private_key": { - "type": "tendermint/PrivKeyEd25519", - "value": "z1exB2b1hS8Ajtr/Qf/PvjD0ES/m7RoEwzaT69t2+Ow=" - }, - "public_key": { - "type": "tendermint/PubKeyEd25519", - "value": "Hhaz5Ebr1Yx1VKNOVBnbazs5B5IyWN8P0qxkmE2oIn8=" - }, - "address": "0x0000000000000000000000000000000000000000000000000000000000000065" -} From cc5994d11c82a7b0955b01e87efd58fcbc7361f8 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Wed, 28 May 2025 15:00:57 +0200 Subject: [PATCH 52/54] Update Malachite config template --- qa/starknet/templates/malachite-config.j2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/qa/starknet/templates/malachite-config.j2 b/qa/starknet/templates/malachite-config.j2 index b2239bceb..f93250993 100644 --- a/qa/starknet/templates/malachite-config.j2 +++ b/qa/starknet/templates/malachite-config.j2 @@ -48,6 +48,9 @@ mode = "rebroadcast" max_tx_count = 10000 gossip_batch_size = 0 +[mempool.load] +load_type = "no_load" + [mempool.p2p] listen_addr = "/ip4/127.0.0.1/tcp/28000" persistent_peers = [] From d2a54566a12a810fb0df9c099a98bda81234c990 Mon Sep 17 00:00:00 2001 From: kirdatatjana Date: Fri, 12 Sep 2025 11:23:16 +0200 Subject: [PATCH 53/54] Resolve issues from anca/starknet_interop --- code/crates/engine/src/wal.rs | 5 ++++- code/crates/starknet/host/src/actor.rs | 14 +++++++------- code/crates/starknet/host/src/host/proposal.rs | 6 +++--- qa/starknet/generate.py | 9 ++++++--- qa/starknet/malachite.Dockerfile | 2 +- qa/starknet/manage.sh | 6 +++--- qa/starknet/sequencer.Dockerfile | 2 +- qa/starknet/setup/requirements.txt | 1 + qa/starknet/templates/bashrc.j2 | 6 +++--- qa/starknet/templates/docker-compose.j2 | 6 +++--- qa/starknet/templates/malachite-cli-start.j2 | 2 +- qa/starknet/templates/sequencer-cli-start.j2 | 6 +++--- 12 files changed, 36 insertions(+), 29 deletions(-) diff --git a/code/crates/engine/src/wal.rs b/code/crates/engine/src/wal.rs index a9a0e9a86..db7b244c9 100644 --- a/code/crates/engine/src/wal.rs +++ b/code/crates/engine/src/wal.rs @@ -84,7 +84,10 @@ where match msg { Msg::StartedHeight(height, reply_to) => { if state.height == height { - debug!(%height, "WAL already at height, ignoring"); + debug!(%height, "WAL already at height, returning empty entries"); + reply_to + .send(Ok(None)) + .map_err(|e| eyre!("Failed to send reply: {e}"))?; return Ok(()); } diff --git a/code/crates/starknet/host/src/actor.rs b/code/crates/starknet/host/src/actor.rs index c43e0cc66..c7ab83f33 100644 --- a/code/crates/starknet/host/src/actor.rs +++ b/code/crates/starknet/host/src/actor.rs @@ -228,14 +228,14 @@ async fn on_consensus_ready( state.start_height = start_height; - if !state.peers.is_empty() { - tokio::time::sleep(Duration::from_millis(200)).await; + + tokio::time::sleep(Duration::from_millis(200)).await; - consensus.cast(ConsensusMsg::StartHeight( - start_height, - state.host.validator_set.clone(), - ))?; - } + consensus.cast(ConsensusMsg::StartHeight( + start_height, + state.host.validator_set.clone(), + ))?; + Ok(()) } diff --git a/code/crates/starknet/host/src/host/proposal.rs b/code/crates/starknet/host/src/host/proposal.rs index 05cdfa1d0..c4582e7ae 100644 --- a/code/crates/starknet/host/src/host/proposal.rs +++ b/code/crates/starknet/host/src/host/proposal.rs @@ -202,9 +202,9 @@ async fn run_build_proposal_task( // Fin { let part = ProposalPart::Fin(ProposalFin { - // TODO: Compute the actual propoosal commitment hash, for now - // we use the transaction commitment - proposal_commitment_hash: transaction_commitment, + // TODO: Compute the actual proposal commitment hash, for now + // we use the empty block hash + proposal_commitment_hash: Hash::new([0; 32]), }); tx_part.send(part).await?; sequence += 1; diff --git a/qa/starknet/generate.py b/qa/starknet/generate.py index df0702b3e..df3b2051f 100644 --- a/qa/starknet/generate.py +++ b/qa/starknet/generate.py @@ -93,7 +93,7 @@ def main(): "--proposal_timeout", type=int, required=False, - default=500, + default=1500, help="Proposal timeout (in ms)", ) parser.add_argument( @@ -131,6 +131,7 @@ def main(): compose_template = env.get_template("templates/docker-compose.j2") rendered_compose = compose_template.render( network_name=args.name, + starknet_interop_path=os.path.dirname(os.path.abspath(__file__)), malachite_path=args.malachite_path, sequencer_path=args.sequencer_path, malachite_count=args.malachite_nodes, @@ -229,6 +230,7 @@ def main(): rendered_bashrc = bashrc_template.render( network_name=args.name, node_type="malachite", + node_bin="informalsystems-malachitebft-starknet-app", id=i, ) save_bashrc(f"{base_dir}/malachite-node-{i}/", rendered_bashrc) @@ -239,9 +241,9 @@ def main(): if args.proposal_timeout <= 1000: print( - "Warning: Proposal timeout should be > 1s for the sequencer. Setting it to 1001ms." + "Warning: Proposal timeout should be > 1s for the sequencer. Setting it to 1500ms." ) - args.proposal_timeout = 1001 + args.proposal_timeout = 1500 for i in range(1, args.sequencer_nodes + 1): rendered_cli = sequencer_cli_start_template.render( @@ -267,6 +269,7 @@ def main(): rendered_bashrc = bashrc_template.render( network_name=args.name, node_type="sequencer", + node_bin="starknet_sequencer_node", id=i, ) save_bashrc(f"{base_dir}/sequencer-node-{i}/", rendered_bashrc) diff --git a/qa/starknet/malachite.Dockerfile b/qa/starknet/malachite.Dockerfile index 49b09783d..7cf3ac7da 100644 --- a/qa/starknet/malachite.Dockerfile +++ b/qa/starknet/malachite.Dockerfile @@ -1,6 +1,6 @@ FROM rust:1-slim -RUN apt-get update && apt-get install -y bash bash-completion protobuf-compiler python3 iproute2 && \ +RUN apt-get update && apt-get install -y bash bash-completion protobuf-compiler python3 iproute2 make procps librust-tikv-jemalloc-sys-dev && \ echo 'set editing-mode emacs' >> /etc/inputrc && \ echo '[[ $PS1 && -f /etc/bash_completion ]] && . /etc/bash_completion' >> /etc/bash.bashrc diff --git a/qa/starknet/manage.sh b/qa/starknet/manage.sh index 97572897b..4a2a7ade9 100755 --- a/qa/starknet/manage.sh +++ b/qa/starknet/manage.sh @@ -53,10 +53,10 @@ case "$action" in echo "Starting the nodes..." containers=( $(docker compose -f "$compose_file" ps --format '{{.Name}}' ) ) for container in "${containers[@]}"; do - if [[ "$container" =~ ^malachite-node- ]]; then - docker exec -it "$container" /bin/bash -lic "sleep 10 && start > /shared/networks/${network_name}/logs/${container}.log 2>&1 &" + if [[ "$container" =~ malachite-node- ]]; then + docker exec -itd "$container" /bin/bash -lic "sleep 10 && start > /shared/networks/${network_name}/logs/${container}.log 2>&1" else - docker exec -it "$container" /bin/bash -lic "start > /shared/networks/${network_name}/logs/${container}.log 2>&1 &" + docker exec -itd "$container" /bin/bash -lic "start > /shared/networks/${network_name}/logs/${container}.log 2>&1" fi done sleep 10 # The sequencer takes about 5 seconds to start diff --git a/qa/starknet/sequencer.Dockerfile b/qa/starknet/sequencer.Dockerfile index e8f6db423..3b39ab774 100644 --- a/qa/starknet/sequencer.Dockerfile +++ b/qa/starknet/sequencer.Dockerfile @@ -1,6 +1,6 @@ FROM rust:1-slim -RUN apt-get update && apt-get install -y bash bash-completion python3 iproute2 procps && \ +RUN apt-get update && apt-get install -y bash bash-completion python3 iproute2 procps libssl-dev librust-tikv-jemalloc-sys-dev librust-clang-sys-dev pkg-config zstd lld && \ echo 'set editing-mode emacs' >> /etc/inputrc && \ echo '[[ $PS1 && -f /etc/bash_completion ]] && . /etc/bash_completion' >> /etc/bash.bashrc diff --git a/qa/starknet/setup/requirements.txt b/qa/starknet/setup/requirements.txt index c78ca7248..f6fa313f5 100644 --- a/qa/starknet/setup/requirements.txt +++ b/qa/starknet/setup/requirements.txt @@ -1,3 +1,4 @@ jinja2 eth-hash pynacl +libp2p diff --git a/qa/starknet/templates/bashrc.j2 b/qa/starknet/templates/bashrc.j2 index 561f69e65..abe6f7e23 100644 --- a/qa/starknet/templates/bashrc.j2 +++ b/qa/starknet/templates/bashrc.j2 @@ -1,7 +1,7 @@ -export CARGO_HOME=/shared/build/{{ node_type }} -export CARGO_TARGET_DIR=/shared/build/{{ node_type }} +# export CARGO_HOME=/shared/build/{{ node_type }} +# export CARGO_TARGET_DIR=/shared/build/{{ node_type }} export PATH=/usr/local/cargo/bin:$PATH -alias build="cargo build --locked --release --manifest-path /{{ node_type }}/Cargo.toml" +alias build="cd {{ node_type }} && cargo build --locked --bin {{ node_bin }}" alias start="/shared/networks/{{ network_name }}/{{ node_type }}-node-{{ id }}/start.sh" alias reset="/shared/networks/{{ network_name }}/{{ node_type }}-node-{{ id }}/reset.sh" diff --git a/qa/starknet/templates/docker-compose.j2 b/qa/starknet/templates/docker-compose.j2 index dc783a99d..3f1bcc145 100644 --- a/qa/starknet/templates/docker-compose.j2 +++ b/qa/starknet/templates/docker-compose.j2 @@ -30,8 +30,8 @@ services: malachite-node-{{ i }}: container_name: {{ network_name }}-malachite-node-{{ i }} build: - context: {{ malachite_path }}/qa/starknet - dockerfile: malachite.Dockerfile + context: {{ malachite_path }} + dockerfile: {{ starknet_interop_path }}/malachite.Dockerfile environment: - CARGO_HOME=/shared/build/malachite - CARGO_TARGET_DIR=/shared/build/malachite @@ -53,7 +53,7 @@ services: container_name: {{ network_name }}-sequencer-node-{{ i }} build: context: {{ sequencer_path }} - dockerfile: {{ malachite_path }}/qa/starknet/sequencer.Dockerfile + dockerfile: {{ starknet_interop_path }}/sequencer.Dockerfile environment: - CARGO_HOME=/shared/build/sequencer - CARGO_TARGET_DIR=/shared/build/sequencer diff --git a/qa/starknet/templates/malachite-cli-start.j2 b/qa/starknet/templates/malachite-cli-start.j2 index 0d53956df..cbcfab95b 100644 --- a/qa/starknet/templates/malachite-cli-start.j2 +++ b/qa/starknet/templates/malachite-cli-start.j2 @@ -1,3 +1,3 @@ #!/bin/bash -/shared/build/malachite/release/informalsystems-malachitebft-starknet-app start --home /shared/networks/{{ network_name }}/malachite-node-{{ id }} +${CARGO_TARGET_DIR}/debug/informalsystems-malachitebft-starknet-app start --home /shared/networks/{{ network_name }}/malachite-node-{{ id }} diff --git a/qa/starknet/templates/sequencer-cli-start.j2 b/qa/starknet/templates/sequencer-cli-start.j2 index 8a74b7f8f..9844b83d0 100644 --- a/qa/starknet/templates/sequencer-cli-start.j2 +++ b/qa/starknet/templates/sequencer-cli-start.j2 @@ -1,7 +1,7 @@ #!/bin/bash RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=info \ - /shared/build/sequencer/release/starknet_sequencer_node \ + ${CARGO_TARGET_DIR}/debug/starknet_sequencer_node \ --chain_id MY_CUSTOM_CHAIN_ID \ --eth_fee_token_address 0x1001 \ --strk_fee_token_address 0x1002 \ @@ -19,8 +19,8 @@ RUST_LOG=starknet_consensus=debug,starknet=info,papyrus_network=debug,papyrus=in --validator_id {{ validator_id }} \ --consensus_manager_config.context_config.num_validators {{ num_validators }} \ --consensus_manager_config.context_config.validator_ids {{ validator_ids }} \ - {% if bootstrap_peer is defined and bootstrap_peer %}--consensus_manager_config.network_config.bootstrap_peer_multiaddr {{ bootstrap_peer }} \ - --consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false{% endif %} \ + {% if bootstrap_peers is defined and bootstrap_peers %}{% for peer in bootstrap_peers %}--consensus_manager_config.network_config.bootstrap_peer_multiaddr {{ peer }} \ + {% endfor %}--consensus_manager_config.network_config.bootstrap_peer_multiaddr.#is_none false{% endif %} \ --consensus_manager_config.consensus_config.timeouts.proposal_timeout {{ proposal_timeout }} \ --consensus_manager_config.consensus_config.timeouts.prevote_timeout {{ prevote_timeout }} \ --consensus_manager_config.consensus_config.timeouts.precommit_timeout {{ precommit_timeout }} From 78f88bdf333bb1f889c04e2093935a6618b51de0 Mon Sep 17 00:00:00 2001 From: kirdatatjana Date: Fri, 12 Sep 2025 11:26:29 +0200 Subject: [PATCH 54/54] Updated README.md file --- qa/starknet/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qa/starknet/README.md b/qa/starknet/README.md index 7816ae6c4..cb72d6d5a 100644 --- a/qa/starknet/README.md +++ b/qa/starknet/README.md @@ -13,9 +13,9 @@ This setup generates networks composed of any combination of Malachite and Seque 2. Clone the Starknet sequencer fork: ```bash - git clone https://github.com/bastienfaivre/sequencer.git + git clone https://github.com/informalsystems/sequencer.git cd sequencer - git checkout shahak/for_informalsystems/mock_batcher_to_return_empty_proposals + git checkout bastien/validators-ids ``` 3. Generate a network: