Skip to content

Commit 4819305

Browse files
committed
Add gnosis specific handlers
1 parent 18592c3 commit 4819305

File tree

2 files changed

+60
-29
lines changed

2 files changed

+60
-29
lines changed

rolling-shutter/gnosisaccessnode/decryptionkeyshandler.go

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,11 @@ import (
77
pubsub "github.com/libp2p/go-libp2p-pubsub"
88
"github.com/pkg/errors"
99

10+
obskeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
11+
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis"
1012
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2pmsg"
1113
)
1214

13-
const (
14-
// TODO: pull these from keyper set manager
15-
n = 7
16-
threshold = 5
17-
)
18-
1915
type DecryptionKeysHandler struct {
2016
config *Config
2117
}
@@ -66,13 +62,23 @@ func (handler *DecryptionKeysHandler) validateCommonFields(key *p2pmsg.Decryptio
6662
}
6763

6864
func (handler *DecryptionKeysHandler) validateGnosisFields(keys *p2pmsg.DecryptionKeys) (pubsub.ValidationResult, error) {
69-
extraWrapped, ok := keys.Extra.(*p2pmsg.DecryptionKeys_Gnosis)
70-
if !ok {
71-
return pubsub.ValidationReject, errors.Errorf("unexpected extra type %T, expected Gnosis", keys.Extra)
65+
res, err := gnosis.ValidateDecryptionKeysBasic(keys)
66+
if res != pubsub.ValidationAccept || err != nil {
67+
return res, err
7268
}
73-
extra := extraWrapped.Gnosis
74-
if extra == nil {
75-
return pubsub.ValidationReject, errors.New("missing extra Gnosis data")
69+
extra := keys.Extra.(*p2pmsg.DecryptionKeys_Gnosis).Gnosis
70+
71+
// TODO: populate this from the contract
72+
keyperSet := &obskeyperdatabase.KeyperSet{
73+
KeyperConfigIndex: 0,
74+
ActivationBlockNumber: 0,
75+
Keypers: []string{},
76+
Threshold: 0,
77+
}
78+
79+
res, err = gnosis.ValidateDecryptionKeysSignatures(keys, extra, keyperSet)
80+
if res != pubsub.ValidationAccept || err != nil {
81+
return res, err
7682
}
7783

7884
return pubsub.ValidationAccept, nil

rolling-shutter/keyperimpl/gnosis/handlers.go

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,10 @@ func (h *DecryptionKeysHandler) MessagePrototypes() []p2pmsg.Message {
180180
return []p2pmsg.Message{&p2pmsg.DecryptionKeys{}}
181181
}
182182

183-
func validateSignerIndices(extra *p2pmsg.DecryptionKeys_Gnosis, n int) (pubsub.ValidationResult, error) {
184-
for i, signerIndex := range extra.Gnosis.SignerIndices {
183+
func validateSignerIndices(extra *p2pmsg.GnosisDecryptionKeysExtra, n int) (pubsub.ValidationResult, error) {
184+
for i, signerIndex := range extra.SignerIndices {
185185
if i >= 1 {
186-
prevSignerIndex := extra.Gnosis.SignerIndices[i-1]
186+
prevSignerIndex := extra.SignerIndices[i-1]
187187
if signerIndex == prevSignerIndex {
188188
return pubsub.ValidationReject, errors.New("duplicate signer index found")
189189
}
@@ -198,8 +198,7 @@ func validateSignerIndices(extra *p2pmsg.DecryptionKeys_Gnosis, n int) (pubsub.V
198198
return pubsub.ValidationAccept, nil
199199
}
200200

201-
func (h *DecryptionKeysHandler) ValidateMessage(ctx context.Context, msg p2pmsg.Message) (pubsub.ValidationResult, error) {
202-
keys := msg.(*p2pmsg.DecryptionKeys)
201+
func ValidateDecryptionKeysBasic(keys *p2pmsg.DecryptionKeys) (pubsub.ValidationResult, error) {
203202
extra, ok := keys.Extra.(*p2pmsg.DecryptionKeys_Gnosis)
204203
if !ok {
205204
return pubsub.ValidationReject, errors.Errorf("unexpected extra type %T, expected Gnosis", keys.Extra)
@@ -218,21 +217,23 @@ func (h *DecryptionKeysHandler) ValidateMessage(ctx context.Context, msg p2pmsg.
218217
return pubsub.ValidationReject, errors.New("msg does not contain any keys")
219218
}
220219

221-
obsKeyperDB := obskeyperdatabase.New(h.dbpool)
222-
keyperSet, err := obsKeyperDB.GetKeyperSetByKeyperConfigIndex(ctx, int64(keys.Eon))
223-
if err != nil {
224-
return pubsub.ValidationReject, errors.Wrapf(err, "failed to get keyper set from database for eon %d", keys.Eon)
225-
}
220+
return pubsub.ValidationAccept, nil
221+
}
226222

227-
if int32(len(extra.Gnosis.SignerIndices)) != keyperSet.Threshold {
228-
return pubsub.ValidationReject, errors.Errorf("expected %d signers, got %d", keyperSet.Threshold, len(extra.Gnosis.SignerIndices))
223+
func ValidateDecryptionKeysSignatures(
224+
keys *p2pmsg.DecryptionKeys,
225+
extra *p2pmsg.GnosisDecryptionKeysExtra,
226+
keyperSet *obskeyperdatabase.KeyperSet,
227+
) (pubsub.ValidationResult, error) {
228+
if int32(len(extra.SignerIndices)) != keyperSet.Threshold {
229+
return pubsub.ValidationReject, errors.Errorf("expected %d signers, got %d", keyperSet.Threshold, len(extra.SignerIndices))
229230
}
230231

231232
res, err := validateSignerIndices(extra, len(keyperSet.Keypers))
232233
if res != pubsub.ValidationAccept {
233234
return res, err
234235
}
235-
signers, err := keyperSet.GetSubset(extra.Gnosis.SignerIndices)
236+
signers, err := keyperSet.GetSubset(extra.SignerIndices)
236237
if err != nil {
237238
return pubsub.ValidationReject, err
238239
}
@@ -245,15 +246,15 @@ func (h *DecryptionKeysHandler) ValidateMessage(ctx context.Context, msg p2pmsg.
245246
slotDecryptionSignatureData, err := gnosisssztypes.NewSlotDecryptionSignatureData(
246247
keys.InstanceID,
247248
keys.Eon,
248-
extra.Gnosis.Slot,
249-
extra.Gnosis.TxPointer,
249+
extra.Slot,
250+
extra.TxPointer,
250251
identityPreimages,
251252
)
252253
if err != nil {
253254
return pubsub.ValidationReject, errors.Wrap(err, "failed to create slot decryption signature data object")
254255
}
255-
for signatureIndex := 0; signatureIndex < len(extra.Gnosis.Signatures); signatureIndex++ {
256-
signature := extra.Gnosis.Signatures[signatureIndex]
256+
for signatureIndex := 0; signatureIndex < len(extra.Signatures); signatureIndex++ {
257+
signature := extra.Signatures[signatureIndex]
257258
signer := signers[signatureIndex]
258259
signatureValid, err := slotDecryptionSignatureData.CheckSignature(signature, signer)
259260
if err != nil {
@@ -267,6 +268,30 @@ func (h *DecryptionKeysHandler) ValidateMessage(ctx context.Context, msg p2pmsg.
267268
return pubsub.ValidationAccept, nil
268269
}
269270

271+
func (h *DecryptionKeysHandler) ValidateMessage(ctx context.Context, msg p2pmsg.Message) (pubsub.ValidationResult, error) {
272+
keys := msg.(*p2pmsg.DecryptionKeys)
273+
274+
res, err := ValidateDecryptionKeysBasic(keys)
275+
if res != pubsub.ValidationAccept || err != nil {
276+
return res, err
277+
}
278+
279+
extra := keys.Extra.(*p2pmsg.DecryptionKeys_Gnosis).Gnosis
280+
281+
obsKeyperDB := obskeyperdatabase.New(h.dbpool)
282+
keyperSet, err := obsKeyperDB.GetKeyperSetByKeyperConfigIndex(ctx, int64(keys.Eon))
283+
if err != nil {
284+
return pubsub.ValidationReject, errors.Wrapf(err, "failed to get keyper set from database for eon %d", keys.Eon)
285+
}
286+
287+
res, err = ValidateDecryptionKeysSignatures(keys, extra, &keyperSet)
288+
if res != pubsub.ValidationAccept || err != nil {
289+
return res, err
290+
}
291+
292+
return pubsub.ValidationAccept, nil
293+
}
294+
270295
func (h *DecryptionKeysHandler) HandleMessage(ctx context.Context, msg p2pmsg.Message) ([]p2pmsg.Message, error) {
271296
keys := msg.(*p2pmsg.DecryptionKeys)
272297
extra := keys.Extra.(*p2pmsg.DecryptionKeys_Gnosis).Gnosis

0 commit comments

Comments
 (0)