Skip to content

Commit fcec220

Browse files
committed
Fix isKeyper check
The eon field in messages refers to the keyper set index, not the keyper-internal eon (which is a counter that includes failed DKG attempts).
1 parent 4e54744 commit fcec220

File tree

4 files changed

+26
-31
lines changed

4 files changed

+26
-31
lines changed

rolling-shutter/keyper/database/extend.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,20 @@ func (q *Queries) ScheduleShutterMessage(
8686
Msg("scheduled shuttermint message")
8787
return nil
8888
}
89+
90+
// GetKeyperIndex returns the index of the keyper with the given address in the keyper set with
91+
// the given index. If the keyper is not found, the second return value is false.
92+
func (q *Queries) GetKeyperIndex(ctx context.Context, keyperConfigIndex int64, addr common.Address) (int64, bool, error) {
93+
batchConfig, err := q.GetBatchConfig(ctx, int32(keyperConfigIndex))
94+
if err != nil {
95+
return -1, false, errors.Wrapf(err, "failed to get config %d from db", keyperConfigIndex)
96+
}
97+
98+
encodedAddress := shdb.EncodeAddress(addr)
99+
for i, address := range batchConfig.Keypers {
100+
if address == encodedAddress {
101+
return int64(i), true, nil
102+
}
103+
}
104+
return -1, false, nil
105+
}

rolling-shutter/keyper/epochkghandler/key.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,9 @@ func (handler *DecryptionKeyHandler) ValidateMessage(ctx context.Context, msg p2
4646

4747
queries := database.New(handler.dbpool)
4848

49-
isKeyper, err := queries.GetKeyperStateForEon(ctx, database.GetKeyperStateForEonParams{
50-
KeyperAddress: []string{handler.config.GetAddress().String()},
51-
Eon: int64(key.Eon),
52-
})
53-
if errors.Is(err, pgx.ErrNoRows) {
54-
return pubsub.ValidationReject, errors.Errorf("eon %d does not exist", key.Eon)
55-
}
49+
_, isKeyper, err := queries.GetKeyperIndex(ctx, int64(key.Eon), handler.config.GetAddress())
5650
if err != nil {
57-
return pubsub.ValidationReject, errors.Errorf("failed to get keyper state for eon %d from db", key.Eon)
51+
return pubsub.ValidationReject, err
5852
}
5953
if !isKeyper {
6054
log.Debug().Uint64("eon", key.Eon).Msg("Ignoring decryptionKey for eon; we're not a Keyper")

rolling-shutter/keyper/epochkghandler/keyshare.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,12 @@ func (handler *DecryptionKeyShareHandler) ValidateMessage(ctx context.Context, m
4747
}
4848

4949
queries := database.New(handler.dbpool)
50-
51-
isKeyper, err := queries.GetKeyperStateForEon(ctx, database.GetKeyperStateForEonParams{
52-
KeyperAddress: []string{handler.config.GetAddress().String()},
53-
Eon: int64(keyShare.Eon),
54-
})
55-
if errors.Is(err, pgx.ErrNoRows) {
56-
return pubsub.ValidationReject, errors.Errorf("eon %d does not exist", keyShare.Eon)
57-
}
50+
_, isKeyper, err := queries.GetKeyperIndex(ctx, int64(keyShare.Eon), handler.config.GetAddress())
5851
if err != nil {
59-
return pubsub.ValidationReject, errors.Errorf("failed to get keyper state for eon %d from db", keyShare.Eon)
52+
return pubsub.ValidationReject, err
6053
}
6154
if !isKeyper {
62-
log.Debug().Uint64("eon", keyShare.Eon).Msg("ignoring KeyShare for eon; we're not a Keyper")
55+
log.Debug().Uint64("eon", keyShare.Eon).Msg("Ignoring decryptionKey for eon; we're not a Keyper")
6356
return pubsub.ValidationReject, nil
6457
}
6558

rolling-shutter/keyper/epochkghandler/sendkeyshare.go

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,13 @@ func (ksh *KeyShareHandler) ConstructDecryptionKeyShares(
5757
if len(identityPreimages) > MaxNumKeysPerMessage {
5858
return nil, errors.Errorf("too many decryption key shares for message (%d > %d)", len(identityPreimages), MaxNumKeysPerMessage)
5959
}
60+
6061
db := database.New(ksh.DBPool)
61-
batchConfig, err := db.GetBatchConfig(ctx, int32(eon.KeyperConfigIndex))
62+
keyperIndex, isKeyper, err := db.GetKeyperIndex(ctx, eon.KeyperConfigIndex, ksh.KeyperAddress)
6263
if err != nil {
63-
return nil, errors.Wrapf(err, "failed to get config %d from db", eon.KeyperConfigIndex)
64-
}
65-
66-
// get our keyper index (and check that we in fact are a keyper)
67-
encodedAddress := shdb.EncodeAddress(ksh.KeyperAddress)
68-
keyperIndex := int64(-1)
69-
for i, address := range batchConfig.Keypers {
70-
if address == encodedAddress {
71-
keyperIndex = int64(i)
72-
break
73-
}
64+
return nil, err
7465
}
75-
if keyperIndex == -1 {
66+
if !isKeyper {
7667
return nil, errors.Wrap(ErrNotAKeyper, ErrIgnoreDecryptionRequest.Error())
7768
}
7869

0 commit comments

Comments
 (0)