Skip to content
This repository was archived by the owner on Apr 18, 2025. It is now read-only.

Commit 30f821e

Browse files
bug: fix callee address of hi-lo in CALL OP (for testool cases) (#1055)
* Fix callee address in CALL_OP for testool cases. * Fix callee address in CALL_OP for testool cases. * Add a word cell for callee address. * Update * fix callee_address construction --------- Co-authored-by: Dream Wu <[email protected]>
1 parent d6066da commit 30f821e

File tree

2 files changed

+33
-15
lines changed

2 files changed

+33
-15
lines changed

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

+13-5
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use bus_mapping::{
3434
};
3535
use eth_types::{
3636
evm_types::{memory::MemoryWordRange, GAS_STIPEND_CALL_WITH_VALUE},
37-
Field, ToAddress, ToBigEndian, ToScalar, U256,
37+
Field, ToAddress, ToBigEndian, ToScalar, ToWord, U256,
3838
};
3939
use halo2_proofs::{
4040
circuit::Value,
@@ -987,10 +987,18 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
987987
(is_precompiled_call, precompile_addr)
988988
};
989989
let code_address = callee_address;
990-
self.is_code_address_zero
991-
.assign_u256(region, offset, code_address)?;
992-
self.is_precompile_lt
993-
.assign(region, offset, code_address, 0x0Au64.into())?;
990+
self.is_code_address_zero.assign_value(
991+
region,
992+
offset,
993+
Value::known(Word::from(code_address.to_address())),
994+
)?;
995+
self.is_precompile_lt.assign(
996+
region,
997+
offset,
998+
callee_address.to_address().to_word(),
999+
0x0Au64.into(),
1000+
)?;
1001+
9941002
log::trace!("callop is precompile call {}", is_precompile_call);
9951003
let precompile_return_length = if is_precompile_call && is_precheck_ok {
9961004
rws.offset_add(14); // skip

zkevm-circuits/src/evm_circuit/util/common_gadget.rs

+20-10
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use super::{
33
from_bytes,
44
math_gadget::{IsEqualWordGadget, IsZeroGadget, IsZeroWordGadget, LtGadget},
55
memory_gadget::{CommonMemoryAddressGadget, MemoryExpansionGadget},
6-
AccountAddress, CachedRegion,
6+
CachedRegion,
77
};
88
use crate::{
99
evm_circuit::{
@@ -28,7 +28,7 @@ use crate::{
2828
};
2929
use bus_mapping::state_db::CodeDB;
3030
use either::Either;
31-
use eth_types::{evm_types::GasCost, Field, ToAddress, ToLittleEndian, ToScalar, ToWord, U256};
31+
use eth_types::{evm_types::GasCost, Field, ToLittleEndian, ToScalar, ToWord, U256};
3232
use gadgets::util::{select, sum};
3333
use halo2_proofs::{
3434
circuit::Value,
@@ -1052,7 +1052,7 @@ pub(crate) struct CommonCallGadget<F, MemAddrGadget, const IS_SUCCESS_CALL: bool
10521052

10531053
pub gas: Word32Cell<F>,
10541054
pub gas_is_u64: IsZeroGadget<F>,
1055-
pub callee_address: AccountAddress<F>,
1055+
pub callee_address_word: Word32Cell<F>,
10561056
pub value: Word32Cell<F>,
10571057
pub cd_address: MemAddrGadget,
10581058
pub rd_address: MemAddrGadget,
@@ -1093,7 +1093,7 @@ impl<F: Field, MemAddrGadget: CommonMemoryAddressGadget<F>, const IS_SUCCESS_CAL
10931093
);
10941094

10951095
let gas_word = cb.query_word32();
1096-
let callee_address = cb.query_account_address();
1096+
let callee_address_word = cb.query_word32();
10971097
let value = cb.query_word32();
10981098
let is_success = cb.query_bool();
10991099

@@ -1109,7 +1109,7 @@ impl<F: Field, MemAddrGadget: CommonMemoryAddressGadget<F>, const IS_SUCCESS_CAL
11091109
// For both CALL and STATICCALL, caller address is
11101110
// `current_callee_address` and callee address is `callee_address`.
11111111
cb.stack_pop(gas_word.to_word());
1112-
cb.stack_pop(callee_address.to_word());
1112+
cb.stack_pop(callee_address_word.to_word());
11131113

11141114
// `CALL` and `CALLCODE` opcodes have an additional stack pop `value`.
11151115
cb.condition(is_call.clone() + is_callcode.clone(), |cb| {
@@ -1142,8 +1142,10 @@ impl<F: Field, MemAddrGadget: CommonMemoryAddressGadget<F>, const IS_SUCCESS_CAL
11421142
);
11431143

11441144
let callee_code_hash = cb.query_word_unchecked();
1145+
let callee_address_normal = Self::callee_address_valid(&callee_address_word);
1146+
11451147
cb.account_read(
1146-
callee_address.to_word(),
1148+
callee_address_normal,
11471149
AccountFieldTag::CodeHash,
11481150
callee_code_hash.to_word(),
11491151
);
@@ -1154,7 +1156,7 @@ impl<F: Field, MemAddrGadget: CommonMemoryAddressGadget<F>, const IS_SUCCESS_CAL
11541156

11551157
Self {
11561158
is_success,
1157-
callee_address,
1159+
callee_address_word,
11581160
gas: gas_word,
11591161
gas_is_u64,
11601162
value,
@@ -1175,7 +1177,14 @@ impl<F: Field, MemAddrGadget: CommonMemoryAddressGadget<F>, const IS_SUCCESS_CAL
11751177
}
11761178

11771179
pub fn callee_address(&self) -> Word<Expression<F>> {
1178-
self.callee_address.to_word()
1180+
Self::callee_address_valid(&self.callee_address_word)
1181+
}
1182+
1183+
pub fn callee_address_valid(callee_address_word: &Word32Cell<F>) -> Word<Expression<F>> {
1184+
let limbs: [Expression<F>; 32] = callee_address_word.limbs.clone().map(|l| l.expr());
1185+
let callee_address_lo = from_bytes::expr(&limbs[0..16]);
1186+
let callee_address_hi = from_bytes::expr(&limbs[16..20]);
1187+
Word::new([callee_address_lo, callee_address_hi])
11791188
}
11801189

11811190
pub fn gas_expr(&self) -> Expression<F> {
@@ -1216,8 +1225,9 @@ impl<F: Field, MemAddrGadget: CommonMemoryAddressGadget<F>, const IS_SUCCESS_CAL
12161225
callee_code_hash: U256,
12171226
) -> Result<u64, Error> {
12181227
self.gas.assign_u256(region, offset, gas)?;
1219-
self.callee_address
1220-
.assign_h160(region, offset, callee_address.to_address())?;
1228+
self.callee_address_word
1229+
.assign_u256(region, offset, callee_address)?;
1230+
12211231
self.value.assign_u256(region, offset, value)?;
12221232
if IS_SUCCESS_CALL {
12231233
self.is_success

0 commit comments

Comments
 (0)