Skip to content

Commit

Permalink
feat: use the scaled power for winning tickets (#375)
Browse files Browse the repository at this point in the history
This brings us in-line with the FIP.
  • Loading branch information
Stebalien authored Jun 25, 2024
1 parent 2ddf410 commit f2319a9
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 15 deletions.
8 changes: 4 additions & 4 deletions gpbft/gpbft.go
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ func (i *instance) tryCurrentPhase() error {
// It must be safe for concurrent use.
func ValidateMessage(powerTable *PowerTable, beacon []byte, host Host, msg *GMessage) error {
// Check sender is eligible.
senderPower, _, senderPubKey := powerTable.Get(msg.Sender)
senderPower, senderPubKey := powerTable.Get(msg.Sender)
if senderPower == 0 {
return xerrors.Errorf("sender %d with zero power or not in power table", msg.Sender)
}
Expand Down Expand Up @@ -1150,7 +1150,7 @@ func (q *quorumState) receiveSender(sender ActorID) (uint16, bool) {
return 0, false
}
q.senders[sender] = struct{}{}
senderPower, _, _ := q.powerTable.Get(sender)
senderPower, _ := q.powerTable.Get(sender)
q.sendersTotalPower += senderPower
return senderPower, true
}
Expand Down Expand Up @@ -1433,9 +1433,9 @@ func (c *convergeState) FindMaxTicketProposal(table PowerTable) ConvergeValue {

for key, value := range c.values {
for _, ticket := range c.tickets[key] {
_, senderPower, _ := table.Get(ticket.Sender)
senderPower, _ := table.Get(ticket.Sender)
ticketAsInt := new(big.Int).SetBytes(ticket.Ticket)
weightedTicket := new(big.Int).Mul(ticketAsInt, senderPower)
weightedTicket := new(big.Int).Mul(ticketAsInt, big.NewInt(int64(senderPower)))
if maxTicket == nil || weightedTicket.Cmp(maxTicket) > 0 {
maxTicket = weightedTicket
maxValue = value
Expand Down
5 changes: 2 additions & 3 deletions gpbft/message_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package gpbft

import (
"errors"
"math/big"

xerrors "golang.org/x/xerrors"
)
Expand Down Expand Up @@ -68,7 +67,7 @@ func (mb *MessageBuilder) SetSigningMarshaler(sm SigningMarshaler) {
}

type powerTableAccessor interface {
Get(ActorID) (uint16, *big.Int, PubKey)
Get(ActorID) (uint16, PubKey)
}

type SignerWithMarshaler interface {
Expand Down Expand Up @@ -105,7 +104,7 @@ type SignatureBuilder struct {
}

func (mb *MessageBuilder) PrepareSigningInputs(id ActorID) (*SignatureBuilder, error) {
effectivePower, _, pubKey := mb.powerTable.Get(id)
effectivePower, pubKey := mb.powerTable.Get(id)
if pubKey == nil || effectivePower == 0 {
return nil, xerrors.Errorf("could not find pubkey for actor %d: %w", id, ErrNoPower)
}
Expand Down
8 changes: 4 additions & 4 deletions gpbft/powertable.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,13 @@ func (p *PowerTable) rescale() error {

// Get retrieves the scaled power, unscaled StoragePower and PubKey for the given id, if present in
// the table. Otherwise, returns 0/nil.
func (p *PowerTable) Get(id ActorID) (uint16, *StoragePower, PubKey) {
func (p *PowerTable) Get(id ActorID) (uint16, PubKey) {
if index, ok := p.Lookup[id]; ok {
entry := p.Entries[index]
key := p.Entries[index].PubKey
scaledPower := p.ScaledPower[index]
return scaledPower, entry.Power, entry.PubKey
return scaledPower, key
}
return 0, nil, nil
return 0, nil
}

// Has check whether this PowerTable contains an entry for the given id.
Expand Down
7 changes: 4 additions & 3 deletions gpbft/powertable_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ func TestPowerTable(t *testing.T) {
})
t.Run("gets nil", func(t *testing.T) {
subject := gpbft.NewPowerTable()
_, gotPower, gotKey := subject.Get(1413)
require.Nil(t, gotPower)
gotPower, gotKey := subject.Get(1413)
require.Zero(t, gotPower)
require.Nil(t, gotKey)
})
})
Expand Down Expand Up @@ -199,7 +199,8 @@ func TestPowerTable(t *testing.T) {
func requireAddedToPowerTable(t *testing.T, subject *gpbft.PowerTable, entry gpbft.PowerEntry) {
t.Helper()
require.True(t, subject.Has(entry.ID))
_, gotPower, gotKey := subject.Get(entry.ID)
_, gotKey := subject.Get(entry.ID)
gotPower := subject.Entries[subject.Lookup[entry.ID]].Power
require.Equal(t, entry.Power, gotPower)
require.Equal(t, entry.PubKey, gotKey)
}
2 changes: 1 addition & 1 deletion sim/adversary/decide.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ func (i *ImmediateDecide) StartInstance(instance uint64) error {
SupplementalData: *supplementalData,
}
sigPayload := i.host.MarshalPayloadForSigning(i.host.NetworkName(), &justificationPayload)
_, _, pubkey := powertable.Get(i.id)
_, pubkey := powertable.Get(i.id)
sig, err := i.host.Sign(pubkey, sigPayload)
if err != nil {
panic(err)
Expand Down

0 comments on commit f2319a9

Please sign in to comment.