From 349116f6955f76066b182f0607c9e033211a245c Mon Sep 17 00:00:00 2001 From: Andrei Smirnov Date: Mon, 19 Jan 2026 20:49:53 +0300 Subject: [PATCH] *: edit commands publishing lock --- cmd/edit_addoperators.go | 1 + cmd/edit_addvalidators.go | 1 + cmd/edit_recreateprivatekeys.go | 1 + cmd/edit_removeoperators.go | 1 + cmd/edit_replaceoperator.go | 1 + dkg/protocolsteps.go | 8 ++++++++ dkg/protocolsteps_internal_test.go | 29 +++++++++++++++++++++++++++++ 7 files changed, 42 insertions(+) diff --git a/cmd/edit_addoperators.go b/cmd/edit_addoperators.go index 477813373..f3c672a1b 100644 --- a/cmd/edit_addoperators.go +++ b/cmd/edit_addoperators.go @@ -56,6 +56,7 @@ func newAddOperatorsCmd(runFunc func(context.Context, dkg.AddOperatorsConfig, dk bindLogFlags(cmd.Flags(), &dkgConfig.Log) bindEth1Flag(cmd.Flags(), &dkgConfig.ExecutionEngineAddr) bindShutdownDelayFlag(cmd.Flags(), &dkgConfig.ShutdownDelay) + bindPublishFlags(cmd.Flags(), &dkgConfig) return cmd } diff --git a/cmd/edit_addvalidators.go b/cmd/edit_addvalidators.go index 8858d6778..0f5516b45 100644 --- a/cmd/edit_addvalidators.go +++ b/cmd/edit_addvalidators.go @@ -77,6 +77,7 @@ func newAddValidatorsCmd(runFunc func(context.Context, addValidatorsConfig) erro bindLogFlags(cmd.Flags(), &config.DKG.Log) bindShutdownDelayFlag(cmd.Flags(), &config.DKG.ShutdownDelay) bindEth1Flag(cmd.Flags(), &config.DKG.ExecutionEngineAddr) + bindPublishFlags(cmd.Flags(), &config.DKG) cmd.Flags().DurationVar(&config.DKG.Timeout, "timeout", 1*time.Minute, "Timeout for the command, should be increased if the command times out.") // Bind `create dkg` flags. diff --git a/cmd/edit_recreateprivatekeys.go b/cmd/edit_recreateprivatekeys.go index 379a69b81..f652ecf50 100644 --- a/cmd/edit_recreateprivatekeys.go +++ b/cmd/edit_recreateprivatekeys.go @@ -47,6 +47,7 @@ func newRecreatePrivateKeysCmd(runFunc func(context.Context, dkg.ReshareConfig) bindLogFlags(cmd.Flags(), &config.DKGConfig.Log) bindEth1Flag(cmd.Flags(), &config.DKGConfig.ExecutionEngineAddr) bindShutdownDelayFlag(cmd.Flags(), &config.DKGConfig.ShutdownDelay) + bindPublishFlags(cmd.Flags(), &config.DKGConfig) return cmd } diff --git a/cmd/edit_removeoperators.go b/cmd/edit_removeoperators.go index 8f8382e9f..d6eb056cb 100644 --- a/cmd/edit_removeoperators.go +++ b/cmd/edit_removeoperators.go @@ -54,6 +54,7 @@ func newRemoveOperatorsCmd(runFunc func(context.Context, dkg.RemoveOperatorsConf bindLogFlags(cmd.Flags(), &dkgConfig.Log) bindEth1Flag(cmd.Flags(), &dkgConfig.ExecutionEngineAddr) bindShutdownDelayFlag(cmd.Flags(), &dkgConfig.ShutdownDelay) + bindPublishFlags(cmd.Flags(), &dkgConfig) return cmd } diff --git a/cmd/edit_replaceoperator.go b/cmd/edit_replaceoperator.go index a264ee460..a17b83782 100644 --- a/cmd/edit_replaceoperator.go +++ b/cmd/edit_replaceoperator.go @@ -55,6 +55,7 @@ func newReplaceOperatorCmd(runFunc func(context.Context, dkg.ReplaceOperatorConf bindLogFlags(cmd.Flags(), &dkgConfig.Log) bindEth1Flag(cmd.Flags(), &dkgConfig.ExecutionEngineAddr) bindShutdownDelayFlag(cmd.Flags(), &dkgConfig.ShutdownDelay) + bindPublishFlags(cmd.Flags(), &dkgConfig) return cmd } diff --git a/dkg/protocolsteps.go b/dkg/protocolsteps.go index 0dd55db46..bd8ef75b4 100644 --- a/dkg/protocolsteps.go +++ b/dkg/protocolsteps.go @@ -187,6 +187,14 @@ func (s *writeArtifactsProtocolStep) Run(ctx context.Context, pctx *ProtocolCont log.Info(ctx, "Stored artifacts", z.Str("output_dir", s.outputDir)) + if pctx.Config.Publish { + if _, err := writeLockToAPI(ctx, pctx.Config.PublishAddr, *pctx.Lock, pctx.Config.PublishTimeout); err != nil { + return errors.Wrap(err, "publish lock to API") + } + + log.Info(ctx, "The new cluster lock has been published to Obol API") + } + return nil } diff --git a/dkg/protocolsteps_internal_test.go b/dkg/protocolsteps_internal_test.go index bfe47c4af..6f514c8f8 100644 --- a/dkg/protocolsteps_internal_test.go +++ b/dkg/protocolsteps_internal_test.go @@ -4,7 +4,11 @@ package dkg import ( "encoding/hex" + "encoding/json" + "io" "math/rand" + "net/http" + "net/http/httptest" "os" "path/filepath" "testing" @@ -213,12 +217,34 @@ func TestWriteArtifactsProtocolStep(t *testing.T) { shares := valKeysToSharesNode0(t, valKeys, lock.Validators) + var receivedLock cluster.Lock + + mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/lock", r.URL.Path) + require.Equal(t, http.MethodPost, r.Method) + require.Equal(t, "application/json", r.Header.Get("Content-Type")) + + body, err := io.ReadAll(r.Body) + require.NoError(t, err) + + err = json.Unmarshal(body, &receivedLock) + require.NoError(t, err) + + w.WriteHeader(http.StatusOK) + })) + defer mockServer.Close() + pctx := &ProtocolContext{ Lock: &lock, PrivateKeyPath: p2p.KeyPath(dataDir), ENRPrivateKey: nodeKeys[0], Shares: shares, ThisNodeIdx: cluster.NodeIdx{PeerIdx: 0, ShareIdx: 1}, + Config: Config{ + PublishAddr: mockServer.URL, + PublishTimeout: 30 * time.Second, + Publish: true, + }, } err = step.Run(t.Context(), pctx) @@ -227,6 +253,9 @@ func TestWriteArtifactsProtocolStep(t *testing.T) { require.DirExists(t, filepath.Join(step.outputDir, validatorKeysSubDir)) require.FileExists(t, p2p.KeyPath(step.outputDir)) + require.NotZero(t, receivedLock.LockHash, "Expected lock to be published to mock server") + require.Equal(t, lock.LockHash, receivedLock.LockHash) + enrPrivKey, err := os.ReadFile(p2p.KeyPath(step.outputDir)) require.NoError(t, err) enrPrivKeyBytes, err := hex.DecodeString(string(enrPrivKey))