Skip to content

Commit 71c06dd

Browse files
authored
Merge pull request #478 from shutter-network/fix-eon-key-publishing
Fix eon key publishing
2 parents 0d7a580 + 06b60b7 commit 71c06dd

File tree

3 files changed

+54
-21
lines changed

3 files changed

+54
-21
lines changed

rolling-shutter/eonkeypublisher/eonkeypublisher.go

Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,29 +30,29 @@ const (
3030

3131
// EonKeyPublisher is a service that publishes eon keys via a eon key publisher contract.
3232
type EonKeyPublisher struct {
33-
dbpool *pgxpool.Pool
34-
client *ethclient.Client
35-
contract *bindings.EonKeyPublish
36-
privateKey *ecdsa.PrivateKey
33+
dbpool *pgxpool.Pool
34+
client *ethclient.Client
35+
keyperSetManager *bindings.KeyperSetManager
36+
privateKey *ecdsa.PrivateKey
3737

3838
keys chan keyper.EonPublicKey
3939
}
4040

4141
func NewEonKeyPublisher(
4242
dbpool *pgxpool.Pool,
4343
client *ethclient.Client,
44-
eonKeyPublishAddress common.Address,
44+
keyperSetManagerAddress common.Address,
4545
privateKey *ecdsa.PrivateKey,
4646
) (*EonKeyPublisher, error) {
47-
contract, err := bindings.NewEonKeyPublish(eonKeyPublishAddress, client)
47+
keyperSetManager, err := bindings.NewKeyperSetManager(keyperSetManagerAddress, client)
4848
if err != nil {
49-
return nil, errors.Wrap(err, "failed to instantiate eon key publisher contract")
49+
return nil, errors.Wrapf(err, "failed to instantiate keyper set manager contract at address %s", keyperSetManagerAddress.Hex())
5050
}
5151
return &EonKeyPublisher{
52-
dbpool: dbpool,
53-
client: client,
54-
contract: contract,
55-
privateKey: privateKey,
52+
dbpool: dbpool,
53+
client: client,
54+
keyperSetManager: keyperSetManager,
55+
privateKey: privateKey,
5656

5757
keys: make(chan keyper.EonPublicKey, eonKeyChannelSize),
5858
}, nil
@@ -83,7 +83,7 @@ func (p *EonKeyPublisher) Publish(key keyper.EonPublicKey) {
8383
// set, unless the key is already confirmed or the keyper has already voted on it.
8484
func (p *EonKeyPublisher) publishIfResponsible(ctx context.Context, key keyper.EonPublicKey) {
8585
db := obskeyperdb.New(p.dbpool)
86-
keyperSet, err := db.GetKeyperSetByKeyperConfigIndex(ctx, int64(key.Eon))
86+
keyperSet, err := db.GetKeyperSetByKeyperConfigIndex(ctx, int64(key.KeyperConfigIndex))
8787
if err != nil {
8888
log.Error().
8989
Err(err).
@@ -121,11 +121,21 @@ func (p *EonKeyPublisher) publishOldKeys(ctx context.Context) {
121121
}
122122
dkgResult, err := shdb.DecodePureDKGResult(dkgResultDB.PureResult)
123123
if err != nil {
124-
err := errors.Wrapf(err, "failed to decode DKG result of eon %d", dkgResultDB.Eon)
125-
log.Error().Err(err).Msg("failed to publish old eon keys")
124+
log.Error().
125+
Err(err).
126+
Int64("eon", dkgResultDB.Eon).
127+
Msg("failed to decode DKG result to publish old eon key")
126128
continue
127129
}
128-
p.publish(ctx, dkgResult.PublicKey.Marshal(), dkgResult.Eon, dkgResult.Keyper)
130+
eon, err := db.GetEon(ctx, dkgResultDB.Eon)
131+
if err != nil {
132+
log.Error().
133+
Err(err).
134+
Int64("eon", dkgResultDB.Eon).
135+
Msg("failed to fetch eon to publish old eon public key")
136+
continue
137+
}
138+
p.publish(ctx, dkgResult.PublicKey.Marshal(), uint64(eon.KeyperConfigIndex), dkgResult.Keyper)
129139
}
130140
}
131141

@@ -145,8 +155,12 @@ func (p *EonKeyPublisher) publish(ctx context.Context, key []byte, keyperSetInde
145155
}
146156

147157
func (p *EonKeyPublisher) tryPublish(ctx context.Context, key []byte, keyperSetIndex uint64, keyperIndex uint64) error {
158+
contract, err := p.getEonKeyPublisherContract(keyperSetIndex)
159+
if err != nil {
160+
return err
161+
}
148162
keyperAddress := ethcrypto.PubkeyToAddress(p.privateKey.PublicKey)
149-
hasAlreadyVoted, err := p.contract.HasKeyperVoted(&bind.CallOpts{}, keyperAddress)
163+
hasAlreadyVoted, err := contract.HasKeyperVoted(&bind.CallOpts{}, keyperAddress)
150164
if err != nil {
151165
return errors.Wrap(err, "failed to query eon key publisher contract if keyper has already voted")
152166
}
@@ -158,7 +172,7 @@ func (p *EonKeyPublisher) tryPublish(ctx context.Context, key []byte, keyperSetI
158172
Msg("not publishing eon key as keyper has already voted")
159173
return nil
160174
}
161-
isAlreadyConfirmed, err := p.contract.EonKeyConfirmed(&bind.CallOpts{}, key)
175+
isAlreadyConfirmed, err := contract.EonKeyConfirmed(&bind.CallOpts{}, key)
162176
if err != nil {
163177
return errors.Wrap(err, "failed to query eon key publisher contract if eon key is confirmed")
164178
}
@@ -178,7 +192,7 @@ func (p *EonKeyPublisher) tryPublish(ctx context.Context, key []byte, keyperSetI
178192
if err != nil {
179193
return errors.Wrap(err, "failed to construct tx opts")
180194
}
181-
tx, err := p.contract.PublishEonKey(opts, key, keyperIndex)
195+
tx, err := contract.PublishEonKey(opts, key, keyperIndex)
182196
if err != nil {
183197
return errors.Wrap(err, "failed to send publish eon key tx")
184198
}
@@ -206,3 +220,24 @@ func (p *EonKeyPublisher) tryPublish(ctx context.Context, key []byte, keyperSetI
206220
Msg("successfully published eon key")
207221
return nil
208222
}
223+
224+
func (p *EonKeyPublisher) getEonKeyPublisherContract(keyperSetIndex uint64) (*bindings.EonKeyPublish, error) {
225+
opts := &bind.CallOpts{}
226+
keyperSetAddress, err := p.keyperSetManager.GetKeyperSetAddress(opts, keyperSetIndex)
227+
if err != nil {
228+
return nil, errors.Wrapf(err, "failed to get keyper set address from manager for index %d", keyperSetIndex)
229+
}
230+
keyperSet, err := bindings.NewKeyperSet(keyperSetAddress, p.client)
231+
if err != nil {
232+
return nil, errors.Wrapf(err, "failed to instantiate keyper set contract at address %s", keyperSetAddress.Hex())
233+
}
234+
eonKeyPublisherAddress, err := keyperSet.GetPublisher(opts)
235+
if err != nil {
236+
return nil, errors.Wrapf(err, "failed to get eon key publisher contract from keyper set at address %s", keyperSetAddress.Hex())
237+
}
238+
eonKeyPublisher, err := bindings.NewEonKeyPublish(eonKeyPublisherAddress, p.client)
239+
if err != nil {
240+
return nil, errors.Wrapf(err, "failed to instantiate eon key publisher contract at address %s", eonKeyPublisherAddress.Hex())
241+
}
242+
return eonKeyPublisher, nil
243+
}

rolling-shutter/keyperimpl/gnosis/config.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,6 @@ func (c *GnosisConfig) TOMLWriteHeader(_ io.Writer) (int, error) {
166166
type GnosisContractsConfig struct {
167167
KeyperSetManager common.Address `shconfig:",required"`
168168
KeyBroadcastContract common.Address `shconfig:",required"`
169-
EonKeyPublish common.Address `shconfig:",required"`
170169
Sequencer common.Address `shconfig:",required"`
171170
ValidatorRegistry common.Address `shconfig:",required"`
172171
}
@@ -175,7 +174,6 @@ func NewGnosisContractsConfig() *GnosisContractsConfig {
175174
return &GnosisContractsConfig{
176175
KeyperSetManager: common.Address{},
177176
KeyBroadcastContract: common.Address{},
178-
EonKeyPublish: common.Address{},
179177
Sequencer: common.Address{},
180178
ValidatorRegistry: common.Address{},
181179
}

rolling-shutter/keyperimpl/gnosis/keyper.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func (kpr *Keyper) Start(ctx context.Context, runner service.Runner) error {
128128
kpr.eonKeyPublisher, err = eonkeypublisher.NewEonKeyPublisher(
129129
kpr.dbpool,
130130
eonKeyPublisherClient,
131-
kpr.config.Gnosis.Contracts.EonKeyPublish,
131+
kpr.config.Gnosis.Contracts.KeyperSetManager,
132132
kpr.config.Gnosis.Node.PrivateKey.Key,
133133
)
134134
if err != nil {

0 commit comments

Comments
 (0)