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

Commit 8e09a8d

Browse files
authored
fix ec recover (#750)
* try * 2 * v0.5.12rc2
1 parent 87cae11 commit 8e09a8d

File tree

4 files changed

+54
-15
lines changed

4 files changed

+54
-15
lines changed

bus-mapping/src/circuit_input_builder.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,14 @@ pub fn keccak_inputs(block: &Block, code_db: &CodeDB) -> Result<Vec<Vec<u8>>, Er
633633
"keccak total len after txs: {}",
634634
keccak_inputs.iter().map(|i| i.len()).sum::<usize>()
635635
);
636+
// Ec recover
637+
keccak_inputs.extend_from_slice(&keccak_inputs_sign_verify(
638+
&block.precompile_events.get_ecrecover_events(),
639+
));
640+
log::debug!(
641+
"keccak total len after ecrecover: {}",
642+
keccak_inputs.iter().map(|i| i.len()).sum::<usize>()
643+
);
636644
// PI circuit
637645
keccak_inputs.extend(keccak_inputs_pi_circuit(
638646
block.chain_id,

bus-mapping/src/evm/opcodes/precompiles/ecrecover.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use eth_types::{
22
sign_types::{recover_pk, SignData},
3-
Bytes, ToBigEndian,
3+
Bytes, ToBigEndian, ToLittleEndian,
44
};
55
use halo2_proofs::halo2curves::secp256k1::Fq;
66

@@ -33,13 +33,13 @@ pub(crate) fn opt_data(
3333
) {
3434
let sign_data = SignData {
3535
signature: (
36-
Fq::from_bytes(&aux_data.sig_r.to_be_bytes()).unwrap(),
37-
Fq::from_bytes(&aux_data.sig_s.to_be_bytes()).unwrap(),
36+
Fq::from_bytes(&aux_data.sig_r.to_le_bytes()).unwrap(),
37+
Fq::from_bytes(&aux_data.sig_s.to_le_bytes()).unwrap(),
3838
sig_v,
3939
),
4040
pk: recovered_pk,
4141
msg: Bytes::default(),
42-
msg_hash: Fq::from_bytes(&aux_data.msg_hash.to_be_bytes()).unwrap(),
42+
msg_hash: Fq::from_bytes(&aux_data.msg_hash.to_le_bytes()).unwrap(),
4343
};
4444
assert_eq!(aux_data.recovered_addr, sign_data.get_addr());
4545
(

zkevm-circuits/src/evm_circuit/execution/precompiles/ecrecover.rs

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
util::{
1212
common_gadget::RestoreContextGadget,
1313
constraint_builder::{ConstrainBuilderCommon, EVMConstraintBuilder},
14-
from_bytes, rlc, CachedRegion, Cell, RandomLinearCombination,
14+
from_bytes, rlc, CachedRegion, Cell, RandomLinearCombination, Word,
1515
},
1616
},
1717
table::CallContextFieldTag,
@@ -21,10 +21,13 @@ use crate::{
2121
#[derive(Clone, Debug)]
2222
pub struct EcrecoverGadget<F> {
2323
recovered: Cell<F>,
24-
msg_hash_rlc: Cell<F>,
2524
sig_v_rlc: Cell<F>,
25+
sig_r_word: Word<F>,
26+
sig_s_word: Word<F>,
27+
msg_hash_word: Word<F>,
2628
sig_r_rlc: Cell<F>,
2729
sig_s_rlc: Cell<F>,
30+
msg_hash_rlc: Cell<F>,
2831
recovered_addr_rlc: RandomLinearCombination<F, N_BYTES_ACCOUNT_ADDRESS>,
2932

3033
is_success: Cell<F>,
@@ -51,6 +54,24 @@ impl<F: Field> ExecutionGadget<F> for EcrecoverGadget<F> {
5154
cb.query_cell_phase2(),
5255
cb.query_keccak_rlc(),
5356
);
57+
let msg_hash_word: RandomLinearCombination<F, 32> = cb.query_word_rlc();
58+
let sig_s_word: RandomLinearCombination<F, 32> = cb.query_word_rlc();
59+
let sig_r_word: RandomLinearCombination<F, 32> = cb.query_word_rlc();
60+
cb.require_equal(
61+
"msg_hash_rlc",
62+
msg_hash_rlc.expr(),
63+
cb.keccak_rlc(msg_hash_word.cells.clone().map(|x| x.expr())),
64+
);
65+
cb.require_equal(
66+
"sig_r_rlc",
67+
sig_r_rlc.expr(),
68+
cb.keccak_rlc(sig_r_word.cells.clone().map(|x| x.expr())),
69+
);
70+
cb.require_equal(
71+
"sig_s_rlc",
72+
sig_s_rlc.expr(),
73+
cb.keccak_rlc(sig_s_word.cells.clone().map(|x| x.expr())),
74+
);
5475

5576
cb.condition(recovered.expr(), |cb| {
5677
// if address was recovered, the sig_v (recovery ID) was correct.
@@ -61,11 +82,12 @@ impl<F: Field> ExecutionGadget<F> for EcrecoverGadget<F> {
6182

6283
// lookup to the sign_verify table
6384
// || v | r | s | msg_hash | recovered_addr ||
85+
6486
cb.sig_table_lookup(
65-
msg_hash_rlc.expr(),
87+
cb.word_rlc(msg_hash_word.cells.clone().map(|x| x.expr())),
6688
sig_v_rlc.expr() - 27.expr(),
67-
sig_r_rlc.expr(),
68-
sig_s_rlc.expr(),
89+
cb.word_rlc(sig_r_word.cells.clone().map(|x| x.expr())),
90+
cb.word_rlc(sig_s_word.cells.clone().map(|x| x.expr())),
6991
from_bytes::expr(&recovered_addr_rlc.cells),
7092
);
7193
});
@@ -100,9 +122,12 @@ impl<F: Field> ExecutionGadget<F> for EcrecoverGadget<F> {
100122

101123
Self {
102124
recovered,
125+
msg_hash_word,
103126
msg_hash_rlc,
104127
sig_v_rlc,
128+
sig_r_word,
105129
sig_r_rlc,
130+
sig_s_word,
106131
sig_s_rlc,
107132
recovered_addr_rlc,
108133
is_success,
@@ -129,6 +154,8 @@ impl<F: Field> ExecutionGadget<F> for EcrecoverGadget<F> {
129154
let recovered = !aux_data.recovered_addr.is_zero();
130155
self.recovered
131156
.assign(region, offset, Value::known(F::from(recovered as u64)))?;
157+
self.msg_hash_word
158+
.assign(region, offset, Some(aux_data.msg_hash.to_le_bytes()))?;
132159
self.msg_hash_rlc.assign(
133160
region,
134161
offset,
@@ -145,6 +172,10 @@ impl<F: Field> ExecutionGadget<F> for EcrecoverGadget<F> {
145172
.keccak_input()
146173
.map(|r| rlc::value(&aux_data.sig_v.to_le_bytes(), r)),
147174
)?;
175+
self.sig_r_word
176+
.assign(region, offset, Some(aux_data.sig_r.to_le_bytes()))?;
177+
self.sig_s_word
178+
.assign(region, offset, Some(aux_data.sig_s.to_le_bytes()))?;
148179
self.sig_r_rlc.assign(
149180
region,
150181
offset,

zkevm-circuits/src/table.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2235,21 +2235,21 @@ impl SigTable {
22352235
let signatures: Vec<SignData> = block.get_sign_data(false);
22362236

22372237
for (offset, sign_data) in signatures.iter().enumerate() {
2238-
let msg_hash_rlc = challenges.keccak_input().map(|challenge| {
2238+
let msg_hash_rlc = challenges.evm_word().map(|challenge| {
22392239
rlc::value(
2240-
sign_data.msg_hash.to_bytes().iter().rev().collect_vec(),
2240+
sign_data.msg_hash.to_bytes().iter().collect_vec(),
22412241
challenge,
22422242
)
22432243
});
2244-
let sig_r_rlc = challenges.keccak_input().map(|challenge| {
2244+
let sig_r_rlc = challenges.evm_word().map(|challenge| {
22452245
rlc::value(
2246-
sign_data.signature.0.to_bytes().iter().rev().collect_vec(),
2246+
sign_data.signature.0.to_bytes().iter().collect_vec(),
22472247
challenge,
22482248
)
22492249
});
2250-
let sig_s_rlc = challenges.keccak_input().map(|challenge| {
2250+
let sig_s_rlc = challenges.evm_word().map(|challenge| {
22512251
rlc::value(
2252-
sign_data.signature.1.to_bytes().iter().rev().collect_vec(),
2252+
sign_data.signature.1.to_bytes().iter().collect_vec(),
22532253
challenge,
22542254
)
22552255
});

0 commit comments

Comments
 (0)