2
2
3
3
use bus_mapping:: circuit_input_builder:: BuilderClient ;
4
4
use bus_mapping:: operation:: OperationContainer ;
5
- use halo2_proofs:: dev:: MockProver ;
6
- use integration_tests:: { get_client, log_init, GenDataOutput } ;
5
+ use eth_types:: geth_types;
6
+ use group:: { Curve , Group } ;
7
+ use halo2_proofs:: arithmetic:: BaseExt ;
8
+ use halo2_proofs:: {
9
+ arithmetic:: { CurveAffine , Field } ,
10
+ dev:: MockProver ,
11
+ pairing:: bn256:: Fr ,
12
+ } ;
13
+ use integration_tests:: { get_client, log_init, GenDataOutput , CHAIN_ID } ;
7
14
use lazy_static:: lazy_static;
8
15
use log:: trace;
16
+ use paste:: paste;
17
+ use rand_chacha:: rand_core:: SeedableRng ;
18
+ use rand_chacha:: ChaCha20Rng ;
19
+ use std:: marker:: PhantomData ;
20
+ use zkevm_circuits:: bytecode_circuit:: dev:: test_bytecode_circuit;
21
+ use zkevm_circuits:: copy_circuit:: dev:: test_copy_circuit;
9
22
use zkevm_circuits:: evm_circuit:: witness:: RwMap ;
10
23
use zkevm_circuits:: evm_circuit:: { test:: run_test_circuit, witness:: block_convert} ;
11
24
use zkevm_circuits:: state_circuit:: StateCircuit ;
25
+ use zkevm_circuits:: tx_circuit:: {
26
+ sign_verify:: SignVerifyChip , Secp256k1Affine , TxCircuit , POW_RAND_SIZE , VERIF_HEIGHT ,
27
+ } ;
12
28
13
29
lazy_static ! {
14
30
pub static ref GEN_DATA : GenDataOutput = GenDataOutput :: load( ) ;
@@ -18,19 +34,17 @@ async fn test_evm_circuit_block(block_num: u64) {
18
34
log:: info!( "test evm circuit, block number: {}" , block_num) ;
19
35
let cli = get_client ( ) ;
20
36
let cli = BuilderClient :: new ( cli) . await . unwrap ( ) ;
21
- let builder = cli. gen_inputs ( block_num) . await . unwrap ( ) ;
37
+ let ( builder, _ ) = cli. gen_inputs ( block_num) . await . unwrap ( ) ;
22
38
23
39
let block = block_convert ( & builder. block , & builder. code_db ) ;
24
40
run_test_circuit ( block) . expect ( "evm_circuit verification failed" ) ;
25
41
}
26
42
27
43
async fn test_state_circuit_block ( block_num : u64 ) {
28
- use halo2_proofs:: pairing:: bn256:: Fr ;
29
-
30
44
log:: info!( "test state circuit, block number: {}" , block_num) ;
31
45
let cli = get_client ( ) ;
32
46
let cli = BuilderClient :: new ( cli) . await . unwrap ( ) ;
33
- let builder = cli. gen_inputs ( block_num) . await . unwrap ( ) ;
47
+ let ( builder, _ ) = cli. gen_inputs ( block_num) . await . unwrap ( ) ;
34
48
35
49
// Generate state proof
36
50
let stack_ops = builder. block . container . sorted_stack ( ) ;
@@ -58,20 +72,108 @@ async fn test_state_circuit_block(block_num: u64) {
58
72
prover. verify ( ) . expect ( "state_circuit verification failed" ) ;
59
73
}
60
74
75
+ async fn test_tx_circuit_block ( block_num : u64 ) {
76
+ const DEGREE : u32 = 20 ;
77
+
78
+ log:: info!( "test tx circuit, block number: {}" , block_num) ;
79
+ let cli = get_client ( ) ;
80
+ let cli = BuilderClient :: new ( cli) . await . unwrap ( ) ;
81
+
82
+ let ( _, eth_block) = cli. gen_inputs ( block_num) . await . unwrap ( ) ;
83
+ let txs: Vec < _ > = eth_block
84
+ . transactions
85
+ . iter ( )
86
+ . map ( geth_types:: Transaction :: from_eth_tx)
87
+ . collect ( ) ;
88
+
89
+ let mut rng = ChaCha20Rng :: seed_from_u64 ( 2 ) ;
90
+ let aux_generator = <Secp256k1Affine as CurveAffine >:: CurveExt :: random ( & mut rng) . to_affine ( ) ;
91
+
92
+ let randomness = Fr :: random ( & mut rng) ;
93
+ let mut instance: Vec < Vec < Fr > > = ( 1 ..POW_RAND_SIZE + 1 )
94
+ . map ( |exp| vec ! [ randomness. pow( & [ exp as u64 , 0 , 0 , 0 ] ) ; txs. len( ) * VERIF_HEIGHT ] )
95
+ . collect ( ) ;
96
+
97
+ instance. push ( vec ! [ ] ) ;
98
+ let circuit = TxCircuit :: < Fr , 4 , { 4 * ( 4 + 32 + 32 ) } > {
99
+ sign_verify : SignVerifyChip {
100
+ aux_generator,
101
+ window_size : 2 ,
102
+ _marker : PhantomData ,
103
+ } ,
104
+ randomness,
105
+ txs,
106
+ chain_id : CHAIN_ID ,
107
+ } ;
108
+
109
+ let prover = MockProver :: run ( DEGREE , & circuit, instance) . unwrap ( ) ;
110
+
111
+ prover. verify ( ) . expect ( "tx_circuit verification failed" ) ;
112
+ }
113
+
114
+ pub async fn test_bytecode_circuit_block ( block_num : u64 ) {
115
+ const DEGREE : u32 = 16 ;
116
+ let randomness = Fr :: from ( 123456 ) ;
117
+
118
+ log:: info!( "test bytecode circuit, block number: {}" , block_num) ;
119
+ let cli = get_client ( ) ;
120
+ let cli = BuilderClient :: new ( cli) . await . unwrap ( ) ;
121
+ let ( builder, _) = cli. gen_inputs ( block_num) . await . unwrap ( ) ;
122
+ let bytecodes: Vec < Vec < u8 > > = builder. code_db . 0 . values ( ) . cloned ( ) . collect ( ) ;
123
+
124
+ test_bytecode_circuit ( DEGREE , bytecodes, randomness) ;
125
+ }
126
+
127
+ pub async fn test_copy_circuit_block ( block_num : u64 ) {
128
+ const DEGREE : u32 = 16 ;
129
+
130
+ log:: info!( "test copy circuit, block number: {}" , block_num) ;
131
+ let cli = get_client ( ) ;
132
+ let cli = BuilderClient :: new ( cli) . await . unwrap ( ) ;
133
+ let ( builder, _) = cli. gen_inputs ( block_num) . await . unwrap ( ) ;
134
+ let block = block_convert ( & builder. block , & builder. code_db ) ;
135
+
136
+ assert ! ( test_copy_circuit( DEGREE , block) . is_ok( ) ) ;
137
+ }
138
+
61
139
macro_rules! declare_tests {
62
- ( $test_evm_name: ident, $test_state_name: ident, $block_tag: expr) => {
63
- #[ tokio:: test]
64
- async fn $test_evm_name( ) {
65
- log_init( ) ;
66
- let block_num = GEN_DATA . blocks. get( $block_tag) . unwrap( ) ;
67
- test_evm_circuit_block( * block_num) . await ;
68
- }
140
+ ( $name: ident, $block_tag: expr) => {
141
+ paste! {
142
+ #[ tokio:: test]
143
+ async fn [ <serial_test_evm_ $name>] ( ) {
144
+ log_init( ) ;
145
+ let block_num = GEN_DATA . blocks. get( $block_tag) . unwrap( ) ;
146
+ test_evm_circuit_block( * block_num) . await ;
147
+ }
148
+
149
+ #[ tokio:: test]
150
+ async fn [ <serial_test_state_ $name>] ( ) {
151
+ log_init( ) ;
152
+ let block_num = GEN_DATA . blocks. get( $block_tag) . unwrap( ) ;
153
+ test_state_circuit_block( * block_num) . await ;
154
+ }
155
+
156
+ #[ tokio:: test]
157
+ async fn [ <serial_test_tx_ $name>] ( ) {
158
+ log_init( ) ;
159
+ let block_num = GEN_DATA . blocks. get( $block_tag) . unwrap( ) ;
160
+ test_tx_circuit_block( * block_num) . await ;
161
+ }
162
+
163
+ #[ tokio:: test]
164
+ async fn [ <serial_test_bytecode_ $name>] ( ) {
165
+ log_init( ) ;
166
+ let block_num = GEN_DATA . blocks. get( $block_tag) . unwrap( ) ;
167
+ test_bytecode_circuit_block( * block_num) . await ;
168
+ }
169
+
170
+ #[ tokio:: test]
171
+ async fn [ <serial_test_copy_ $name>] ( ) {
172
+ log_init( ) ;
173
+ let block_num = GEN_DATA . blocks. get( $block_tag) . unwrap( ) ;
174
+ test_copy_circuit_block( * block_num) . await ;
175
+ }
69
176
70
- #[ tokio:: test]
71
- async fn $test_state_name( ) {
72
- log_init( ) ;
73
- let block_num = GEN_DATA . blocks. get( $block_tag) . unwrap( ) ;
74
- test_state_circuit_block( * block_num) . await ;
75
177
}
76
178
} ;
77
179
}
@@ -94,17 +196,14 @@ declare_tests!(
94
196
);
95
197
*/
96
198
declare_tests ! (
97
- test_evm_circuit_erc20_openzeppelin_transfer_fail,
98
- test_state_circuit_erc20_openzeppelin_transfer_fail,
199
+ circuit_erc20_openzeppelin_transfer_fail,
99
200
"ERC20 OpenZeppelin transfer failed"
100
201
) ;
101
202
declare_tests ! (
102
- test_evm_circuit_erc20_openzeppelin_transfer_succeed,
103
- test_state_circuit_erc20_openzeppelin_transfer_succeed,
203
+ circuit_erc20_openzeppelin_transfer_succeed,
104
204
"ERC20 OpenZeppelin transfer successful"
105
205
) ;
106
206
declare_tests ! (
107
- test_evm_circuit_multiple_erc20_openzeppelin_transfers,
108
- test_state_circuit_multiple_erc20_openzeppelin_transfers,
207
+ circuit_multiple_erc20_openzeppelin_transfers,
109
208
"Multiple ERC20 OpenZeppelin transfers"
110
209
) ;
0 commit comments