Skip to content

Add chainsync handler implementations for the keyper packages #543

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: ezdac/02-add-chainsync
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions rolling-shutter/cmd/gnosiskeyper/gnosiskeyper.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/shutter-network/rolling-shutter/rolling-shutter/cmd/shversion"
"github.com/shutter-network/rolling-shutter/rolling-shutter/gnosiskeyperwatcher"
keyper "github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis"
keyperconfig "github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis/config"
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis/database"
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/configuration/command"
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/db"
Expand Down Expand Up @@ -38,7 +39,7 @@ Shuttermint node which have to be started separately in advance.`,
return builder.Command()
}

func main(config *keyper.Config) error {
func main(config *keyperconfig.Config) error {
log.Info().
Str("version", shversion.Version()).
Str("address", config.GetAddress().Hex()).
Expand All @@ -49,7 +50,7 @@ func main(config *keyper.Config) error {
return service.RunWithSighandler(context.Background(), kpr)
}

func initDB(cfg *keyper.Config) error {
func initDB(cfg *keyperconfig.Config) error {
ctx := context.Background()
dbpool, err := pgxpool.Connect(ctx, cfg.DatabaseURL)
if err != nil {
Expand All @@ -59,7 +60,7 @@ func initDB(cfg *keyper.Config) error {
return db.InitDB(ctx, dbpool, database.Definition.Name(), database.Definition)
}

func watch(cfg *keyper.Config) error {
func watch(cfg *keyperconfig.Config) error {
log.Info().Msg("starting monitor")
return service.RunWithSighandler(context.Background(), gnosiskeyperwatcher.New(cfg))
}
6 changes: 3 additions & 3 deletions rolling-shutter/gnosisaccessnode/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gnosisaccessnode
import (
"io"

gnosiskeyper "github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis"
gnosisconfig "github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis/config"
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/configuration"
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/metricsserver"
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2p"
Expand All @@ -13,7 +13,7 @@ type Config struct {
InstanceID uint64

GnosisNode *configuration.EthnodeConfig
Contracts *gnosiskeyper.GnosisContractsConfig
Contracts *gnosisconfig.GnosisContractsConfig
P2P *p2p.Config
Metrics *metricsserver.MetricsConfig

Expand All @@ -22,7 +22,7 @@ type Config struct {

func (c *Config) Init() {
c.GnosisNode = configuration.NewEthnodeConfig()
c.Contracts = gnosiskeyper.NewGnosisContractsConfig()
c.Contracts = gnosisconfig.NewGnosisContractsConfig()
c.P2P = p2p.NewConfig()
c.Metrics = metricsserver.NewConfig()
}
Expand Down
7 changes: 4 additions & 3 deletions rolling-shutter/gnosisaccessnode/decryptionkeyshandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,20 @@ import (

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

"github.com/shutter-network/rolling-shutter/rolling-shutter/gnosisaccessnode/storage"
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis"
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2pmsg"
)

type DecryptionKeysHandler struct {
config *Config
storage *Storage
storage *storage.Memory
}

func NewDecryptionKeysHandler(config *Config, storage *Storage) *DecryptionKeysHandler {
func NewDecryptionKeysHandler(config *Config, store *storage.Memory) *DecryptionKeysHandler {
return &DecryptionKeysHandler{
config: config,
storage: storage,
storage: store,
}
}

Expand Down
5 changes: 3 additions & 2 deletions rolling-shutter/gnosisaccessnode/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/shutter-network/shutter/shlib/shcrypto"

obskeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
"github.com/shutter-network/rolling-shutter/rolling-shutter/gnosisaccessnode/storage"
chainsync "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/legacychainsync"
syncevent "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/legacychainsync/event"
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/metricsserver"
Expand All @@ -19,13 +20,13 @@ import (

type GnosisAccessNode struct {
config *Config
storage *Storage
storage *storage.Memory
}

func New(config *Config) *GnosisAccessNode {
return &GnosisAccessNode{
config: config,
storage: NewStorage(),
storage: storage.NewMemory(),
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gnosisaccessnode
package storage

import (
"sync"
Expand All @@ -8,43 +8,43 @@ import (
obskeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
)

type Storage struct {
type Memory struct {
mu sync.Mutex
eonKeys map[uint64]*shcrypto.EonPublicKey
keyperSets map[uint64]*obskeyperdatabase.KeyperSet
}

func NewStorage() *Storage {
return &Storage{
func NewMemory() *Memory {
return &Memory{
mu: sync.Mutex{},
eonKeys: make(map[uint64]*shcrypto.EonPublicKey),
keyperSets: make(map[uint64]*obskeyperdatabase.KeyperSet),
}
}

func (s *Storage) AddEonKey(keyperConfigIndex uint64, key *shcrypto.EonPublicKey) {
func (s *Memory) AddEonKey(keyperConfigIndex uint64, key *shcrypto.EonPublicKey) {
s.mu.Lock()
defer s.mu.Unlock()

s.eonKeys[keyperConfigIndex] = key
}

func (s *Storage) GetEonKey(keyperConfigIndex uint64) (*shcrypto.EonPublicKey, bool) {
func (s *Memory) GetEonKey(keyperConfigIndex uint64) (*shcrypto.EonPublicKey, bool) {
s.mu.Lock()
defer s.mu.Unlock()

v, ok := s.eonKeys[keyperConfigIndex]
return v, ok
}

func (s *Storage) AddKeyperSet(keyperConfigIndex uint64, keyperSet *obskeyperdatabase.KeyperSet) {
func (s *Memory) AddKeyperSet(keyperConfigIndex uint64, keyperSet *obskeyperdatabase.KeyperSet) {
s.mu.Lock()
defer s.mu.Unlock()

s.keyperSets[keyperConfigIndex] = keyperSet
}

func (s *Storage) GetKeyperSet(keyperConfigIndex uint64) (*obskeyperdatabase.KeyperSet, bool) {
func (s *Memory) GetKeyperSet(keyperConfigIndex uint64) (*obskeyperdatabase.KeyperSet, bool) {
s.mu.Lock()
defer s.mu.Unlock()

Expand Down
89 changes: 89 additions & 0 deletions rolling-shutter/gnosisaccessnode/synchandler/eonkey.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package synchandler

import (
"context"

"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/rs/zerolog/log"
"github.com/shutter-network/shop-contracts/bindings"

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

"github.com/shutter-network/rolling-shutter/rolling-shutter/gnosisaccessnode/storage"
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync/syncer"
)

func init() {
var err error
KeyBroadcastContractContractABI, err = bindings.KeyBroadcastContractMetaData.GetAbi()
if err != nil {
panic(err)
}
}

var KeyBroadcastContractContractABI *abi.ABI

func NewEonKeyBroadcast(
store *storage.Memory,
contractAddress common.Address,
) (syncer.ContractEventHandler, error) {
return syncer.WrapHandler(&EonKeyBroadcast{
evABI: KeyBroadcastContractContractABI,
keyBroadcastAddress: contractAddress,
storage: store,
})
}

type EonKeyBroadcast struct {
storage *storage.Memory
evABI *abi.ABI
keyBroadcastAddress common.Address
}

func (handler *EonKeyBroadcast) Address() common.Address {
return handler.keyBroadcastAddress
}

func (*EonKeyBroadcast) Event() string {
// TODO: look this up that his is correct
return "EonKeyBroadcast"
}

func (handler *EonKeyBroadcast) ABI() abi.ABI {
return *handler.evABI
}

func (handler *EonKeyBroadcast) Accept(
_ context.Context,
_ types.Header,
_ bindings.KeyBroadcastContractEonKeyBroadcast,
) (bool, error) {
return true, nil
}

func (handler *EonKeyBroadcast) Handle(
_ context.Context,
_ syncer.ChainUpdateContext,
events []bindings.KeyBroadcastContractEonKeyBroadcast,
) error {
for _, ev := range events {
key := new(shcrypto.EonPublicKey)
err := key.Unmarshal(ev.Key)
if err != nil {
log.Error().
Err(err).
Hex("key", ev.Key).
Int("keyper-config-index", int(ev.Eon)).
Msg("received invalid eon key")
return nil
}
log.Info().
Int("keyper-config-index", int(ev.Eon)).
Hex("key", ev.Key).
Msg("adding eon key")
handler.storage.AddEonKey(ev.Eon, key)
}
return nil
}
112 changes: 112 additions & 0 deletions rolling-shutter/gnosisaccessnode/synchandler/keypersetmanager.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package synchandler

import (
"context"

"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/rs/zerolog/log"
"github.com/shutter-network/shop-contracts/bindings"

obskeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
"github.com/shutter-network/rolling-shutter/rolling-shutter/gnosisaccessnode/storage"
keypersetsync "github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/synchandler"
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync/client"
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync/syncer"
"github.com/shutter-network/rolling-shutter/rolling-shutter/shdb"
)

func init() {
var err error
KeyperSetManagerContractABI, err = bindings.KeyperSetManagerMetaData.GetAbi()
if err != nil {
panic(err)
}
}

var KeyperSetManagerContractABI *abi.ABI

func NewKeyperSetAdded(
ethClient client.Client,
store *storage.Memory,
contractAddress common.Address,
) (syncer.ContractEventHandler, error) {
// we need access to an additional contract here in oder to pull in some more
// required information about the keyper sets:
ksm, err := bindings.NewKeyperSetManager(contractAddress, ethClient)
if err != nil {
return nil, err
}
return syncer.WrapHandler(&KeyperSetAdded{
storage: store,
evABI: KeyperSetManagerContractABI,
keyperSetManagerAddress: contractAddress,
keyperSetManager: ksm,
ethClient: ethClient,
})
}

type KeyperSetAdded struct {
storage *storage.Memory
evABI *abi.ABI
keyperSetManagerAddress common.Address
ethClient client.Client
keyperSetManager *bindings.KeyperSetManager
}

func (handler *KeyperSetAdded) Address() common.Address {
return handler.keyperSetManagerAddress
}

func (*KeyperSetAdded) Event() string {
return "KeyperSetAdded"
}

func (handler *KeyperSetAdded) ABI() abi.ABI {
return *handler.evABI
}

func (handler *KeyperSetAdded) Accept(
_ context.Context,
_ types.Header,
_ bindings.KeyperSetManagerKeyperSetAdded,
) (bool, error) {
return true, nil
}

func (handler *KeyperSetAdded) Handle(
ctx context.Context,
update syncer.ChainUpdateContext,
events []bindings.KeyperSetManagerKeyperSetAdded,
) error {
// TODO: handle reorgs here
_ = update

for _, ev := range events {
keyperSet, err := keypersetsync.QueryFullKeyperSetFromKeyperSetAddedEvent(
ctx,
handler.ethClient,
ev,
handler.keyperSetManager,
)
if err != nil {
log.Error().Err(err).Msg("KeyperSetAdded event, error querying keyperset-data")
}
// FIXME: integer overflow protection
obsKeyperSet := obskeyperdatabase.KeyperSet{
KeyperConfigIndex: int64(keyperSet.Eon),
ActivationBlockNumber: int64(keyperSet.ActivationBlock),
Keypers: shdb.EncodeAddresses(keyperSet.Members),
Threshold: int32(keyperSet.Threshold),
}
log.Info().
Uint64("keyper-config-index", keyperSet.Eon).
Uint64("activation-block-number", keyperSet.ActivationBlock).
Int("num-keypers", len(keyperSet.Members)).
Uint64("threshold", keyperSet.Threshold).
Msg("adding keyper set")
handler.storage.AddKeyperSet(keyperSet.Eon, &obsKeyperSet)
}
return nil
}
6 changes: 3 additions & 3 deletions rolling-shutter/gnosiskeyperwatcher/blocks.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ import (
"github.com/ethereum/go-ethereum/ethclient"
"github.com/rs/zerolog/log"

keyper "github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis"
gnosisconfig "github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis/config"
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/service"
)

type BlocksWatcher struct {
config *keyper.Config
config *gnosisconfig.Config
blocksChannel chan *BlockReceivedEvent
}

Expand All @@ -22,7 +22,7 @@ type BlockReceivedEvent struct {
Time time.Time
}

func NewBlocksWatcher(config *keyper.Config, blocksChannel chan *BlockReceivedEvent) *BlocksWatcher {
func NewBlocksWatcher(config *gnosisconfig.Config, blocksChannel chan *BlockReceivedEvent) *BlocksWatcher {
return &BlocksWatcher{
config: config,
blocksChannel: blocksChannel,
Expand Down
Loading