Skip to content

Commit c763ad6

Browse files
committed
gnosisaccessnode: add synchandler for new chainsyncer
1 parent ab9f501 commit c763ad6

File tree

5 files changed

+216
-13
lines changed

5 files changed

+216
-13
lines changed

rolling-shutter/gnosisaccessnode/decryptionkeyshandler.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,20 @@ import (
1010

1111
"github.com/shutter-network/shutter/shlib/shcrypto"
1212

13+
"github.com/shutter-network/rolling-shutter/rolling-shutter/gnosisaccessnode/storage"
1314
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis"
1415
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2pmsg"
1516
)
1617

1718
type DecryptionKeysHandler struct {
1819
config *Config
19-
storage *Storage
20+
storage *storage.Memory
2021
}
2122

22-
func NewDecryptionKeysHandler(config *Config, storage *Storage) *DecryptionKeysHandler {
23+
func NewDecryptionKeysHandler(config *Config, store *storage.Memory) *DecryptionKeysHandler {
2324
return &DecryptionKeysHandler{
2425
config: config,
25-
storage: storage,
26+
storage: store,
2627
}
2728
}
2829

rolling-shutter/gnosisaccessnode/node.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/shutter-network/shutter/shlib/shcrypto"
1010

1111
obskeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
12+
"github.com/shutter-network/rolling-shutter/rolling-shutter/gnosisaccessnode/storage"
1213
chainsync "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/legacychainsync"
1314
syncevent "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/legacychainsync/event"
1415
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/metricsserver"
@@ -19,13 +20,13 @@ import (
1920

2021
type GnosisAccessNode struct {
2122
config *Config
22-
storage *Storage
23+
storage *storage.Memory
2324
}
2425

2526
func New(config *Config) *GnosisAccessNode {
2627
return &GnosisAccessNode{
2728
config: config,
28-
storage: NewStorage(),
29+
storage: storage.NewMemory(),
2930
}
3031
}
3132

rolling-shutter/gnosisaccessnode/storage.go renamed to rolling-shutter/gnosisaccessnode/storage/storage.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package gnosisaccessnode
1+
package storage
22

33
import (
44
"sync"
@@ -8,43 +8,43 @@ import (
88
obskeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
99
)
1010

11-
type Storage struct {
11+
type Memory struct {
1212
mu sync.Mutex
1313
eonKeys map[uint64]*shcrypto.EonPublicKey
1414
keyperSets map[uint64]*obskeyperdatabase.KeyperSet
1515
}
1616

17-
func NewStorage() *Storage {
18-
return &Storage{
17+
func NewMemory() *Memory {
18+
return &Memory{
1919
mu: sync.Mutex{},
2020
eonKeys: make(map[uint64]*shcrypto.EonPublicKey),
2121
keyperSets: make(map[uint64]*obskeyperdatabase.KeyperSet),
2222
}
2323
}
2424

25-
func (s *Storage) AddEonKey(keyperConfigIndex uint64, key *shcrypto.EonPublicKey) {
25+
func (s *Memory) AddEonKey(keyperConfigIndex uint64, key *shcrypto.EonPublicKey) {
2626
s.mu.Lock()
2727
defer s.mu.Unlock()
2828

2929
s.eonKeys[keyperConfigIndex] = key
3030
}
3131

32-
func (s *Storage) GetEonKey(keyperConfigIndex uint64) (*shcrypto.EonPublicKey, bool) {
32+
func (s *Memory) GetEonKey(keyperConfigIndex uint64) (*shcrypto.EonPublicKey, bool) {
3333
s.mu.Lock()
3434
defer s.mu.Unlock()
3535

3636
v, ok := s.eonKeys[keyperConfigIndex]
3737
return v, ok
3838
}
3939

40-
func (s *Storage) AddKeyperSet(keyperConfigIndex uint64, keyperSet *obskeyperdatabase.KeyperSet) {
40+
func (s *Memory) AddKeyperSet(keyperConfigIndex uint64, keyperSet *obskeyperdatabase.KeyperSet) {
4141
s.mu.Lock()
4242
defer s.mu.Unlock()
4343

4444
s.keyperSets[keyperConfigIndex] = keyperSet
4545
}
4646

47-
func (s *Storage) GetKeyperSet(keyperConfigIndex uint64) (*obskeyperdatabase.KeyperSet, bool) {
47+
func (s *Memory) GetKeyperSet(keyperConfigIndex uint64) (*obskeyperdatabase.KeyperSet, bool) {
4848
s.mu.Lock()
4949
defer s.mu.Unlock()
5050

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package synchandler
2+
3+
import (
4+
"context"
5+
6+
"github.com/ethereum/go-ethereum/accounts/abi"
7+
"github.com/ethereum/go-ethereum/common"
8+
"github.com/ethereum/go-ethereum/core/types"
9+
"github.com/rs/zerolog/log"
10+
"github.com/shutter-network/shop-contracts/bindings"
11+
12+
"github.com/shutter-network/shutter/shlib/shcrypto"
13+
14+
"github.com/shutter-network/rolling-shutter/rolling-shutter/gnosisaccessnode/storage"
15+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync/syncer"
16+
)
17+
18+
func init() {
19+
var err error
20+
KeyBroadcastContractContractABI, err = bindings.KeyBroadcastContractMetaData.GetAbi()
21+
if err != nil {
22+
panic(err)
23+
}
24+
}
25+
26+
var KeyBroadcastContractContractABI *abi.ABI
27+
28+
func NewEonKeyBroadcast(
29+
store *storage.Memory,
30+
contractAddress common.Address,
31+
) (syncer.ContractEventHandler, error) {
32+
return syncer.WrapHandler(&EonKeyBroadcast{
33+
evABI: KeyBroadcastContractContractABI,
34+
keyBroadcastAddress: contractAddress,
35+
storage: store,
36+
})
37+
}
38+
39+
type EonKeyBroadcast struct {
40+
storage *storage.Memory
41+
evABI *abi.ABI
42+
keyBroadcastAddress common.Address
43+
}
44+
45+
func (handler *EonKeyBroadcast) Address() common.Address {
46+
return handler.keyBroadcastAddress
47+
}
48+
49+
func (*EonKeyBroadcast) Event() string {
50+
// TODO: look this up that his is correct
51+
return "EonKeyBroadcast"
52+
}
53+
54+
func (handler *EonKeyBroadcast) ABI() abi.ABI {
55+
return *handler.evABI
56+
}
57+
58+
func (handler *EonKeyBroadcast) Accept(
59+
_ context.Context,
60+
_ types.Header,
61+
_ bindings.KeyBroadcastContractEonKeyBroadcast,
62+
) (bool, error) {
63+
return true, nil
64+
}
65+
66+
func (handler *EonKeyBroadcast) Handle(
67+
_ context.Context,
68+
_ syncer.ChainUpdateContext,
69+
events []bindings.KeyBroadcastContractEonKeyBroadcast,
70+
) error {
71+
for _, ev := range events {
72+
key := new(shcrypto.EonPublicKey)
73+
err := key.Unmarshal(ev.Key)
74+
if err != nil {
75+
log.Error().
76+
Err(err).
77+
Hex("key", ev.Key).
78+
Int("keyper-config-index", int(ev.Eon)).
79+
Msg("received invalid eon key")
80+
return nil
81+
}
82+
log.Info().
83+
Int("keyper-config-index", int(ev.Eon)).
84+
Hex("key", ev.Key).
85+
Msg("adding eon key")
86+
handler.storage.AddEonKey(ev.Eon, key)
87+
}
88+
return nil
89+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package synchandler
2+
3+
import (
4+
"context"
5+
6+
"github.com/ethereum/go-ethereum/accounts/abi"
7+
"github.com/ethereum/go-ethereum/common"
8+
"github.com/ethereum/go-ethereum/core/types"
9+
"github.com/rs/zerolog/log"
10+
"github.com/shutter-network/shop-contracts/bindings"
11+
12+
obskeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
13+
"github.com/shutter-network/rolling-shutter/rolling-shutter/gnosisaccessnode/storage"
14+
keypersetsync "github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/synchandler"
15+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync/client"
16+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync/syncer"
17+
"github.com/shutter-network/rolling-shutter/rolling-shutter/shdb"
18+
)
19+
20+
func init() {
21+
var err error
22+
KeyperSetManagerContractABI, err = bindings.KeyperSetManagerMetaData.GetAbi()
23+
if err != nil {
24+
panic(err)
25+
}
26+
}
27+
28+
var KeyperSetManagerContractABI *abi.ABI
29+
30+
func NewKeyperSetAdded(
31+
ethClient client.Client,
32+
store *storage.Memory,
33+
contractAddress common.Address,
34+
) (syncer.ContractEventHandler, error) {
35+
// we need access to an additional contract here in oder to pull in some more
36+
// required information about the keyper sets:
37+
ksm, err := bindings.NewKeyperSetManager(contractAddress, ethClient)
38+
if err != nil {
39+
return nil, err
40+
}
41+
return syncer.WrapHandler(&KeyperSetAdded{
42+
storage: store,
43+
evABI: KeyperSetManagerContractABI,
44+
keyperSetManagerAddress: contractAddress,
45+
keyperSetManager: ksm,
46+
ethClient: ethClient,
47+
})
48+
}
49+
50+
type KeyperSetAdded struct {
51+
storage *storage.Memory
52+
evABI *abi.ABI
53+
keyperSetManagerAddress common.Address
54+
ethClient client.Client
55+
keyperSetManager *bindings.KeyperSetManager
56+
}
57+
58+
func (handler *KeyperSetAdded) Address() common.Address {
59+
return handler.keyperSetManagerAddress
60+
}
61+
62+
func (*KeyperSetAdded) Event() string {
63+
return "KeyperSetAdded"
64+
}
65+
66+
func (handler *KeyperSetAdded) ABI() abi.ABI {
67+
return *handler.evABI
68+
}
69+
70+
func (handler *KeyperSetAdded) Accept(
71+
_ context.Context,
72+
_ types.Header,
73+
_ bindings.KeyperSetManagerKeyperSetAdded,
74+
) (bool, error) {
75+
return true, nil
76+
}
77+
78+
func (handler *KeyperSetAdded) Handle(
79+
ctx context.Context,
80+
update syncer.ChainUpdateContext,
81+
events []bindings.KeyperSetManagerKeyperSetAdded,
82+
) error {
83+
// TODO: handle reorgs here
84+
_ = update
85+
86+
for _, ev := range events {
87+
keyperSet, err := keypersetsync.QueryFullKeyperSetFromKeyperSetAddedEvent(
88+
ctx,
89+
handler.ethClient,
90+
ev,
91+
handler.keyperSetManager,
92+
)
93+
if err != nil {
94+
log.Error().Err(err).Msg("KeyperSetAdded event, error querying keyperset-data")
95+
}
96+
// FIXME: integer overflow protection
97+
obsKeyperSet := obskeyperdatabase.KeyperSet{
98+
KeyperConfigIndex: int64(keyperSet.Eon),
99+
ActivationBlockNumber: int64(keyperSet.ActivationBlock),
100+
Keypers: shdb.EncodeAddresses(keyperSet.Members),
101+
Threshold: int32(keyperSet.Threshold),
102+
}
103+
log.Info().
104+
Uint64("keyper-config-index", keyperSet.Eon).
105+
Uint64("activation-block-number", keyperSet.ActivationBlock).
106+
Int("num-keypers", len(keyperSet.Members)).
107+
Uint64("threshold", keyperSet.Threshold).
108+
Msg("adding keyper set")
109+
handler.storage.AddKeyperSet(keyperSet.Eon, &obsKeyperSet)
110+
}
111+
return nil
112+
}

0 commit comments

Comments
 (0)