@@ -236,15 +236,38 @@ func MakePowerTableDiff(oldPowerTable, newPowerTable gpbft.PowerEntries) PowerTa
236
236
return diff
237
237
}
238
238
239
+ func PowerTableArrayToMap (pt gpbft.PowerEntries ) map [gpbft.ActorID ]gpbft.PowerEntry {
240
+ ptm := make (map [gpbft.ActorID ]gpbft.PowerEntry , len (pt ))
241
+ for _ , pe := range pt {
242
+ ptm [pe .ID ] = pe
243
+ }
244
+ return ptm
245
+ }
246
+
247
+ func PowerTableMapToArray (ptm map [gpbft.ActorID ]gpbft.PowerEntry ) gpbft.PowerEntries {
248
+ pt := make (gpbft.PowerEntries , 0 , len (ptm ))
249
+ for _ , pe := range ptm {
250
+ pt = append (pt , pe )
251
+ }
252
+ sort .Sort (pt )
253
+ return pt
254
+ }
255
+
239
256
// Apply a set of power table diffs to the passed power table.
240
257
//
241
258
// - The delta must be sorted by participant ID, ascending.
242
259
// - The returned power table is sorted by power, descending.
243
260
func ApplyPowerTableDiffs (prevPowerTable gpbft.PowerEntries , diffs ... PowerTableDiff ) (gpbft.PowerEntries , error ) {
244
- powerTableMap := make (map [gpbft.ActorID ]gpbft.PowerEntry , len (prevPowerTable ))
245
- for _ , pe := range prevPowerTable {
246
- powerTableMap [pe .ID ] = pe
261
+ powerTableMap := PowerTableArrayToMap (prevPowerTable )
262
+ powerTableMap , err := ApplyPowerTableDiffsToMap (powerTableMap , diffs ... )
263
+ if err != nil {
264
+ return nil , err
247
265
}
266
+ newPowerTable := PowerTableMapToArray (powerTableMap )
267
+ return newPowerTable , nil
268
+ }
269
+
270
+ func ApplyPowerTableDiffsToMap (powerTableMap map [gpbft.ActorID ]gpbft.PowerEntry , diffs ... PowerTableDiff ) (map [gpbft.ActorID ]gpbft.PowerEntry , error ) {
248
271
for j , diff := range diffs {
249
272
var lastActorId gpbft.ActorID
250
273
for i , d := range diff {
@@ -298,17 +321,10 @@ func ApplyPowerTableDiffs(prevPowerTable gpbft.PowerEntries, diffs ...PowerTable
298
321
default : // if the power becomes negative, something went wrong
299
322
return nil , fmt .Errorf ("diff %d resulted in negative power for participant %d" , j , pe .ID )
300
323
}
301
-
302
324
}
303
325
}
304
326
305
- newPowerTable := make (gpbft.PowerEntries , 0 , len (powerTableMap ))
306
- for _ , pe := range powerTableMap {
307
- newPowerTable = append (newPowerTable , pe )
308
- }
309
-
310
- sort .Sort (newPowerTable )
311
- return newPowerTable , nil
327
+ return powerTableMap , nil
312
328
}
313
329
314
330
// MakePowerTableCID returns the DagCBOR-blake2b256 CID of the given power entries. This method does
0 commit comments