Skip to content

Commit 6bb333b

Browse files
committed
Sync keyper sets and eon keys
1 parent 4819305 commit 6bb333b

File tree

3 files changed

+122
-5
lines changed

3 files changed

+122
-5
lines changed

rolling-shutter/gnosisaccessnode/config.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,26 @@ package gnosisaccessnode
33
import (
44
"io"
55

6+
gnosiskeyper "github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis"
7+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/configuration"
68
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/metricsserver"
79
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2p"
810
)
911

1012
type Config struct {
1113
InstanceID uint64
1214

13-
P2P *p2p.Config
14-
Metrics *metricsserver.MetricsConfig
15+
GnosisNode *configuration.EthnodeConfig
16+
Contracts *gnosiskeyper.GnosisContractsConfig
17+
P2P *p2p.Config
18+
Metrics *metricsserver.MetricsConfig
1519

1620
MaxNumKeysPerMessage uint64
1721
}
1822

1923
func (c *Config) Init() {
24+
c.GnosisNode = configuration.NewEthnodeConfig()
25+
c.Contracts = gnosiskeyper.NewGnosisContractsConfig()
2026
c.P2P = p2p.NewConfig()
2127
c.Metrics = metricsserver.NewConfig()
2228
}

rolling-shutter/gnosisaccessnode/node.go

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,27 @@ import (
44
"context"
55

66
"github.com/pkg/errors"
7+
"github.com/rs/zerolog/log"
78

9+
"github.com/shutter-network/shutter/shlib/shcrypto"
10+
11+
obskeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
12+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync"
13+
syncevent "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync/event"
814
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/service"
915
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2p"
16+
"github.com/shutter-network/rolling-shutter/rolling-shutter/shdb"
1017
)
1118

1219
type GnosisAccessNode struct {
13-
config *Config
20+
config *Config
21+
storage *Storage
1422
}
1523

1624
func New(config *Config) *GnosisAccessNode {
1725
return &GnosisAccessNode{
18-
config: config,
26+
config: config,
27+
storage: NewStorage(),
1928
}
2029
}
2130

@@ -25,5 +34,54 @@ func (node *GnosisAccessNode) Start(ctx context.Context, runner service.Runner)
2534
return errors.Wrap(err, "failed to initialize p2p messaging")
2635
}
2736
messageSender.AddMessageHandler(NewDecryptionKeysHandler(node.config))
28-
return runner.StartService(messageSender)
37+
38+
chainSyncClient, err := chainsync.NewClient(
39+
ctx,
40+
chainsync.WithClientURL(node.config.GnosisNode.EthereumURL),
41+
chainsync.WithKeyperSetManager(node.config.Contracts.KeyperSetManager),
42+
chainsync.WithKeyBroadcastContract(node.config.Contracts.KeyBroadcastContract),
43+
chainsync.WithSyncNewKeyperSet(node.onNewKeyperSet),
44+
chainsync.WithSyncNewEonKey(node.onNewEonKey),
45+
)
46+
if err != nil {
47+
return errors.Wrap(err, "failed to initialize chain sync client")
48+
}
49+
50+
return runner.StartService(messageSender, chainSyncClient)
51+
}
52+
53+
func (node *GnosisAccessNode) onNewKeyperSet(_ context.Context, keyperSet *syncevent.KeyperSet) error {
54+
obsKeyperSet := obskeyperdatabase.KeyperSet{
55+
KeyperConfigIndex: int64(keyperSet.Eon),
56+
ActivationBlockNumber: int64(keyperSet.ActivationBlock),
57+
Keypers: shdb.EncodeAddresses(keyperSet.Members),
58+
Threshold: int32(keyperSet.Threshold),
59+
}
60+
log.Info().
61+
Uint64("keyper-config-index", keyperSet.Eon).
62+
Uint64("activation-block-number", keyperSet.ActivationBlock).
63+
Int("num-keypers", len(keyperSet.Members)).
64+
Uint64("threshold", keyperSet.Threshold).
65+
Msg("adding keyper set")
66+
node.storage.AddKeyperSet(keyperSet.Eon, &obsKeyperSet)
67+
return nil
68+
}
69+
70+
func (node *GnosisAccessNode) onNewEonKey(_ context.Context, eonKey *syncevent.EonPublicKey) error {
71+
key := new(shcrypto.EonPublicKey)
72+
err := key.Unmarshal(eonKey.Key)
73+
if err != nil {
74+
log.Error().
75+
Err(err).
76+
Hex("key", eonKey.Key).
77+
Int("keyper-config-index", int(eonKey.Eon)).
78+
Msg("received invalid eon key")
79+
return nil
80+
}
81+
log.Info().
82+
Int("keyper-config-index", int(eonKey.Eon)).
83+
Hex("key", eonKey.Key).
84+
Msg("adding eon key")
85+
node.storage.AddEonKey(eonKey.Eon, key)
86+
return nil
2987
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package gnosisaccessnode
2+
3+
import (
4+
"sync"
5+
6+
"github.com/shutter-network/shutter/shlib/shcrypto"
7+
8+
obskeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
9+
)
10+
11+
type Storage struct {
12+
mu sync.Mutex
13+
eonKeys map[uint64]*shcrypto.EonPublicKey
14+
keyperSets map[uint64]*obskeyperdatabase.KeyperSet
15+
}
16+
17+
func NewStorage() *Storage {
18+
return &Storage{
19+
mu: sync.Mutex{},
20+
eonKeys: make(map[uint64]*shcrypto.EonPublicKey),
21+
keyperSets: make(map[uint64]*obskeyperdatabase.KeyperSet),
22+
}
23+
}
24+
25+
func (s *Storage) AddEonKey(keyperConfigIndex uint64, key *shcrypto.EonPublicKey) {
26+
s.mu.Lock()
27+
defer s.mu.Unlock()
28+
29+
s.eonKeys[keyperConfigIndex] = key
30+
}
31+
32+
func (s *Storage) GetEonKey(keyperConfigIndex uint64) (*shcrypto.EonPublicKey, bool) {
33+
s.mu.Lock()
34+
defer s.mu.Unlock()
35+
36+
v, ok := s.eonKeys[keyperConfigIndex]
37+
return v, ok
38+
}
39+
40+
func (s *Storage) AddKeyperSet(keyperConfigIndex uint64, keyperSet *obskeyperdatabase.KeyperSet) {
41+
s.mu.Lock()
42+
defer s.mu.Unlock()
43+
44+
s.keyperSets[keyperConfigIndex] = keyperSet
45+
}
46+
47+
func (s *Storage) GetKeyperSet(keyperConfigIndex uint64) (*obskeyperdatabase.KeyperSet, bool) {
48+
s.mu.Lock()
49+
defer s.mu.Unlock()
50+
51+
v, ok := s.keyperSets[keyperConfigIndex]
52+
return v, ok
53+
}

0 commit comments

Comments
 (0)