fix: block overrides inconsistencies (#4746)

This commit is contained in:
Matthias Seitz
2023-09-24 15:55:51 +02:00
committed by GitHub
parent 0a4e428448
commit 7a0781c25e
2 changed files with 40 additions and 6 deletions

View File

@ -257,22 +257,37 @@ impl<T: Serialize> Serialize for Rich<T> {
/// BlockOverrides is a set of header fields to override. /// BlockOverrides is a set of header fields to override.
#[derive(Clone, Debug, PartialEq, Eq, Default, Serialize, Deserialize)] #[derive(Clone, Debug, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase", deny_unknown_fields)] #[serde(default, rename_all = "camelCase", deny_unknown_fields)]
#[allow(missing_docs)]
pub struct BlockOverrides { pub struct BlockOverrides {
#[serde(default, skip_serializing_if = "Option::is_none")] /// Overrides the block number.
///
/// For `eth_callMany` this will be the block number of the first simulated block. Each
/// following block increments its block number by 1
// Note: geth uses `number`, erigon uses `blockNumber`
#[serde(default, skip_serializing_if = "Option::is_none", alias = "blockNumber")]
pub number: Option<U256>, pub number: Option<U256>,
/// Overrides the difficulty of the block.
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub difficulty: Option<U256>, pub difficulty: Option<U256>,
#[serde(default, skip_serializing_if = "Option::is_none")] /// Overrides the timestamp of the block.
// Note: geth uses `time`, erigon uses `timestamp`
#[serde(default, skip_serializing_if = "Option::is_none", alias = "timestamp")]
pub time: Option<U64>, pub time: Option<U64>,
/// Overrides the gas limit of the block.
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub gas_limit: Option<U64>, pub gas_limit: Option<U64>,
/// Overrides the coinbase address of the block.
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub coinbase: Option<Address>, pub coinbase: Option<Address>,
/// Overrides the prevrandao of the block.
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub random: Option<H256>, pub random: Option<H256>,
/// Overrides the basefee of the block.
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub base_fee: Option<U256>, pub base_fee: Option<U256>,
/// A dictionary that maps blockNumber to a user-defined hash. It could be queried from the
/// solidity opcode BLOCKHASH.
#[serde(default, skip_serializing_if = "Option::is_none")]
pub block_hash: Option<BTreeMap<u64, H256>>,
} }
#[cfg(test)] #[cfg(test)]
@ -380,4 +395,10 @@ mod tests {
let deserialized: Block = serde_json::from_str(&serialized).unwrap(); let deserialized: Block = serde_json::from_str(&serialized).unwrap();
assert_eq!(block, deserialized); assert_eq!(block, deserialized);
} }
#[test]
fn block_overrides() {
let s = r#"{"blockNumber": "0xe39dd0"}"#;
let _overrides = serde_json::from_str::<BlockOverrides>(s).unwrap();
}
} }

View File

@ -217,7 +217,12 @@ where
} }
// apply block overrides // apply block overrides
if let Some(block_overrides) = overrides.block { if let Some(mut block_overrides) = overrides.block {
if let Some(block_hashes) = block_overrides.block_hash.take() {
// override block hashes
db.block_hashes
.extend(block_hashes.into_iter().map(|(num, hash)| (U256::from(num), hash)))
}
apply_block_overrides(*block_overrides, &mut env.block); apply_block_overrides(*block_overrides, &mut env.block);
} }
@ -400,8 +405,16 @@ impl CallFees {
/// Applies the given block overrides to the env /// Applies the given block overrides to the env
fn apply_block_overrides(overrides: BlockOverrides, env: &mut BlockEnv) { fn apply_block_overrides(overrides: BlockOverrides, env: &mut BlockEnv) {
let BlockOverrides { number, difficulty, time, gas_limit, coinbase, random, base_fee } = let BlockOverrides {
overrides; number,
difficulty,
time,
gas_limit,
coinbase,
random,
base_fee,
block_hash: _,
} = overrides;
if let Some(number) = number { if let Some(number) = number {
env.number = number; env.number = number;