@@ -4,18 +4,27 @@ import (
4
4
"context"
5
5
6
6
"github.com/pkg/errors"
7
+ "github.com/rs/zerolog/log"
7
8
9
+ "github.com/shutter-network/shutter/shlib/shcrypto"
10
+
11
+ obskeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
12
+ "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync"
13
+ syncevent "github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync/event"
8
14
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/service"
9
15
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2p"
16
+ "github.com/shutter-network/rolling-shutter/rolling-shutter/shdb"
10
17
)
11
18
12
19
type GnosisAccessNode struct {
13
- config * Config
20
+ config * Config
21
+ storage * Storage
14
22
}
15
23
16
24
func New (config * Config ) * GnosisAccessNode {
17
25
return & GnosisAccessNode {
18
- config : config ,
26
+ config : config ,
27
+ storage : NewStorage (),
19
28
}
20
29
}
21
30
@@ -25,5 +34,54 @@ func (node *GnosisAccessNode) Start(ctx context.Context, runner service.Runner)
25
34
return errors .Wrap (err , "failed to initialize p2p messaging" )
26
35
}
27
36
messageSender .AddMessageHandler (NewDecryptionKeysHandler (node .config ))
28
- return runner .StartService (messageSender )
37
+
38
+ chainSyncClient , err := chainsync .NewClient (
39
+ ctx ,
40
+ chainsync .WithClientURL (node .config .GnosisNode .EthereumURL ),
41
+ chainsync .WithKeyperSetManager (node .config .Contracts .KeyperSetManager ),
42
+ chainsync .WithKeyBroadcastContract (node .config .Contracts .KeyBroadcastContract ),
43
+ chainsync .WithSyncNewKeyperSet (node .onNewKeyperSet ),
44
+ chainsync .WithSyncNewEonKey (node .onNewEonKey ),
45
+ )
46
+ if err != nil {
47
+ return errors .Wrap (err , "failed to initialize chain sync client" )
48
+ }
49
+
50
+ return runner .StartService (messageSender , chainSyncClient )
51
+ }
52
+
53
+ func (node * GnosisAccessNode ) onNewKeyperSet (_ context.Context , keyperSet * syncevent.KeyperSet ) error {
54
+ obsKeyperSet := obskeyperdatabase.KeyperSet {
55
+ KeyperConfigIndex : int64 (keyperSet .Eon ),
56
+ ActivationBlockNumber : int64 (keyperSet .ActivationBlock ),
57
+ Keypers : shdb .EncodeAddresses (keyperSet .Members ),
58
+ Threshold : int32 (keyperSet .Threshold ),
59
+ }
60
+ log .Info ().
61
+ Uint64 ("keyper-config-index" , keyperSet .Eon ).
62
+ Uint64 ("activation-block-number" , keyperSet .ActivationBlock ).
63
+ Int ("num-keypers" , len (keyperSet .Members )).
64
+ Uint64 ("threshold" , keyperSet .Threshold ).
65
+ Msg ("adding keyper set" )
66
+ node .storage .AddKeyperSet (keyperSet .Eon , & obsKeyperSet )
67
+ return nil
68
+ }
69
+
70
+ func (node * GnosisAccessNode ) onNewEonKey (_ context.Context , eonKey * syncevent.EonPublicKey ) error {
71
+ key := new (shcrypto.EonPublicKey )
72
+ err := key .Unmarshal (eonKey .Key )
73
+ if err != nil {
74
+ log .Error ().
75
+ Err (err ).
76
+ Hex ("key" , eonKey .Key ).
77
+ Int ("keyper-config-index" , int (eonKey .Eon )).
78
+ Msg ("received invalid eon key" )
79
+ return nil
80
+ }
81
+ log .Info ().
82
+ Int ("keyper-config-index" , int (eonKey .Eon )).
83
+ Hex ("key" , eonKey .Key ).
84
+ Msg ("adding eon key" )
85
+ node .storage .AddEonKey (eonKey .Eon , key )
86
+ return nil
29
87
}
0 commit comments