Skip to content

Commit 715145e

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

File tree

2 files changed

+201
-0
lines changed

2 files changed

+201
-0
lines changed
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)