From 0f58c9a9250675484a38f08111affcf620e57ff9 Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Wed, 16 Feb 2022 00:56:23 +0000 Subject: [PATCH] Exchange Transition Configuration for Engine API (#10248) * transition proto * gen pb * builds * impl transition config * begin tests * transition config messed up * amend proto * use str * passing * gaz * config * client test * pb * set to 0 * rem log * gaz --- .../powchain/engine-api-client/v1/BUILD.bazel | 3 + .../powchain/engine-api-client/v1/client.go | 42 ++++ .../engine-api-client/v1/client_test.go | 146 +++++++++++ .../powchain/engine-api-client/v1/errors.go | 6 + proto/engine/v1/BUILD.bazel | 2 + proto/engine/v1/execution_engine.pb.go | 228 ++++++++++++------ proto/engine/v1/execution_engine.proto | 6 + proto/engine/v1/json_marshal_unmarshal.go | 36 ++- .../engine/v1/json_marshal_unmarshal_test.go | 17 ++ 9 files changed, 414 insertions(+), 72 deletions(-) diff --git a/beacon-chain/powchain/engine-api-client/v1/BUILD.bazel b/beacon-chain/powchain/engine-api-client/v1/BUILD.bazel index 43dc17dcb3..89ad94851f 100644 --- a/beacon-chain/powchain/engine-api-client/v1/BUILD.bazel +++ b/beacon-chain/powchain/engine-api-client/v1/BUILD.bazel @@ -10,6 +10,7 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/beacon-chain/powchain/engine-api-client/v1", visibility = ["//beacon-chain:__subpackages__"], deps = [ + "//config/params:go_default_library", "//proto/engine/v1:go_default_library", "@com_github_ethereum_go_ethereum//common:go_default_library", "@com_github_ethereum_go_ethereum//rpc:go_default_library", @@ -23,11 +24,13 @@ go_test( embed = [":go_default_library"], deps = [ "//config/fieldparams:go_default_library", + "//config/params:go_default_library", "//encoding/bytesutil:go_default_library", "//proto/engine/v1:go_default_library", "//testing/require:go_default_library", "@com_github_ethereum_go_ethereum//common:go_default_library", "@com_github_ethereum_go_ethereum//rpc:go_default_library", "@com_github_pkg_errors//:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", ], ) diff --git a/beacon-chain/powchain/engine-api-client/v1/client.go b/beacon-chain/powchain/engine-api-client/v1/client.go index c6b714c6ab..199c26a1ab 100644 --- a/beacon-chain/powchain/engine-api-client/v1/client.go +++ b/beacon-chain/powchain/engine-api-client/v1/client.go @@ -4,13 +4,16 @@ package v1 import ( + "bytes" "context" + "math/big" "net/url" "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/rpc" "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/config/params" pb "github.com/prysmaticlabs/prysm/proto/engine/v1" ) @@ -21,6 +24,8 @@ const ( ForkchoiceUpdatedMethod = "engine_forkchoiceUpdatedV1" // GetPayloadMethod v1 request string for JSON-RPC. GetPayloadMethod = "engine_getPayloadV1" + // ExchangeTransitionConfigurationMethod v1 request string for JSON-RPC. + ExchangeTransitionConfigurationMethod = "engine_exchangeTransitionConfigurationV1" // ExecutionBlockByHashMethod request string for JSON-RPC. ExecutionBlockByHashMethod = "eth_getBlockByHash" // ExecutionBlockByNumberMethod request string for JSON-RPC. @@ -44,6 +49,9 @@ type EngineCaller interface { ctx context.Context, state *pb.ForkchoiceState, attrs *pb.PayloadAttributes, ) (*ForkchoiceUpdatedResponse, error) GetPayload(ctx context.Context, payloadId [8]byte) (*pb.ExecutionPayload, error) + ExchangeTransitionConfiguration( + ctx context.Context, cfg *pb.TransitionConfiguration, + ) (*pb.TransitionConfiguration, error) LatestExecutionBlock(ctx context.Context) (*pb.ExecutionBlock, error) ExecutionBlockByHash(ctx context.Context, hash common.Hash) (*pb.ExecutionBlock, error) } @@ -107,6 +115,40 @@ func (c *Client) GetPayload(ctx context.Context, payloadId [8]byte) (*pb.Executi return result, handleRPCError(err) } +// ExchangeTransitionConfiguration calls the engine_exchangeTransitionConfigurationV1 method via JSON-RPC. +func (c *Client) ExchangeTransitionConfiguration( + ctx context.Context, cfg *pb.TransitionConfiguration, +) (*pb.TransitionConfiguration, error) { + // Terminal block number should be set to 0 + zeroBigNum := big.NewInt(0) + cfg.TerminalBlockNumber = zeroBigNum.Bytes() + result := &pb.TransitionConfiguration{} + if err := c.rpc.CallContext(ctx, result, ExchangeTransitionConfigurationMethod, cfg); err != nil { + return nil, handleRPCError(err) + } + // We surface an error to the user if local configuration settings mismatch + // according to the response from the execution node. + cfgTerminalHash := params.BeaconConfig().TerminalBlockHash[:] + if !bytes.Equal(cfgTerminalHash, result.TerminalBlockHash) { + return nil, errors.Wrapf( + ErrMismatchTerminalBlockHash, + "got %#x from execution node, wanted %#x", + result.TerminalBlockHash, + cfgTerminalHash, + ) + } + ttdCfg := params.BeaconConfig().TerminalTotalDifficulty + if ttdCfg != result.TerminalTotalDifficulty { + return nil, errors.Wrapf( + ErrMismatchTerminalTotalDiff, + "got %s from execution node, wanted %s", + result.TerminalTotalDifficulty, + ttdCfg, + ) + } + return result, nil +} + // LatestExecutionBlock fetches the latest execution engine block by calling // eth_blockByNumber via JSON-RPC. func (c *Client) LatestExecutionBlock(ctx context.Context) (*pb.ExecutionBlock, error) { diff --git a/beacon-chain/powchain/engine-api-client/v1/client_test.go b/beacon-chain/powchain/engine-api-client/v1/client_test.go index ccdf295d5d..f6e8b88a25 100644 --- a/beacon-chain/powchain/engine-api-client/v1/client_test.go +++ b/beacon-chain/powchain/engine-api-client/v1/client_test.go @@ -15,9 +15,11 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/pkg/errors" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" pb "github.com/prysmaticlabs/prysm/proto/engine/v1" "github.com/prysmaticlabs/prysm/testing/require" + "google.golang.org/protobuf/proto" ) var _ = EngineCaller(&Client{}) @@ -57,6 +59,22 @@ func TestClient_IPC(t *testing.T) { require.NoError(t, err) require.DeepEqual(t, want, resp) }) + t.Run(NewPayloadMethod, func(t *testing.T) { + want, ok := fix["PayloadStatus"].(*pb.PayloadStatus) + require.Equal(t, true, ok) + req, ok := fix["ExecutionPayload"].(*pb.ExecutionPayload) + require.Equal(t, true, ok) + resp, err := client.NewPayload(ctx, req) + require.NoError(t, err) + require.DeepEqual(t, want, resp) + }) + t.Run(ExchangeTransitionConfigurationMethod, func(t *testing.T) { + want, ok := fix["TransitionConfiguration"].(*pb.TransitionConfiguration) + require.Equal(t, true, ok) + resp, err := client.ExchangeTransitionConfiguration(ctx, want) + require.NoError(t, err) + require.DeepEqual(t, want, resp) + }) t.Run(ExecutionBlockByNumberMethod, func(t *testing.T) { want, ok := fix["ExecutionBlock"].(*pb.ExecutionBlock) require.Equal(t, true, ok) @@ -251,6 +269,45 @@ func TestClient_HTTP(t *testing.T) { require.NoError(t, err) require.DeepEqual(t, want, resp) }) + t.Run(ExchangeTransitionConfigurationMethod, func(t *testing.T) { + want, ok := fix["TransitionConfiguration"].(*pb.TransitionConfiguration) + require.Equal(t, true, ok) + encodedReq, err := json.Marshal(want) + require.NoError(t, err) + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + defer func() { + require.NoError(t, r.Body.Close()) + }() + enc, err := ioutil.ReadAll(r.Body) + require.NoError(t, err) + jsonRequestString := string(enc) + // We expect the JSON string RPC request contains the right arguments. + require.Equal(t, true, strings.Contains( + jsonRequestString, string(encodedReq), + )) + resp := map[string]interface{}{ + "jsonrpc": "2.0", + "id": 1, + "result": want, + } + err = json.NewEncoder(w).Encode(resp) + require.NoError(t, err) + })) + defer srv.Close() + + rpcClient, err := rpc.DialHTTP(srv.URL) + require.NoError(t, err) + defer rpcClient.Close() + + client := &Client{} + client.rpc = rpcClient + + // We call the RPC method via HTTP and expect a proper result. + resp, err := client.ExchangeTransitionConfiguration(ctx, want) + require.NoError(t, err) + require.DeepEqual(t, want, resp) + }) t.Run(ExecutionBlockByHashMethod, func(t *testing.T) { arg := common.BytesToHash([]byte("foo")) want, ok := fix["ExecutionBlock"].(*pb.ExecutionBlock) @@ -291,6 +348,78 @@ func TestClient_HTTP(t *testing.T) { }) } +func TestExchangeTransitionConfiguration(t *testing.T) { + fix := fixtures() + ctx := context.Background() + t.Run("wrong terminal block hash", func(t *testing.T) { + request, ok := fix["TransitionConfiguration"].(*pb.TransitionConfiguration) + require.Equal(t, true, ok) + resp, ok := proto.Clone(request).(*pb.TransitionConfiguration) + require.Equal(t, true, ok) + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + defer func() { + require.NoError(t, r.Body.Close()) + }() + + // Change the terminal block hash. + h := common.BytesToHash([]byte("foo")) + resp.TerminalBlockHash = h[:] + respJSON := map[string]interface{}{ + "jsonrpc": "2.0", + "id": 1, + "result": resp, + } + require.NoError(t, json.NewEncoder(w).Encode(respJSON)) + })) + defer srv.Close() + + rpcClient, err := rpc.DialHTTP(srv.URL) + require.NoError(t, err) + defer rpcClient.Close() + + client := &Client{} + client.rpc = rpcClient + + _, err = client.ExchangeTransitionConfiguration(ctx, request) + require.Equal(t, true, errors.Is(err, ErrMismatchTerminalBlockHash)) + }) + t.Run("wrong terminal total difficulty", func(t *testing.T) { + request, ok := fix["TransitionConfiguration"].(*pb.TransitionConfiguration) + require.Equal(t, true, ok) + resp, ok := proto.Clone(request).(*pb.TransitionConfiguration) + require.Equal(t, true, ok) + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + defer func() { + require.NoError(t, r.Body.Close()) + }() + + // Change the terminal block hash. + resp.TerminalTotalDifficulty = "bar" + respJSON := map[string]interface{}{ + "jsonrpc": "2.0", + "id": 1, + "result": resp, + } + require.NoError(t, json.NewEncoder(w).Encode(respJSON)) + })) + defer srv.Close() + + rpcClient, err := rpc.DialHTTP(srv.URL) + require.NoError(t, err) + defer rpcClient.Close() + + client := &Client{} + client.rpc = rpcClient + + _, err = client.ExchangeTransitionConfiguration(ctx, request) + require.Equal(t, true, errors.Is(err, ErrMismatchTerminalTotalDiff)) + }) +} + type customError struct { code int } @@ -454,11 +583,17 @@ func fixtures() map[string]interface{} { Status: status, PayloadId: &id, } + transitionCfg := &pb.TransitionConfiguration{ + TerminalBlockHash: params.BeaconConfig().TerminalBlockHash[:], + TerminalTotalDifficulty: params.BeaconConfig().TerminalTotalDifficulty, + TerminalBlockNumber: big.NewInt(0).Bytes(), + } return map[string]interface{}{ "ExecutionBlock": executionBlock, "ExecutionPayload": executionPayloadFixture, "PayloadStatus": status, "ForkchoiceUpdatedResponse": forkChoiceResp, + "TransitionConfiguration": transitionCfg, } } @@ -499,6 +634,17 @@ func (*testEngineService) GetPayloadV1( return item } +func (*testEngineService) ExchangeTransitionConfigurationV1( + _ context.Context, _ *pb.TransitionConfiguration, +) *pb.TransitionConfiguration { + fix := fixtures() + item, ok := fix["TransitionConfiguration"].(*pb.TransitionConfiguration) + if !ok { + panic("not found") + } + return item +} + func (*testEngineService) ForkchoiceUpdatedV1( _ context.Context, _ *pb.ForkchoiceState, _ *pb.PayloadAttributes, ) *ForkchoiceUpdatedResponse { diff --git a/beacon-chain/powchain/engine-api-client/v1/errors.go b/beacon-chain/powchain/engine-api-client/v1/errors.go index 480fe3c111..cf50faa63d 100644 --- a/beacon-chain/powchain/engine-api-client/v1/errors.go +++ b/beacon-chain/powchain/engine-api-client/v1/errors.go @@ -19,4 +19,10 @@ var ( ErrUnknownPayload = errors.New("payload does not exist or is not available") // ErrUnsupportedScheme for unsupported URL schemes. ErrUnsupportedScheme = errors.New("unsupported url scheme, only http(s) and ipc are supported") + // ErrMismatchTerminalBlockHash when the terminal block hash value received via + // the API mismatches Prysm's configuration value. + ErrMismatchTerminalBlockHash = errors.New("terminal block hash mismatch") + // ErrMismatchTerminalTotalDiff when the terminal total difficulty value received via + // the API mismatches Prysm's configuration value. + ErrMismatchTerminalTotalDiff = errors.New("terminal total difficulty mismatch") ) diff --git a/proto/engine/v1/BUILD.bazel b/proto/engine/v1/BUILD.bazel index ed9f8adcce..866d27d758 100644 --- a/proto/engine/v1/BUILD.bazel +++ b/proto/engine/v1/BUILD.bazel @@ -79,6 +79,7 @@ go_library( "@com_github_ferranbt_fastssz//:go_default_library", "//encoding/bytesutil:go_default_library", "//config/fieldparams:go_default_library", + "//config/params:go_default_library", ], # keep ) @@ -93,5 +94,6 @@ go_test( "//testing/require:go_default_library", "@com_github_ethereum_go_ethereum//common/hexutil:go_default_library", "//config/fieldparams:go_default_library", + "//config/params:go_default_library", ], ) diff --git a/proto/engine/v1/execution_engine.pb.go b/proto/engine/v1/execution_engine.pb.go index e757d37ed3..772e3d7845 100755 --- a/proto/engine/v1/execution_engine.pb.go +++ b/proto/engine/v1/execution_engine.pb.go @@ -80,7 +80,7 @@ func (x PayloadStatus_Status) Number() protoreflect.EnumNumber { // Deprecated: Use PayloadStatus_Status.Descriptor instead. func (PayloadStatus_Status) EnumDescriptor() ([]byte, []int) { - return file_proto_engine_v1_execution_engine_proto_rawDescGZIP(), []int{3, 0} + return file_proto_engine_v1_execution_engine_proto_rawDescGZIP(), []int{4, 0} } type ExecutionBlock struct { @@ -441,6 +441,69 @@ func (x *ExecutionPayload) GetTransactions() [][]byte { return nil } +type TransitionConfiguration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TerminalTotalDifficulty string `protobuf:"bytes,1,opt,name=terminal_total_difficulty,json=terminalTotalDifficulty,proto3" json:"terminal_total_difficulty,omitempty"` + TerminalBlockHash []byte `protobuf:"bytes,2,opt,name=terminal_block_hash,json=terminalBlockHash,proto3" json:"terminal_block_hash,omitempty"` + TerminalBlockNumber []byte `protobuf:"bytes,3,opt,name=terminal_block_number,json=terminalBlockNumber,proto3" json:"terminal_block_number,omitempty"` +} + +func (x *TransitionConfiguration) Reset() { + *x = TransitionConfiguration{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransitionConfiguration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransitionConfiguration) ProtoMessage() {} + +func (x *TransitionConfiguration) ProtoReflect() protoreflect.Message { + mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TransitionConfiguration.ProtoReflect.Descriptor instead. +func (*TransitionConfiguration) Descriptor() ([]byte, []int) { + return file_proto_engine_v1_execution_engine_proto_rawDescGZIP(), []int{2} +} + +func (x *TransitionConfiguration) GetTerminalTotalDifficulty() string { + if x != nil { + return x.TerminalTotalDifficulty + } + return "" +} + +func (x *TransitionConfiguration) GetTerminalBlockHash() []byte { + if x != nil { + return x.TerminalBlockHash + } + return nil +} + +func (x *TransitionConfiguration) GetTerminalBlockNumber() []byte { + if x != nil { + return x.TerminalBlockNumber + } + return nil +} + type PayloadAttributes struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -454,7 +517,7 @@ type PayloadAttributes struct { func (x *PayloadAttributes) Reset() { *x = PayloadAttributes{} if protoimpl.UnsafeEnabled { - mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[2] + mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -467,7 +530,7 @@ func (x *PayloadAttributes) String() string { func (*PayloadAttributes) ProtoMessage() {} func (x *PayloadAttributes) ProtoReflect() protoreflect.Message { - mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[2] + mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -480,7 +543,7 @@ func (x *PayloadAttributes) ProtoReflect() protoreflect.Message { // Deprecated: Use PayloadAttributes.ProtoReflect.Descriptor instead. func (*PayloadAttributes) Descriptor() ([]byte, []int) { - return file_proto_engine_v1_execution_engine_proto_rawDescGZIP(), []int{2} + return file_proto_engine_v1_execution_engine_proto_rawDescGZIP(), []int{3} } func (x *PayloadAttributes) GetTimestamp() uint64 { @@ -517,7 +580,7 @@ type PayloadStatus struct { func (x *PayloadStatus) Reset() { *x = PayloadStatus{} if protoimpl.UnsafeEnabled { - mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[3] + mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -530,7 +593,7 @@ func (x *PayloadStatus) String() string { func (*PayloadStatus) ProtoMessage() {} func (x *PayloadStatus) ProtoReflect() protoreflect.Message { - mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[3] + mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -543,7 +606,7 @@ func (x *PayloadStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use PayloadStatus.ProtoReflect.Descriptor instead. func (*PayloadStatus) Descriptor() ([]byte, []int) { - return file_proto_engine_v1_execution_engine_proto_rawDescGZIP(), []int{3} + return file_proto_engine_v1_execution_engine_proto_rawDescGZIP(), []int{4} } func (x *PayloadStatus) GetStatus() PayloadStatus_Status { @@ -580,7 +643,7 @@ type ForkchoiceState struct { func (x *ForkchoiceState) Reset() { *x = ForkchoiceState{} if protoimpl.UnsafeEnabled { - mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[4] + mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -593,7 +656,7 @@ func (x *ForkchoiceState) String() string { func (*ForkchoiceState) ProtoMessage() {} func (x *ForkchoiceState) ProtoReflect() protoreflect.Message { - mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[4] + mi := &file_proto_engine_v1_execution_engine_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -606,7 +669,7 @@ func (x *ForkchoiceState) ProtoReflect() protoreflect.Message { // Deprecated: Use ForkchoiceState.ProtoReflect.Descriptor instead. func (*ForkchoiceState) Descriptor() ([]byte, []int) { - return file_proto_engine_v1_execution_engine_proto_rawDescGZIP(), []int{4} + return file_proto_engine_v1_execution_engine_proto_rawDescGZIP(), []int{5} } func (x *ForkchoiceState) GetHeadBlockHash() []byte { @@ -715,56 +778,68 @@ var file_proto_engine_v1_execution_engine_proto_rawDesc = []byte{ 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x1d, 0x8a, 0xb5, 0x18, 0x03, 0x3f, 0x2c, 0x3f, 0x92, 0xb5, 0x18, 0x12, 0x31, 0x30, 0x34, 0x38, 0x35, 0x37, 0x36, 0x2c, 0x31, 0x30, 0x37, 0x33, 0x37, 0x34, 0x31, 0x38, 0x32, 0x34, 0x52, 0x0c, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x91, 0x01, 0x0a, - 0x11, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x1e, 0x0a, 0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, - 0x12, 0x3e, 0x0a, 0x17, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x65, - 0x65, 0x5f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x32, 0x30, 0x52, 0x15, 0x73, 0x75, 0x67, 0x67, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x46, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, - 0x22, 0xae, 0x02, 0x0a, 0x0d, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x40, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x11, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, - 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x0f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x29, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x7c, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, - 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x59, 0x4e, 0x43, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, - 0x0c, 0x0a, 0x08, 0x41, 0x43, 0x43, 0x45, 0x50, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x16, 0x0a, - 0x12, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x48, - 0x41, 0x53, 0x48, 0x10, 0x05, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x4c, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, - 0x06, 0x22, 0xab, 0x01, 0x0a, 0x0f, 0x46, 0x6f, 0x72, 0x6b, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x0f, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, - 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x0f, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, - 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x61, 0x66, 0x65, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x38, 0x0a, 0x14, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x12, 0x66, 0x69, 0x6e, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x42, - 0x93, 0x01, 0x0a, 0x16, 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x14, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, - 0x73, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, - 0x76, 0x31, 0x3b, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x76, 0x31, 0xaa, 0x02, 0x12, 0x45, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x56, 0x31, - 0xca, 0x02, 0x12, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5c, 0x45, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x5c, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb9, 0x01, 0x0a, + 0x17, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x74, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x69, + 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x69, 0x66, 0x66, 0x69, 0x63, + 0x75, 0x6c, 0x74, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x11, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x13, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1e, 0x0a, 0x06, + 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, + 0x18, 0x02, 0x33, 0x32, 0x52, 0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x12, 0x3e, 0x0a, 0x17, + 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x65, + 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, + 0xb5, 0x18, 0x02, 0x32, 0x30, 0x52, 0x15, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x46, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x22, 0xae, 0x02, 0x0a, + 0x0d, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x40, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, + 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x32, 0x0a, 0x11, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, + 0x02, 0x33, 0x32, 0x52, 0x0f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x29, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x7c, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, + 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x02, 0x12, 0x0b, + 0x0a, 0x07, 0x53, 0x59, 0x4e, 0x43, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, + 0x43, 0x43, 0x45, 0x50, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x48, 0x41, 0x53, 0x48, 0x10, + 0x05, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x45, 0x52, + 0x4d, 0x49, 0x4e, 0x41, 0x4c, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x06, 0x22, 0xab, 0x01, + 0x0a, 0x0f, 0x46, 0x6f, 0x72, 0x6b, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x2e, 0x0a, 0x0f, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, + 0x33, 0x32, 0x52, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x2e, 0x0a, 0x0f, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, + 0x33, 0x32, 0x52, 0x0d, 0x73, 0x61, 0x66, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x38, 0x0a, 0x14, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, + 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x12, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x42, 0x93, 0x01, 0x0a, 0x16, + 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x14, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x37, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, + 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x65, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x76, 0x31, 0xaa, 0x02, 0x12, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x12, 0x45, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5c, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5c, 0x76, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -780,14 +855,15 @@ func file_proto_engine_v1_execution_engine_proto_rawDescGZIP() []byte { } var file_proto_engine_v1_execution_engine_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_proto_engine_v1_execution_engine_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_proto_engine_v1_execution_engine_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_proto_engine_v1_execution_engine_proto_goTypes = []interface{}{ - (PayloadStatus_Status)(0), // 0: ethereum.engine.v1.PayloadStatus.Status - (*ExecutionBlock)(nil), // 1: ethereum.engine.v1.ExecutionBlock - (*ExecutionPayload)(nil), // 2: ethereum.engine.v1.ExecutionPayload - (*PayloadAttributes)(nil), // 3: ethereum.engine.v1.PayloadAttributes - (*PayloadStatus)(nil), // 4: ethereum.engine.v1.PayloadStatus - (*ForkchoiceState)(nil), // 5: ethereum.engine.v1.ForkchoiceState + (PayloadStatus_Status)(0), // 0: ethereum.engine.v1.PayloadStatus.Status + (*ExecutionBlock)(nil), // 1: ethereum.engine.v1.ExecutionBlock + (*ExecutionPayload)(nil), // 2: ethereum.engine.v1.ExecutionPayload + (*TransitionConfiguration)(nil), // 3: ethereum.engine.v1.TransitionConfiguration + (*PayloadAttributes)(nil), // 4: ethereum.engine.v1.PayloadAttributes + (*PayloadStatus)(nil), // 5: ethereum.engine.v1.PayloadStatus + (*ForkchoiceState)(nil), // 6: ethereum.engine.v1.ForkchoiceState } var file_proto_engine_v1_execution_engine_proto_depIdxs = []int32{ 0, // 0: ethereum.engine.v1.PayloadStatus.status:type_name -> ethereum.engine.v1.PayloadStatus.Status @@ -829,7 +905,7 @@ func file_proto_engine_v1_execution_engine_proto_init() { } } file_proto_engine_v1_execution_engine_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PayloadAttributes); i { + switch v := v.(*TransitionConfiguration); i { case 0: return &v.state case 1: @@ -841,7 +917,7 @@ func file_proto_engine_v1_execution_engine_proto_init() { } } file_proto_engine_v1_execution_engine_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PayloadStatus); i { + switch v := v.(*PayloadAttributes); i { case 0: return &v.state case 1: @@ -853,6 +929,18 @@ func file_proto_engine_v1_execution_engine_proto_init() { } } file_proto_engine_v1_execution_engine_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PayloadStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_engine_v1_execution_engine_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ForkchoiceState); i { case 0: return &v.state @@ -871,7 +959,7 @@ func file_proto_engine_v1_execution_engine_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_engine_v1_execution_engine_proto_rawDesc, NumEnums: 1, - NumMessages: 5, + NumMessages: 6, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/engine/v1/execution_engine.proto b/proto/engine/v1/execution_engine.proto index 0853e09b3b..48b0db11b7 100644 --- a/proto/engine/v1/execution_engine.proto +++ b/proto/engine/v1/execution_engine.proto @@ -65,6 +65,12 @@ message ExecutionPayload { repeated bytes transactions = 14 [(ethereum.eth.ext.ssz_size) = "?,?", (ethereum.eth.ext.ssz_max) = "1048576,1073741824"]; } +message TransitionConfiguration { + string terminal_total_difficulty = 1; + bytes terminal_block_hash = 2; + bytes terminal_block_number = 3; +} + message PayloadAttributes { uint64 timestamp = 1; bytes random = 2 [(ethereum.eth.ext.ssz_size) = "32"]; diff --git a/proto/engine/v1/json_marshal_unmarshal.go b/proto/engine/v1/json_marshal_unmarshal.go index aa4ece6adf..5ae5d7d4fa 100644 --- a/proto/engine/v1/json_marshal_unmarshal.go +++ b/proto/engine/v1/json_marshal_unmarshal.go @@ -2,7 +2,6 @@ package enginev1 import ( "encoding/json" - "fmt" "math/big" "github.com/ethereum/go-ethereum/common/hexutil" @@ -212,7 +211,6 @@ func (e *ExecutionPayload) MarshalJSON() ([]byte, error) { func (e *ExecutionPayload) UnmarshalJSON(enc []byte) error { dec := executionPayloadJSON{} if err := json.Unmarshal(enc, &dec); err != nil { - fmt.Println("got weird err") return err } *e = ExecutionPayload{} @@ -298,6 +296,40 @@ func (p *PayloadStatus) UnmarshalJSON(enc []byte) error { return nil } +type transitionConfigurationJSON struct { + TerminalTotalDifficulty string `json:"terminalTotalDifficulty"` + TerminalBlockHash hexutil.Bytes `json:"terminalBlockHash"` + TerminalBlockNumber string `json:"terminalBlockNumber"` +} + +// MarshalJSON -- +func (t *TransitionConfiguration) MarshalJSON() ([]byte, error) { + num := new(big.Int).SetBytes(t.TerminalBlockNumber) + numHex := hexutil.EncodeBig(num) + return json.Marshal(transitionConfigurationJSON{ + TerminalTotalDifficulty: t.TerminalTotalDifficulty, + TerminalBlockHash: t.TerminalBlockHash, + TerminalBlockNumber: numHex, + }) +} + +// UnmarshalJSON -- +func (t *TransitionConfiguration) UnmarshalJSON(enc []byte) error { + dec := transitionConfigurationJSON{} + if err := json.Unmarshal(enc, &dec); err != nil { + return err + } + *t = TransitionConfiguration{} + num, err := hexutil.DecodeBig(dec.TerminalBlockNumber) + if err != nil { + return err + } + t.TerminalTotalDifficulty = dec.TerminalTotalDifficulty + t.TerminalBlockHash = dec.TerminalBlockHash + t.TerminalBlockNumber = num.Bytes() + return nil +} + type forkchoiceStateJSON struct { HeadBlockHash hexutil.Bytes `json:"headBlockHash"` SafeBlockHash hexutil.Bytes `json:"safeBlockHash"` diff --git a/proto/engine/v1/json_marshal_unmarshal_test.go b/proto/engine/v1/json_marshal_unmarshal_test.go index ab8ca018f9..66461c9621 100644 --- a/proto/engine/v1/json_marshal_unmarshal_test.go +++ b/proto/engine/v1/json_marshal_unmarshal_test.go @@ -6,6 +6,7 @@ import ( "testing" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" enginev1 "github.com/prysmaticlabs/prysm/proto/engine/v1" "github.com/prysmaticlabs/prysm/testing/require" @@ -60,6 +61,22 @@ func TestJsonMarshalUnmarshal(t *testing.T) { require.DeepEqual(t, safe, payloadPb.SafeBlockHash) require.DeepEqual(t, finalized, payloadPb.FinalizedBlockHash) }) + t.Run("transition configuration", func(t *testing.T) { + blockHash := []byte("head") + jsonPayload := &enginev1.TransitionConfiguration{ + TerminalBlockHash: blockHash, + TerminalTotalDifficulty: params.BeaconConfig().TerminalTotalDifficulty, + TerminalBlockNumber: big.NewInt(0).Bytes(), + } + enc, err := json.Marshal(jsonPayload) + require.NoError(t, err) + payloadPb := &enginev1.TransitionConfiguration{} + require.NoError(t, json.Unmarshal(enc, payloadPb)) + require.DeepEqual(t, blockHash, payloadPb.TerminalBlockHash) + + require.DeepEqual(t, params.BeaconConfig().TerminalTotalDifficulty, payloadPb.TerminalTotalDifficulty) + require.DeepEqual(t, big.NewInt(0).Bytes(), payloadPb.TerminalBlockNumber) + }) t.Run("execution payload", func(t *testing.T) { baseFeePerGas := big.NewInt(6) parentHash := bytesutil.PadTo([]byte("parent"), fieldparams.RootLength)