[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) {
|
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 {
|
let eras = if block_number != 0 && block_number % era_rounds == 0 {
|
||||||
block_number / era_rounds - 1
|
block_number / era_rounds - 1
|
||||||
} else {
|
} else {
|
||||||
|
@ -91,6 +91,7 @@ pub struct EthashParams {
|
|||||||
pub ecip1010_continue_transition: Option<Uint>,
|
pub ecip1010_continue_transition: Option<Uint>,
|
||||||
|
|
||||||
/// See main EthashParams docs.
|
/// See main EthashParams docs.
|
||||||
|
#[serde(default, deserialize_with="uint::validate_optional_non_zero")]
|
||||||
pub ecip1017_era_rounds: Option<Uint>,
|
pub ecip1017_era_rounds: Option<Uint>,
|
||||||
|
|
||||||
/// Delays of difficulty bombs.
|
/// Delays of difficulty bombs.
|
||||||
@ -101,7 +102,6 @@ pub struct EthashParams {
|
|||||||
/// EXPIP-2 duration limit
|
/// EXPIP-2 duration limit
|
||||||
pub expip2_duration_limit: Option<Uint>,
|
pub expip2_duration_limit: Option<Uint>,
|
||||||
/// Block to transition to progpow
|
/// Block to transition to progpow
|
||||||
#[serde(rename="progpowTransition")]
|
|
||||||
pub progpow_transition: Option<Uint>,
|
pub progpow_transition: Option<Uint>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user