[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:
Niklas Adolfsson 2019-10-17 14:02:41 +02:00 committed by GitHub
parent f99819d326
commit 9c8b7c23d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 2 deletions

View File

@ -464,7 +464,16 @@ impl Ethash {
} }
} }
fn ecip1017_eras_block_reward(era_rounds: u64, mut reward: U256, block_number:u64) -> (u64, U256) {
/// 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 { let eras = if block_number != 0 && block_number % era_rounds == 0 {
block_number / era_rounds - 1 block_number / era_rounds - 1
} else { } else {

View File

@ -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>,
} }