Skip to content

Commit

Permalink
fix: reject block if it includes messages below the base fee.
Browse files Browse the repository at this point in the history
  • Loading branch information
raulk committed Dec 19, 2024
1 parent 94ec24f commit 7e4b87c
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 1 deletion.
2 changes: 2 additions & 0 deletions fendermint/actors/api/src/gas_market.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ pub struct Reading {
pub block_gas_limit: Gas,
/// The current base fee for the block.
pub base_fee: TokenAmount,
/// The minimum allowable base fee.
pub min_base_fee: TokenAmount,
}

/// The current utilization for the client to report to the gas market.
Expand Down
7 changes: 6 additions & 1 deletion fendermint/actors/gas_market/eip1559/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ impl fendermint_actors_api::gas_market::GasMarket for Actor {
Ok(fendermint_actors_api::gas_market::Reading {
block_gas_limit: st.constants.block_gas_limit,
base_fee: st.base_fee,
min_base_fee: st.constants.minimal_base_fee,
})
}

Expand All @@ -111,6 +112,7 @@ impl fendermint_actors_api::gas_market::GasMarket for Actor {
Ok(fendermint_actors_api::gas_market::Reading {
block_gas_limit: st.constants.block_gas_limit,
base_fee: st.base_fee.clone(),
min_base_fee: st.constants.minimal_base_fee.clone(),
})
})
}
Expand Down Expand Up @@ -229,10 +231,10 @@ mod tests {
let r = rt.call::<Actor>(
Method::SetConstants as u64,
IpldBlock::serialize_cbor(&Constants {
minimal_base_fee: Default::default(),
elasticity_multiplier: 0,
base_fee_max_change_denominator: 0,
block_gas_limit: 20,
..Default::default()
})
.unwrap(),
);
Expand Down Expand Up @@ -266,6 +268,7 @@ mod tests {
.unwrap();
let reading = r.deserialize::<Reading>().unwrap();
assert_eq!(reading.base_fee, TokenAmount::from_atto(112));
assert_eq!(reading.min_base_fee, Constants::default().minimal_base_fee)
}

#[test]
Expand All @@ -292,6 +295,7 @@ mod tests {
.unwrap();
let reading = r.deserialize::<Reading>().unwrap();
assert_eq!(reading.base_fee, TokenAmount::from_atto(100));
assert_eq!(reading.min_base_fee, Constants::default().minimal_base_fee)
}

#[test]
Expand All @@ -318,6 +322,7 @@ mod tests {
.unwrap();
let reading = r.deserialize::<Reading>().unwrap();
assert_eq!(reading.base_fee, TokenAmount::from_atto(88));
assert_eq!(reading.min_base_fee, Constants::default().minimal_base_fee)
}

#[test]
Expand Down
7 changes: 7 additions & 0 deletions fendermint/vm/interpreter/src/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ where
msgs: Vec<Self::Message>,
) -> anyhow::Result<bool> {
let mut block_gas_usage = 0;
let base_fee = state.block_gas_tracker().base_fee();

for msg in msgs {
match msg {
Expand Down Expand Up @@ -228,6 +229,12 @@ where
}
}
ChainMessage::Signed(signed) => {
if &signed.message.gas_fee_cap < base_fee {
// We do not accept blocks containing transactions with gas parameters below the current base fee.
// Producing an invalid block like this should penalize the validator going forward.
return Ok(false);
}

block_gas_usage += signed.message.gas_limit;
}
_ => {}
Expand Down

0 comments on commit 7e4b87c

Please sign in to comment.