From 1f1221d301fbd2b18cb293e6f502be064d91cc28 Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Wed, 24 Jan 2024 15:13:31 -0800 Subject: [PATCH 1/4] send startup req --- .../guardian_prover_sender/guardian_prover.go | 46 ++++++++++++++++++- prover/guardian_prover_sender/interface.go | 1 + 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/prover/guardian_prover_sender/guardian_prover.go b/prover/guardian_prover_sender/guardian_prover.go index db3c25f95..055b9e9d3 100644 --- a/prover/guardian_prover_sender/guardian_prover.go +++ b/prover/guardian_prover_sender/guardian_prover.go @@ -34,6 +34,14 @@ type signedBlockReq struct { Prover common.Address `json:"proverAddress"` } +// startupReq is the request body send to the health check server when the guardian prover starts up. +type startupReq struct { + ProverAddress string `json:"prover"` + Version string `json:"version"` + Revision string `json:"revision"` + Signature []byte `json:"signature"` +} + // GuardianProverBlockSender is responsible for signing and sending known blocks to the health check server. type GuardianProverBlockSender struct { privateKey *ecdsa.PrivateKey @@ -88,7 +96,7 @@ func (s *GuardianProverBlockSender) post(ctx context.Context, route string, req // SignAndSendBlock signs the given block and sends it to the health check server. func (s *GuardianProverBlockSender) SignAndSendBlock(ctx context.Context, blockID *big.Int) error { - signed, header, err := s.sign(ctx, blockID) + signed, header, err := s.signBlock(ctx, blockID) if err != nil { return nil } @@ -110,6 +118,40 @@ func (s *GuardianProverBlockSender) SignAndSendBlock(ctx context.Context, blockI ) } +func (s *GuardianProverBlockSender) SendStartup(ctx context.Context, revision string, version string) error { + if s.healthCheckServerEndpoint == nil { + log.Info("No health check server endpoint set, returning early") + return nil + } + + sig, err := crypto.Sign( + crypto.Keccak256Hash( + s.proverAddress.Bytes(), + []byte(revision), + []byte(version)).Bytes(), + s.privateKey) + if err != nil { + return err + } + + req := &startupReq{ + Revision: revision, + Version: version, + ProverAddress: s.proverAddress.Hex(), + Signature: sig, + } + + if err := s.post(ctx, "startup", req); err != nil { + return err + } + + log.Info("Guardian prover successfully sent startup", + "revision", revision, + ) + + return nil +} + // sendSignedBlockReq is the actual method that sends the signed block to the health check server. func (s *GuardianProverBlockSender) sendSignedBlockReq( ctx context.Context, @@ -139,7 +181,7 @@ func (s *GuardianProverBlockSender) sendSignedBlockReq( } // sign signs the given block and returns the signature and header. -func (s *GuardianProverBlockSender) sign(ctx context.Context, blockID *big.Int) ([]byte, *types.Header, error) { +func (s *GuardianProverBlockSender) signBlock(ctx context.Context, blockID *big.Int) ([]byte, *types.Header, error) { log.Info("Guardian prover signing block", "blockID", blockID.Uint64()) head, err := s.rpc.L2.BlockNumber(ctx) diff --git a/prover/guardian_prover_sender/interface.go b/prover/guardian_prover_sender/interface.go index 19abf2220..aa4d4503d 100644 --- a/prover/guardian_prover_sender/interface.go +++ b/prover/guardian_prover_sender/interface.go @@ -7,6 +7,7 @@ import ( type BlockSigner interface { SignAndSendBlock(ctx context.Context, blockID *big.Int) error + SendStartup(ctx context.Context, revision string, version string) error } type Heartbeater interface { From f554fc00c186a08248a0ebd7d5372cd607e77bfe Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Wed, 24 Jan 2024 15:19:15 -0800 Subject: [PATCH 2/4] send on startup --- prover/prover.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/prover/prover.go b/prover/prover.go index 65157574e..0606e2077 100644 --- a/prover/prover.go +++ b/prover/prover.go @@ -7,6 +7,7 @@ import ( "fmt" "math/big" "net/http" + "runtime/debug" "sync" "time" @@ -400,6 +401,16 @@ func (p *Prover) Start() error { }() if p.IsGuardianProver() { + revision, err := getRevision() + if err != nil { + log.Crit("Unable to get revision", "error", err) + } + + // use default version for now when sending, since we dont publish new versions right now. + if err := p.guardianProverSender.SendStartup(p.ctx, revision, "v1.0.0"); err != nil { + log.Crit("Failed to send guardian prover startup", "error", err) + } + p.wg.Add(1) go p.heartbeatInterval(p.ctx) } @@ -1320,3 +1331,21 @@ func (p *Prover) heartbeatInterval(ctx context.Context) { } } } + +func getRevision() (string, error) { + var revision string + + if info, ok := debug.ReadBuildInfo(); ok { + for _, setting := range info.Settings { + if setting.Key == "vcs.revision" { + revision = setting.Value + } + } + } + + if revision == "" { + return "", errors.New("unable to get revision") + } + + return revision, nil +} From a0bd87a55d733ca1c3f38de37064e5d7a3cc0afa Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Wed, 24 Jan 2024 15:24:29 -0800 Subject: [PATCH 3/4] get version --- prover/prover.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/prover/prover.go b/prover/prover.go index 0606e2077..7a98890bf 100644 --- a/prover/prover.go +++ b/prover/prover.go @@ -401,13 +401,12 @@ func (p *Prover) Start() error { }() if p.IsGuardianProver() { - revision, err := getRevision() + revision, version, err := getRevision() if err != nil { log.Crit("Unable to get revision", "error", err) } - // use default version for now when sending, since we dont publish new versions right now. - if err := p.guardianProverSender.SendStartup(p.ctx, revision, "v1.0.0"); err != nil { + if err := p.guardianProverSender.SendStartup(p.ctx, revision, version); err != nil { log.Crit("Failed to send guardian prover startup", "error", err) } @@ -1332,10 +1331,14 @@ func (p *Prover) heartbeatInterval(ctx context.Context) { } } -func getRevision() (string, error) { +func getRevision() (string, string, error) { var revision string + var version string + if info, ok := debug.ReadBuildInfo(); ok { + version = info.Main.Version + for _, setting := range info.Settings { if setting.Key == "vcs.revision" { revision = setting.Value @@ -1343,9 +1346,9 @@ func getRevision() (string, error) { } } - if revision == "" { - return "", errors.New("unable to get revision") + if revision == "" || version == "" { + return "", "", fmt.Errorf("unable to get revision or version. revision: %v, version: %v", revision, version) } - return revision, nil + return revision, version, nil } From a0f8bdf58b65c86de88bd6353cf4191b8527e4e6 Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Wed, 24 Jan 2024 15:29:11 -0800 Subject: [PATCH 4/4] add log --- prover/guardian_prover_sender/guardian_prover.go | 1 + 1 file changed, 1 insertion(+) diff --git a/prover/guardian_prover_sender/guardian_prover.go b/prover/guardian_prover_sender/guardian_prover.go index 055b9e9d3..bff8b34db 100644 --- a/prover/guardian_prover_sender/guardian_prover.go +++ b/prover/guardian_prover_sender/guardian_prover.go @@ -147,6 +147,7 @@ func (s *GuardianProverBlockSender) SendStartup(ctx context.Context, revision st log.Info("Guardian prover successfully sent startup", "revision", revision, + "version", version, ) return nil