@@ -6,7 +6,7 @@ use database::NetworkDatabase;
66use indexmap:: IndexSet ;
77use openssl:: rsa:: Rsa ;
88use ssv_types:: {
9- Cluster , ClusterId , OperatorId , Share , ValidatorIndex , ValidatorMetadata , ENCRYPTED_KEY_LENGTH ,
9+ Cluster , ClusterId , Operator , OperatorId , Share , ValidatorIndex , ValidatorMetadata , ENCRYPTED_KEY_LENGTH ,
1010} ;
1111use ssz:: Decode ;
1212use std:: { path:: Path , sync:: OnceLock } ;
@@ -46,24 +46,51 @@ static RSA_KEY: OnceLock<Rsa<openssl::pkey::Public>> = OnceLock::new();
4646
4747#[ derive( Arbitrary , Debug ) ]
4848enum DbAction {
49- InsertValidator ,
50- UpdateStatus ( bool ) ,
51- DeleteValidator ,
52- BumpNonce ,
49+ InsertValidator {
50+ cluster_id : [ u8 ; 32 ] ,
51+ owner : [ u8 ; 20 ] ,
52+ fee_recipient : [ u8 ; 20 ] ,
53+ liquidated : bool ,
54+ validator_pubkey : [ u8 ; 48 ] ,
55+ share_pubkey : [ u8 ; 48 ] ,
56+ operator_id : u64 ,
57+ encrypted_private_key : [ u8 ; ENCRYPTED_KEY_LENGTH ] ,
58+ validator_index : usize ,
59+ graffiti : [ u8 ; 32 ] ,
60+ } ,
61+ UpdateStatus {
62+ cluster_id : [ u8 ; 32 ] ,
63+ status : bool ,
64+ } ,
65+ DeleteValidator {
66+ validator_pubkey : [ u8 ; 48 ] ,
67+ } ,
68+ BumpNonce {
69+ owner : [ u8 ; 20 ] ,
70+ } ,
71+ InsertOperator {
72+ operator_id : u64 ,
73+ owner : [ u8 ; 20 ] ,
74+ } ,
75+ DeleteOperator {
76+ operator_id : u64 ,
77+ } ,
78+ UpdateFeeRecipient {
79+ owner : [ u8 ; 20 ] ,
80+ fee_recipient : [ u8 ; 20 ] ,
81+ } ,
82+ UpdateGraffiti {
83+ validator_pubkey : [ u8 ; 48 ] ,
84+ graffiti : [ u8 ; 32 ] ,
85+ } ,
86+ SetValidatorIndices {
87+ validator_pubkey : [ u8 ; 48 ] ,
88+ index : Option < usize > ,
89+ } ,
5390}
5491
5592#[ derive( Arbitrary , Debug ) ]
5693struct FuzzData {
57- cluster_id : [ u8 ; 32 ] ,
58- owner : [ u8 ; 20 ] ,
59- fee_recipient : [ u8 ; 20 ] ,
60- liquidated : bool ,
61- validator_pubkey : [ u8 ; 48 ] ,
62- share_pubkey : [ u8 ; 48 ] ,
63- operator_id : u64 ,
64- encrypted_private_key : [ u8 ; ENCRYPTED_KEY_LENGTH ] ,
65- validator_index : usize ,
66- graffiti : [ u8 ; 32 ] ,
6794 actions : Vec < DbAction > ,
6895}
6996
@@ -92,40 +119,6 @@ fn fuzz_with_data(fuzz: FuzzData) {
92119 return ;
93120 } ;
94121
95- // Create test data with correct types
96- let mut cluster_members = IndexSet :: new ( ) ;
97- cluster_members. insert ( OperatorId ( fuzz. operator_id ) ) ;
98-
99- let Ok ( validator_pk) = PublicKeyBytes :: from_ssz_bytes ( & fuzz. validator_pubkey ) else {
100- return ;
101- } ;
102- let Ok ( share_pk) = PublicKeyBytes :: from_ssz_bytes ( & fuzz. share_pubkey ) else {
103- return ;
104- } ;
105-
106- let cluster = Cluster {
107- cluster_id : ClusterId ( fuzz. cluster_id ) ,
108- owner : Address :: from ( fuzz. owner ) ,
109- fee_recipient : Address :: from ( fuzz. fee_recipient ) ,
110- liquidated : fuzz. liquidated ,
111- cluster_members,
112- } ;
113-
114- let validator = ValidatorMetadata {
115- public_key : validator_pk,
116- cluster_id : ClusterId ( fuzz. cluster_id ) ,
117- index : Some ( ValidatorIndex ( fuzz. validator_index ) ) ,
118- graffiti : Graffiti ( fuzz. graffiti ) ,
119- } ;
120-
121- let share = Share {
122- validator_pubkey : validator_pk,
123- operator_id : OperatorId ( fuzz. operator_id ) ,
124- cluster_id : ClusterId ( fuzz. cluster_id ) ,
125- share_pubkey : share_pk,
126- encrypted_private_key : fuzz. encrypted_private_key ,
127- } ;
128-
129122 for action in fuzz. actions {
130123 let Ok ( conn) = old. connection ( ) else {
131124 return ;
@@ -135,17 +128,94 @@ fn fuzz_with_data(fuzz: FuzzData) {
135128 } ;
136129
137130 match action {
138- DbAction :: InsertValidator => {
139- let _ = old. insert_validator ( cluster. clone ( ) , & validator, vec ! [ share. clone( ) ] , & tx) ;
131+ DbAction :: InsertValidator {
132+ cluster_id,
133+ owner,
134+ fee_recipient,
135+ liquidated,
136+ validator_pubkey,
137+ share_pubkey,
138+ operator_id,
139+ encrypted_private_key,
140+ validator_index,
141+ graffiti,
142+ } => {
143+ let Ok ( validator_pk) = PublicKeyBytes :: from_ssz_bytes ( & validator_pubkey) else {
144+ continue ;
145+ } ;
146+ let Ok ( share_pk) = PublicKeyBytes :: from_ssz_bytes ( & share_pubkey) else {
147+ continue ;
148+ } ;
149+
150+ let mut cluster_members = IndexSet :: new ( ) ;
151+ cluster_members. insert ( OperatorId ( operator_id) ) ;
152+
153+ let cluster = Cluster {
154+ cluster_id : ClusterId ( cluster_id) ,
155+ owner : Address :: from ( owner) ,
156+ fee_recipient : Address :: from ( fee_recipient) ,
157+ liquidated,
158+ cluster_members,
159+ } ;
160+
161+ let validator = ValidatorMetadata {
162+ public_key : validator_pk,
163+ cluster_id : ClusterId ( cluster_id) ,
164+ index : Some ( ValidatorIndex ( validator_index) ) ,
165+ graffiti : Graffiti ( graffiti) ,
166+ } ;
167+
168+ let share = Share {
169+ validator_pubkey : validator_pk,
170+ operator_id : OperatorId ( operator_id) ,
171+ cluster_id : ClusterId ( cluster_id) ,
172+ share_pubkey : share_pk,
173+ encrypted_private_key,
174+ } ;
175+
176+ let _ = old. insert_validator ( cluster, & validator, vec ! [ share] , & tx) ;
177+ }
178+ DbAction :: UpdateStatus { cluster_id, status } => {
179+ let _ = old. update_status ( ClusterId ( cluster_id) , status, & tx) ;
140180 }
141- DbAction :: UpdateStatus ( status) => {
142- let _ = old. update_status ( ClusterId ( fuzz. cluster_id ) , status, & tx) ;
181+ DbAction :: DeleteValidator { validator_pubkey } => {
182+ let Ok ( validator_pk) = PublicKeyBytes :: from_ssz_bytes ( & validator_pubkey) else {
183+ continue ;
184+ } ;
185+ let _ = old. delete_validator ( & validator_pk, & tx) ;
143186 }
144- DbAction :: DeleteValidator => {
145- let _ = old. delete_validator ( & validator . public_key , & tx) ;
187+ DbAction :: BumpNonce { owner } => {
188+ let _ = old. bump_and_get_nonce ( & Address :: from ( owner ) , & tx) ;
146189 }
147- DbAction :: BumpNonce => {
148- let _ = old. bump_and_get_nonce ( & cluster. owner , & tx) ;
190+ DbAction :: InsertOperator { operator_id, owner } => {
191+ let operator = Operator {
192+ id : OperatorId ( operator_id) ,
193+ rsa_pubkey : rsa_key. clone ( ) ,
194+ owner : Address :: from ( owner) ,
195+ } ;
196+ let _ = old. insert_operator ( & operator, & tx) ;
197+ }
198+ DbAction :: DeleteOperator { operator_id } => {
199+ let _ = old. delete_operator ( OperatorId ( operator_id) , & tx) ;
200+ }
201+ DbAction :: UpdateFeeRecipient { owner, fee_recipient } => {
202+ let _ = old. update_fee_recipient ( Address :: from ( owner) , Address :: from ( fee_recipient) , & tx) ;
203+ }
204+ DbAction :: UpdateGraffiti { validator_pubkey, graffiti } => {
205+ if let Ok ( validator_pk) = PublicKeyBytes :: from_ssz_bytes ( & validator_pubkey) {
206+ let _ = old. update_graffiti ( & validator_pk, Graffiti ( graffiti) , & tx) ;
207+ } ;
208+ }
209+ DbAction :: SetValidatorIndices { validator_pubkey, index } => {
210+ if let Ok ( validator_pk) = PublicKeyBytes :: from_ssz_bytes ( & validator_pubkey) {
211+ if let Some ( idx) = index {
212+ let mut map = std:: collections:: HashMap :: new ( ) ;
213+ map. insert ( validator_pk, ValidatorIndex ( idx) ) ;
214+ let _ = old. set_validator_indices ( map) ;
215+ continue ;
216+ } ;
217+ } ;
218+
149219 }
150220 }
151221
@@ -186,4 +256,4 @@ fn main() {
186256 } ;
187257 fuzz_with_data( fuzz) ;
188258 } ) ;
189- }
259+ }
0 commit comments