@@ -2,21 +2,34 @@ package gnosis
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
5
6
7
+ "github.com/jackc/pgx/v4"
8
+ "github.com/jackc/pgx/v4/pgxpool"
6
9
"github.com/pkg/errors"
10
+ "github.com/rs/zerolog/log"
7
11
12
+ obskeyper "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
8
13
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyper"
9
14
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/epochkghandler"
10
15
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/kprconfig"
11
16
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis/database"
17
+ "github.com/shutter-network/rolling-shutter/rolling-shutter/medley"
12
18
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/broker"
19
+ "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync"
20
+ syncevent "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync/event"
13
21
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/db"
14
22
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/service"
23
+ "github.com/shutter-network/rolling-shutter/rolling-shutter/shdb"
15
24
)
16
25
26
+ var ErrParseKeyperSet = errors .New ("can't parse KeyperSet" )
27
+
17
28
type Keyper struct {
18
- core * keyper.KeyperCore
19
- config * Config
29
+ core * keyper.KeyperCore
30
+ config * Config
31
+ dbpool * pgxpool.Pool
32
+ chainSyncClient * chainsync.Client
20
33
}
21
34
22
35
func New (c * Config ) * Keyper {
@@ -26,10 +39,12 @@ func New(c *Config) *Keyper {
26
39
}
27
40
28
41
func (kpr * Keyper ) Start (ctx context.Context , runner service.Runner ) error {
42
+ var err error
43
+
29
44
decrTrigChan := make (chan * broker.Event [* epochkghandler.DecryptionTrigger ])
30
45
runner .Defer (func () { close (decrTrigChan ) })
31
46
32
- dbpool , err : = db .Connect (ctx , runner , kpr .config .DatabaseURL , database .Definition .Name ())
47
+ kpr . dbpool , err = db .Connect (ctx , runner , kpr .config .DatabaseURL , database .Definition .Name ())
33
48
if err != nil {
34
49
return errors .Wrap (err , "failed to connect to database" )
35
50
}
@@ -46,11 +61,74 @@ func (kpr *Keyper) Start(ctx context.Context, runner service.Runner) error {
46
61
Metrics : kpr .config .Metrics ,
47
62
},
48
63
decrTrigChan ,
49
- keyper .WithDBPool (dbpool ),
64
+ keyper .WithDBPool (kpr .dbpool ),
65
+ keyper .NoBroadcastEonPublicKey (),
66
+ keyper .WithEonPublicKeyHandler (kpr .newEonPublicKey ),
50
67
)
51
68
if err != nil {
52
69
return errors .Wrap (err , "can't instantiate keyper core" )
53
70
}
54
71
55
- return runner .StartService (kpr .core )
72
+ kpr .chainSyncClient , err = chainsync .NewClient (
73
+ ctx ,
74
+ chainsync .WithClientURL (kpr .config .Gnosis .EthereumURL ),
75
+ chainsync .WithKeyperSetManager (kpr .config .GnosisContracts .KeyperSetManager ),
76
+ chainsync .WithKeyBroadcastContract (kpr .config .GnosisContracts .KeyBroadcastContract ),
77
+ chainsync .WithSyncNewBlock (kpr .newBlock ),
78
+ chainsync .WithSyncNewKeyperSet (kpr .newKeyperSet ),
79
+ chainsync .WithPrivateKey (kpr .config .Gnosis .PrivateKey .Key ),
80
+ )
81
+ if err != nil {
82
+ return err
83
+ }
84
+
85
+ return runner .StartService (kpr .core , kpr .chainSyncClient )
86
+ }
87
+
88
+ func (kpr * Keyper ) newBlock (_ context.Context , ev * syncevent.LatestBlock ) error {
89
+ log .Info ().
90
+ Uint64 ("number" , ev .Number .Uint64 ()).
91
+ Str ("hash" , ev .BlockHash .Hex ()).
92
+ Msg ("new latest block" )
93
+ return nil
94
+ }
95
+
96
+ func (kpr * Keyper ) newKeyperSet (ctx context.Context , ev * syncevent.KeyperSet ) error {
97
+ log .Info ().
98
+ Uint64 ("activation-block" , ev .ActivationBlock ).
99
+ Uint64 ("eon" , ev .Eon ).
100
+ Msg ("new keyper set added" )
101
+ fmt .Printf ("%+v\n " , ev .Members )
102
+
103
+ return kpr .dbpool .BeginFunc (ctx , func (tx pgx.Tx ) error {
104
+ obskeyperdb := obskeyper .New (tx )
105
+
106
+ keyperConfigIndex , err := medley .Uint64ToInt64Safe (ev .Eon )
107
+ if err != nil {
108
+ return errors .Wrap (err , ErrParseKeyperSet .Error ())
109
+ }
110
+ activationBlockNumber , err := medley .Uint64ToInt64Safe (ev .ActivationBlock )
111
+ if err != nil {
112
+ return errors .Wrap (err , ErrParseKeyperSet .Error ())
113
+ }
114
+ threshold , err := medley .Uint64ToInt64Safe (ev .Threshold )
115
+ if err != nil {
116
+ return errors .Wrap (err , ErrParseKeyperSet .Error ())
117
+ }
118
+
119
+ return obskeyperdb .InsertKeyperSet (ctx , obskeyper.InsertKeyperSetParams {
120
+ KeyperConfigIndex : keyperConfigIndex ,
121
+ ActivationBlockNumber : activationBlockNumber ,
122
+ Keypers : shdb .EncodeAddresses (ev .Members ),
123
+ Threshold : int32 (threshold ),
124
+ })
125
+ })
126
+ }
127
+
128
+ func (kpr * Keyper ) newEonPublicKey (_ context.Context , pubKey keyper.EonPublicKey ) error {
129
+ log .Info ().
130
+ Uint64 ("eon" , pubKey .Eon ).
131
+ Uint64 ("activation-block" , pubKey .ActivationBlock ).
132
+ Msg ("new eon pk" )
133
+ return nil
56
134
}
0 commit comments