1
1
use std:: convert:: From ;
2
2
use std:: fmt;
3
- use std:: sync:: Arc ;
3
+ use std:: sync:: { Arc , LazyLock , Mutex } ;
4
4
5
5
use ark_ec:: short_weierstrass:: { Affine , Projective , SWCurveConfig } ;
6
6
use ark_ff:: { BigInt , PrimeField } ;
@@ -45,6 +45,39 @@ use crate::versioned_constants::GasCosts;
45
45
46
46
pub const CALL_CONTRACT_SELECTOR_NAME : & str = "call_contract" ;
47
47
pub const LIBRARY_CALL_SELECTOR_NAME : & str = "library_call" ;
48
+
49
+ pub static SYSCALL_COUNTER : LazyLock < Mutex < SyscallCounts > > =
50
+ LazyLock :: new ( || Mutex :: new ( SyscallCounts :: default ( ) ) ) ;
51
+
52
+ #[ derive( Default , Clone , Copy ) ]
53
+ pub struct SyscallCounts {
54
+ pub get_block_hash : u64 ,
55
+ pub get_execution_info : u64 ,
56
+ pub get_execution_info_v2 : u64 ,
57
+ pub deploy : u64 ,
58
+ pub replace_class : u64 ,
59
+ pub library_call : u64 ,
60
+ pub call_contract : u64 ,
61
+ pub storage_read : u64 ,
62
+ pub storage_write : u64 ,
63
+ pub emit_event : u64 ,
64
+ pub send_message_to_l1 : u64 ,
65
+ pub keccak : u64 ,
66
+ pub secp256k1_new : u64 ,
67
+ pub secp256k1_add : u64 ,
68
+ pub secp256k1_mul : u64 ,
69
+ pub secp256k1_get_point_from_x : u64 ,
70
+ pub secp256k1_get_xy : u64 ,
71
+ pub secp256r1_new : u64 ,
72
+ pub secp256r1_add : u64 ,
73
+ pub secp256r1_mul : u64 ,
74
+ pub secp256r1_get_point_from_x : u64 ,
75
+ pub secp256r1_get_xy : u64 ,
76
+ pub sha256_process_block : u64 ,
77
+ pub get_class_hash_at : u64 ,
78
+ pub meta_tx_v0 : u64 ,
79
+ }
80
+
48
81
pub struct NativeSyscallHandler < ' state > {
49
82
pub base : Box < SyscallHandlerBase < ' state > > ,
50
83
@@ -239,6 +272,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
239
272
block_number : u64 ,
240
273
remaining_gas : & mut u64 ,
241
274
) -> SyscallResult < Felt > {
275
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . get_block_hash += 1 ;
276
+
242
277
self . pre_execute_syscall (
243
278
remaining_gas,
244
279
self . gas_costs ( ) . syscalls . get_block_hash . base_syscall_cost ( ) ,
@@ -251,6 +286,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
251
286
}
252
287
253
288
fn get_execution_info ( & mut self , remaining_gas : & mut u64 ) -> SyscallResult < ExecutionInfo > {
289
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . get_execution_info += 1 ;
290
+
254
291
self . pre_execute_syscall (
255
292
remaining_gas,
256
293
self . gas_costs ( ) . syscalls . get_execution_info . base_syscall_cost ( ) ,
@@ -270,6 +307,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
270
307
contract_address : Felt ,
271
308
remaining_gas : & mut u64 ,
272
309
) -> SyscallResult < Felt > {
310
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . get_class_hash_at += 1 ;
311
+
273
312
self . pre_execute_syscall (
274
313
remaining_gas,
275
314
self . gas_costs ( ) . syscalls . get_class_hash_at . base_syscall_cost ( ) ,
@@ -285,6 +324,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
285
324
}
286
325
287
326
fn get_execution_info_v2 ( & mut self , remaining_gas : & mut u64 ) -> SyscallResult < ExecutionInfoV2 > {
327
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . get_execution_info_v2 += 1 ;
328
+
288
329
self . pre_execute_syscall (
289
330
remaining_gas,
290
331
self . gas_costs ( ) . syscalls . get_execution_info . base_syscall_cost ( ) ,
@@ -307,6 +348,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
307
348
deploy_from_zero : bool ,
308
349
remaining_gas : & mut u64 ,
309
350
) -> SyscallResult < ( Felt , Vec < Felt > ) > {
351
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . deploy += 1 ;
310
352
// The cost of deploying a contract is the base cost plus the linear cost of the calldata
311
353
// len.
312
354
let total_gas_cost =
@@ -330,6 +372,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
330
372
Ok ( ( Felt :: from ( deployed_contract_address) , constructor_retdata) )
331
373
}
332
374
fn replace_class ( & mut self , class_hash : Felt , remaining_gas : & mut u64 ) -> SyscallResult < ( ) > {
375
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . replace_class += 1 ;
333
376
self . pre_execute_syscall (
334
377
remaining_gas,
335
378
self . gas_costs ( ) . syscalls . replace_class . base_syscall_cost ( ) ,
@@ -348,6 +391,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
348
391
calldata : & [ Felt ] ,
349
392
remaining_gas : & mut u64 ,
350
393
) -> SyscallResult < Vec < Felt > > {
394
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . library_call += 1 ;
351
395
self . pre_execute_syscall (
352
396
remaining_gas,
353
397
self . gas_costs ( ) . syscalls . library_call . base_syscall_cost ( ) ,
@@ -392,6 +436,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
392
436
calldata : & [ Felt ] ,
393
437
remaining_gas : & mut u64 ,
394
438
) -> SyscallResult < Vec < Felt > > {
439
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . call_contract += 1 ;
440
+
395
441
self . pre_execute_syscall (
396
442
remaining_gas,
397
443
self . gas_costs ( ) . syscalls . call_contract . base_syscall_cost ( ) ,
@@ -448,6 +494,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
448
494
address : Felt ,
449
495
remaining_gas : & mut u64 ,
450
496
) -> SyscallResult < Felt > {
497
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . storage_read += 1 ;
498
+
451
499
self . pre_execute_syscall (
452
500
remaining_gas,
453
501
self . gas_costs ( ) . syscalls . storage_read . base_syscall_cost ( ) ,
@@ -473,6 +521,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
473
521
value : Felt ,
474
522
remaining_gas : & mut u64 ,
475
523
) -> SyscallResult < ( ) > {
524
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . storage_write += 1 ;
525
+
476
526
self . pre_execute_syscall (
477
527
remaining_gas,
478
528
self . gas_costs ( ) . syscalls . storage_write . base_syscall_cost ( ) ,
@@ -497,6 +547,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
497
547
data : & [ Felt ] ,
498
548
remaining_gas : & mut u64 ,
499
549
) -> SyscallResult < ( ) > {
550
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . emit_event += 1 ;
551
+
500
552
self . pre_execute_syscall (
501
553
remaining_gas,
502
554
self . gas_costs ( ) . syscalls . emit_event . base_syscall_cost ( ) ,
@@ -517,6 +569,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
517
569
payload : & [ Felt ] ,
518
570
remaining_gas : & mut u64 ,
519
571
) -> SyscallResult < ( ) > {
572
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . send_message_to_l1 += 1 ;
573
+
520
574
self . pre_execute_syscall (
521
575
remaining_gas,
522
576
self . gas_costs ( ) . syscalls . send_message_to_l1 . base_syscall_cost ( ) ,
@@ -530,6 +584,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
530
584
}
531
585
532
586
fn keccak ( & mut self , input : & [ u64 ] , remaining_gas : & mut u64 ) -> SyscallResult < U256 > {
587
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . keccak += 1 ;
588
+
533
589
self . pre_execute_syscall (
534
590
remaining_gas,
535
591
self . gas_costs ( ) . syscalls . keccak . base_syscall_cost ( ) ,
@@ -550,6 +606,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
550
606
y : U256 ,
551
607
remaining_gas : & mut u64 ,
552
608
) -> SyscallResult < Option < Secp256k1Point > > {
609
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256k1_new += 1 ;
610
+
553
611
self . pre_execute_syscall (
554
612
remaining_gas,
555
613
self . gas_costs ( ) . syscalls . secp256k1_new . base_syscall_cost ( ) ,
@@ -566,6 +624,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
566
624
p1 : Secp256k1Point ,
567
625
remaining_gas : & mut u64 ,
568
626
) -> SyscallResult < Secp256k1Point > {
627
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256k1_add += 1 ;
569
628
self . pre_execute_syscall (
570
629
remaining_gas,
571
630
self . gas_costs ( ) . syscalls . secp256k1_add . base_syscall_cost ( ) ,
@@ -580,6 +639,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
580
639
m : U256 ,
581
640
remaining_gas : & mut u64 ,
582
641
) -> SyscallResult < Secp256k1Point > {
642
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256k1_mul += 1 ;
643
+
583
644
self . pre_execute_syscall (
584
645
remaining_gas,
585
646
self . gas_costs ( ) . syscalls . secp256k1_mul . base_syscall_cost ( ) ,
@@ -594,6 +655,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
594
655
y_parity : bool ,
595
656
remaining_gas : & mut u64 ,
596
657
) -> SyscallResult < Option < Secp256k1Point > > {
658
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256k1_get_point_from_x += 1 ;
659
+
597
660
self . pre_execute_syscall (
598
661
remaining_gas,
599
662
self . gas_costs ( ) . syscalls . secp256k1_get_point_from_x . base_syscall_cost ( ) ,
@@ -609,6 +672,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
609
672
p : Secp256k1Point ,
610
673
remaining_gas : & mut u64 ,
611
674
) -> SyscallResult < ( U256 , U256 ) > {
675
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256k1_get_xy += 1 ;
612
676
self . pre_execute_syscall (
613
677
remaining_gas,
614
678
self . gas_costs ( ) . syscalls . secp256k1_get_xy . base_syscall_cost ( ) ,
@@ -623,6 +687,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
623
687
y : U256 ,
624
688
remaining_gas : & mut u64 ,
625
689
) -> SyscallResult < Option < Secp256r1Point > > {
690
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256r1_new += 1 ;
691
+
626
692
self . pre_execute_syscall (
627
693
remaining_gas,
628
694
self . gas_costs ( ) . syscalls . secp256r1_new . base_syscall_cost ( ) ,
@@ -639,6 +705,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
639
705
p1 : Secp256r1Point ,
640
706
remaining_gas : & mut u64 ,
641
707
) -> SyscallResult < Secp256r1Point > {
708
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256r1_add += 1 ;
709
+
642
710
self . pre_execute_syscall (
643
711
remaining_gas,
644
712
self . gas_costs ( ) . syscalls . secp256r1_add . base_syscall_cost ( ) ,
@@ -652,6 +720,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
652
720
m : U256 ,
653
721
remaining_gas : & mut u64 ,
654
722
) -> SyscallResult < Secp256r1Point > {
723
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256r1_mul += 1 ;
724
+
655
725
self . pre_execute_syscall (
656
726
remaining_gas,
657
727
self . gas_costs ( ) . syscalls . secp256r1_mul . base_syscall_cost ( ) ,
@@ -666,6 +736,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
666
736
y_parity : bool ,
667
737
remaining_gas : & mut u64 ,
668
738
) -> SyscallResult < Option < Secp256r1Point > > {
739
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256r1_get_point_from_x += 1 ;
740
+
669
741
self . pre_execute_syscall (
670
742
remaining_gas,
671
743
self . gas_costs ( ) . syscalls . secp256r1_get_point_from_x . base_syscall_cost ( ) ,
@@ -681,6 +753,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
681
753
p : Secp256r1Point ,
682
754
remaining_gas : & mut u64 ,
683
755
) -> SyscallResult < ( U256 , U256 ) > {
756
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256r1_get_xy += 1 ;
757
+
684
758
self . pre_execute_syscall (
685
759
remaining_gas,
686
760
self . gas_costs ( ) . syscalls . secp256r1_get_xy . base_syscall_cost ( ) ,
@@ -695,6 +769,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
695
769
current_block : & [ u32 ; 16 ] ,
696
770
remaining_gas : & mut u64 ,
697
771
) -> SyscallResult < ( ) > {
772
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . sha256_process_block += 1 ;
773
+
698
774
self . pre_execute_syscall (
699
775
remaining_gas,
700
776
self . gas_costs ( ) . syscalls . sha256_process_block . base_syscall_cost ( ) ,
@@ -720,6 +796,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
720
796
signature : & [ Felt ] ,
721
797
remaining_gas : & mut u64 ,
722
798
) -> SyscallResult < Vec < Felt > > {
799
+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . meta_tx_v0 += 1 ;
723
800
todo ! (
724
801
"implement meta_tx_v0 {:?}" ,
725
802
( address, entry_point_selector, calldata, signature, remaining_gas)
0 commit comments