Skip to content

Commit cd5edab

Browse files
Streamline the math gadget API (privacy-scaling-explorations#1765)
### Description We improve the readability by sweeping gadget constructors under the constraint builder. ### Issue Link Quick search and replace ### Type of change Refactor (no updates to logic) ### Contents - changed `XGadget::construct(cb, ...)` to `cb.x(...)` - some IsZero checks are replaced with IsEqual checks. ### Rationale We keep consumption of the following gadgets unchanged because they are not used frequently enough. - abs_word - add_word - binary_number - byte_size - cmp_words - comparison - modulo - mul_add_words - mul_add_words512 - mul_word_u64
1 parent 3151efd commit cd5edab

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+230
-189
lines changed

zkevm-circuits/src/evm_circuit/execution/addmod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ impl<F: Field> ExecutionGadget<F> for AddModGadget<F> {
6969
let a_reduced = cb.query_word32();
7070
let d = cb.query_word32();
7171

72-
let n_is_zero = IsZeroWordGadget::construct(cb, &n);
72+
let n_is_zero = cb.is_zero_word(&n);
7373

7474
// 1. check k * N + a_reduced == a without overflow
7575
let muladd_k_n_areduced =

zkevm-circuits/src/evm_circuit/execution/balance.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl<F: Field> ExecutionGadget<F> for BalanceGadget<F> {
6060
AccountFieldTag::CodeHash,
6161
code_hash.to_word(),
6262
);
63-
let not_exists = IsZeroWordGadget::construct(cb, &code_hash);
63+
let not_exists = cb.is_zero_word(&code_hash);
6464
let exists = not::expr(not_exists.expr());
6565
let balance = cb.query_word32();
6666
cb.condition(exists.expr(), |cb| {

zkevm-circuits/src/evm_circuit/execution/begin_tx.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
8181
let gas_left = tx.gas.expr() - tx.intrinsic_gas();
8282
let sufficient_gas_left = RangeCheckGadget::construct(cb, gas_left.clone());
8383

84-
let tx_caller_address_is_zero = IsZeroWordGadget::construct(cb, &tx.caller_address);
84+
let tx_caller_address_is_zero = cb.is_zero_word(&tx.caller_address);
8585
cb.require_equal(
8686
"CallerAddress != 0 (not a padding tx)",
8787
tx_caller_address_is_zero.expr(),
@@ -155,9 +155,8 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
155155

156156
// Read code_hash of callee
157157
let code_hash = cb.query_word_unchecked();
158-
let is_empty_code_hash =
159-
IsEqualWordGadget::construct(cb, &code_hash.to_word(), &cb.empty_code_hash());
160-
let callee_not_exists = IsZeroWordGadget::construct(cb, &code_hash);
158+
let is_empty_code_hash = cb.is_eq_word(&code_hash.to_word(), &cb.empty_code_hash());
159+
let callee_not_exists = cb.is_zero_word(&code_hash);
161160
// no_callee_code is true when the account exists and has empty
162161
// code hash, or when the account doesn't exist (which we encode with
163162
// code_hash = 0).

zkevm-circuits/src/evm_circuit/execution/byte.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ impl<F: Field> ExecutionGadget<F> for ByteGadget<F> {
5353
let is_byte_selected = array_init(|idx| {
5454
// Check if this byte is selected looking only at the LSB of the
5555
// index word
56-
IsEqualGadget::construct(cb, index.limbs[0].expr(), (31 - idx).expr())
56+
cb.is_eq(index.limbs[0].expr(), (31 - idx).expr())
5757
});
5858

5959
// Sum all possible selected bytes

zkevm-circuits/src/evm_circuit/execution/callop.rs

+29-29
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ use crate::{
1111
Transition::{Delta, To},
1212
},
1313
math_gadget::{
14-
ConstantDivisionGadget, IsZeroGadget, LtGadget, LtWordGadget, MinMaxGadget,
14+
ConstantDivisionGadget, IsEqualGadget, IsZeroGadget, LtGadget, LtWordGadget,
15+
MinMaxGadget,
1516
},
1617
memory_gadget::{CommonMemoryAddressGadget, MemoryAddressGadget},
1718
not, or,
@@ -44,10 +45,10 @@ use std::cmp::min;
4445

4546
pub(crate) struct CallOpGadget<F> {
4647
opcode: Cell<F>,
47-
is_call: IsZeroGadget<F>,
48-
is_callcode: IsZeroGadget<F>,
49-
is_delegatecall: IsZeroGadget<F>,
50-
is_staticcall: IsZeroGadget<F>,
48+
is_call: IsEqualGadget<F>,
49+
is_callcode: IsEqualGadget<F>,
50+
is_delegatecall: IsEqualGadget<F>,
51+
is_staticcall: IsEqualGadget<F>,
5152
tx_id: Cell<F>,
5253
reversion_info: ReversionInfo<F>,
5354
current_callee_address: WordLoHiCell<F>,
@@ -94,12 +95,10 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
9495
fn configure(cb: &mut EVMConstraintBuilder<F>) -> Self {
9596
let opcode = cb.query_cell();
9697
cb.opcode_lookup(opcode.expr(), 1.expr());
97-
let is_call = IsZeroGadget::construct(cb, opcode.expr() - OpcodeId::CALL.expr());
98-
let is_callcode = IsZeroGadget::construct(cb, opcode.expr() - OpcodeId::CALLCODE.expr());
99-
let is_delegatecall =
100-
IsZeroGadget::construct(cb, opcode.expr() - OpcodeId::DELEGATECALL.expr());
101-
let is_staticcall =
102-
IsZeroGadget::construct(cb, opcode.expr() - OpcodeId::STATICCALL.expr());
98+
let is_call = cb.is_eq(opcode.expr(), OpcodeId::CALL.expr());
99+
let is_callcode = cb.is_eq(opcode.expr(), OpcodeId::CALLCODE.expr());
100+
let is_delegatecall = cb.is_eq(opcode.expr(), OpcodeId::DELEGATECALL.expr());
101+
let is_staticcall = cb.is_eq(opcode.expr(), OpcodeId::STATICCALL.expr());
103102

104103
// Use rw_counter of the step which triggers next call as its call_id.
105104
let callee_call_id = cb.curr.state.rw_counter.clone();
@@ -196,9 +195,9 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
196195
// rwc_delta = 8 + is_delegatecall * 2 + call_gadget.rw_delta() +
197196
// callee_reversion_info.rw_delta()
198197
let is_insufficient_balance =
199-
LtWordGadget::construct(cb, &caller_balance.to_word(), &call_gadget.value.to_word());
198+
cb.is_lt_word(&caller_balance.to_word(), &call_gadget.value.to_word());
200199
// depth < 1025
201-
let is_depth_ok = LtGadget::construct(cb, depth.expr(), 1025.expr());
200+
let is_depth_ok = cb.is_lt(depth.expr(), 1025.expr());
202201

203202
let is_precheck_ok = and::expr([
204203
is_depth_ok.expr(),
@@ -215,18 +214,15 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
215214

216215
// whether the call is to a precompiled contract.
217216
// precompile contracts are stored from address 0x01 to 0x09.
218-
let is_code_address_zero = IsZeroGadget::construct(cb, call_gadget.callee_address.expr());
219-
let is_precompile_lt =
220-
LtGadget::construct(cb, call_gadget.callee_address.expr(), 0x0A.expr());
217+
let is_code_address_zero = cb.is_zero(call_gadget.callee_address.expr());
218+
let is_precompile_lt = cb.is_lt(call_gadget.callee_address.expr(), 0x0A.expr());
221219
let is_precompile = and::expr([
222220
not::expr(is_code_address_zero.expr()),
223221
is_precompile_lt.expr(),
224222
]);
225223
let precompile_return_length = cb.query_cell();
226-
let precompile_return_length_zero =
227-
IsZeroGadget::construct(cb, precompile_return_length.expr());
228-
let precompile_return_data_copy_size = MinMaxGadget::construct(
229-
cb,
224+
let precompile_return_length_zero = cb.is_zero(precompile_return_length.expr());
225+
let precompile_return_data_copy_size = cb.min_max(
230226
precompile_return_length.expr(),
231227
call_gadget.rd_address.length(),
232228
);
@@ -275,10 +271,10 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
275271
let gas_cost = call_gadget.gas_cost_expr(is_warm_prev.expr(), is_call.expr());
276272
// Apply EIP 150
277273
let gas_available = cb.curr.state.gas_left.expr() - gas_cost.clone();
278-
let one_64th_gas = ConstantDivisionGadget::construct(cb, gas_available.clone(), 64);
274+
let one_64th_gas = cb.div_by_const(gas_available.clone(), 64);
279275
let all_but_one_64th_gas = gas_available - one_64th_gas.quotient();
280276
let capped_callee_gas_left =
281-
MinMaxGadget::construct(cb, call_gadget.gas_expr(), all_but_one_64th_gas.clone());
277+
cb.min_max(call_gadget.gas_expr(), all_but_one_64th_gas.clone());
282278
let callee_gas_left = select::expr(
283279
call_gadget.gas_is_u64.expr(),
284280
capped_callee_gas_left.min(),
@@ -480,10 +476,10 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
480476
let callee_gas_left = callee_gas_left.expr()
481477
+ call_gadget.has_value.clone() * GAS_STIPEND_CALL_WITH_VALUE.expr();
482478

483-
let precompile_output_word_size_div: ConstantDivisionGadget<F, N_BYTES_U64> =
484-
ConstantDivisionGadget::construct(cb, precompile_output_rws.expr(), 32);
479+
let precompile_output_word_size_div =
480+
cb.div_by_const(precompile_output_rws.expr(), 32);
485481
let precompile_output_word_size_div_remainder_zero =
486-
IsZeroGadget::construct(cb, precompile_output_word_size_div.remainder());
482+
cb.is_zero(precompile_output_word_size_div.remainder());
487483
let precompile_output_word_size = precompile_output_word_size_div.quotient()
488484
+ 1.expr()
489485
- precompile_output_word_size_div_remainder_zero.expr();
@@ -891,22 +887,26 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
891887
self.is_call.assign(
892888
region,
893889
offset,
894-
F::from(opcode.as_u64()) - F::from(OpcodeId::CALL.as_u64()),
890+
F::from(opcode.as_u64()),
891+
F::from(OpcodeId::CALL.as_u64()),
895892
)?;
896893
self.is_callcode.assign(
897894
region,
898895
offset,
899-
F::from(opcode.as_u64()) - F::from(OpcodeId::CALLCODE.as_u64()),
896+
F::from(opcode.as_u64()),
897+
F::from(OpcodeId::CALLCODE.as_u64()),
900898
)?;
901899
self.is_delegatecall.assign(
902900
region,
903901
offset,
904-
F::from(opcode.as_u64()) - F::from(OpcodeId::DELEGATECALL.as_u64()),
902+
F::from(opcode.as_u64()),
903+
F::from(OpcodeId::DELEGATECALL.as_u64()),
905904
)?;
906905
self.is_staticcall.assign(
907906
region,
908907
offset,
909-
F::from(opcode.as_u64()) - F::from(OpcodeId::STATICCALL.as_u64()),
908+
F::from(opcode.as_u64()),
909+
F::from(OpcodeId::STATICCALL.as_u64()),
910910
)?;
911911
self.tx_id
912912
.assign(region, offset, Value::known(F::from(tx_id.low_u64())))?;

zkevm-circuits/src/evm_circuit/execution/comparator.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ impl<F: Field> ExecutionGadget<F> for ComparatorGadget<F> {
4141
let b = cb.query_word_unchecked();
4242

4343
// Check if opcode is EQ
44-
let is_eq = IsEqualGadget::construct(cb, opcode.expr(), OpcodeId::EQ.expr());
44+
let is_eq = cb.is_eq(opcode.expr(), OpcodeId::EQ.expr());
4545
// Check if opcode is GT. For GT we swap the stack inputs so that we
4646
// actually do greater than instead of smaller than.
47-
let is_gt = IsEqualGadget::construct(cb, opcode.expr(), OpcodeId::GT.expr());
47+
let is_gt = cb.is_eq(opcode.expr(), OpcodeId::GT.expr());
4848

4949
let word_comparison = CmpWordsGadget::construct(cb, a.clone(), b.clone());
5050

zkevm-circuits/src/evm_circuit/execution/create.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::{
1313
Transition::{Delta, To},
1414
},
1515
math_gadget::{
16-
ConstantDivisionGadget, ContractCreateGadget, IsZeroGadget, IsZeroWordGadget,
16+
ConstantDivisionGadget, ContractCreateGadget, IsEqualGadget, IsZeroWordGadget,
1717
LtGadget, LtWordGadget,
1818
},
1919
memory_gadget::{
@@ -53,7 +53,7 @@ pub(crate) struct CreateGadget<F, const IS_CREATE2: bool, const S: ExecutionStat
5353
reversion_info: ReversionInfo<F>,
5454
depth: Cell<F>,
5555

56-
is_create2: IsZeroGadget<F>,
56+
is_create2: IsEqualGadget<F>,
5757
is_success: Cell<F>,
5858
was_warm: Cell<F>,
5959
value: Word32Cell<F>,
@@ -95,7 +95,7 @@ impl<F: Field, const IS_CREATE2: bool, const S: ExecutionState> ExecutionGadget<
9595
opcode.expr(),
9696
vec![OpcodeId::CREATE2.expr(), OpcodeId::CREATE.expr()],
9797
);
98-
let is_create2 = IsZeroGadget::construct(cb, opcode.expr() - OpcodeId::CREATE2.expr());
98+
let is_create2 = cb.is_eq(opcode.expr(), OpcodeId::CREATE2.expr());
9999

100100
// Use rw_counter of the step which triggers next call as its call_id.
101101
let callee_call_id = cb.curr.state.rw_counter.clone();
@@ -143,10 +143,9 @@ impl<F: Field, const IS_CREATE2: bool, const S: ExecutionState> ExecutionGadget<
143143
);
144144

145145
// Pre-check: call depth, user's nonce and user's balance
146-
let is_depth_in_range = LtGadget::construct(cb, depth.expr(), 1025.expr());
147-
let is_insufficient_balance =
148-
LtWordGadget::construct(cb, &caller_balance.to_word(), &value.to_word());
149-
let is_nonce_in_range = LtGadget::construct(cb, caller_nonce.expr(), u64::MAX.expr());
146+
let is_depth_in_range = cb.is_lt(depth.expr(), 1025.expr());
147+
let is_insufficient_balance = cb.is_lt_word(&caller_balance.to_word(), &value.to_word());
148+
let is_nonce_in_range = cb.is_lt(caller_nonce.expr(), u64::MAX.expr());
150149
let is_precheck_ok = and::expr([
151150
is_depth_in_range.expr(),
152151
not::expr(is_insufficient_balance.expr()),
@@ -169,7 +168,7 @@ impl<F: Field, const IS_CREATE2: bool, const S: ExecutionState> ExecutionGadget<
169168
);
170169
let gas_cost = GasCost::CREATE.expr() + memory_expansion.gas_cost() + keccak_gas_cost;
171170
let gas_remaining = cb.curr.state.gas_left.expr() - gas_cost.clone();
172-
let gas_left = ConstantDivisionGadget::construct(cb, gas_remaining.clone(), 64);
171+
let gas_left = cb.div_by_const(gas_remaining.clone(), 64);
173172
let callee_gas_left = gas_remaining - gas_left.quotient();
174173

175174
let was_warm = cb.query_bool();
@@ -209,7 +208,7 @@ impl<F: Field, const IS_CREATE2: bool, const S: ExecutionState> ExecutionGadget<
209208
// empty_code_hash_word))` to represent `(callee_nonce == 0 && (prev_code_hash_word
210209
// == 0 or prev_code_hash_word == empty_code_hash_word))`
211210
let prev_code_hash_word = prev_code_hash.to_word();
212-
let prev_code_hash_is_zero = IsZeroWordGadget::construct(cb, &prev_code_hash_word);
211+
let prev_code_hash_is_zero = cb.is_zero_word(&prev_code_hash_word);
213212
cb.condition(not::expr(prev_code_hash_is_zero.expr()), |cb| {
214213
cb.account_read(
215214
contract_addr.to_word(),
@@ -525,7 +524,8 @@ impl<F: Field, const IS_CREATE2: bool, const S: ExecutionState> ExecutionGadget<
525524
self.is_create2.assign(
526525
region,
527526
offset,
528-
F::from(opcode.as_u64()) - F::from(OpcodeId::CREATE2.as_u64()),
527+
F::from(opcode.as_u64()),
528+
F::from(OpcodeId::CREATE2.as_u64()),
529529
)?;
530530

531531
self.tx_id

zkevm-circuits/src/evm_circuit/execution/end_block.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::{
66
constraint_builder::{
77
ConstrainBuilderCommon, EVMConstraintBuilder, StepStateTransition, Transition::Same,
88
},
9-
math_gadget::{IsEqualGadget, IsZeroGadget},
9+
math_gadget::IsEqualGadget,
1010
not, CachedRegion, Cell,
1111
},
1212
witness::{Block, Call, ExecStep, Transaction},
@@ -22,7 +22,7 @@ use halo2_proofs::{circuit::Value, plonk::Error};
2222
pub(crate) struct EndBlockGadget<F> {
2323
total_txs: Cell<F>,
2424
total_txs_is_max_txs: IsEqualGadget<F>,
25-
is_empty_block: IsZeroGadget<F>,
25+
is_empty_block: IsEqualGadget<F>,
2626
max_rws: Cell<F>,
2727
max_txs: Cell<F>,
2828
}
@@ -36,10 +36,9 @@ impl<F: Field> ExecutionGadget<F> for EndBlockGadget<F> {
3636
let max_txs = cb.query_copy_cell();
3737
let max_rws = cb.query_copy_cell();
3838
let total_txs = cb.query_cell();
39-
let total_txs_is_max_txs = IsEqualGadget::construct(cb, total_txs.expr(), max_txs.expr());
39+
let total_txs_is_max_txs = cb.is_eq(total_txs.expr(), max_txs.expr());
4040
// Note that rw_counter starts at 1
41-
let is_empty_block =
42-
IsZeroGadget::construct(cb, cb.curr.state.rw_counter.clone().expr() - 1.expr());
41+
let is_empty_block = cb.is_eq(cb.curr.state.rw_counter.clone().expr(), 1.expr());
4342

4443
let total_rws_before_padding = cb.curr.state.rw_counter.clone().expr() - 1.expr()
4544
+ select::expr(
@@ -126,7 +125,7 @@ impl<F: Field> ExecutionGadget<F> for EndBlockGadget<F> {
126125
step: &ExecStep,
127126
) -> Result<(), Error> {
128127
self.is_empty_block
129-
.assign(region, offset, F::from(u64::from(step.rwc) - 1))?;
128+
.assign(region, offset, F::from(u64::from(step.rwc)), F::ONE)?;
130129
let max_rws = F::from(block.circuits_params.max_rws as u64);
131130
let max_rws_assigned = self.max_rws.assign(region, offset, Value::known(max_rws))?;
132131

zkevm-circuits/src/evm_circuit/execution/end_tx.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
6767
);
6868
let refund = cb.query_cell();
6969
cb.tx_refund_read(tx_id.expr(), WordLoHi::from_lo_unchecked(refund.expr()));
70-
let effective_refund = MinMaxGadget::construct(cb, max_refund.quotient(), refund.expr());
70+
let effective_refund = cb.min_max(max_refund.quotient(), refund.expr());
7171

7272
// Add effective_refund * tx_gas_price back to caller's balance
7373
let mul_gas_price_by_refund = MulWordByU64Gadget::construct(
@@ -85,7 +85,7 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
8585
// Add gas_used * effective_tip to coinbase's balance
8686
let coinbase = cb.query_word_unchecked();
8787
let coinbase_code_hash = cb.query_word_unchecked();
88-
let coinbase_code_hash_is_zero = IsZeroWordGadget::construct(cb, &coinbase_code_hash);
88+
let coinbase_code_hash_is_zero = cb.is_zero_word(&coinbase_code_hash);
8989
cb.account_read(
9090
coinbase.to_word(),
9191
AccountFieldTag::CodeHash,

zkevm-circuits/src/evm_circuit/execution/error_code_store.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ impl<F: Field> ExecutionGadget<F> for ErrorCodeStoreGadget<F> {
7272
);
7373

7474
// constrain code size > MAXCODESIZE
75-
let max_code_size_exceed =
76-
LtGadget::construct(cb, MAXCODESIZE.expr(), memory_address.length());
75+
let max_code_size_exceed = cb.is_lt(MAXCODESIZE.expr(), memory_address.length());
7776

7877
// check must be one of CodeStoreOutOfGas or MaxCodeSizeExceeded
7978
cb.require_in_set(

zkevm-circuits/src/evm_circuit/execution/error_invalid_creation_code.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ impl<F: Field> ExecutionGadget<F> for ErrorInvalidCreationCodeGadget<F> {
4646
cb.memory_lookup(0.expr(), memory_address.offset(), first_byte.expr(), None);
4747

4848
let is_first_byte_invalid =
49-
IsEqualGadget::construct(cb, first_byte.expr(), INVALID_INIT_CODE_FIRST_BYTE.expr());
49+
cb.is_eq(first_byte.expr(), INVALID_INIT_CODE_FIRST_BYTE.expr());
5050
cb.require_true(
5151
"is_first_byte_invalid is true",
5252
is_first_byte_invalid.expr(),

zkevm-circuits/src/evm_circuit/execution/error_invalid_jump.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,14 @@ impl<F: Field> ExecutionGadget<F> for ErrorInvalidJumpGadget<F> {
5454
vec![OpcodeId::JUMP.expr(), OpcodeId::JUMPI.expr()],
5555
);
5656

57-
let is_jumpi = IsEqualGadget::construct(cb, opcode.expr(), OpcodeId::JUMPI.expr());
57+
let is_jumpi = cb.is_eq(opcode.expr(), OpcodeId::JUMPI.expr());
5858

5959
// initialize is_jump_dest
60-
let is_jump_dest = IsEqualGadget::construct(cb, value.expr(), OpcodeId::JUMPDEST.expr());
60+
let is_jump_dest = cb.is_eq(value.expr(), OpcodeId::JUMPDEST.expr());
6161

6262
// first default this condition, if use will re-construct with real condition
6363
// value
64-
let is_condition_zero = IsZeroWordGadget::construct(cb, &condition);
64+
let is_condition_zero = cb.is_zero_word(&condition);
6565

6666
// Pop the value from the stack
6767
cb.stack_pop(dest.original_word().to_word());

zkevm-circuits/src/evm_circuit/execution/error_oog_account_access.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ impl<F: Field> ExecutionGadget<F> for ErrorOOGAccountAccessGadget<F> {
6262
GasCost::COLD_ACCOUNT_ACCESS.expr(),
6363
);
6464

65-
let insufficient_gas_cost =
66-
LtGadget::construct(cb, cb.curr.state.gas_left.expr(), gas_cost);
65+
let insufficient_gas_cost = cb.is_lt(cb.curr.state.gas_left.expr(), gas_cost);
6766

6867
cb.require_equal(
6968
"Gas left is less than gas cost",

zkevm-circuits/src/evm_circuit/execution/error_oog_call.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ impl<F: Field> ExecutionGadget<F> for ErrorOOGCallGadget<F> {
7979
let gas_cost = call_gadget.gas_cost_expr(is_warm.expr(), is_call.expr());
8080

8181
// Check if the amount of gas available is less than the amount of gas required
82-
let insufficient_gas = LtGadget::construct(cb, cb.curr.state.gas_left.expr(), gas_cost);
82+
let insufficient_gas = cb.is_lt(cb.curr.state.gas_left.expr(), gas_cost);
8383

8484
cb.require_equal(
8585
"Either Memory address is overflow or gas left is less than cost",

zkevm-circuits/src/evm_circuit/execution/error_oog_constant.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ impl<F: Field> ExecutionGadget<F> for ErrorOOGConstantGadget<F> {
3838
cb.constant_gas_lookup(opcode.expr(), gas_required.expr());
3939
// Check if the amount of gas available is less than the amount of gas
4040
// required
41-
let insufficient_gas =
42-
LtGadget::construct(cb, cb.curr.state.gas_left.expr(), gas_required.expr());
41+
let insufficient_gas = cb.is_lt(cb.curr.state.gas_left.expr(), gas_required.expr());
4342
cb.require_equal(
4443
"constant gas left is less than gas required ",
4544
insufficient_gas.expr(),

0 commit comments

Comments
 (0)