[ethash] chainspec validate ecip1017EraRounds
non-zero (#11123)
* [ethash]: validate `ecip1017EraRounds` non-zero When `ecip1017EraRounds` ethash will divide by zero. This commit ensures that the chainspec deserialization fails and gives a better error message. * [ecip1017_eras_block_reward]: document behaviour * nit * docs(ethash ecip1071): resolve `TODO`
This commit is contained in:
parent
f99819d326
commit
9c8b7c23d1
@ -464,7 +464,16 @@ impl Ethash {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Calculates the number of eras and reward
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// This function will panic if `era_rounds` is less than `2`
|
||||
fn ecip1017_eras_block_reward(era_rounds: u64, mut reward: U256, block_number: u64) -> (u64, U256) {
|
||||
// NOTE(niklasad1): all numbers is divisible by 1, it will cause the if below
|
||||
// to succeed except for the first block. Thus, `era_rounds - 1 == 0` and cause `divide by zero`
|
||||
assert!(era_rounds > 1, "ecip1017EraRounds must be bigger than 1");
|
||||
let eras = if block_number != 0 && block_number % era_rounds == 0 {
|
||||
block_number / era_rounds - 1
|
||||
} else {
|
||||
|
@ -91,6 +91,7 @@ pub struct EthashParams {
|
||||
pub ecip1010_continue_transition: Option<Uint>,
|
||||
|
||||
/// See main EthashParams docs.
|
||||
#[serde(default, deserialize_with="uint::validate_optional_non_zero")]
|
||||
pub ecip1017_era_rounds: Option<Uint>,
|
||||
|
||||
/// Delays of difficulty bombs.
|
||||
@ -101,7 +102,6 @@ pub struct EthashParams {
|
||||
/// EXPIP-2 duration limit
|
||||
pub expip2_duration_limit: Option<Uint>,
|
||||
/// Block to transition to progpow
|
||||
#[serde(rename="progpowTransition")]
|
||||
pub progpow_transition: Option<Uint>,
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user