process slashings once (#10621)

Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com>
This commit is contained in:
Potuz
2022-05-04 11:51:18 -03:00
committed by GitHub
parent f9b4a340a3
commit df695346a5
4 changed files with 32 additions and 4 deletions

View File

@@ -333,6 +333,10 @@ func (f *ForkChoice) SetOptimisticToInvalid(ctx context.Context, root, parentRoo
func (f *ForkChoice) InsertSlashedIndex(_ context.Context, index types.ValidatorIndex) {
f.store.nodesLock.Lock()
defer f.store.nodesLock.Unlock()
// return early if the index was already included:
if f.store.slashedIndices[index] {
return
}
f.store.slashedIndices[index] = true
// Subtract last vote from this equivocating validator

View File

@@ -218,6 +218,15 @@ func TestForkChoice_RemoveEquivocating(t *testing.T) {
require.NoError(t, err)
require.Equal(t, [32]byte{'c'}, head)
// Process b's slashing again, should be a noop
f.InsertSlashedIndex(ctx, 1)
require.Equal(t, uint64(200), f.store.nodeByRoot[[32]byte{'b'}].balance)
head, err = f.Head(ctx, 1, params.BeaconConfig().ZeroHash, []uint64{100, 200, 200, 300}, 1)
require.Equal(t, uint64(200), f.store.nodeByRoot[[32]byte{'b'}].weight)
require.Equal(t, uint64(300), f.store.nodeByRoot[[32]byte{'c'}].weight)
require.NoError(t, err)
require.Equal(t, [32]byte{'c'}, head)
// Process index where index == vote length. Should not panic.
f.InsertSlashedIndex(ctx, types.ValidatorIndex(len(f.balances)))
f.InsertSlashedIndex(ctx, types.ValidatorIndex(len(f.votes)))

View File

@@ -749,6 +749,10 @@ func (f *ForkChoice) ForkChoiceNodes() []*pbrpc.ForkChoiceNode {
func (f *ForkChoice) InsertSlashedIndex(ctx context.Context, index types.ValidatorIndex) {
f.store.nodesLock.Lock()
defer f.store.nodesLock.Unlock()
// return early if the index was already included:
if f.store.slashedIndices[index] {
return
}
f.store.slashedIndices[index] = true
// Subtract last vote from this equivocating validator

View File

@@ -790,17 +790,28 @@ func TestStore_RemoveEquivocating(t *testing.T) {
require.NoError(t, err)
require.Equal(t, [32]byte{'c'}, head)
// Insert an attestation for block b, it becomes head
f.ProcessAttestation(ctx, []uint64{1}, [32]byte{'b'}, 1)
head, err = f.Head(ctx, 1, params.BeaconConfig().ZeroHash, []uint64{100, 200}, 1)
// Insert two attestations for block b, it becomes head
f.ProcessAttestation(ctx, []uint64{1, 2}, [32]byte{'b'}, 1)
f.ProcessAttestation(ctx, []uint64{3}, [32]byte{'c'}, 1)
head, err = f.Head(ctx, 1, params.BeaconConfig().ZeroHash, []uint64{100, 200, 200, 300}, 1)
require.NoError(t, err)
require.Equal(t, [32]byte{'b'}, head)
// Process b's slashing, c is now head
f.InsertSlashedIndex(ctx, 1)
head, err = f.Head(ctx, 1, params.BeaconConfig().ZeroHash, []uint64{100, 200}, 1)
head, err = f.Head(ctx, 1, params.BeaconConfig().ZeroHash, []uint64{100, 200, 200, 300}, 1)
require.NoError(t, err)
require.Equal(t, [32]byte{'c'}, head)
require.Equal(t, uint64(200), f.store.nodes[2].weight)
require.Equal(t, uint64(300), f.store.nodes[3].weight)
// Process the same slashing again, should be a noop
f.InsertSlashedIndex(ctx, 1)
head, err = f.Head(ctx, 1, params.BeaconConfig().ZeroHash, []uint64{100, 200, 200, 300}, 1)
require.NoError(t, err)
require.Equal(t, [32]byte{'c'}, head)
require.Equal(t, uint64(200), f.store.nodes[2].weight)
require.Equal(t, uint64(300), f.store.nodes[3].weight)
// Process index where index == vote length. Should not panic.
f.InsertSlashedIndex(ctx, types.ValidatorIndex(len(f.balances)))