Block processing eip4844 (#3673)

* add eip4844 block processing

* fix blob processing code

* consensus logic fixes and cleanup

* use safe arith
This commit is contained in:
realbigsean
2022-11-01 13:15:11 -04:00
committed by GitHub
parent 29f2ec46d3
commit 5ad834280b
9 changed files with 200 additions and 2 deletions

View File

@@ -34,4 +34,5 @@ pub mod eip4844 {
.expect("should initialize BLS_MODULUS");
}
pub const BLOB_TX_TYPE: u8 = 5;
pub const VERSIONED_HASH_VERSION_KZG: u8 = 1;
}

View File

@@ -9,7 +9,7 @@ use tree_hash::{PackedEncoding, TreeHash};
#[derive(Derivative, Debug, Clone, Serialize, Deserialize)]
#[derivative(PartialEq, Eq, Hash)]
pub struct KzgCommitment(#[serde(with = "BigArray")] [u8; 48]);
pub struct KzgCommitment(#[serde(with = "BigArray")] pub [u8; 48]);
impl Display for KzgCommitment {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {

View File

@@ -1,9 +1,9 @@
use crate::test_utils::{RngCore, TestRandom};
use serde::{Deserialize, Serialize};
use serde_big_array::BigArray;
use ssz::{Decode, DecodeError, Encode};
use std::fmt;
use tree_hash::{PackedEncoding, TreeHash};
use serde_big_array::BigArray;
const KZG_PROOF_BYTES_LEN: usize = 48;

View File

@@ -193,6 +193,7 @@ pub type Address = H160;
pub type ForkVersion = [u8; 4];
pub type BLSFieldElement = Uint256;
pub type Blob<T> = FixedVector<BLSFieldElement, <T as EthSpec>::FieldElementsPerBlob>;
pub type VersionedHash = Hash256;
pub use bls::{
AggregatePublicKey, AggregateSignature, Keypair, PublicKey, PublicKeyBytes, SecretKey,

View File

@@ -35,6 +35,9 @@ pub trait ExecPayload<T: EthSpec>: Debug + Clone + PartialEq + Hash + TreeHash +
fn fee_recipient(&self) -> Address;
fn gas_limit(&self) -> u64;
/// This will return `None` on blinded blocks or pre-merge blocks.
fn transactions(&self) -> Option<&Transactions<T>>;
// Is this a default payload? (pre-merge)
fn is_default(&self) -> bool;
}
@@ -191,6 +194,10 @@ impl<T: EthSpec> ExecPayload<T> for FullPayloadMerge<T> {
self.execution_payload.gas_limit
}
fn transactions(&self) -> Option<&Transactions<T>> {
Some(&self.execution_payload.transactions)
}
// TODO: can this function be optimized?
fn is_default(&self) -> bool {
self.execution_payload == ExecutionPayloadMerge::default()
@@ -235,6 +242,10 @@ impl<T: EthSpec> ExecPayload<T> for FullPayloadCapella<T> {
self.execution_payload.gas_limit
}
fn transactions(&self) -> Option<&Transactions<T>> {
Some(&self.execution_payload.transactions)
}
// TODO: can this function be optimized?
fn is_default(&self) -> bool {
self.execution_payload == ExecutionPayloadCapella::default()
@@ -279,6 +290,10 @@ impl<T: EthSpec> ExecPayload<T> for FullPayloadEip4844<T> {
self.execution_payload.gas_limit
}
fn transactions(&self) -> Option<&Transactions<T>> {
Some(&self.execution_payload.transactions)
}
// TODO: can this function be optimized?
fn is_default(&self) -> bool {
self.execution_payload == ExecutionPayloadEip4844::default()
@@ -347,6 +362,13 @@ impl<T: EthSpec> ExecPayload<T> for FullPayload<T> {
})
}
fn transactions<'a>(&'a self) -> Option<&'a Transactions<T>> {
map_full_payload_ref!(&'a _, self.to_ref(), move |payload, cons| {
cons(payload);
Some(&payload.execution_payload.transactions)
})
}
fn is_default(&self) -> bool {
match self {
Self::Merge(payload) => payload.is_default(),
@@ -428,6 +450,13 @@ impl<'b, T: EthSpec> ExecPayload<T> for FullPayloadRef<'b, T> {
})
}
fn transactions<'a>(&'a self) -> Option<&'a Transactions<T>> {
map_full_payload_ref!(&'a _, self, move |payload, cons| {
cons(payload);
Some(&payload.execution_payload.transactions)
})
}
// TODO: can this function be optimized?
fn is_default<'a>(&'a self) -> bool {
match self {
@@ -687,6 +716,10 @@ impl<T: EthSpec> ExecPayload<T> for BlindedPayload<T> {
}
}
fn transactions(&self) -> Option<&Transactions<T>> {
None
}
// TODO: can this function be optimized?
fn is_default(&self) -> bool {
match self {
@@ -773,6 +806,10 @@ impl<'b, T: EthSpec> ExecPayload<T> for BlindedPayloadRef<'b, T> {
}
}
fn transactions(&self) -> Option<&Transactions<T>> {
None
}
// TODO: can this function be optimized?
fn is_default<'a>(&'a self) -> bool {
match self {
@@ -828,6 +865,10 @@ impl<T: EthSpec> ExecPayload<T> for BlindedPayloadMerge<T> {
self.execution_payload_header.gas_limit
}
fn transactions(&self) -> Option<&Transactions<T>> {
None
}
fn is_default(&self) -> bool {
self.execution_payload_header == ExecutionPayloadHeaderMerge::default()
}
@@ -871,6 +912,10 @@ impl<T: EthSpec> ExecPayload<T> for BlindedPayloadCapella<T> {
self.execution_payload_header.gas_limit
}
fn transactions(&self) -> Option<&Transactions<T>> {
None
}
fn is_default(&self) -> bool {
self.execution_payload_header == ExecutionPayloadHeaderCapella::default()
}
@@ -914,6 +959,10 @@ impl<T: EthSpec> ExecPayload<T> for BlindedPayloadEip4844<T> {
self.execution_payload_header.gas_limit
}
fn transactions(&self) -> Option<&Transactions<T>> {
None
}
fn is_default(&self) -> bool {
self.execution_payload_header == ExecutionPayloadHeaderEip4844::default()
}