From 121d9e5680aad619ddf41296ab1f395b7423f6c1 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Wed, 16 Jan 2019 03:24:08 +0100 Subject: [PATCH 1/5] Add reentry protection for EIP-1283 --- ethcore/evm/src/interpreter/gasometer.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ethcore/evm/src/interpreter/gasometer.rs b/ethcore/evm/src/interpreter/gasometer.rs index 26fec2d9376..ba81ac069d5 100644 --- a/ethcore/evm/src/interpreter/gasometer.rs +++ b/ethcore/evm/src/interpreter/gasometer.rs @@ -121,6 +121,10 @@ impl Gasometer { Request::Gas(Gas::from(1)) }, instructions::SSTORE => { + if self.current_gas < Gas::from(schedule.call_stipend) { + return Err(vm::Error::OutOfGas); + } + let address = H256::from(stack.peek(0)); let newval = stack.peek(1); let val = U256::from(&*ext.storage_at(&address)?); From 59a740185cd8045056ecdd35eb5f4e0f63169c42 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Wed, 16 Jan 2019 03:27:22 +0100 Subject: [PATCH 2/5] typo: should use <= --- ethcore/evm/src/interpreter/gasometer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethcore/evm/src/interpreter/gasometer.rs b/ethcore/evm/src/interpreter/gasometer.rs index ba81ac069d5..4b16231505f 100644 --- a/ethcore/evm/src/interpreter/gasometer.rs +++ b/ethcore/evm/src/interpreter/gasometer.rs @@ -121,7 +121,7 @@ impl Gasometer { Request::Gas(Gas::from(1)) }, instructions::SSTORE => { - if self.current_gas < Gas::from(schedule.call_stipend) { + if self.current_gas <= Gas::from(schedule.call_stipend) { return Err(vm::Error::OutOfGas); } From d2d4a6005f21d356bdb9ce260caacf7d5232faa1 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Fri, 18 Jan 2019 16:44:00 +0100 Subject: [PATCH 3/5] Put things behind flag eip1706 --- ethcore/evm/src/interpreter/gasometer.rs | 2 +- ethcore/src/spec/spec.rs | 5 +++++ ethcore/vm/src/schedule.rs | 4 ++++ json/src/spec/params.rs | 2 ++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/ethcore/evm/src/interpreter/gasometer.rs b/ethcore/evm/src/interpreter/gasometer.rs index 4b16231505f..f0c608c3fb0 100644 --- a/ethcore/evm/src/interpreter/gasometer.rs +++ b/ethcore/evm/src/interpreter/gasometer.rs @@ -121,7 +121,7 @@ impl Gasometer { Request::Gas(Gas::from(1)) }, instructions::SSTORE => { - if self.current_gas <= Gas::from(schedule.call_stipend) { + if schedule.eip1706 && self.current_gas <= Gas::from(schedule.call_stipend) { return Err(vm::Error::OutOfGas); } diff --git a/ethcore/src/spec/spec.rs b/ethcore/src/spec/spec.rs index 9d67bf2c151..ca876203bcf 100644 --- a/ethcore/src/spec/spec.rs +++ b/ethcore/src/spec/spec.rs @@ -190,6 +190,7 @@ impl CommonParams { schedule.have_bitwise_shifting = block_number >= self.eip145_transition; schedule.have_extcodehash = block_number >= self.eip1052_transition; schedule.eip1283 = block_number >= self.eip1283_transition; + schedule.eip1706 = block_number >= self.eip1706_transition; if block_number >= self.eip210_transition { schedule.blockhash_gas = 800; } @@ -304,6 +305,10 @@ impl From for CommonParams { BlockNumber::max_value, Into::into, ), + eip1706_transition: p.eip1706_transition.map_or_else( + BlockNumber::max_value, + Into::into, + ), dust_protection_transition: p.dust_protection_transition.map_or_else( BlockNumber::max_value, Into::into, diff --git a/ethcore/vm/src/schedule.rs b/ethcore/vm/src/schedule.rs index d1dc3b5aad7..65142209315 100644 --- a/ethcore/vm/src/schedule.rs +++ b/ethcore/vm/src/schedule.rs @@ -119,6 +119,8 @@ pub struct Schedule { pub kill_dust: CleanDustMode, /// Enable EIP-1283 rules pub eip1283: bool, + /// Enable EIP-1706 rules + pub eip1706: bool, /// VM execution does not increase null signed address nonce if this field is true. pub keep_unsigned_nonce: bool, /// Wasm extra schedule settings, if wasm activated @@ -253,6 +255,7 @@ impl Schedule { have_static_call: false, kill_dust: CleanDustMode::Off, eip1283: false, + eip1706: false, keep_unsigned_nonce: false, wasm: None, } @@ -327,6 +330,7 @@ impl Schedule { have_static_call: false, kill_dust: CleanDustMode::Off, eip1283: false, + eip1706: false, keep_unsigned_nonce: false, wasm: None, } diff --git a/json/src/spec/params.rs b/json/src/spec/params.rs index d64f429bf88..0d7a1c3ee22 100644 --- a/json/src/spec/params.rs +++ b/json/src/spec/params.rs @@ -91,6 +91,8 @@ pub struct Params { pub eip1283_transition: Option, pub eip1014_transition: Option, /// See `CommonParams` docs. + pub eip1706_transition: Option, + /// See `CommonParams` docs. pub dust_protection_transition: Option, /// See `CommonParams` docs. pub nonce_cap_increment: Option, From a0da2aa9da3674cedf95fa098a592441d2971612 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Fri, 18 Jan 2019 16:56:27 +0100 Subject: [PATCH 4/5] Fix compile --- ethcore/src/spec/spec.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ethcore/src/spec/spec.rs b/ethcore/src/spec/spec.rs index ca876203bcf..5074048a385 100644 --- a/ethcore/src/spec/spec.rs +++ b/ethcore/src/spec/spec.rs @@ -123,6 +123,8 @@ pub struct CommonParams { pub eip1283_transition: BlockNumber, /// Number of first block where EIP-1014 rules begin. pub eip1014_transition: BlockNumber, + /// Number of first block where EIP-1706 rules begin. + pub eip1706_transition: BlockNumber, /// Number of first block where dust cleanup rules (EIP-168 and EIP169) begin. pub dust_protection_transition: BlockNumber, /// Nonce cap increase per block. Nonce cap is only checked if dust protection is enabled. From 44fa79f93b4787e37639e2c18652a26b127a2760 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Thu, 29 Aug 2019 16:11:27 +0200 Subject: [PATCH 5/5] Fix missing config in json and add eip1283_reenable_transition --- ethcore/types/src/engines/params.rs | 16 +++++++++++++++- json/src/spec/params.rs | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ethcore/types/src/engines/params.rs b/ethcore/types/src/engines/params.rs index ff85df8d739..b8edebc94f5 100644 --- a/ethcore/types/src/engines/params.rs +++ b/ethcore/types/src/engines/params.rs @@ -88,6 +88,8 @@ pub struct CommonParams { pub eip1283_transition: BlockNumber, /// Number of first block where EIP-1283 rules end. pub eip1283_disable_transition: BlockNumber, + /// Number of first block where EIP-1283 rules re-enabled. + pub eip1283_reenable_transition: BlockNumber, /// Number of first block where EIP-1014 rules begin. pub eip1014_transition: BlockNumber, /// Number of first block where EIP-1706 rules begin. @@ -168,7 +170,11 @@ impl CommonParams { schedule.have_bitwise_shifting = block_number >= self.eip145_transition; schedule.have_extcodehash = block_number >= self.eip1052_transition; schedule.have_chain_id = block_number >= self.eip1344_transition; - schedule.eip1283 = block_number >= self.eip1283_transition && !(block_number >= self.eip1283_disable_transition); + schedule.eip1283 = + (block_number >= self.eip1283_transition && + !(block_number >= self.eip1283_disable_transition)) || + block_number >= self.eip1283_reenable_transition; + schedule.eip1706 = block_number >= self.eip1706_transition; if block_number >= self.eip1884_transition { schedule.have_selfbalance = true; @@ -292,6 +298,14 @@ impl From for CommonParams { BlockNumber::max_value, Into::into, ), + eip1283_reenable_transition: p.eip1283_reenable_transition.map_or_else( + BlockNumber::max_value, + Into::into, + ), + eip1706_transition: p.eip1706_transition.map_or_else( + BlockNumber::max_value, + Into::into, + ), eip1014_transition: p.eip1014_transition.map_or_else( BlockNumber::max_value, Into::into, diff --git a/json/src/spec/params.rs b/json/src/spec/params.rs index e3d57642ff5..58adbd6a468 100644 --- a/json/src/spec/params.rs +++ b/json/src/spec/params.rs @@ -92,6 +92,8 @@ pub struct Params { /// See `CommonParams` docs. pub eip1283_disable_transition: Option, /// See `CommonParams` docs. + pub eip1283_reenable_transition: Option, + /// See `CommonParams` docs. pub eip1014_transition: Option, /// See `CommonParams` docs. pub eip1706_transition: Option,