@@ -180,6 +180,7 @@ type httpOkProofs struct {
180180}
181181
182182type httpOkValBlocks struct {
183+ ValidatorIndex uint64 `json:"validator_index"`
183184 ProposedBlocks []oracle.Block `json:"proposed_blocks"`
184185 MissedBlocks []oracle.Block `json:"missed_blocks"`
185186 WrongFeeBlocks []oracle.Block `json:"wrong_fee_blocks"`
@@ -322,46 +323,69 @@ func (m *ApiService) handleMemoryValidatorBlocks(w http.ResponseWriter, r *http.
322323 missedBlocks := oracleState .MissedBlocks
323324 wrongFeeBlocks := oracleState .WrongFeeBlocks
324325
325- // Sort the blocks by ValidatorKey
326- sort .Slice (proposedBlocks , func (i , j int ) bool {
327- return proposedBlocks [i ].ValidatorKey < proposedBlocks [j ].ValidatorKey
328- })
329- sort .Slice (missedBlocks , func (i , j int ) bool {
330- return missedBlocks [i ].ValidatorKey < missedBlocks [j ].ValidatorKey
331- })
332- sort .Slice (wrongFeeBlocks , func (i , j int ) bool {
333- return wrongFeeBlocks [i ].ValidatorKey < wrongFeeBlocks [j ].ValidatorKey
334- })
335-
336- // Create a map to hold the ordered blocks, with the ValidatorKey as the key
337- orderedBlocks := make (map [string ]* httpOkValBlocks )
326+ // Create a map to hold the ordered blocks, with the ValidatorIndex as the key
327+ orderedBlocks := make (map [uint64 ]* httpOkValBlocks )
338328
339329 // Add the ordered blocks to the map
340330 for _ , block := range proposedBlocks {
341- validatorKey := block .ValidatorKey
342- if _ , ok := orderedBlocks [validatorKey ]; ! ok {
343- orderedBlocks [validatorKey ] = & httpOkValBlocks {}
331+ validatorIndex := block .ValidatorIndex
332+ if _ , ok := orderedBlocks [validatorIndex ]; ! ok {
333+ orderedBlocks [validatorIndex ] = & httpOkValBlocks {ValidatorIndex : validatorIndex }
344334 }
345- orderedBlocks [validatorKey ].ProposedBlocks = append (orderedBlocks [validatorKey ].ProposedBlocks , block )
335+ orderedBlocks [validatorIndex ].ProposedBlocks = append (orderedBlocks [validatorIndex ].ProposedBlocks , block )
346336 }
347337
348338 for _ , block := range missedBlocks {
349- validatorKey := block .ValidatorKey
350- if _ , ok := orderedBlocks [validatorKey ]; ! ok {
351- orderedBlocks [validatorKey ] = & httpOkValBlocks {}
339+ validatorIndex := block .ValidatorIndex
340+ if _ , ok := orderedBlocks [validatorIndex ]; ! ok {
341+ orderedBlocks [validatorIndex ] = & httpOkValBlocks {ValidatorIndex : validatorIndex }
352342 }
353- orderedBlocks [validatorKey ].MissedBlocks = append (orderedBlocks [validatorKey ].MissedBlocks , block )
343+ orderedBlocks [validatorIndex ].MissedBlocks = append (orderedBlocks [validatorIndex ].MissedBlocks , block )
354344 }
355345
356346 for _ , block := range wrongFeeBlocks {
357- validatorKey := block .ValidatorKey
358- if _ , ok := orderedBlocks [validatorKey ]; ! ok {
359- orderedBlocks [validatorKey ] = & httpOkValBlocks {}
347+ validatorIndex := block .ValidatorIndex
348+ if _ , ok := orderedBlocks [validatorIndex ]; ! ok {
349+ orderedBlocks [validatorIndex ] = & httpOkValBlocks {ValidatorIndex : validatorIndex }
360350 }
361- orderedBlocks [validatorKey ].WrongFeeBlocks = append (orderedBlocks [validatorKey ].WrongFeeBlocks , block )
351+ orderedBlocks [validatorIndex ].WrongFeeBlocks = append (orderedBlocks [validatorIndex ].WrongFeeBlocks , block )
352+ }
353+
354+ // Sort the blocks within each validator index by slot number
355+ for _ , valBlocks := range orderedBlocks {
356+ sort .Slice (valBlocks .ProposedBlocks , func (i , j int ) bool {
357+ return valBlocks .ProposedBlocks [i ].Slot < valBlocks .ProposedBlocks [j ].Slot
358+ })
359+ sort .Slice (valBlocks .MissedBlocks , func (i , j int ) bool {
360+ return valBlocks .MissedBlocks [i ].Slot < valBlocks .MissedBlocks [j ].Slot
361+ })
362+ sort .Slice (valBlocks .WrongFeeBlocks , func (i , j int ) bool {
363+ return valBlocks .WrongFeeBlocks [i ].Slot < valBlocks .WrongFeeBlocks [j ].Slot
364+ })
365+ }
366+
367+ // Create a slice to hold the ordered validator indices
368+ orderedIndices := make ([]uint64 , 0 , len (orderedBlocks ))
369+
370+ // Extract the validator indices from the map into the slice
371+ for index := range orderedBlocks {
372+ orderedIndices = append (orderedIndices , index )
373+ }
374+
375+ // Sort the validator indices in ascending order
376+ sort .Slice (orderedIndices , func (i , j int ) bool {
377+ return orderedIndices [i ] < orderedIndices [j ]
378+ })
379+
380+ // Create a slice to hold the final JSON output
381+ finalOutput := make ([]* httpOkValBlocks , 0 , len (orderedBlocks ))
382+
383+ // Add the blocks to the final JSON output in the ordered sequence
384+ for _ , index := range orderedIndices {
385+ finalOutput = append (finalOutput , orderedBlocks [index ])
362386 }
363387
364- m .respondOK (w , orderedBlocks )
388+ m .respondOK (w , finalOutput )
365389}
366390
367391func (m * ApiService ) handleMemoryStatistics (w http.ResponseWriter , req * http.Request ) {
0 commit comments