Skip to content

Commit 4ddd3af

Browse files
committed
feat: use new chainsyncer
keyper: add contract-addresses to config keyper-core: implement DB chaincache gnosis-keyper: use new chainsyncer gnosis-keyper: remove old sync-handler gnosisaccessnode: use new chainsyncer gnosisaccessnode: move storage to package gnosis-keyper: Rename some functions and types gnosis-keyper: refactor keyperCore init func gnosis-keyper: Pass dbpool to keyper core fixup keyper-core opts keyper: implement SyncStartBlock / DatabaseChainCache initial syncing gnosis-keyper: Add int64 overflow checks gnosis-keyper: add new synchandler fixup gnosis keyper chore: avoid var shadow feat(chainsync): add retry in initial block fetch chore: rename keypersetmanager synchandler chore: re-use the gnosis eth-client in keyper-core chore: refine comments chore: remove unnecessary import chore: fix generate, gci, gofumpt
1 parent 8b60b75 commit 4ddd3af

File tree

32 files changed

+741
-693
lines changed

32 files changed

+741
-693
lines changed

rolling-shutter/chainobserver/db/keyper/keyper.sqlc.gen.go

+137
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rolling-shutter/chainobserver/db/keyper/sql/queries/keyper.sql

+39-1
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,42 @@ ORDER BY activation_block_number DESC LIMIT 1;
1818

1919
-- name: GetKeyperSets :many
2020
SELECT * FROM keyper_set
21-
ORDER BY activation_block_number ASC;
21+
ORDER BY activation_block_number ASC;
22+
23+
-- name: InsertSyncedBlock :exec
24+
INSERT INTO recent_block (
25+
block_hash,
26+
block_number,
27+
parent_hash,
28+
timestamp,
29+
header
30+
) VALUES (
31+
$1, $2, $3, $4, $5
32+
) ON CONFLICT DO UPDATE SET
33+
block_hash = $1,
34+
block_number =$2 ,
35+
parent_hash =$3,
36+
timestamp =$4 ,
37+
header =$5
38+
;
39+
40+
-- name: GetSyncedBlockByHash :one
41+
SELECT * FROM recent_block
42+
WHERE block_hash = $1;
43+
44+
-- name: DeleteSyncedBlockByHash :exec
45+
DELETE FROM recent_block
46+
WHERE block_hash = $1;
47+
48+
-- name: GetSyncedBlocks :many
49+
SELECT * FROM recent_block
50+
ORDER BY block_number DESC;
51+
52+
-- name: GetLatestSyncedBlocks :many
53+
SELECT * FROM recent_block
54+
ORDER BY block_number DESC
55+
LIMIT $1;
56+
57+
-- name: EvictSyncedBlocksBefore :exec
58+
DELETE FROM recent_block
59+
WHERE block_number < $1;

rolling-shutter/eonkeypublisher/eonkeypublisher.go

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ const (
2929
)
3030

