From ca658784113ae6db849eca8724922fe686b33545 Mon Sep 17 00:00:00 2001 From: kant Date: Thu, 19 Jun 2025 00:53:39 -0700 Subject: [PATCH 1/6] changing get payload from v3 to v4 --- cl/blockbuilder/blockbuilder.go | 8 ++++++-- cl/cmd/singlenode/main.go | 4 ++-- cl/ethclient/engineclient.go | 12 ++++++------ cl/singlenode/singlenode.go | 1 - 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/cl/blockbuilder/blockbuilder.go b/cl/blockbuilder/blockbuilder.go index 370d154c9..59f82e5ea 100644 --- a/cl/blockbuilder/blockbuilder.go +++ b/cl/blockbuilder/blockbuilder.go @@ -32,7 +32,7 @@ type EngineClient interface { ForkchoiceUpdatedV3(ctx context.Context, update engine.ForkchoiceStateV1, payloadAttributes *engine.PayloadAttributes) (engine.ForkChoiceResponse, error) - GetPayloadV3(ctx context.Context, payloadID engine.PayloadID) (*engine.ExecutionPayloadEnvelope, error) + GetPayloadV4(ctx context.Context, payloadID engine.PayloadID) (*engine.ExecutionPayloadEnvelope, error) HeaderByNumber(ctx context.Context, number *big.Int) (*etypes.Header, error) } @@ -207,7 +207,7 @@ func (bb *BlockBuilder) GetPayload(ctx context.Context) error { var payloadResp *engine.ExecutionPayloadEnvelope err = util.RetryWithBackoff(ctx, maxAttempts, bb.logger, func() error { var err error - payloadResp, err = bb.engineCl.GetPayloadV3(ctx, *payloadID) + payloadResp, err = bb.engineCl.GetPayloadV4(ctx, *payloadID) if isUnknownPayload(err) { return backoff.Permanent(err) } else if err != nil { @@ -480,6 +480,10 @@ func (bb *BlockBuilder) pushNewPayload(ctx context.Context, executionPayload eng emptyVersionHashes := []common.Hash{} return retryFunc(func() error { status, err := bb.engineCl.NewPayloadV4(ctx, executionPayload, emptyVersionHashes, &hash, []hexutil.Bytes{}) + bb.logger.Debug("newPayload result", + "status", status.Status, + "validationError", status.ValidationError, + "latestValidHash", status.LatestValidHash) if err != nil || isUnknown(status) { bb.logger.Error("Failed to push new payload", "error", err) return err // Will retry diff --git a/cl/cmd/singlenode/main.go b/cl/cmd/singlenode/main.go index 04c2991a8..455316a4c 100644 --- a/cl/cmd/singlenode/main.go +++ b/cl/cmd/singlenode/main.go @@ -126,14 +126,14 @@ var ( Name: "evm-build-delay", Usage: "Delay after initiating payload construction before calling getPayload (e.g., '200ms')", EnvVars: []string{"LEADER_EVM_BUILD_DELAY"}, - Value: 100 * time.Millisecond, + Value: 1 * time.Millisecond, }) evmBuildDelayEmptyBlockFlag = altsrc.NewDurationFlag(&cli.DurationFlag{ Name: "evm-build-delay-empty-block", Usage: "Minimum time since last block to build an empty block (0 to disable skipping, e.g., '2s')", EnvVars: []string{"LEADER_EVM_BUILD_DELAY_EMPTY_BLOCK"}, - Value: 2 * time.Second, + Value: 50 * time.Millisecond, }) priorityFeeReceiptFlag = altsrc.NewStringFlag(&cli.StringFlag{ diff --git a/cl/ethclient/engineclient.go b/cl/ethclient/engineclient.go index 92334a95a..6880f221c 100644 --- a/cl/ethclient/engineclient.go +++ b/cl/ethclient/engineclient.go @@ -23,7 +23,7 @@ const ( forkchoiceUpdatedV3 = "engine_forkchoiceUpdatedV3" getPayloadV2 = "engine_getPayloadV2" - getPayloadV3 = "engine_getPayloadV3" + getPayloadV4 = "engine_getPayloadV4" ) // EngineClient defines the Engine API authenticated JSON-RPC endpoints. @@ -53,7 +53,7 @@ type EngineClient interface { // GetPayloadV2 returns a cached payload by id. GetPayloadV2(ctx context.Context, payloadID engine.PayloadID) (*engine.ExecutionPayloadEnvelope, error) // GetPayloadV3 returns a cached payload by id. - GetPayloadV3(ctx context.Context, payloadID engine.PayloadID) (*engine.ExecutionPayloadEnvelope, error) + GetPayloadV4(ctx context.Context, payloadID engine.PayloadID) (*engine.ExecutionPayloadEnvelope, error) } // engineClient implements EngineClient using JSON-RPC. @@ -174,17 +174,17 @@ func (c engineClient) GetPayloadV2(ctx context.Context, payloadID engine.Payload return &resp, nil } -func (c engineClient) GetPayloadV3(ctx context.Context, payloadID engine.PayloadID) ( +func (c engineClient) GetPayloadV4(ctx context.Context, payloadID engine.PayloadID) ( *engine.ExecutionPayloadEnvelope, error, ) { - const endpoint = "get_payload_v3" + const endpoint = "get_payload_v4" defer latency(c.chain, endpoint)() var resp engine.ExecutionPayloadEnvelope - err := c.cl.Client().CallContext(ctx, &resp, getPayloadV3, payloadID) + err := c.cl.Client().CallContext(ctx, &resp, getPayloadV4, payloadID) if err != nil { incError(c.chain, endpoint) - return nil, fmt.Errorf("rpc get payload v3: %w", err) + return nil, fmt.Errorf("rpc get payload v4: %w", err) } return &resp, nil diff --git a/cl/singlenode/singlenode.go b/cl/singlenode/singlenode.go index db121e210..bbe13a016 100644 --- a/cl/singlenode/singlenode.go +++ b/cl/singlenode/singlenode.go @@ -342,7 +342,6 @@ func (app *SingleNodeApp) produceBlock() error { if err := app.blockBuilder.FinalizeBlock(app.appCtx, currentState.PayloadID, currentState.ExecutionPayload, ""); err != nil { return fmt.Errorf("failed to finalize block: %w", err) } - return nil } From e11cabc1d83586bdc6e3e48a35e86c19921f8826 Mon Sep 17 00:00:00 2001 From: kant Date: Sat, 21 Jun 2025 08:32:22 -0700 Subject: [PATCH 2/6] setting empty block generation to 1 minute --- cl/cmd/singlenode/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cl/cmd/singlenode/main.go b/cl/cmd/singlenode/main.go index 455316a4c..c2544efac 100644 --- a/cl/cmd/singlenode/main.go +++ b/cl/cmd/singlenode/main.go @@ -133,7 +133,7 @@ var ( Name: "evm-build-delay-empty-block", Usage: "Minimum time since last block to build an empty block (0 to disable skipping, e.g., '2s')", EnvVars: []string{"LEADER_EVM_BUILD_DELAY_EMPTY_BLOCK"}, - Value: 50 * time.Millisecond, + Value: 1 * time.Minute, }) priorityFeeReceiptFlag = altsrc.NewStringFlag(&cli.StringFlag{ From bf8012ddff37dcb87ccaff24f21e2ac25c0a4d50 Mon Sep 17 00:00:00 2001 From: kant Date: Wed, 25 Jun 2025 02:22:33 -0700 Subject: [PATCH 3/6] setting default fee receipent and adjusting test --- cl/blockbuilder/blockbuilder_test.go | 2 +- cl/cmd/singlenode/main.go | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/cl/blockbuilder/blockbuilder_test.go b/cl/blockbuilder/blockbuilder_test.go index eca0df5a2..9406e3d3e 100644 --- a/cl/blockbuilder/blockbuilder_test.go +++ b/cl/blockbuilder/blockbuilder_test.go @@ -44,7 +44,7 @@ func (m *MockEngineClient) ForkchoiceUpdatedV3(ctx context.Context, fcs engine.F return args.Get(0).(engine.ForkChoiceResponse), args.Error(1) } -func (m *MockEngineClient) GetPayloadV3(ctx context.Context, payloadID engine.PayloadID) (*engine.ExecutionPayloadEnvelope, error) { +func (m *MockEngineClient) GetPayloadV4(ctx context.Context, payloadID engine.PayloadID) (*engine.ExecutionPayloadEnvelope, error) { args := m.Called(ctx, payloadID) return args.Get(0).(*engine.ExecutionPayloadEnvelope), args.Error(1) } diff --git a/cl/cmd/singlenode/main.go b/cl/cmd/singlenode/main.go index c2544efac..e41041a8c 100644 --- a/cl/cmd/singlenode/main.go +++ b/cl/cmd/singlenode/main.go @@ -44,6 +44,20 @@ var ( EnvVars: []string{"LEADER_CONFIG"}, } + coinbaseFlag = altsrc.NewStringFlag(&cli.StringFlag{ + Name: "coinbase", + Usage: "coinbase address where you receive the fees", + EnvVars: []string{"COINBASE"}, + Value: "http://localhost:8551", + Required: true, + Action: func(_ *cli.Context, s string) error { + if s == "" { + return fmt.Errorf("instance-id is required") + } + return nil + }, + }) + instanceIDFlag = altsrc.NewStringFlag(&cli.StringFlag{ Name: "instance-id", Usage: "Unique instance ID for this node (for logging/identification)", @@ -141,6 +155,7 @@ var ( Usage: "Ethereum address for receiving priority fees (block proposer fee)", EnvVars: []string{"LEADER_PRIORITY_FEE_RECIPIENT"}, Required: true, + Value: "0xfA0B0f5d298d28EFE4d35641724141ef19C05684", Action: func(c *cli.Context, s string) error { if !strings.HasPrefix(s, "0x") || len(s) != 42 { return fmt.Errorf("priority-fee-recipient must be a 0x-prefixed 42-character hex string") From d41614371937061f297066775b49aec97a4e72f0 Mon Sep 17 00:00:00 2001 From: kant Date: Wed, 25 Jun 2025 02:34:49 -0700 Subject: [PATCH 4/6] fixing tests --- cl/blockbuilder/blockbuilder_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cl/blockbuilder/blockbuilder_test.go b/cl/blockbuilder/blockbuilder_test.go index 9406e3d3e..93f69e1bb 100644 --- a/cl/blockbuilder/blockbuilder_test.go +++ b/cl/blockbuilder/blockbuilder_test.go @@ -174,7 +174,7 @@ func TestBlockBuilder_getPayload(t *testing.T) { ReceiptsRoot: hash, }, } - mockEngineClient.On("GetPayloadV3", mock.Anything, *payloadID).Return(executionPayload, nil) + mockEngineClient.On("GetPayloadV4", mock.Anything, *payloadID).Return(executionPayload, nil) blockBuilder.executionHead = executionHead err = blockBuilder.GetPayload(ctx) @@ -404,7 +404,7 @@ func TestBlockBuilder_getPayload_GetPayloadUnknownPayload(t *testing.T) { } mockEngineClient.On("ForkchoiceUpdatedV3", mock.Anything, expectedFCS, mock.MatchedBy(matchPayloadAttributes(hash, executionHead.BlockTime))).Return(forkChoiceResponse, nil) - mockEngineClient.On("GetPayloadV3", mock.Anything, *payloadID).Return(&engine.ExecutionPayloadEnvelope{}, errors.New("Unknown payload")) + mockEngineClient.On("GetPayloadV4", mock.Anything, *payloadID).Return(&engine.ExecutionPayloadEnvelope{}, errors.New("Unknown payload")) blockBuilder.executionHead = executionHead err = blockBuilder.GetPayload(ctx) From 738f89549e11c0168e0f70795c613ed00af60063 Mon Sep 17 00:00:00 2001 From: kant Date: Wed, 25 Jun 2025 02:36:34 -0700 Subject: [PATCH 5/6] go.work --- go.work.sum | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/go.work.sum b/go.work.sum index afe9f6f34..bcbb7f26f 100644 --- a/go.work.sum +++ b/go.work.sum @@ -838,6 +838,7 @@ github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnx github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/cloudflare/cloudflare-go v0.79.0 h1:ErwCYDjFCYppDJlDJ/5WhsSmzegAUe2+K9qgFyQDg3M= github.com/cloudflare/cloudflare-go v0.79.0/go.mod h1:gkHQf9xEubaQPEuerBuoinR9P8bf8a05Lq0X6WKy1Oc= +github.com/cloudflare/cloudflare-go v0.114.0 h1:ucoti4/7Exo0XQ+rzpn1H+IfVVe++zgiM+tyKtf0HUA= github.com/cloudflare/cloudflare-go v0.114.0/go.mod h1:O7fYfFfA6wKqKFn2QIR9lhj7FDw6VQCGOY6hd2TBtd0= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -1009,6 +1010,7 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= +github.com/fjl/gencodec v0.1.0 h1:B3K0xPfc52cw52BBgUbSPxYo+HlLfAgWMVKRWXUXBcs= github.com/fjl/gencodec v0.1.0/go.mod h1:Um1dFHPONZGTHog1qD1NaWjXJW/SPB38wPv0O8uZ2fI= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4 h1:GY1+t5Dr9OKADM64SYnQjw/w99HMYvQ0A8/JoUkxVmc= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= @@ -1112,6 +1114,7 @@ github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/K github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gofiber/fiber/v2 v2.52.2 h1:b0rYH6b06Df+4NyrbdptQL8ifuxw/Tf2DgfkZkDaxEo= github.com/gofiber/fiber/v2 v2.52.2/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= @@ -1414,6 +1417,7 @@ github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhd github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46 h1:veS9QfglfvqAw2e+eeNT/SbGySq8ajECXJ9e4fPoLhY= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= @@ -1683,6 +1687,7 @@ github.com/protolambda/messagediff v1.4.0 h1:fk6gxK7WybJCaeOFK1yuh2Ldplx7qYMLibi github.com/protolambda/messagediff v1.4.0/go.mod h1:LboJp0EwIbJsePYpzh5Op/9G1/4mIztMRYzzwR0dR2M= github.com/protolambda/zrnt v0.32.2 h1:KZ48T+3UhsPXNdtE/5QEvGc9DGjUaRI17nJaoznoIaM= github.com/protolambda/zrnt v0.32.2/go.mod h1:A0fezkp9Tt3GBLATSPIbuY4ywYESyAuc/FFmPKg8Lqs= +github.com/protolambda/zrnt v0.34.1 h1:qW55rnhZJDnOb3TwFiFRJZi3yTXFrJdGOFQM7vCwYGg= github.com/protolambda/zrnt v0.34.1/go.mod h1:A0fezkp9Tt3GBLATSPIbuY4ywYESyAuc/FFmPKg8Lqs= github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNyY= github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= @@ -1796,6 +1801,7 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= @@ -2215,6 +2221,7 @@ golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= From f5af81cd2e72515d8ddbf48a415be18e0bf68c9e Mon Sep 17 00:00:00 2001 From: kant Date: Wed, 25 Jun 2025 02:46:02 -0700 Subject: [PATCH 6/6] removing redundant flag --- cl/cmd/singlenode/main.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/cl/cmd/singlenode/main.go b/cl/cmd/singlenode/main.go index e41041a8c..3664519e0 100644 --- a/cl/cmd/singlenode/main.go +++ b/cl/cmd/singlenode/main.go @@ -44,20 +44,6 @@ var ( EnvVars: []string{"LEADER_CONFIG"}, } - coinbaseFlag = altsrc.NewStringFlag(&cli.StringFlag{ - Name: "coinbase", - Usage: "coinbase address where you receive the fees", - EnvVars: []string{"COINBASE"}, - Value: "http://localhost:8551", - Required: true, - Action: func(_ *cli.Context, s string) error { - if s == "" { - return fmt.Errorf("instance-id is required") - } - return nil - }, - }) - instanceIDFlag = altsrc.NewStringFlag(&cli.StringFlag{ Name: "instance-id", Usage: "Unique instance ID for this node (for logging/identification)",