From 9c1ff22b54ce4adb7300d556742508c0bd5d1040 Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Thu, 24 Aug 2023 12:13:39 +1000 Subject: [PATCH 1/5] Handle deneb signed blocks --- mev-rs/src/blinded_block_provider/api/server.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/mev-rs/src/blinded_block_provider/api/server.rs b/mev-rs/src/blinded_block_provider/api/server.rs index 9a38d02e..5eb4e081 100644 --- a/mev-rs/src/blinded_block_provider/api/server.rs +++ b/mev-rs/src/blinded_block_provider/api/server.rs @@ -2,7 +2,7 @@ use crate::{ blinded_block_provider::BlindedBlockProvider, error::Error, types::{ - bellatrix, capella, BidRequest, ExecutionPayload, SignedBlindedBeaconBlock, + bellatrix, capella, deneb, BidRequest, ExecutionPayload, SignedBlindedBeaconBlock, SignedBuilderBid, SignedValidatorRegistration, }, }; @@ -49,13 +49,14 @@ async fn handle_open_bid( State(builder): State, Json(block): Json, ) -> Result>, Error> { - let maybe_capella_block = capella::SignedBlindedBeaconBlock::deserialize(&block); - let mut block = match maybe_capella_block { - Ok(block) => SignedBlindedBeaconBlock::Capella(block), - Err(err) => match bellatrix::SignedBlindedBeaconBlock::deserialize(block) { - Ok(block) => SignedBlindedBeaconBlock::Bellatrix(block), - Err(_) => return Err(ApiClientError::from(err).into()), - }, + // TODO: Using the optional `Eth-Consensus-Version` header once clients have implemented it. + let mut block = if block["message"].is_null() { + deneb::SignedBlindedBlockAndBlobSidecars::deserialize(&block).map(SignedBlindedBeaconBlock::Deneb) + .map_err(ApiClientError::from)? + } else { + capella::SignedBlindedBeaconBlock::deserialize(&block).map(SignedBlindedBeaconBlock::Capella) + .or_else(|_| bellatrix::SignedBlindedBeaconBlock::deserialize(&block).map(SignedBlindedBeaconBlock::Bellatrix)) + .map_err(ApiClientError::from)? }; let payload = builder.open_bid(&mut block).await?; From b9c749df6a73aff4954be9ed58510f6e46f5ec36 Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Tue, 5 Sep 2023 16:00:37 +1000 Subject: [PATCH 2/5] Update BlindedBlobsBundle list max lengths to `MAX_BLOB_COMMITMENTS_PER_BLOCK` https://github.com/ethereum/builder-specs/pull/87 --- mev-rs/src/types/deneb.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mev-rs/src/types/deneb.rs b/mev-rs/src/types/deneb.rs index aae0505d..67e135ac 100644 --- a/mev-rs/src/types/deneb.rs +++ b/mev-rs/src/types/deneb.rs @@ -1,6 +1,6 @@ pub use ethereum_consensus::{builder::SignedValidatorRegistration, deneb::mainnet as spec}; use ethereum_consensus::{ - deneb::mainnet::MAX_BLOBS_PER_BLOCK, + deneb::mainnet::{MAX_BLOBS_PER_BLOCK, MAX_BLOB_COMMITMENTS_PER_BLOCK}, kzg::{KzgCommitment, KzgProof}, primitives::{BlsPublicKey, BlsSignature, Root, U256}, }; @@ -26,9 +26,9 @@ pub struct BuilderBid { #[derive(Debug, Default, Clone, SimpleSerialize)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct BlindedBlobsBundle { - pub commitments: List, - pub proofs: List, - pub blob_roots: List, + pub commitments: List, + pub proofs: List, + pub blob_roots: List, } #[derive(Debug, Default, Clone, SimpleSerialize)] @@ -48,9 +48,9 @@ pub struct SignedBlindedBlockAndBlobSidecars { #[derive(Debug, Default, Clone, SimpleSerialize)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct BlobsBundle { - pub commitments: List, - pub proofs: List, - pub blobs: List, + pub commitments: List, + pub proofs: List, + pub blobs: List, } #[derive(Debug, Default, Clone, SimpleSerialize)] From eb75005088778334f6905144882a760afaaadffb Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Tue, 5 Sep 2023 16:16:44 +1000 Subject: [PATCH 3/5] Update `ethereum-consensus` dependency --- Cargo.lock | 34 ++++++++++++++++--- Cargo.toml | 2 +- .../src/blinded_block_provider/api/server.rs | 11 ++++-- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f224ca50..61ccdfb9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -394,7 +394,7 @@ version = "0.1.0" source = "git+https://github.com/ralexstokes/beacon-api-client?rev=d838d93#d838d930f80fdfcadfe32147bcb2e805aec074bc" dependencies = [ "clap", - "ethereum-consensus", + "ethereum-consensus 0.1.1 (git+https://github.com/ralexstokes/ethereum-consensus?rev=2bcb975)", "http", "itertools", "reqwest", @@ -857,6 +857,30 @@ dependencies = [ "libc", ] +[[package]] +name = "ethereum-consensus" +version = "0.1.1" +source = "git+https://github.com/ralexstokes/ethereum-consensus?rev=2354493#2354493fd631b736c189868b7dc1b415a160f0f7" +dependencies = [ + "async-stream", + "blst", + "bs58", + "enr", + "hex", + "integer-sqrt", + "multiaddr", + "multihash", + "rand", + "serde", + "serde_json", + "serde_yaml", + "sha2 0.9.9", + "ssz_rs", + "thiserror", + "tokio", + "tokio-stream", +] + [[package]] name = "ethereum-consensus" version = "0.1.1" @@ -1558,7 +1582,7 @@ version = "0.3.0" dependencies = [ "async-trait", "beacon-api-client", - "ethereum-consensus", + "ethereum-consensus 0.1.1 (git+https://github.com/ralexstokes/ethereum-consensus?rev=2354493)", "futures", "httpmock", "mev-build-rs", @@ -1582,7 +1606,7 @@ version = "0.3.0" dependencies = [ "async-trait", "beacon-api-client", - "ethereum-consensus", + "ethereum-consensus 0.1.1 (git+https://github.com/ralexstokes/ethereum-consensus?rev=2354493)", "futures", "mev-rs", "parking_lot", @@ -1600,7 +1624,7 @@ version = "0.3.0" dependencies = [ "async-trait", "beacon-api-client", - "ethereum-consensus", + "ethereum-consensus 0.1.1 (git+https://github.com/ralexstokes/ethereum-consensus?rev=2354493)", "futures", "http", "mev-build-rs", @@ -1622,7 +1646,7 @@ dependencies = [ "async-trait", "axum", "beacon-api-client", - "ethereum-consensus", + "ethereum-consensus 0.1.1 (git+https://github.com/ralexstokes/ethereum-consensus?rev=2354493)", "hyper", "parking_lot", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index 10fa7777..fdd123c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,6 @@ members = ["bin/mev", "mev-boost-rs", "mev-relay-rs", "mev-build-rs", "mev-rs"] default-members = ["bin/mev"] [workspace.dependencies] -ethereum-consensus = { git = "https://github.com/ralexstokes/ethereum-consensus", rev = "2bcb975" } +ethereum-consensus = { git = "https://github.com/ralexstokes/ethereum-consensus", rev = "2354493" } beacon-api-client = { git = "https://github.com/ralexstokes/beacon-api-client", rev = "d838d93" } ssz_rs = "0.9.0" diff --git a/mev-rs/src/blinded_block_provider/api/server.rs b/mev-rs/src/blinded_block_provider/api/server.rs index 5eb4e081..849c145b 100644 --- a/mev-rs/src/blinded_block_provider/api/server.rs +++ b/mev-rs/src/blinded_block_provider/api/server.rs @@ -51,11 +51,16 @@ async fn handle_open_bid( ) -> Result>, Error> { // TODO: Using the optional `Eth-Consensus-Version` header once clients have implemented it. let mut block = if block["message"].is_null() { - deneb::SignedBlindedBlockAndBlobSidecars::deserialize(&block).map(SignedBlindedBeaconBlock::Deneb) + deneb::SignedBlindedBlockAndBlobSidecars::deserialize(&block) + .map(SignedBlindedBeaconBlock::Deneb) .map_err(ApiClientError::from)? } else { - capella::SignedBlindedBeaconBlock::deserialize(&block).map(SignedBlindedBeaconBlock::Capella) - .or_else(|_| bellatrix::SignedBlindedBeaconBlock::deserialize(&block).map(SignedBlindedBeaconBlock::Bellatrix)) + capella::SignedBlindedBeaconBlock::deserialize(&block) + .map(SignedBlindedBeaconBlock::Capella) + .or_else(|_| { + bellatrix::SignedBlindedBeaconBlock::deserialize(&block) + .map(SignedBlindedBeaconBlock::Bellatrix) + }) .map_err(ApiClientError::from)? }; From dedc77a796986603fb3376c5f353863d09e0dbf2 Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Tue, 5 Sep 2023 16:46:32 +1000 Subject: [PATCH 4/5] Update `ethereum-consensus` and `beacon-api-client` dependencies --- Cargo.lock | 38 +++++++------------------------------ Cargo.toml | 4 ++-- mev-boost-rs/src/service.rs | 10 ++++++++-- mev-build-rs/src/service.rs | 10 ++++++++-- mev-relay-rs/src/service.rs | 10 ++++++++-- 5 files changed, 33 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 61ccdfb9..9df94995 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,10 +391,10 @@ dependencies = [ [[package]] name = "beacon-api-client" version = "0.1.0" -source = "git+https://github.com/ralexstokes/beacon-api-client?rev=d838d93#d838d930f80fdfcadfe32147bcb2e805aec074bc" +source = "git+https://github.com/ralexstokes/beacon-api-client?rev=7f28993615fde52d563dd601a0511c34fe9b7c38#7f28993615fde52d563dd601a0511c34fe9b7c38" dependencies = [ "clap", - "ethereum-consensus 0.1.1 (git+https://github.com/ralexstokes/ethereum-consensus?rev=2bcb975)", + "ethereum-consensus", "http", "itertools", "reqwest", @@ -860,31 +860,7 @@ dependencies = [ [[package]] name = "ethereum-consensus" version = "0.1.1" -source = "git+https://github.com/ralexstokes/ethereum-consensus?rev=2354493#2354493fd631b736c189868b7dc1b415a160f0f7" -dependencies = [ - "async-stream", - "blst", - "bs58", - "enr", - "hex", - "integer-sqrt", - "multiaddr", - "multihash", - "rand", - "serde", - "serde_json", - "serde_yaml", - "sha2 0.9.9", - "ssz_rs", - "thiserror", - "tokio", - "tokio-stream", -] - -[[package]] -name = "ethereum-consensus" -version = "0.1.1" -source = "git+https://github.com/ralexstokes/ethereum-consensus?rev=2bcb975#2bcb97563bb8dcb15802d1a280b58f21577ea3e2" +source = "git+https://github.com/ralexstokes/ethereum-consensus?rev=12508c1f9b0c8f4bf4c5e9b6d441e840c1b37fd9#12508c1f9b0c8f4bf4c5e9b6d441e840c1b37fd9" dependencies = [ "async-stream", "blst", @@ -1582,7 +1558,7 @@ version = "0.3.0" dependencies = [ "async-trait", "beacon-api-client", - "ethereum-consensus 0.1.1 (git+https://github.com/ralexstokes/ethereum-consensus?rev=2354493)", + "ethereum-consensus", "futures", "httpmock", "mev-build-rs", @@ -1606,7 +1582,7 @@ version = "0.3.0" dependencies = [ "async-trait", "beacon-api-client", - "ethereum-consensus 0.1.1 (git+https://github.com/ralexstokes/ethereum-consensus?rev=2354493)", + "ethereum-consensus", "futures", "mev-rs", "parking_lot", @@ -1624,7 +1600,7 @@ version = "0.3.0" dependencies = [ "async-trait", "beacon-api-client", - "ethereum-consensus 0.1.1 (git+https://github.com/ralexstokes/ethereum-consensus?rev=2354493)", + "ethereum-consensus", "futures", "http", "mev-build-rs", @@ -1646,7 +1622,7 @@ dependencies = [ "async-trait", "axum", "beacon-api-client", - "ethereum-consensus 0.1.1 (git+https://github.com/ralexstokes/ethereum-consensus?rev=2354493)", + "ethereum-consensus", "hyper", "parking_lot", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index fdd123c7..765c27aa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,6 @@ members = ["bin/mev", "mev-boost-rs", "mev-relay-rs", "mev-build-rs", "mev-rs"] default-members = ["bin/mev"] [workspace.dependencies] -ethereum-consensus = { git = "https://github.com/ralexstokes/ethereum-consensus", rev = "2354493" } -beacon-api-client = { git = "https://github.com/ralexstokes/beacon-api-client", rev = "d838d93" } +ethereum-consensus = { git = "https://github.com/ralexstokes/ethereum-consensus", rev = "12508c1f9b0c8f4bf4c5e9b6d441e840c1b37fd9" } +beacon-api-client = { git = "https://github.com/ralexstokes/beacon-api-client", rev = "7f28993615fde52d563dd601a0511c34fe9b7c38" } ssz_rs = "0.9.0" diff --git a/mev-boost-rs/src/service.rs b/mev-boost-rs/src/service.rs index 19ed8a07..3cf9a0fd 100644 --- a/mev-boost-rs/src/service.rs +++ b/mev-boost-rs/src/service.rs @@ -2,7 +2,7 @@ use crate::{ relay::{Relay, RelayEndpoint}, relay_mux::RelayMux, }; -use ethereum_consensus::state_transition::Context; +use ethereum_consensus::{clock::from_system_time, state_transition::Context}; use futures::StreamExt; use mev_rs::{blinded_block_provider::Server as BlindedBlockProviderServer, Error, Network}; use serde::Deserialize; @@ -69,7 +69,13 @@ impl Service { let context = if let Some(context) = context { context } else { Context::try_from(&network)? }; let relays = relays.into_iter().map(Relay::from); - let clock = context.clock(None); + let clock = match context.clock() { + Some(clock) => clock, + None => { + let genesis_time = context.genesis_time()?; + from_system_time(genesis_time, context.seconds_per_slot, context.slots_per_epoch) + } + }; let relay_mux = RelayMux::new(relays, context); let relay_mux_clone = relay_mux.clone(); diff --git a/mev-build-rs/src/service.rs b/mev-build-rs/src/service.rs index 87b13181..2b922913 100644 --- a/mev-build-rs/src/service.rs +++ b/mev-build-rs/src/service.rs @@ -1,6 +1,6 @@ use crate::mempool_builder::Builder; use beacon_api_client::Client; -use ethereum_consensus::{crypto::SecretKey, state_transition::Context}; +use ethereum_consensus::{clock::from_system_time, crypto::SecretKey, state_transition::Context}; use futures::StreamExt; use mev_rs::{ blinded_block_provider::Server as BlindedBlockProviderServer, @@ -72,7 +72,13 @@ impl Service { let genesis_details = client.get_genesis_details().await?; let genesis_validators_root = genesis_details.genesis_validators_root; - let clock = context.clock(Some(genesis_details.genesis_time)); + let clock = match context.clock() { + Some(clock) => clock, + None => { + let genesis_time = context.genesis_time()?; + from_system_time(genesis_time, context.seconds_per_slot, context.slots_per_epoch) + } + }; let builder = Builder::new( secret_key, genesis_validators_root, diff --git a/mev-relay-rs/src/service.rs b/mev-relay-rs/src/service.rs index c36e4800..b6cea650 100644 --- a/mev-relay-rs/src/service.rs +++ b/mev-relay-rs/src/service.rs @@ -1,6 +1,6 @@ use crate::relay::Relay; use beacon_api_client::mainnet::Client; -use ethereum_consensus::{crypto::SecretKey, state_transition::Context}; +use ethereum_consensus::{clock::from_system_time, crypto::SecretKey, state_transition::Context}; use futures::StreamExt; use mev_rs::{blinded_block_provider::Server as BlindedBlockProviderServer, Error, Network}; use serde::Deserialize; @@ -58,7 +58,13 @@ impl Service { let context = if let Some(context) = context { context } else { Context::try_from(&network)? }; - let clock = context.clock(None); + let clock = match context.clock() { + Some(clock) => clock, + None => { + let genesis_time = context.genesis_time()?; + from_system_time(genesis_time, context.seconds_per_slot, context.slots_per_epoch) + } + }; let context = Arc::new(context); let genesis_details = beacon_node.get_genesis_details().await?; let genesis_validators_root = genesis_details.genesis_validators_root; From ac8b5808514060c38a6d169a87b3db87acd737c4 Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Tue, 12 Sep 2023 15:21:49 +1000 Subject: [PATCH 5/5] Revert blinded block deserialization to the existing strategy. --- .../src/blinded_block_provider/api/server.rs | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/mev-rs/src/blinded_block_provider/api/server.rs b/mev-rs/src/blinded_block_provider/api/server.rs index 849c145b..98505f76 100644 --- a/mev-rs/src/blinded_block_provider/api/server.rs +++ b/mev-rs/src/blinded_block_provider/api/server.rs @@ -49,20 +49,17 @@ async fn handle_open_bid( State(builder): State, Json(block): Json, ) -> Result>, Error> { - // TODO: Using the optional `Eth-Consensus-Version` header once clients have implemented it. - let mut block = if block["message"].is_null() { - deneb::SignedBlindedBlockAndBlobSidecars::deserialize(&block) - .map(SignedBlindedBeaconBlock::Deneb) - .map_err(ApiClientError::from)? - } else { - capella::SignedBlindedBeaconBlock::deserialize(&block) - .map(SignedBlindedBeaconBlock::Capella) - .or_else(|_| { - bellatrix::SignedBlindedBeaconBlock::deserialize(&block) - .map(SignedBlindedBeaconBlock::Bellatrix) - }) - .map_err(ApiClientError::from)? - }; + let mut block = deneb::SignedBlindedBlockAndBlobSidecars::deserialize(&block) + .map(SignedBlindedBeaconBlock::Deneb) + .or_else(|_| { + capella::SignedBlindedBeaconBlock::deserialize(&block) + .map(SignedBlindedBeaconBlock::Capella) + }) + .or_else(|_| { + bellatrix::SignedBlindedBeaconBlock::deserialize(&block) + .map(SignedBlindedBeaconBlock::Bellatrix) + }) + .map_err(ApiClientError::from)?; let payload = builder.open_bid(&mut block).await?; let block_hash = payload.block_hash();