Skip to content

Commit b0814db

Browse files
authored
Switch to the big-int library we use in go-state-types (#519)
* fix: switch to the big-int library we use in go-state-types Previously, we dropped the sign. Unfortunately, the only ways to do this were to: 1. Replace the StoragePower type (what I did here). 2. Hack marshaling/unmarshaling for anything containing this type (which I really didn't want to do). It has some warts, but it works well in practice and works around some issues regarding nil encoding/decoding. fixes #517 replaces #518 * Test that we can round-trip powers Including negative powers... * format * Import big instead of copying We can split it into a new package/repo later if desired. * go fmt
1 parent 41e850b commit b0814db

26 files changed

+91
-149
lines changed

certs/cbor_gen.go

Lines changed: 6 additions & 44 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

certs/certs.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/filecoin-project/go-bitfield"
1111
"github.com/filecoin-project/go-f3/gpbft"
12+
"github.com/filecoin-project/go-state-types/big"
1213
)
1314

1415
// PowerTableDelta represents a single power table change between GPBFT instances. If the resulting
@@ -17,7 +18,7 @@ type PowerTableDelta struct {
1718
// Participant with changed power
1819
ParticipantID gpbft.ActorID
1920
// Change in power from base (signed).
20-
PowerDelta *gpbft.StoragePower
21+
PowerDelta gpbft.StoragePower
2122
// New signing key if relevant (else empty)
2223
SigningKey gpbft.PubKey
2324
}
@@ -212,7 +213,7 @@ func MakePowerTableDiff(oldPowerTable, newPowerTable gpbft.PowerEntries) PowerTa
212213
delta := PowerTableDelta{ParticipantID: newEntry.ID}
213214
if oldEntry, ok := oldPowerMap[newEntry.ID]; ok {
214215
delete(oldPowerMap, newEntry.ID)
215-
delta.PowerDelta = new(gpbft.StoragePower).Sub(newEntry.Power, oldEntry.Power)
216+
delta.PowerDelta = big.Sub(newEntry.Power, oldEntry.Power)
216217
if !bytes.Equal(newEntry.PubKey, oldEntry.PubKey) {
217218
delta.SigningKey = newEntry.PubKey
218219
}
@@ -228,7 +229,7 @@ func MakePowerTableDiff(oldPowerTable, newPowerTable gpbft.PowerEntries) PowerTa
228229
for _, e := range oldPowerMap {
229230
diff = append(diff, PowerTableDelta{
230231
ParticipantID: e.ID,
231-
PowerDelta: new(gpbft.StoragePower).Neg(e.Power),
232+
PowerDelta: e.Power.Neg(),
232233
})
233234
}
234235
slices.SortFunc(diff, func(a, b PowerTableDelta) int {
@@ -268,7 +269,7 @@ func ApplyPowerTableDiffs(prevPowerTable gpbft.PowerEntries, diffs ...PowerTable
268269
return nil, fmt.Errorf("diff %d delta for participant %d includes an unchanged key", j, pe.ID)
269270
}
270271
if d.PowerDelta.Sign() != 0 {
271-
pe.Power = new(gpbft.StoragePower).Add(d.PowerDelta, pe.Power)
272+
pe.Power = big.Add(d.PowerDelta, pe.Power)
272273
}
273274
if len(d.SigningKey) > 0 {
274275
// If we end up with no power, we shouldn't have replaced the key.

certs/certs_test.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package certs_test
22

33
import (
4+
"bytes"
45
"fmt"
56
"math/rand"
67
"slices"
@@ -11,6 +12,7 @@ import (
1112
"github.com/filecoin-project/go-f3/gpbft"
1213
"github.com/filecoin-project/go-f3/sim"
1314
"github.com/filecoin-project/go-f3/sim/signing"
15+
"github.com/filecoin-project/go-state-types/big"
1416
"github.com/stretchr/testify/require"
1517
)
1618

@@ -47,13 +49,16 @@ func TestPowerTableDiff(t *testing.T) {
4749

4850
expDeltaRemove[i] = certs.PowerTableDelta{
4951
ParticipantID: e.ID,
50-
PowerDelta: new(gpbft.StoragePower).Neg(e.Power),
52+
PowerDelta: e.Power.Neg(),
5153
}
5254

5355
}
5456
require.Equal(t, expDeltaRemove, certs.MakePowerTableDiff(powerTable, nil))
5557
require.Equal(t, expDeltaAdd, certs.MakePowerTableDiff(nil, powerTable))
5658

59+
testRoundTrip(t, expDeltaRemove)
60+
testRoundTrip(t, expDeltaAdd)
61+
5762
addAll, err := certs.ApplyPowerTableDiffs(nil, expDeltaAdd)
5863
require.NoError(t, err)
5964
require.Equal(t, powerTable, addAll)
@@ -102,7 +107,7 @@ func TestPowerTableDiff(t *testing.T) {
102107
}})
103108
require.NoError(t, err)
104109
require.Equal(t,
105-
new(gpbft.StoragePower).Sub(newPowerTable[0].Power, powerTable[0].Power),
110+
big.Sub(newPowerTable[0].Power, powerTable[0].Power),
106111
gpbft.NewStoragePower(1),
107112
)
108113

@@ -114,7 +119,7 @@ func TestPowerTableDiff(t *testing.T) {
114119
}})
115120
require.NoError(t, err)
116121
require.Equal(t,
117-
new(gpbft.StoragePower).Sub(newPowerTable[0].Power, powerTable[0].Power),
122+
big.Sub(newPowerTable[0].Power, powerTable[0].Power),
118123
gpbft.NewStoragePower(1),
119124
)
120125
require.Equal(t, newPowerTable[0].PubKey, powerTable[1].PubKey)
@@ -149,7 +154,7 @@ func TestPowerTableDiff(t *testing.T) {
149154
// Remove all power and change key.
150155
_, err = certs.ApplyPowerTableDiffs(powerTable, certs.PowerTableDiff{{
151156
ParticipantID: powerTable[0].ID,
152-
PowerDelta: new(gpbft.StoragePower).Neg(powerTable[0].Power),
157+
PowerDelta: powerTable[0].Power.Neg(),
153158
SigningKey: powerTable[1].PubKey,
154159
}})
155160
require.ErrorContains(t, err, "removes all power for participant 1 while specifying a new key")
@@ -180,13 +185,23 @@ func TestPowerTableDiff(t *testing.T) {
180185
// Remove more power than we have.
181186
_, err = certs.ApplyPowerTableDiffs(powerTable, certs.PowerTableDiff{{
182187
ParticipantID: powerTable[0].ID,
183-
PowerDelta: new(gpbft.StoragePower).Sub(gpbft.NewStoragePower(-1), powerTable[0].Power),
188+
PowerDelta: big.Sub(gpbft.NewStoragePower(-1), powerTable[0].Power),
184189
}})
185190
require.ErrorContains(t, err, "resulted in negative power")
186191
}
187192

188193
}
189194

195+
func testRoundTrip(t *testing.T, diff certs.PowerTableDiff) {
196+
var b bytes.Buffer
197+
require.NoError(t, diff.MarshalCBOR(&b))
198+
199+
var out certs.PowerTableDiff
200+
require.NoError(t, out.UnmarshalCBOR(&b))
201+
202+
require.EqualValues(t, diff, out)
203+
}
204+
190205
func TestFinalityCertificates(t *testing.T) {
191206
backend := signing.NewFakeBackend()
192207

@@ -319,7 +334,7 @@ func TestBadFinalityCertificates(t *testing.T) {
319334
require.NoError(t, err)
320335
powerTableCpy := slices.Clone(powerTable)
321336
// increase so we definitely have enough power
322-
powerTableCpy[firstSigner].Power = new(gpbft.StoragePower).Add(powerTableCpy[firstSigner].Power, gpbft.NewStoragePower(1))
337+
powerTableCpy[firstSigner].Power = big.Add(powerTableCpy[firstSigner].Power, gpbft.NewStoragePower(1))
323338
nextInstance, chain, _, err := certs.ValidateFinalityCertificates(backend, networkName, powerTableCpy, 1, nil, *certificate)
324339
require.ErrorContains(t, err, "incorrect power diff")
325340
require.EqualValues(t, 1, nextInstance)

cmd/f3/run.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package main
33
import (
44
"context"
55
"fmt"
6-
"math/big"
76
"os"
87

98
"github.com/filecoin-project/go-f3"
@@ -90,7 +89,7 @@ var runCmd = cli.Command{
9089
initialPowerTable = append(initialPowerTable, gpbft.PowerEntry{
9190
ID: gpbft.ActorID(i),
9291
PubKey: pubkey,
93-
Power: big.NewInt(1000),
92+
Power: gpbft.NewStoragePower(1000),
9493
})
9594
}
9695

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ require (
88
github.com/drand/kyber-bls12381 v0.3.1
99
github.com/filecoin-project/go-bitfield v0.2.4
1010
github.com/filecoin-project/go-clock v0.1.0
11+
github.com/filecoin-project/go-state-types v0.14.0
1112
github.com/ipfs/go-cid v0.4.1
1213
github.com/ipfs/go-datastore v0.6.0
1314
github.com/ipfs/go-ds-leveldb v0.5.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW
5959
github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM=
6060
github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU=
6161
github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs=
62+
github.com/filecoin-project/go-state-types v0.14.0 h1:JFw8r/LA0/Hvu865Yn2Gz3R5e2woItKeHTgbT4VsXoU=
63+
github.com/filecoin-project/go-state-types v0.14.0/go.mod h1:cDbxwjbmVtV+uNi5D/cFtxKlsRqibnQNlz7xQA1EqYg=
6264
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
6365
github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg=
6466
github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=

gpbft/cbor_gen.go

Lines changed: 6 additions & 44 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gpbft/message_builder_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package gpbft
22

33
import (
4-
"math/big"
54
"testing"
65

6+
"github.com/filecoin-project/go-state-types/big"
77
"github.com/stretchr/testify/assert"
88
"github.com/stretchr/testify/require"
99
)

0 commit comments

Comments
 (0)