3131
// EonKeyPublisher is a service that publishes eon keys via a eon key publisher contract.
32+
// E.g. in the Gnosis keyper implementation this is used to publish keys onchain
33+
// instead of broadcasting it on the p2p-network.
3234
type EonKeyPublisher struct {
3335
dbpool *pgxpool.Pool
3436
client *ethclient.Client

rolling-shutter/gnosisaccessnode/decryptionkeyshandler.go

+4-3
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

+32-54
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,28 @@ package gnosisaccessnode
22

33
import (
44
"context"
5+
"fmt"
56

7+
"github.com/ethereum/go-ethereum/ethclient"
68
"github.com/pkg/errors"
7-
"github.com/rs/zerolog/log"
89

9-
"github.com/shutter-network/shutter/shlib/shcrypto"
10-
11-
obskeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
10+
"github.com/shutter-network/rolling-shutter/rolling-shutter/gnosisaccessnode/storage"
11+
"github.com/shutter-network/rolling-shutter/rolling-shutter/gnosisaccessnode/synchandler"
1212
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync"
13-
syncevent "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync/event"
1413
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/metricsserver"
1514
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/service"
1615
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2p"
17-
"github.com/shutter-network/rolling-shutter/rolling-shutter/shdb"
1816
)
1917

2018
type GnosisAccessNode struct {
2119
config *Config
22-
storage *Storage
20+
storage *storage.Memory
2321
}
2422

2523
func New(config *Config) *GnosisAccessNode {
2624
return &GnosisAccessNode{
2725
config: config,
28-
storage: NewStorage(),
26+
storage: storage.NewMemory(),
2927
}
3028
}
3129

@@ -39,59 +37,39 @@ func (node *GnosisAccessNode) Start(ctx context.Context, runner service.Runner)
3937
messageSender.AddMessageHandler(NewDecryptionKeysHandler(node.config, node.storage))
4038
services = append(services, messageSender)
4139

42-
chainSyncClient, err := chainsync.NewClient(
43-
ctx,
44-
chainsync.WithClientURL(node.config.GnosisNode.EthereumURL),
45-
chainsync.WithKeyperSetManager(node.config.Contracts.KeyperSetManager),
46-
chainsync.WithKeyBroadcastContract(node.config.Contracts.KeyBroadcastContract),
47-
chainsync.WithSyncNewKeyperSet(node.onNewKeyperSet),
48-
chainsync.WithSyncNewEonKey(node.onNewEonKey),
40+
ethClient, err := ethclient.DialContext(ctx, node.config.GnosisNode.EthereumURL)
41+
if err != nil {
42+
return err
43+
}
44+
keyperSetAdded, err := synchandler.NewKeyperSetAdded(
45+
ethClient,
46+
node.storage,
47+
node.config.Contracts.KeyperSetManager,
4948
)
5049
if err != nil {
51-
return errors.Wrap(err, "failed to initialize chain sync client")
50+
return err
5251
}
53-
services = append(services, chainSyncClient)
54-
52+
eonKeyBroadcast, err := synchandler.NewEonKeyBroadcast(
53+
node.storage,
54+
node.config.Contracts.KeyBroadcastContract,
55+
)
56+
if err != nil {
57+
return err
58+
}
59+
chainsyncOpts := []chainsync.Option{
60+
chainsync.WithClient(ethClient),
61+
chainsync.WithContractEventHandler(keyperSetAdded),
62+
chainsync.WithContractEventHandler(eonKeyBroadcast),
63+
}
64+
chainsyncer, err := chainsync.New(chainsyncOpts...)
65+
if err != nil {
66+
return fmt.Errorf("can't instantiate chainsync: %w", err)
67+
}
68+
services = append(services, chainsyncer)
5569
if node.config.Metrics.Enabled {
5670
metricsServer := metricsserver.New(node.config.Metrics)
5771
services = append(services, metricsServer)
5872
}
5973

6074
return runner.StartService(services...)
6175
}
62-
63-
func (node *GnosisAccessNode) onNewKeyperSet(_ context.Context, keyperSet *syncevent.KeyperSet) error {
64-
obsKeyperSet := obskeyperdatabase.KeyperSet{
65-
KeyperConfigIndex: int64(keyperSet.Eon),
66-
ActivationBlockNumber: int64(keyperSet.ActivationBlock),
67-
Keypers: shdb.EncodeAddresses(keyperSet.Members),
68-
Threshold: int32(keyperSet.Threshold),
69-
}
70-
log.Info().
71-
Uint64("keyper-config-index", keyperSet.Eon).
72-
Uint64("activation-block-number", keyperSet.ActivationBlock).
73-
Int("num-keypers", len(keyperSet.Members)).
74-
Uint64("threshold", keyperSet.Threshold).
75-
Msg("adding keyper set")
76-
node.storage.AddKeyperSet(keyperSet.Eon, &obsKeyperSet)
77-
return nil
78-
}
79-
80-
func (node *GnosisAccessNode) onNewEonKey(_ context.Context, eonKey *syncevent.EonPublicKey) error {
81-
key := new(shcrypto.EonPublicKey)
82-
err := key.Unmarshal(eonKey.Key)
83-
if err != nil {
84-
log.Error().
85-
Err(err).
86-
Hex("key", eonKey.Key).
87-
Int("keyper-config-index", int(eonKey.Eon)).
88-
Msg("received invalid eon key")
89-
return nil
90-
}
91-
log.Info().
92-
Int("keyper-config-index", int(eonKey.Eon)).
93-
Hex("key", eonKey.Key).
94-
Msg("adding eon key")
95-
node.storage.AddEonKey(eonKey.Eon, key)
96-
return nil
97-
}

0 commit comments

Comments
 (0)