From 090d7bbc0576b67e9751c6050c8099d214768fe0 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Wed, 9 Mar 2022 13:48:48 +0800 Subject: [PATCH 1/4] add nz_nz_allne_case_refund --- .../src/evm_circuit/execution/sstore.rs | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/sstore.rs b/zkevm-circuits/src/evm_circuit/execution/sstore.rs index 5a27d18fc4..0938448574 100644 --- a/zkevm-circuits/src/evm_circuit/execution/sstore.rs +++ b/zkevm-circuits/src/evm_circuit/execution/sstore.rs @@ -354,13 +354,14 @@ pub(crate) struct SstoreTxRefundGadget { value: Cell, value_prev: Cell, committed_value: Cell, - is_warm: Cell, + is_warm: Cell, // TODO: remove value_prev_is_zero: IsZeroGadget, value_is_zero: IsZeroGadget, original_is_zero: IsZeroGadget, original_eq_value: IsEqualGadget, prev_eq_value: IsEqualGadget, original_eq_prev: IsEqualGadget, + nz_nz_allne_case_refund: Cell, } impl SstoreTxRefundGadget { @@ -380,15 +381,19 @@ impl SstoreTxRefundGadget { let original_eq_prev = IsEqualGadget::construct(cb, committed_value.expr(), value_prev.expr()); + // original_value, value_prev, value all are different; + // original_value!=0&&value_prev!=0 + let nz_nz_allne_case_refund = cb.copy(select::expr( + value_is_zero.expr(), + tx_refund_old.expr() + GasCost::SSTORE_CLEARS_SCHEDULE.expr(), + tx_refund_old.expr(), + )); + // original_value, value_prev, value all are different; original_value!=0 let nz_allne_case_refund = select::expr( value_prev_is_zero.expr(), tx_refund_old.expr() - GasCost::SSTORE_CLEARS_SCHEDULE.expr(), - select::expr( - value_is_zero.expr(), - tx_refund_old.expr() + GasCost::SSTORE_CLEARS_SCHEDULE.expr(), - tx_refund_old.expr(), - ), + nz_nz_allne_case_refund.expr(), ); // original_value!=value_prev, value_prev!=value, original_value!=0 let nz_ne_ne_case_refund = select::expr( @@ -434,6 +439,7 @@ impl SstoreTxRefundGadget { original_eq_value, prev_eq_value, original_eq_prev, + nz_nz_allne_case_refund, } } @@ -512,6 +518,18 @@ impl SstoreTxRefundGadget { Word::random_linear_combine(committed_value.to_le_bytes(), randomness), Word::random_linear_combine(value_prev.to_le_bytes(), randomness), )?; + + let nz_nz_allne_case_refund = if value == eth_types::Word::zero() { + tx_refund_old + GasCost::SSTORE_CLEARS_SCHEDULE.as_u64() + } else { + tx_refund_old + }; + self.nz_nz_allne_case_refund.assign( + region, + offset, + Some(F::from(nz_nz_allne_case_refund)), + )?; + Ok(()) } } From 3e069236147ddc90ed67ed9cd910f6eea07eb564 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Wed, 9 Mar 2022 13:54:08 +0800 Subject: [PATCH 2/4] add ez_ne_ne_case_refund cargo fmt --- .../src/evm_circuit/execution/sstore.rs | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/sstore.rs b/zkevm-circuits/src/evm_circuit/execution/sstore.rs index 0938448574..6691d4c994 100644 --- a/zkevm-circuits/src/evm_circuit/execution/sstore.rs +++ b/zkevm-circuits/src/evm_circuit/execution/sstore.rs @@ -362,6 +362,7 @@ pub(crate) struct SstoreTxRefundGadget { prev_eq_value: IsEqualGadget, original_eq_prev: IsEqualGadget, nz_nz_allne_case_refund: Cell, + ez_ne_ne_case_refund: Cell, } impl SstoreTxRefundGadget { @@ -388,7 +389,6 @@ impl SstoreTxRefundGadget { tx_refund_old.expr() + GasCost::SSTORE_CLEARS_SCHEDULE.expr(), tx_refund_old.expr(), )); - // original_value, value_prev, value all are different; original_value!=0 let nz_allne_case_refund = select::expr( value_prev_is_zero.expr(), @@ -402,15 +402,17 @@ impl SstoreTxRefundGadget { nz_allne_case_refund.expr() + GasCost::SSTORE_RESET_GAS.expr() - GasCost::SLOAD_GAS.expr(), ); + // original_value!=value_prev, value_prev!=value, original_value==0 + let ez_ne_ne_case_refund = cb.copy(select::expr( + original_eq_value.expr(), + tx_refund_old.expr() + GasCost::SSTORE_SET_GAS.expr() - GasCost::SLOAD_GAS.expr(), + tx_refund_old.expr(), + )); // original_value!=value_prev, value_prev!=value let ne_ne_case_refund = select::expr( not::expr(original_is_zero.expr()), nz_ne_ne_case_refund.expr(), - select::expr( - original_eq_value.expr(), - tx_refund_old.expr() + GasCost::SSTORE_SET_GAS.expr() - GasCost::SLOAD_GAS.expr(), - tx_refund_old.expr(), - ), + ez_ne_ne_case_refund.expr(), ); let tx_refund_new = select::expr( prev_eq_value.expr(), @@ -440,6 +442,7 @@ impl SstoreTxRefundGadget { prev_eq_value, original_eq_prev, nz_nz_allne_case_refund, + ez_ne_ne_case_refund, } } @@ -530,6 +533,14 @@ impl SstoreTxRefundGadget { Some(F::from(nz_nz_allne_case_refund)), )?; + let ez_ne_ne_case_refund = if committed_value == value { + tx_refund_old + GasCost::SSTORE_SET_GAS.as_u64() - GasCost::SLOAD_GAS.as_u64() + } else { + tx_refund_old + }; + self.ez_ne_ne_case_refund + .assign(region, offset, Some(F::from(ez_ne_ne_case_refund)))?; + Ok(()) } } From 110ee082e1a12ace931c30a161fb3f1a8f1b04d1 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Wed, 9 Mar 2022 14:08:43 +0800 Subject: [PATCH 3/4] add eq_ne_case_refund --- .../src/evm_circuit/execution/sstore.rs | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/sstore.rs b/zkevm-circuits/src/evm_circuit/execution/sstore.rs index 00ffec2704..844fe10251 100644 --- a/zkevm-circuits/src/evm_circuit/execution/sstore.rs +++ b/zkevm-circuits/src/evm_circuit/execution/sstore.rs @@ -360,6 +360,7 @@ pub(crate) struct SstoreTxRefundGadget { original_eq_prev: IsEqualGadget, nz_nz_allne_case_refund: Cell, ez_ne_ne_case_refund: Cell, + eq_ne_case_refund: Cell, } impl SstoreTxRefundGadget { @@ -410,16 +411,18 @@ impl SstoreTxRefundGadget { nz_ne_ne_case_refund.expr(), ez_ne_ne_case_refund.expr(), ); + // original_value==value_prev, value_prev!=value + let eq_ne_case_refund = cb.copy(select::expr( + not::expr(original_is_zero.expr()) * value_is_zero.expr(), + tx_refund_old.expr() + GasCost::SSTORE_CLEARS_SCHEDULE.expr(), + tx_refund_old.expr(), + )); let tx_refund_new = select::expr( prev_eq_value.expr(), tx_refund_old.expr(), select::expr( original_eq_prev.expr(), - select::expr( - not::expr(original_is_zero.expr()) * value_is_zero.expr(), - tx_refund_old.expr() + GasCost::SSTORE_CLEARS_SCHEDULE.expr(), - tx_refund_old.expr(), - ), + eq_ne_case_refund.expr(), ne_ne_case_refund.expr(), ), ); @@ -438,6 +441,7 @@ impl SstoreTxRefundGadget { original_eq_prev, nz_nz_allne_case_refund, ez_ne_ne_case_refund, + eq_ne_case_refund, } } @@ -533,6 +537,15 @@ impl SstoreTxRefundGadget { self.ez_ne_ne_case_refund .assign(region, offset, Some(F::from(ez_ne_ne_case_refund)))?; + let eq_ne_case_refund = + if (committed_value != eth_types::Word::zero()) && (value == eth_types::Word::zero()) { + tx_refund_old + GasCost::SSTORE_CLEARS_SCHEDULE.as_u64() + } else { + tx_refund_old + }; + self.eq_ne_case_refund + .assign(region, offset, Some(F::from(eq_ne_case_refund)))?; + Ok(()) } } From 6890df4bcec277aed490c1202287e2a79cf40e7d Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Wed, 9 Mar 2022 14:25:20 +0800 Subject: [PATCH 4/4] add nz_ne_ne_case_refund --- .../src/evm_circuit/execution/sstore.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/sstore.rs b/zkevm-circuits/src/evm_circuit/execution/sstore.rs index 844fe10251..daf3f99847 100644 --- a/zkevm-circuits/src/evm_circuit/execution/sstore.rs +++ b/zkevm-circuits/src/evm_circuit/execution/sstore.rs @@ -359,6 +359,7 @@ pub(crate) struct SstoreTxRefundGadget { prev_eq_value: IsEqualGadget, original_eq_prev: IsEqualGadget, nz_nz_allne_case_refund: Cell, + nz_ne_ne_case_refund: Cell, ez_ne_ne_case_refund: Cell, eq_ne_case_refund: Cell, } @@ -393,12 +394,12 @@ impl SstoreTxRefundGadget { nz_nz_allne_case_refund.expr(), ); // original_value!=value_prev, value_prev!=value, original_value!=0 - let nz_ne_ne_case_refund = select::expr( + let nz_ne_ne_case_refund = cb.copy(select::expr( not::expr(original_eq_value.expr()), nz_allne_case_refund.expr(), nz_allne_case_refund.expr() + GasCost::SSTORE_RESET_GAS.expr() - GasCost::SLOAD_GAS.expr(), - ); + )); // original_value!=value_prev, value_prev!=value, original_value==0 let ez_ne_ne_case_refund = cb.copy(select::expr( original_eq_value.expr(), @@ -440,6 +441,7 @@ impl SstoreTxRefundGadget { prev_eq_value, original_eq_prev, nz_nz_allne_case_refund, + nz_ne_ne_case_refund, ez_ne_ne_case_refund, eq_ne_case_refund, } @@ -529,6 +531,19 @@ impl SstoreTxRefundGadget { Some(F::from(nz_nz_allne_case_refund)), )?; + let nz_allne_case_refund = if value_prev == eth_types::Word::zero() { + tx_refund_old - GasCost::SSTORE_CLEARS_SCHEDULE.as_u64() + } else { + nz_nz_allne_case_refund + }; + let nz_ne_ne_case_refund = if committed_value != value { + nz_allne_case_refund + } else { + nz_allne_case_refund + GasCost::SSTORE_RESET_GAS.as_u64() - GasCost::SLOAD_GAS.as_u64() + }; + self.nz_ne_ne_case_refund + .assign(region, offset, Some(F::from(nz_ne_ne_case_refund)))?; + let ez_ne_ne_case_refund = if committed_value == value { tx_refund_old + GasCost::SSTORE_SET_GAS.as_u64() - GasCost::SLOAD_GAS.as_u64() } else {