Skip to content

Commit 747fd67

Browse files
committed
gnosisaccessnode: add synchandler for new chainsyncer
1 parent 73ac682 commit 747fd67

File tree

2 files changed

+200
-0
lines changed

2 files changed

+200
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
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+
"github.com/shutter-network/shutter/shlib/shcrypto"
12+
13+
"github.com/shutter-network/rolling-shutter/rolling-shutter/gnosisaccessnode/storage"
14+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync/syncer"
15+
)
16+
17+
func init() {
18+
var err error
19+
KeyBroadcastContractContractABI, err = bindings.KeyBroadcastContractMetaData.GetAbi()
20+
if err != nil {
21+
panic(err)
22+
}
23+
}
24+
25+
var KeyBroadcastContractContractABI *abi.ABI
26+
27+
func NewEonKeyBroadcast(
28+
store *storage.Memory,
29+
contractAddress common.Address,
30+
) (syncer.ContractEventHandler, error) {
31+
return syncer.WrapHandler(&EonKeyBroadcast{
32+
evABI: KeyBroadcastContractContractABI,
33+
keyBroadcastAddress: contractAddress,
34+
storage: store,
35+
})
36+
}
37+
38+
type EonKeyBroadcast struct {
39+
storage *storage.Memory
40+
evABI *abi.ABI
41+
keyBroadcastAddress common.Address
42+
}
43+
44+
func (handler *EonKeyBroadcast) Address() common.Address {
45+
return handler.keyBroadcastAddress
46+
}
47+
48+
func (*EonKeyBroadcast) Event() string {
49+
// TODO: look this up that his is correct
50+
return "EonKeyBroadcast"
51+
}
52+
53+
func (handler *EonKeyBroadcast) ABI() abi.ABI {
54+
return *handler.evABI
55+
}
56+
57+
func (handler *EonKeyBroadcast) Accept(
58+
_ context.Context,
59+
_ types.Header,
60+
_ bindings.KeyBroadcastContractEonKeyBroadcast,
61+
) (bool, error) {
62+
return true, nil
63+
}
64+
65+
func (handler *EonKeyBroadcast) Handle(
66+
_ context.Context,
67+
_ syncer.ChainUpdateContext,
68+
events []bindings.KeyBroadcastContractEonKeyBroadcast,
69+
) error {
70+
for _, ev := range events {
71+
key := new(shcrypto.EonPublicKey)
72+
err := key.Unmarshal(ev.Key)
73+
if err != nil {
74+
log.Error().
75+
Err(err).
76+
Hex("key", ev.Key).
77+
Int("keyper-config-index", int(ev.Eon)).
78+
Msg("received invalid eon key")
79+
return nil
80+
}
81+
log.Info().
82+
Int("keyper-config-index", int(ev.Eon)).
83+
Hex("key", ev.Key).
84+
Msg("adding eon key")
85+
handler.storage.AddEonKey(ev.Eon, key)
86+
}
87+
return nil
88+
}
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)