From 2ca57d7cdb02c7b236f0b81f7eb570dca40a5e17 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Thu, 16 Nov 2017 12:25:05 +0800 Subject: [PATCH 1/4] ECIP-1039: Monetary policy rounding specification Fix potential rounding errors between geth and parity in the long-term future. --- ethcore/src/ethereum/ethash.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ethcore/src/ethereum/ethash.rs b/ethcore/src/ethereum/ethash.rs index 3ecccd9a8..8beafd3d7 100644 --- a/ethcore/src/ethereum/ethash.rs +++ b/ethcore/src/ethereum/ethash.rs @@ -450,7 +450,10 @@ fn ecip1017_eras_block_reward(era_rounds: u64, mut reward: U256, block_number:u6 block_number / era_rounds }; for _ in 0..eras { - reward = reward / U256::from(5) * U256::from(4); + reward = reward * U256::from(4); + } + for _ in 0..eras { + reward = reward / U256::from(5); } (eras, reward) } From b35cc3f7168d03b7c22bf462b774ee1fa3e5fc8d Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Thu, 16 Nov 2017 12:34:04 +0800 Subject: [PATCH 2/4] Change reward calculation to only use divide once --- ethcore/src/ethereum/ethash.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ethcore/src/ethereum/ethash.rs b/ethcore/src/ethereum/ethash.rs index 8beafd3d7..c28fc2050 100644 --- a/ethcore/src/ethereum/ethash.rs +++ b/ethcore/src/ethereum/ethash.rs @@ -449,12 +449,12 @@ fn ecip1017_eras_block_reward(era_rounds: u64, mut reward: U256, block_number:u6 } else { block_number / era_rounds }; + let mut divi = U256::from(1); for _ in 0..eras { reward = reward * U256::from(4); + divi = divi * U256::from(5); } - for _ in 0..eras { - reward = reward / U256::from(5); - } + reward = reward / divi; (eras, reward) } From bef85fb876025abf88cabe1bd7328931882e5a6d Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Fri, 24 Nov 2017 19:31:48 +0800 Subject: [PATCH 3/4] Add test for ECIP1017 at block 250000000 --- ethcore/src/ethereum/ethash.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ethcore/src/ethereum/ethash.rs b/ethcore/src/ethereum/ethash.rs index c28fc2050..56353aafd 100644 --- a/ethcore/src/ethereum/ethash.rs +++ b/ethcore/src/ethereum/ethash.rs @@ -520,6 +520,12 @@ mod tests { let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, start_reward, block_number); assert_eq!(15, eras); assert_eq!(U256::from_str("271000000000000").unwrap(), reward); + + let block_number = 250000000; + let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, start_reward, block_number); + assert_eq!(48, eras); + assert!(U256::from_str("65697BFA9ACB").unwrap() != reward); + assert_eq!(U256::from_str("65697BFA9ACD").unwrap(), reward); } #[test] From 8e89be775c827860e7740e3cdf481454513cbe8c Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Fri, 24 Nov 2017 20:17:26 +0800 Subject: [PATCH 4/4] Wrong era used in ECIP1017 test It is era 49, and should correspond to ECIP1017/ECIP1039's era 50. --- ethcore/src/ethereum/ethash.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ethcore/src/ethereum/ethash.rs b/ethcore/src/ethereum/ethash.rs index 56353aafd..9548fe511 100644 --- a/ethcore/src/ethereum/ethash.rs +++ b/ethcore/src/ethereum/ethash.rs @@ -523,9 +523,8 @@ mod tests { let block_number = 250000000; let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, start_reward, block_number); - assert_eq!(48, eras); - assert!(U256::from_str("65697BFA9ACB").unwrap() != reward); - assert_eq!(U256::from_str("65697BFA9ACD").unwrap(), reward); + assert_eq!(49, eras); + assert_eq!(U256::from_str("51212FFBAF0A").unwrap(), reward); } #[test]