From a50e56277893b74a123e99e18f3f3e147786dc9c Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 28 Jul 2023 16:36:17 +0000 Subject: [PATCH 01/19] simulators/ethereum/engine: Cancun blob test suite --- simulators/ethereum/engine/client/engine.go | 27 +- .../engine/client/hive_rpc/hive_rpc.go | 113 +- .../ethereum/engine/client/node/node.go | 122 +- .../ethereum/engine/client/types/types.go | 92 -- simulators/ethereum/engine/clmock/clmock.go | 139 +- simulators/ethereum/engine/devp2p/conn.go | 478 ++++++ simulators/ethereum/engine/devp2p/devp2p.go | 130 ++ simulators/ethereum/engine/globals/globals.go | 88 ++ simulators/ethereum/engine/go.mod | 11 +- simulators/ethereum/engine/go.sum | 14 +- simulators/ethereum/engine/helper/blobs.go | 324 ++++ simulators/ethereum/engine/helper/helper.go | 221 +-- simulators/ethereum/engine/helper/payload.go | 80 +- simulators/ethereum/engine/helper/tx.go | 240 +++ simulators/ethereum/engine/main.go | 18 +- .../ethereum/engine/suites/blobs/README.md | 5 + .../ethereum/engine/suites/blobs/config.go | 102 ++ .../ethereum/engine/suites/blobs/helpers.go | 129 ++ .../ethereum/engine/suites/blobs/steps.go | 753 ++++++++++ .../ethereum/engine/suites/blobs/tests.go | 1316 +++++++++++++++++ .../ethereum/engine/suites/engine/tests.go | 121 +- .../suites/exchange_capabilities/tests.go | 29 +- .../ethereum/engine/suites/sync/tests.go | 2 +- .../engine/suites/withdrawals/tests.go | 60 +- simulators/ethereum/engine/test/env.go | 20 +- simulators/ethereum/engine/test/expect.go | 65 +- simulators/ethereum/engine/test/spec.go | 27 +- simulators/ethereum/engine/types/blobs.go | 163 ++ .../ethereum/engine/types/gen_blockparams.go | 66 + simulators/ethereum/engine/types/gen_ed.go | 164 ++ .../engine/{client => }/types/gen_edv1.go | 0 .../engine/{client => }/types/gen_epbv1.go | 0 simulators/ethereum/engine/types/gen_epe.go | 52 + .../ethereum/engine/types/transactions.go | 162 ++ simulators/ethereum/engine/types/types.go | 232 +++ simulators/ethereum/go.work.sum | 613 +------- 36 files changed, 5030 insertions(+), 1148 deletions(-) delete mode 100644 simulators/ethereum/engine/client/types/types.go create mode 100644 simulators/ethereum/engine/devp2p/conn.go create mode 100644 simulators/ethereum/engine/devp2p/devp2p.go create mode 100644 simulators/ethereum/engine/helper/blobs.go create mode 100644 simulators/ethereum/engine/suites/blobs/README.md create mode 100644 simulators/ethereum/engine/suites/blobs/config.go create mode 100644 simulators/ethereum/engine/suites/blobs/helpers.go create mode 100644 simulators/ethereum/engine/suites/blobs/steps.go create mode 100644 simulators/ethereum/engine/suites/blobs/tests.go create mode 100644 simulators/ethereum/engine/types/blobs.go create mode 100644 simulators/ethereum/engine/types/gen_blockparams.go create mode 100644 simulators/ethereum/engine/types/gen_ed.go rename simulators/ethereum/engine/{client => }/types/gen_edv1.go (100%) rename simulators/ethereum/engine/{client => }/types/gen_epbv1.go (100%) create mode 100644 simulators/ethereum/engine/types/gen_epe.go create mode 100644 simulators/ethereum/engine/types/transactions.go create mode 100644 simulators/ethereum/engine/types/types.go diff --git a/simulators/ethereum/engine/client/engine.go b/simulators/ethereum/engine/client/engine.go index 03cfd5b024..0a11c03ba9 100644 --- a/simulators/ethereum/engine/client/engine.go +++ b/simulators/ethereum/engine/client/engine.go @@ -10,8 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - - client_types "github.com/ethereum/hive/simulators/ethereum/engine/client/types" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) type Eth interface { @@ -20,8 +19,8 @@ type Eth interface { BlockNumber(ctx context.Context) (uint64, error) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) - SendTransaction(ctx context.Context, tx *types.Transaction) error - SendTransactions(ctx context.Context, txs []*types.Transaction) []error + SendTransaction(ctx context.Context, tx typ.Transaction) error + SendTransactions(ctx context.Context, txs ...typ.Transaction) []error StorageAt(ctx context.Context, account common.Address, key common.Hash, blockNumber *big.Int) ([]byte, error) StorageAtKeys(ctx context.Context, account common.Address, keys []common.Hash, blockNumber *big.Int) (map[common.Hash]*common.Hash, error) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) @@ -34,19 +33,20 @@ type Engine interface { ForkchoiceUpdatedV2(ctx context.Context, fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) (api.ForkChoiceResponse, error) ForkchoiceUpdated(ctx context.Context, version int, fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) (api.ForkChoiceResponse, error) - GetPayloadV1(ctx context.Context, payloadId *api.PayloadID) (api.ExecutableData, error) - GetPayloadV2(ctx context.Context, payloadId *api.PayloadID) (api.ExecutableData, *big.Int, error) + GetPayloadV1(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, error) + GetPayloadV2(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, error) + GetPayloadV3(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, *typ.BlobsBundle, error) - NewPayload(ctx context.Context, version int, payload interface{}, versionedHashes []common.Hash) (api.PayloadStatusV1, error) - NewPayloadV1(ctx context.Context, payload *client_types.ExecutableDataV1) (api.PayloadStatusV1, error) - NewPayloadV2(ctx context.Context, payload *api.ExecutableData) (api.PayloadStatusV1, error) - NewPayloadV3(ctx context.Context, payload *api.ExecutableData, versionedHashes []common.Hash) (api.PayloadStatusV1, error) + NewPayload(ctx context.Context, version int, payload interface{}, versionedHashes *[]common.Hash) (api.PayloadStatusV1, error) + NewPayloadV1(ctx context.Context, payload *typ.ExecutableDataV1) (api.PayloadStatusV1, error) + NewPayloadV2(ctx context.Context, payload *typ.ExecutableData) (api.PayloadStatusV1, error) + NewPayloadV3(ctx context.Context, payload *typ.ExecutableData, versionedHashes *[]common.Hash) (api.PayloadStatusV1, error) - GetPayloadBodiesByRangeV1(ctx context.Context, start uint64, count uint64) ([]*client_types.ExecutionPayloadBodyV1, error) - GetPayloadBodiesByHashV1(ctx context.Context, hashes []common.Hash) ([]*client_types.ExecutionPayloadBodyV1, error) + GetPayloadBodiesByRangeV1(ctx context.Context, start uint64, count uint64) ([]*typ.ExecutionPayloadBodyV1, error) + GetPayloadBodiesByHashV1(ctx context.Context, hashes []common.Hash) ([]*typ.ExecutionPayloadBodyV1, error) LatestForkchoiceSent() (fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) - LatestNewPayloadSent() (payload *api.ExecutableData) + LatestNewPayloadSent() (payload *typ.ExecutableData) LatestForkchoiceResponse() (fcuResponse *api.ForkChoiceResponse) LatestNewPayloadResponse() (payloadResponse *api.PayloadStatusV1) @@ -59,6 +59,7 @@ type EngineClient interface { EnodeURL() (string, error) // Local Test Account Management + GetLastAccountNonce(testCtx context.Context, account common.Address) (uint64, error) GetNextAccountNonce(testCtx context.Context, account common.Address) (uint64, error) UpdateNonce(testCtx context.Context, account common.Address, newNonce uint64) error diff --git a/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go b/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go index f5ef245f2a..2bff753535 100644 --- a/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go +++ b/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go @@ -8,6 +8,7 @@ import ( "net" "net/http" "strings" + "sync" "time" "github.com/ethereum/go-ethereum" @@ -20,9 +21,9 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/hive/hivesim" "github.com/ethereum/hive/simulators/ethereum/engine/client" - client_types "github.com/ethereum/hive/simulators/ethereum/engine/client/types" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" "github.com/golang-jwt/jwt/v4" "github.com/pkg/errors" ) @@ -37,6 +38,8 @@ type HiveRPCEngineStarter struct { JWTSecret []byte } +var _ client.EngineStarter = (*HiveRPCEngineStarter)(nil) + func (s HiveRPCEngineStarter) StartClient(T *hivesim.T, testContext context.Context, genesis *core.Genesis, ClientParams hivesim.Params, ClientFiles hivesim.Params, bootClients ...client.EngineClient) (client.EngineClient, error) { var ( clientType = s.ClientType @@ -159,13 +162,16 @@ type HiveRPCEngineClient struct { latestPAttrSent *api.PayloadAttributes latestFcUResponse *api.ForkChoiceResponse - latestPayloadSent *api.ExecutableData + latestPayloadSent *typ.ExecutableData latestPayloadStatusReponse *api.PayloadStatusV1 // Test account nonces - accTxInfoMap map[common.Address]*AccountTransactionInfo + accTxInfoMap map[common.Address]*AccountTransactionInfo + accTxInfoMapLock sync.Mutex } +var _ client.EngineClient = (*HiveRPCEngineClient)(nil) + // NewClient creates a engine client that uses the given RPC client. func NewHiveRPCEngineClient(h *hivesim.Client, enginePort int, ethPort int, jwtSecretBytes []byte, ttd *big.Int, transport http.RoundTripper) *HiveRPCEngineClient { // Prepare HTTP Client @@ -330,6 +336,8 @@ func (ec *HiveRPCEngineClient) PrepareDefaultAuthCallToken() error { } // Engine API Call Methods + +// Forkchoice Updated API Calls func (ec *HiveRPCEngineClient) ForkchoiceUpdated(ctx context.Context, version int, fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) (api.ForkChoiceResponse, error) { var result api.ForkChoiceResponse if err := ec.PrepareDefaultAuthCallToken(); err != nil { @@ -354,44 +362,54 @@ func (ec *HiveRPCEngineClient) ForkchoiceUpdatedV2(ctx context.Context, fcState return ec.ForkchoiceUpdated(ctx, 2, fcState, pAttributes) } -func (ec *HiveRPCEngineClient) GetPayload(ctx context.Context, version int, payloadId *api.PayloadID) (api.ExecutableData, *big.Int, error) { +// Get Payload API Calls + +func (ec *HiveRPCEngineClient) GetPayload(ctx context.Context, version int, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, *typ.BlobsBundle, error) { var ( - executableData api.ExecutableData + executableData typ.ExecutableData blockValue *big.Int + blobsBundle *typ.BlobsBundle err error rpcString = fmt.Sprintf("engine_getPayloadV%d", version) ) if err = ec.PrepareDefaultAuthCallToken(); err != nil { - return executableData, nil, err + return executableData, nil, nil, err } - if version == 2 { - var response api.ExecutionPayloadEnvelope + if version >= 2 { + var response typ.ExecutionPayloadEnvelope err = ec.c.CallContext(ctx, &response, rpcString, payloadId) if response.ExecutionPayload != nil { executableData = *response.ExecutionPayload } blockValue = response.BlockValue + blobsBundle = response.BlobsBundle } else { err = ec.c.CallContext(ctx, &executableData, rpcString, payloadId) } - return executableData, blockValue, err + return executableData, blockValue, blobsBundle, err } -func (ec *HiveRPCEngineClient) GetPayloadV1(ctx context.Context, payloadId *api.PayloadID) (api.ExecutableData, error) { - ed, _, err := ec.GetPayload(ctx, 1, payloadId) +func (ec *HiveRPCEngineClient) GetPayloadV1(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, error) { + ed, _, _, err := ec.GetPayload(ctx, 1, payloadId) return ed, err } -func (ec *HiveRPCEngineClient) GetPayloadV2(ctx context.Context, payloadId *api.PayloadID) (api.ExecutableData, *big.Int, error) { - return ec.GetPayload(ctx, 2, payloadId) +func (ec *HiveRPCEngineClient) GetPayloadV2(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, error) { + ed, bv, _, err := ec.GetPayload(ctx, 2, payloadId) + return ed, bv, err } -func (ec *HiveRPCEngineClient) GetPayloadBodiesByRangeV1(ctx context.Context, start uint64, count uint64) ([]*client_types.ExecutionPayloadBodyV1, error) { +func (ec *HiveRPCEngineClient) GetPayloadV3(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, *typ.BlobsBundle, error) { + return ec.GetPayload(ctx, 3, payloadId) +} + +// Get Payload Bodies API Calls +func (ec *HiveRPCEngineClient) GetPayloadBodiesByRangeV1(ctx context.Context, start uint64, count uint64) ([]*typ.ExecutionPayloadBodyV1, error) { var ( - result []*client_types.ExecutionPayloadBodyV1 + result []*typ.ExecutionPayloadBodyV1 err error ) if err = ec.PrepareDefaultAuthCallToken(); err != nil { @@ -402,9 +420,9 @@ func (ec *HiveRPCEngineClient) GetPayloadBodiesByRangeV1(ctx context.Context, st return result, err } -func (ec *HiveRPCEngineClient) GetPayloadBodiesByHashV1(ctx context.Context, hashes []common.Hash) ([]*client_types.ExecutionPayloadBodyV1, error) { +func (ec *HiveRPCEngineClient) GetPayloadBodiesByHashV1(ctx context.Context, hashes []common.Hash) ([]*typ.ExecutionPayloadBodyV1, error) { var ( - result []*client_types.ExecutionPayloadBodyV1 + result []*typ.ExecutionPayloadBodyV1 err error ) if err = ec.PrepareDefaultAuthCallToken(); err != nil { @@ -415,12 +433,27 @@ func (ec *HiveRPCEngineClient) GetPayloadBodiesByHashV1(ctx context.Context, has return result, err } -func (ec *HiveRPCEngineClient) NewPayload(ctx context.Context, version int, payload interface{}, versionedHashes []common.Hash) (result api.PayloadStatusV1, err error) { +// Get Blob Bundle API Calls +func (ec *HiveRPCEngineClient) GetBlobsBundleV1(ctx context.Context, payloadId *api.PayloadID) (*typ.BlobsBundle, error) { + var ( + result typ.BlobsBundle + err error + ) + if err = ec.PrepareDefaultAuthCallToken(); err != nil { + return nil, err + } + + err = ec.c.CallContext(ctx, &result, "engine_getBlobsBundleV1", payloadId) + return &result, err +} + +// New Payload API Call Methods +func (ec *HiveRPCEngineClient) NewPayload(ctx context.Context, version int, payload interface{}, versionedHashes *[]common.Hash) (result api.PayloadStatusV1, err error) { if err := ec.PrepareDefaultAuthCallToken(); err != nil { return result, err } - if versionedHashes != nil { + if version >= 3 { err = ec.c.CallContext(ctx, &result, fmt.Sprintf("engine_newPayloadV%d", version), payload, versionedHashes) } else { err = ec.c.CallContext(ctx, &result, fmt.Sprintf("engine_newPayloadV%d", version), payload) @@ -429,21 +462,23 @@ func (ec *HiveRPCEngineClient) NewPayload(ctx context.Context, version int, payl return result, err } -func (ec *HiveRPCEngineClient) NewPayloadV1(ctx context.Context, payload *client_types.ExecutableDataV1) (api.PayloadStatusV1, error) { +func (ec *HiveRPCEngineClient) NewPayloadV1(ctx context.Context, payload *typ.ExecutableDataV1) (api.PayloadStatusV1, error) { ed := payload.ToExecutableData() ec.latestPayloadSent = &ed return ec.NewPayload(ctx, 1, payload, nil) } -func (ec *HiveRPCEngineClient) NewPayloadV2(ctx context.Context, payload *api.ExecutableData) (api.PayloadStatusV1, error) { +func (ec *HiveRPCEngineClient) NewPayloadV2(ctx context.Context, payload *typ.ExecutableData) (api.PayloadStatusV1, error) { ec.latestPayloadSent = payload return ec.NewPayload(ctx, 2, payload, nil) } -func (ec *HiveRPCEngineClient) NewPayloadV3(ctx context.Context, payload *api.ExecutableData, versionedHashes []common.Hash) (api.PayloadStatusV1, error) { +func (ec *HiveRPCEngineClient) NewPayloadV3(ctx context.Context, payload *typ.ExecutableData, versionedHashes *[]common.Hash) (api.PayloadStatusV1, error) { ec.latestPayloadSent = payload return ec.NewPayload(ctx, 3, payload, versionedHashes) } + +// Exchange Transition Configuration API Call Methods func (ec *HiveRPCEngineClient) ExchangeTransitionConfigurationV1(ctx context.Context, tConf *api.TransitionConfigurationV1) (api.TransitionConfigurationV1, error) { var result api.TransitionConfigurationV1 err := ec.c.CallContext(ctx, &result, "engine_exchangeTransitionConfigurationV1", tConf) @@ -459,6 +494,26 @@ func (ec *HiveRPCEngineClient) ExchangeCapabilities(ctx context.Context, clCapab return result, err } +// Account Nonce +func (ec *HiveRPCEngineClient) GetLastAccountNonce(testCtx context.Context, account common.Address) (uint64, error) { + // First get the current head of the client where we will send the tx + ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) + defer cancel() + head, err := ec.HeaderByNumber(ctx, nil) + if err != nil { + return 0, err + } + + // Then check if we have any info about this account, and when it was last updated + if accTxInfo, ok := ec.accTxInfoMap[account]; ok && accTxInfo != nil && (accTxInfo.PreviousBlock == head.Hash() || accTxInfo.PreviousBlock == head.ParentHash) { + // We have info about this account and is up to date (or up to date until the very last block). + // Return the previous nonce + return accTxInfo.PreviousNonce, nil + } + // We don't have info about this account, so there is no previous nonce + return 0, fmt.Errorf("no previous nonce for account %s", account.String()) +} + func (ec *HiveRPCEngineClient) GetNextAccountNonce(testCtx context.Context, account common.Address) (uint64, error) { // First get the current head of the client where we will send the tx ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) @@ -482,6 +537,8 @@ func (ec *HiveRPCEngineClient) GetNextAccountNonce(testCtx context.Context, acco if err != nil { return 0, err } + ec.accTxInfoMapLock.Lock() + defer ec.accTxInfoMapLock.Unlock() ec.accTxInfoMap[account] = &AccountTransactionInfo{ PreviousBlock: head.Hash(), PreviousNonce: nonce, @@ -504,7 +561,15 @@ func (ec *HiveRPCEngineClient) UpdateNonce(testCtx context.Context, account comm return nil } -func (ec *HiveRPCEngineClient) SendTransactions(ctx context.Context, txs []*types.Transaction) []error { +func (ec *HiveRPCEngineClient) SendTransaction(ctx context.Context, tx typ.Transaction) error { + data, err := tx.MarshalBinary() + if err != nil { + return err + } + return ec.cEth.CallContext(ctx, nil, "eth_sendRawTransaction", hexutil.Encode(data)) +} + +func (ec *HiveRPCEngineClient) SendTransactions(ctx context.Context, txs ...typ.Transaction) []error { reqs := make([]rpc.BatchElem, len(txs)) hashes := make([]common.Hash, len(txs)) for i := range reqs { @@ -538,7 +603,7 @@ func (ec *HiveRPCEngineClient) LatestForkchoiceSent() (fcState *api.ForkchoiceSt return ec.latestFcUStateSent, ec.latestPAttrSent } -func (ec *HiveRPCEngineClient) LatestNewPayloadSent() *api.ExecutableData { +func (ec *HiveRPCEngineClient) LatestNewPayloadSent() *typ.ExecutableData { return ec.latestPayloadSent } diff --git a/simulators/ethereum/engine/client/node/node.go b/simulators/ethereum/engine/client/node/node.go index 67584a6fdb..8e081308ac 100644 --- a/simulators/ethereum/engine/client/node/node.go +++ b/simulators/ethereum/engine/client/node/node.go @@ -31,8 +31,8 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/hive/hivesim" "github.com/ethereum/hive/simulators/ethereum/engine/client" - client_types "github.com/ethereum/hive/simulators/ethereum/engine/client/types" "github.com/ethereum/hive/simulators/ethereum/engine/helper" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) type GethNodeTestConfiguration struct { @@ -155,16 +155,19 @@ type GethNode struct { latestPAttrSent *beacon.PayloadAttributes latestFcUResponse *beacon.ForkChoiceResponse - latestPayloadSent *beacon.ExecutableData + latestPayloadSent *typ.ExecutableData latestPayloadStatusReponse *beacon.PayloadStatusV1 // Test specific configuration accTxInfoMap map[common.Address]*AccountTransactionInfo + accTxInfoMapLock sync.Mutex totalReceivedOrAnnouncedNewBlocks *big.Int config GethNodeTestConfiguration } +var _ client.EngineClient = (*GethNode)(nil) + func newNode(config GethNodeTestConfiguration, bootnodes []string, genesis *core.Genesis) (*GethNode, error) { // Define the basic configurations for the Ethereum node datadir, _ := os.MkdirTemp("", "") @@ -395,7 +398,7 @@ func (n *GethNode) SetBlock(block *types.Block, parentNumber uint64, parentRoot failedProcessing = true } rawdb.WriteReceipts(n.eth.ChainDb(), block.Hash(), block.NumberU64(), receipts) - root, err := statedb.Commit(false) + root, err := statedb.Commit(block.NumberU64(), false) if err != nil { return err } @@ -429,43 +432,60 @@ func (n *GethNode) SetBlock(block *types.Block, parentNumber uint64, parentRoot } // Engine API - -func (n *GethNode) NewPayload(ctx context.Context, version int, pl interface{}, versionedHashes []common.Hash) (beacon.PayloadStatusV1, error) { +func (n *GethNode) NewPayload(ctx context.Context, version int, pl interface{}, vh *[]common.Hash) (beacon.PayloadStatusV1, error) { switch version { case 1: - if c, ok := pl.(*client_types.ExecutableDataV1); ok { + if c, ok := pl.(*typ.ExecutableDataV1); ok { return n.NewPayloadV1(ctx, c) } else { return beacon.PayloadStatusV1{}, fmt.Errorf("wrong type %T", pl) } case 2: - if c, ok := pl.(*beacon.ExecutableData); ok { + if c, ok := pl.(*typ.ExecutableData); ok { return n.NewPayloadV2(ctx, c) } else { return beacon.PayloadStatusV1{}, fmt.Errorf("wrong type %T", pl) } + case 3: + if c, ok := pl.(*typ.ExecutableData); ok { + return n.NewPayloadV3(ctx, c, vh) + } else { + return beacon.PayloadStatusV1{}, fmt.Errorf("wrong type %T", pl) + } } return beacon.PayloadStatusV1{}, fmt.Errorf("unknown version %d", version) } -func (n *GethNode) NewPayloadV1(ctx context.Context, pl *client_types.ExecutableDataV1) (beacon.PayloadStatusV1, error) { +func (n *GethNode) NewPayloadV1(ctx context.Context, pl *typ.ExecutableDataV1) (beacon.PayloadStatusV1, error) { ed := pl.ToExecutableData() n.latestPayloadSent = &ed - resp, err := n.api.NewPayloadV1(ed) + edConverted, err := typ.ToBeaconExecutableData(&ed) + if err != nil { + return beacon.PayloadStatusV1{}, err + } + resp, err := n.api.NewPayloadV1(edConverted) n.latestPayloadStatusReponse = &resp return resp, err } -func (n *GethNode) NewPayloadV2(ctx context.Context, pl *beacon.ExecutableData) (beacon.PayloadStatusV1, error) { +func (n *GethNode) NewPayloadV2(ctx context.Context, pl *typ.ExecutableData) (beacon.PayloadStatusV1, error) { n.latestPayloadSent = pl - resp, err := n.api.NewPayloadV2(*pl) + ed, err := typ.ToBeaconExecutableData(pl) + if err != nil { + return beacon.PayloadStatusV1{}, err + } + resp, err := n.api.NewPayloadV2(ed) n.latestPayloadStatusReponse = &resp return resp, err } -func (n *GethNode) NewPayloadV3(ctx context.Context, pl *beacon.ExecutableData, versionedHashes []common.Hash) (beacon.PayloadStatusV1, error) { +func (n *GethNode) NewPayloadV3(ctx context.Context, pl *typ.ExecutableData, versionedHashes *[]common.Hash) (beacon.PayloadStatusV1, error) { n.latestPayloadSent = pl - resp, err := n.api.NewPayloadV3(*pl, &versionedHashes) + ed, err := typ.ToBeaconExecutableData(pl) + if err != nil { + return beacon.PayloadStatusV1{}, err + } + resp, err := n.api.NewPayloadV3(ed, versionedHashes) n.latestPayloadStatusReponse = &resp return resp, err } @@ -497,27 +517,42 @@ func (n *GethNode) ForkchoiceUpdatedV2(ctx context.Context, fcs *beacon.Forkchoi return fcr, err } -func (n *GethNode) GetPayloadV1(ctx context.Context, payloadId *beacon.PayloadID) (beacon.ExecutableData, error) { +func (n *GethNode) GetPayloadV1(ctx context.Context, payloadId *beacon.PayloadID) (typ.ExecutableData, error) { p, err := n.api.GetPayloadV1(*payloadId) if p == nil || err != nil { - return beacon.ExecutableData{}, err + return typ.ExecutableData{}, err } - return *p, err + return typ.FromBeaconExecutableData(p) } -func (n *GethNode) GetPayloadV2(ctx context.Context, payloadId *beacon.PayloadID) (beacon.ExecutableData, *big.Int, error) { +func (n *GethNode) GetPayloadV2(ctx context.Context, payloadId *beacon.PayloadID) (typ.ExecutableData, *big.Int, error) { p, err := n.api.GetPayloadV2(*payloadId) if p == nil || err != nil { - return beacon.ExecutableData{}, nil, err + return typ.ExecutableData{}, nil, err + } + ed, err := typ.FromBeaconExecutableData(p.ExecutionPayload) + return ed, p.BlockValue, err +} + +func (n *GethNode) GetPayloadV3(ctx context.Context, payloadId *beacon.PayloadID) (typ.ExecutableData, *big.Int, *typ.BlobsBundle, error) { + p, err := n.api.GetPayloadV3(*payloadId) + if p == nil || err != nil { + return typ.ExecutableData{}, nil, nil, err } - return *p.ExecutionPayload, p.BlockValue, err + ed, err := typ.FromBeaconExecutableData(p.ExecutionPayload) + // TODO: Convert and return the blobs bundle + return ed, p.BlockValue, nil, err } -func (n *GethNode) GetPayloadBodiesByRangeV1(ctx context.Context, start uint64, count uint64) ([]*client_types.ExecutionPayloadBodyV1, error) { +func (n *GethNode) GetPayloadBodiesByRangeV1(ctx context.Context, start uint64, count uint64) ([]*typ.ExecutionPayloadBodyV1, error) { return nil, fmt.Errorf("not implemented") } -func (n *GethNode) GetPayloadBodiesByHashV1(ctx context.Context, hashes []common.Hash) ([]*client_types.ExecutionPayloadBodyV1, error) { +func (n *GethNode) GetPayloadBodiesByHashV1(ctx context.Context, hashes []common.Hash) ([]*typ.ExecutionPayloadBodyV1, error) { + return nil, fmt.Errorf("not implemented") +} + +func (n *GethNode) GetBlobsBundleV1(ctx context.Context, payloadId *beacon.PayloadID) (*typ.BlobsBundle, error) { return nil, fmt.Errorf("not implemented") } @@ -564,16 +599,24 @@ func (n *GethNode) HeaderByNumber(ctx context.Context, number *big.Int) (*types. return b.Header(), err } -func (n *GethNode) SendTransaction(ctx context.Context, tx *types.Transaction) error { - return n.eth.APIBackend.SendTx(ctx, tx) +func (n *GethNode) SendTransaction(ctx context.Context, tx typ.Transaction) error { + if v, ok := tx.(*types.Transaction); ok { + return n.eth.APIBackend.SendTx(ctx, v) + } + return fmt.Errorf("invalid transaction type") } -func (n *GethNode) SendTransactions(ctx context.Context, txs []*types.Transaction) []error { +func (n *GethNode) SendTransactions(ctx context.Context, txs ...typ.Transaction) []error { for _, tx := range txs { - err := n.eth.APIBackend.SendTx(ctx, tx) - if err != nil { - return []error{err} + if v, ok := tx.(*types.Transaction); ok { + err := n.eth.APIBackend.SendTx(ctx, v) + if err != nil { + return []error{err} + } + } else { + return []error{fmt.Errorf("invalid transaction type")} } + } return nil } @@ -622,6 +665,10 @@ func (n *GethNode) TransactionByHash(ctx context.Context, hash common.Hash) (tx panic("NOT IMPLEMENTED") } +func (n *GethNode) PendingTransactionCount(ctx context.Context) (uint, error) { + panic("NOT IMPLEMENTED") +} + func (n *GethNode) GetBlockTotalDifficulty(ctx context.Context, hash common.Hash) (*big.Int, error) { block := n.eth.BlockChain().GetBlockByHash(hash) if block == nil { @@ -652,6 +699,23 @@ func (n *GethNode) ID() string { return n.node.Config().Name } +func (n *GethNode) GetLastAccountNonce(testCtx context.Context, account common.Address) (uint64, error) { + // First get the current head of the client where we will send the tx + head, err := n.eth.APIBackend.BlockByNumber(testCtx, rpc.LatestBlockNumber) + if err != nil { + return 0, err + } + + // Then check if we have any info about this account, and when it was last updated + if accTxInfo, ok := n.accTxInfoMap[account]; ok && accTxInfo != nil && (accTxInfo.PreviousBlock == head.Hash() || accTxInfo.PreviousBlock == head.ParentHash()) { + // We have info about this account and is up to date (or up to date until the very last block). + // Return the previous nonce + return accTxInfo.PreviousNonce, nil + } + // We don't have info about this account, so there is no previous nonce + return 0, fmt.Errorf("no previous nonce for account %s", account.String()) +} + func (n *GethNode) GetNextAccountNonce(testCtx context.Context, account common.Address) (uint64, error) { // First get the current head of the client where we will send the tx head, err := n.eth.APIBackend.BlockByNumber(testCtx, rpc.LatestBlockNumber) @@ -671,6 +735,8 @@ func (n *GethNode) GetNextAccountNonce(testCtx context.Context, account common.A if err != nil { return 0, err } + n.accTxInfoMapLock.Lock() + defer n.accTxInfoMapLock.Unlock() n.accTxInfoMap[account] = &AccountTransactionInfo{ PreviousBlock: head.Hash(), PreviousNonce: nonce, @@ -705,7 +771,7 @@ func (n *GethNode) LatestForkchoiceSent() (fcState *beacon.ForkchoiceStateV1, pA return n.latestFcUStateSent, n.latestPAttrSent } -func (n *GethNode) LatestNewPayloadSent() (payload *beacon.ExecutableData) { +func (n *GethNode) LatestNewPayloadSent() (payload *typ.ExecutableData) { return n.latestPayloadSent } diff --git a/simulators/ethereum/engine/client/types/types.go b/simulators/ethereum/engine/client/types/types.go deleted file mode 100644 index c0850ca4c5..0000000000 --- a/simulators/ethereum/engine/client/types/types.go +++ /dev/null @@ -1,92 +0,0 @@ -package types - -import ( - "math/big" - - api "github.com/ethereum/go-ethereum/beacon/engine" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core/types" -) - -//go:generate go run github.com/fjl/gencodec -type ExecutionPayloadBodyV1 -field-override executionPayloadBodyV1Marshaling -out gen_epbv1.go -type ExecutionPayloadBodyV1 struct { - Transactions [][]byte `json:"transactions" gencodec:"required"` - Withdrawals []*types.Withdrawal `json:"withdrawals"` -} - -// JSON type overrides for executableData. -type executionPayloadBodyV1Marshaling struct { - Transactions []hexutil.Bytes -} - -// ExecutableData is the data necessary to execute an EL payload. -// -//go:generate go run github.com/fjl/gencodec -type ExecutableDataV1 -field-override executableDataV1Marshaling -out gen_edv1.go -type ExecutableDataV1 struct { - ParentHash common.Hash `json:"parentHash" gencodec:"required"` - FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` - StateRoot common.Hash `json:"stateRoot" gencodec:"required"` - ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` - LogsBloom []byte `json:"logsBloom" gencodec:"required"` - Random common.Hash `json:"prevRandao" gencodec:"required"` - Number uint64 `json:"blockNumber" gencodec:"required"` - GasLimit uint64 `json:"gasLimit" gencodec:"required"` - GasUsed uint64 `json:"gasUsed" gencodec:"required"` - Timestamp uint64 `json:"timestamp" gencodec:"required"` - ExtraData []byte `json:"extraData" gencodec:"required"` - BaseFeePerGas *big.Int `json:"baseFeePerGas" gencodec:"required"` - BlockHash common.Hash `json:"blockHash" gencodec:"required"` - Transactions [][]byte `json:"transactions" gencodec:"required"` -} - -// JSON type overrides for executableData. -type executableDataV1Marshaling struct { - Number hexutil.Uint64 - GasLimit hexutil.Uint64 - GasUsed hexutil.Uint64 - Timestamp hexutil.Uint64 - BaseFeePerGas *hexutil.Big - ExtraData hexutil.Bytes - LogsBloom hexutil.Bytes - Transactions []hexutil.Bytes -} - -func (edv1 *ExecutableDataV1) ToExecutableData() api.ExecutableData { - return api.ExecutableData{ - ParentHash: edv1.ParentHash, - FeeRecipient: edv1.FeeRecipient, - StateRoot: edv1.StateRoot, - ReceiptsRoot: edv1.ReceiptsRoot, - LogsBloom: edv1.LogsBloom, - Random: edv1.Random, - Number: edv1.Number, - GasLimit: edv1.GasLimit, - GasUsed: edv1.GasUsed, - Timestamp: edv1.Timestamp, - ExtraData: edv1.ExtraData, - BaseFeePerGas: edv1.BaseFeePerGas, - BlockHash: edv1.BlockHash, - Transactions: edv1.Transactions, - } -} - -func (edv1 *ExecutableDataV1) FromExecutableData(ed *api.ExecutableData) { - if ed.Withdrawals != nil { - panic("source executable data contains withdrawals, not supported by V1") - } - edv1.ParentHash = ed.ParentHash - edv1.FeeRecipient = ed.FeeRecipient - edv1.StateRoot = ed.StateRoot - edv1.ReceiptsRoot = ed.ReceiptsRoot - edv1.LogsBloom = ed.LogsBloom - edv1.Random = ed.Random - edv1.Number = ed.Number - edv1.GasLimit = ed.GasLimit - edv1.GasUsed = ed.GasUsed - edv1.Timestamp = ed.Timestamp - edv1.ExtraData = ed.ExtraData - edv1.BaseFeePerGas = ed.BaseFeePerGas - edv1.BlockHash = ed.BlockHash - edv1.Transactions = ed.Transactions -} \ No newline at end of file diff --git a/simulators/ethereum/engine/clmock/clmock.go b/simulators/ethereum/engine/clmock/clmock.go index 1540e84b79..6ffe33fdc7 100644 --- a/simulators/ethereum/engine/clmock/clmock.go +++ b/simulators/ethereum/engine/clmock/clmock.go @@ -3,6 +3,7 @@ package clmock import ( "context" "encoding/json" + "errors" "fmt" "math/big" "math/rand" @@ -10,10 +11,12 @@ import ( "time" api "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/forkid" "github.com/ethereum/hive/simulators/ethereum/engine/client" - client_types "github.com/ethereum/hive/simulators/ethereum/engine/client/types" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -27,9 +30,12 @@ var ( // Time delay between ForkchoiceUpdated and GetPayload to allow the clients // to produce a new Payload DefaultPayloadProductionClientDelay = time.Second + + // Fork specific constants + BLOB_COMMITMENT_VERSION_KZG = byte(0x01) ) -type ExecutableDataHistory map[uint64]*api.ExecutableData +type ExecutableDataHistory map[uint64]*typ.ExecutableData func (h ExecutableDataHistory) LatestPayloadNumber() uint64 { latest := uint64(0) @@ -78,6 +84,9 @@ type CLMocker struct { NextPayloadID *api.PayloadID CurrentPayloadNumber uint64 + // Chain History + HeaderHistory map[uint64]*types.Header + // PoS Chain History Information PrevRandaoHistory map[uint64]common.Hash ExecutedPayloadHistory ExecutableDataHistory @@ -86,10 +95,11 @@ type CLMocker struct { // Latest broadcasted data using the PoS Engine API LatestHeadNumber *big.Int LatestHeader *types.Header - LatestPayloadBuilt api.ExecutableData + LatestPayloadBuilt typ.ExecutableData LatestBlockValue *big.Int + LatestBlobBundle *typ.BlobsBundle LatestPayloadAttributes api.PayloadAttributes - LatestExecutedPayload api.ExecutableData + LatestExecutedPayload typ.ExecutableData LatestForkchoice api.ForkchoiceStateV1 // Merge related @@ -97,21 +107,20 @@ type CLMocker struct { TTDReached bool TransitionPayloadTimestamp *big.Int SafeSlotsToImportOptimistically *big.Int + ChainTotalDifficulty *big.Int - // Shanghai Related - ShanghaiTimestamp *big.Int - NextWithdrawals types.Withdrawals + // Fork configuration + *globals.ForkConfig + Genesis *core.Genesis + + NextWithdrawals types.Withdrawals // Global context which all procedures shall stop TestContext context.Context TimeoutContext context.Context } -func isShanghai(blockTimestamp uint64, shanghaiTimestamp *big.Int) bool { - return shanghaiTimestamp != nil && big.NewInt(int64(blockTimestamp)).Cmp(shanghaiTimestamp) >= 0 -} - -func NewCLMocker(t *hivesim.T, slotsToSafe, slotsToFinalized, safeSlotsToImportOptimistically *big.Int, shanghaiTime *big.Int) *CLMocker { +func NewCLMocker(t *hivesim.T, genesis *core.Genesis, slotsToSafe, slotsToFinalized, safeSlotsToImportOptimistically *big.Int, forkConfig globals.ForkConfig) *CLMocker { // Init random seed for different purposes seed := time.Now().Unix() t.Logf("Randomness seed: %v\n", seed) @@ -145,13 +154,26 @@ func NewCLMocker(t *hivesim.T, slotsToSafe, slotsToFinalized, safeSlotsToImportO SafeBlockHash: common.Hash{}, FinalizedBlockHash: common.Hash{}, }, - ShanghaiTimestamp: shanghaiTime, - TestContext: context.Background(), + ChainTotalDifficulty: genesis.Difficulty, + ForkConfig: &forkConfig, + Genesis: genesis, + TestContext: context.Background(), } + // Create header history + newCLMocker.HeaderHistory = make(map[uint64]*types.Header) + + // Add genesis to the header history + newCLMocker.HeaderHistory[0] = genesis.ToBlock().Header() + return newCLMocker } +// Return genesis block of the canonical chain +func (cl *CLMocker) GenesisBlock() *types.Block { + return cl.Genesis.ToBlock() +} + // Add a Client to be kept in sync with the latest payloads func (cl *CLMocker) AddEngineClient(ec client.EngineClient) { cl.EngineClientsLock.Lock() @@ -197,6 +219,45 @@ func (cl *CLMocker) IsOptimisticallySyncing() bool { return diff.Cmp(cl.SafeSlotsToImportOptimistically) >= 0 } +func (cl *CLMocker) ForkID() forkid.ID { + return forkid.NewID(cl.Genesis.Config, cl.GenesisBlock().Hash(), cl.LatestHeader.Number.Uint64(), cl.Genesis.Timestamp) +} + +func (cl *CLMocker) GetHeaders(amount uint64, originHash common.Hash, originNumber uint64, reverse bool, skip uint64) ([]*types.Header, error) { + if amount < 1 { + return nil, errors.New("no block headers requested") + } + + headers := make([]*types.Header, amount) + var blockNumber uint64 + + // range over blocks to check if our chain has the requested header + for _, h := range cl.HeaderHistory { + if h.Hash() == originHash || h.Number.Uint64() == originNumber { + headers[0] = h + blockNumber = h.Number.Uint64() + } + } + if headers[0] == nil { + return nil, fmt.Errorf("no headers found for given origin number %v, hash %v", originNumber, originHash) + } + + if reverse { + for i := 1; i < int(amount); i++ { + blockNumber -= (1 - skip) + headers[i] = cl.HeaderHistory[blockNumber] + } + return headers, nil + } + + for i := 1; i < int(amount); i++ { + blockNumber += (1 + skip) + headers[i] = cl.HeaderHistory[blockNumber] + } + + return headers, nil +} + // Sets the specified client's chain head as Terminal PoW block by sending the initial forkchoiceUpdated. func (cl *CLMocker) SetTTDBlockClient(ec client.EngineClient) { var err error @@ -207,18 +268,20 @@ func (cl *CLMocker) SetTTDBlockClient(ec client.EngineClient) { if err != nil { cl.Fatalf("CLMocker: Unable to get latest header: %v", err) } + cl.HeaderHistory[cl.LatestHeader.Number.Uint64()] = cl.LatestHeader ctx, cancel = context.WithTimeout(cl.TestContext, globals.RPCTimeout) defer cancel() - if ttd, err := ec.GetTotalDifficulty(ctx); err != nil { + if td, err := ec.GetTotalDifficulty(ctx); err != nil { cl.Fatalf("CLMocker: Error getting total difficulty from engine client: %v", err) - } else if ttd.Cmp(ec.TerminalTotalDifficulty()) < 0 { - cl.Fatalf("CLMocker: Attempted to set TTD Block when TTD had not been reached: %d > %d", ec.TerminalTotalDifficulty(), ttd) + } else if td.Cmp(ec.TerminalTotalDifficulty()) < 0 { + cl.Fatalf("CLMocker: Attempted to set TTD Block when TTD had not been reached: %d > %d", ec.TerminalTotalDifficulty(), td) } else { - cl.Logf("CLMocker: TTD has been reached at block %d (%d>=%d)\n", cl.LatestHeader.Number, ttd, ec.TerminalTotalDifficulty()) + cl.Logf("CLMocker: TTD has been reached at block %d (%d>=%d)\n", cl.LatestHeader.Number, td, ec.TerminalTotalDifficulty()) jsH, _ := json.MarshalIndent(cl.LatestHeader, "", " ") cl.Logf("CLMocker: Client: %s, Block %d: %s\n", ec.ID(), cl.LatestHeader.Number, jsH) + cl.ChainTotalDifficulty = td } cl.TTDReached = true @@ -325,7 +388,7 @@ func (cl *CLMocker) RequestNextPayload() { Timestamp: cl.GetNextBlockTimestamp(), } - if isShanghai(cl.LatestPayloadAttributes.Timestamp, cl.ShanghaiTimestamp) && cl.NextWithdrawals != nil { + if cl.IsShanghai(cl.LatestPayloadAttributes.Timestamp) && cl.NextWithdrawals != nil { cl.LatestPayloadAttributes.Withdrawals = cl.NextWithdrawals } @@ -339,7 +402,7 @@ func (cl *CLMocker) RequestNextPayload() { fcUVersion int err error ) - if isShanghai(cl.LatestPayloadAttributes.Timestamp, cl.ShanghaiTimestamp) { + if cl.IsShanghai(cl.LatestPayloadAttributes.Timestamp) { fcUVersion = 2 resp, err = cl.NextBlockProducer.ForkchoiceUpdatedV2(ctx, &cl.LatestForkchoice, &cl.LatestPayloadAttributes) @@ -363,12 +426,15 @@ func (cl *CLMocker) GetNextPayload() { var err error ctx, cancel := context.WithTimeout(cl.TestContext, globals.RPCTimeout) defer cancel() - if isShanghai(cl.LatestPayloadAttributes.Timestamp, cl.ShanghaiTimestamp) { + if cl.IsCancun(cl.LatestPayloadAttributes.Timestamp) { + cl.LatestPayloadBuilt, cl.LatestBlockValue, cl.LatestBlobBundle, err = cl.NextBlockProducer.GetPayloadV3(ctx, cl.NextPayloadID) + } else if cl.IsShanghai(cl.LatestPayloadAttributes.Timestamp) { cl.LatestPayloadBuilt, cl.LatestBlockValue, err = cl.NextBlockProducer.GetPayloadV2(ctx, cl.NextPayloadID) - + cl.LatestBlobBundle = nil } else { cl.LatestPayloadBuilt, err = cl.NextBlockProducer.GetPayloadV1(ctx, cl.NextPayloadID) cl.LatestBlockValue = nil + cl.LatestBlobBundle = nil } if err != nil { cl.Fatalf("CLMocker: Could not getPayload (%v, %v): %v", cl.NextBlockProducer.ID(), cl.NextPayloadID, err) @@ -391,8 +457,19 @@ func (cl *CLMocker) GetNextPayload() { } func (cl *CLMocker) broadcastNextNewPayload() { + // Check if we have blobs to include in the broadcast + var versionedHashes *[]common.Hash + if cl.LatestBlobBundle != nil { + // Broadcast the blob bundle to all clients + var err error + versionedHashes, err = cl.LatestBlobBundle.VersionedHashes(BLOB_COMMITMENT_VERSION_KZG) + if err != nil { + cl.Fatalf("CLMocker: Could not get versioned hashes from blob bundle: %v", err) + } + } // Broadcast the executePayload to all clients - responses := cl.BroadcastNewPayload(&cl.LatestPayloadBuilt) + responses := cl.BroadcastNewPayload(&cl.LatestPayloadBuilt, versionedHashes) + validations := 0 for _, resp := range responses { if resp.Error != nil { cl.Logf("CLMocker: BroadcastNewPayload Error (%v): %v\n", resp.Container, resp.Error) @@ -407,6 +484,7 @@ func (cl *CLMocker) broadcastNextNewPayload() { if *resp.ExecutePayloadResponse.LatestValidHash != cl.LatestPayloadBuilt.BlockHash { cl.Fatalf("CLMocker: NewPayload returned VALID status with incorrect LatestValidHash==%v, expected %v", resp.ExecutePayloadResponse.LatestValidHash, cl.LatestPayloadBuilt.BlockHash) } + validations += 1 } else if resp.ExecutePayloadResponse.Status == api.ACCEPTED { // The client is not synced but the payload was accepted // https://github.com/ethereum/execution-apis/blob/main/src/engine/specification.md: @@ -422,6 +500,9 @@ func (cl *CLMocker) broadcastNextNewPayload() { } } } + if validations == 0 { + cl.Fatalf("CLMocker: No clients validated the payload") + } cl.LatestExecutedPayload = cl.LatestPayloadBuilt payload := cl.LatestPayloadBuilt cl.ExecutedPayloadHistory[cl.LatestPayloadBuilt.Number] = &payload @@ -429,7 +510,7 @@ func (cl *CLMocker) broadcastNextNewPayload() { func (cl *CLMocker) broadcastLatestForkchoice() { version := 1 - if isShanghai(cl.LatestExecutedPayload.Timestamp, cl.ShanghaiTimestamp) { + if cl.IsShanghai(cl.LatestExecutedPayload.Timestamp) { version = 2 } for _, resp := range cl.BroadcastForkchoiceUpdated(&cl.LatestForkchoice, nil, version) { @@ -583,7 +664,7 @@ func (cl *CLMocker) ProduceSingleBlock(callbacks BlockProcessCallbacks) { if cl.LatestHeader == nil { cl.Fatalf("CLMocker: None of the clients accepted the newly constructed payload") } - + cl.HeaderHistory[cl.LatestHeadNumber.Uint64()] = cl.LatestHeader } // Loop produce PoS blocks by using the Engine API @@ -600,7 +681,7 @@ type ExecutePayloadOutcome struct { Error error } -func (cl *CLMocker) BroadcastNewPayload(payload *api.ExecutableData) []ExecutePayloadOutcome { +func (cl *CLMocker) BroadcastNewPayload(payload *typ.ExecutableData, versionedHashes *[]common.Hash) []ExecutePayloadOutcome { responses := make([]ExecutePayloadOutcome, len(cl.EngineClients)) for i, ec := range cl.EngineClients { responses[i].Container = ec.ID() @@ -610,10 +691,12 @@ func (cl *CLMocker) BroadcastNewPayload(payload *api.ExecutableData) []ExecutePa execPayloadResp api.PayloadStatusV1 err error ) - if isShanghai(payload.Timestamp, cl.ShanghaiTimestamp) { + if cl.IsCancun(payload.Timestamp) { + execPayloadResp, err = ec.NewPayloadV3(ctx, payload, versionedHashes) + } else if cl.IsShanghai(payload.Timestamp) { execPayloadResp, err = ec.NewPayloadV2(ctx, payload) } else { - edv1 := &client_types.ExecutableDataV1{} + edv1 := &typ.ExecutableDataV1{} edv1.FromExecutableData(payload) execPayloadResp, err = ec.NewPayloadV1(ctx, edv1) } diff --git a/simulators/ethereum/engine/devp2p/conn.go b/simulators/ethereum/engine/devp2p/conn.go new file mode 100644 index 0000000000..0388c0cc02 --- /dev/null +++ b/simulators/ethereum/engine/devp2p/conn.go @@ -0,0 +1,478 @@ +// Copyright 2020 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package devp2p + +import ( + "crypto/ecdsa" + "errors" + "fmt" + "reflect" + "time" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/protocols/eth" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/rlpx" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" +) + +type Message interface { + Code() int + ReqID() uint64 +} + +type Error struct { + err error +} + +func (e *Error) Unwrap() error { return e.err } +func (e *Error) Error() string { return e.err.Error() } +func (e *Error) String() string { return e.Error() } + +func (e *Error) Code() int { return -1 } +func (e *Error) ReqID() uint64 { return 0 } + +func errorf(format string, args ...interface{}) *Error { + return &Error{fmt.Errorf(format, args...)} +} + +// Hello is the RLP structure of the protocol handshake. +type Hello struct { + Version uint64 + Name string + Caps []p2p.Cap + ListenPort uint64 + ID []byte // secp256k1 public key + + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` +} + +func (msg Hello) Code() int { return 0x00 } +func (msg Hello) ReqID() uint64 { return 0 } + +// Disconnect is the RLP structure for a disconnect message. +type Disconnect struct { + Reason p2p.DiscReason +} + +func (msg Disconnect) Code() int { return 0x01 } +func (msg Disconnect) ReqID() uint64 { return 0 } + +type Ping struct{} + +func (msg Ping) Code() int { return 0x02 } +func (msg Ping) ReqID() uint64 { return 0 } + +type Pong struct{} + +func (msg Pong) Code() int { return 0x03 } +func (msg Pong) ReqID() uint64 { return 0 } + +// Status is the network packet for the status message for eth/64 and later. +type Status eth.StatusPacket + +func (msg Status) Code() int { return 16 } +func (msg Status) ReqID() uint64 { return 0 } + +// NewBlockHashes is the network packet for the block announcements. +type NewBlockHashes eth.NewBlockHashesPacket + +func (msg NewBlockHashes) Code() int { return 17 } +func (msg NewBlockHashes) ReqID() uint64 { return 0 } + +type Transactions eth.TransactionsPacket + +func (msg Transactions) Code() int { return 18 } +func (msg Transactions) ReqID() uint64 { return 18 } + +// GetBlockHeaders represents a block header query. +type GetBlockHeaders eth.GetBlockHeadersPacket66 + +func (msg GetBlockHeaders) Code() int { return 19 } +func (msg GetBlockHeaders) ReqID() uint64 { return msg.RequestId } + +type BlockHeaders eth.BlockHeadersPacket66 + +func (msg BlockHeaders) Code() int { return 20 } +func (msg BlockHeaders) ReqID() uint64 { return msg.RequestId } + +// GetBlockBodies represents a GetBlockBodies request +type GetBlockBodies eth.GetBlockBodiesPacket66 + +func (msg GetBlockBodies) Code() int { return 21 } +func (msg GetBlockBodies) ReqID() uint64 { return msg.RequestId } + +// BlockBodies is the network packet for block content distribution. +type BlockBodies eth.BlockBodiesPacket66 + +func (msg BlockBodies) Code() int { return 22 } +func (msg BlockBodies) ReqID() uint64 { return msg.RequestId } + +// NewBlock is the network packet for the block propagation message. +type NewBlock eth.NewBlockPacket + +func (msg NewBlock) Code() int { return 23 } +func (msg NewBlock) ReqID() uint64 { return 0 } + +// NewPooledTransactionHashes66 is the network packet for the tx hash propagation message. +type NewPooledTransactionHashes66 eth.NewPooledTransactionHashesPacket66 + +func (msg NewPooledTransactionHashes66) Code() int { return 24 } +func (msg NewPooledTransactionHashes66) ReqID() uint64 { return 0 } + +// NewPooledTransactionHashes is the network packet for the tx hash propagation message. +type NewPooledTransactionHashes eth.NewPooledTransactionHashesPacket68 + +func (msg NewPooledTransactionHashes) Code() int { return 24 } +func (msg NewPooledTransactionHashes) ReqID() uint64 { return 0 } + +type GetPooledTransactions eth.GetPooledTransactionsPacket66 + +func (msg GetPooledTransactions) Code() int { return 25 } +func (msg GetPooledTransactions) ReqID() uint64 { return msg.RequestId } + +// PooledTransactionsPacket is the network packet for transaction distribution. +// We decode to bytes to be able to check the serialized version. +type PooledTransactionsBytesPacket [][]byte + +// PooledTransactionsPacket66 is the network packet for transaction distribution over eth/66. +type PooledTransactionsBytesPacket66 struct { + RequestId uint64 + PooledTransactionsBytesPacket +} + +type PooledTransactions PooledTransactionsBytesPacket66 + +func (msg PooledTransactions) Code() int { return 26 } +func (msg PooledTransactions) ReqID() uint64 { return msg.RequestId } + +// Conn represents an individual connection with a peer +type Conn struct { + *rlpx.Conn + consensusEngine *clmock.CLMocker + ourKey *ecdsa.PrivateKey + remoteKey *ecdsa.PublicKey + negotiatedProtoVersion uint + negotiatedSnapProtoVersion uint + ourHighestProtoVersion uint + ourHighestSnapProtoVersion uint + caps []p2p.Cap +} + +func (c *Conn) RemoteKey() *ecdsa.PublicKey { + return c.remoteKey +} + +// Read reads an eth66 packet from the connection. +func (c *Conn) Read() (Message, error) { + code, rawData, _, err := c.Conn.Read() + if err != nil { + return nil, errorf("could not read from connection: %v", err) + } + + var msg Message + switch int(code) { + case (Hello{}).Code(): + msg = new(Hello) + case (Ping{}).Code(): + msg = new(Ping) + case (Pong{}).Code(): + msg = new(Pong) + case (Disconnect{}).Code(): + msg = new(Disconnect) + case (Status{}).Code(): + msg = new(Status) + case (GetBlockHeaders{}).Code(): + ethMsg := new(eth.GetBlockHeadersPacket66) + if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { + return nil, errorf("could not rlp decode message: %v, %x", err, rawData) + } + return (*GetBlockHeaders)(ethMsg), nil + case (BlockHeaders{}).Code(): + ethMsg := new(eth.BlockHeadersPacket66) + if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { + return nil, errorf("could not rlp decode message: %v, %x", err, rawData) + } + return (*BlockHeaders)(ethMsg), nil + case (GetBlockBodies{}).Code(): + ethMsg := new(eth.GetBlockBodiesPacket66) + if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { + return nil, errorf("could not rlp decode message: %v, %x", err, rawData) + } + return (*GetBlockBodies)(ethMsg), nil + case (BlockBodies{}).Code(): + ethMsg := new(eth.BlockBodiesPacket66) + if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { + return nil, errorf("could not rlp decode message: %v, %x", err, rawData) + } + return (*BlockBodies)(ethMsg), nil + case (NewBlock{}).Code(): + msg = new(NewBlock) + case (NewBlockHashes{}).Code(): + msg = new(NewBlockHashes) + case (Transactions{}).Code(): + msg = new(Transactions) + case (NewPooledTransactionHashes66{}).Code(): + // Try decoding to eth68 + ethMsg := new(NewPooledTransactionHashes) + if err := rlp.DecodeBytes(rawData, ethMsg); err == nil { + return ethMsg, nil + } + msg = new(NewPooledTransactionHashes66) + case (GetPooledTransactions{}.Code()): + ethMsg := new(eth.GetPooledTransactionsPacket66) + if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { + return nil, errorf("could not rlp decode message: %v, %x", err, rawData) + } + return (*GetPooledTransactions)(ethMsg), nil + case (PooledTransactions{}.Code()): + ethMsg := new(PooledTransactionsBytesPacket66) + if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { + return nil, errorf("could not rlp decode message: %v, %x", err, rawData) + } + return (*PooledTransactions)(ethMsg), nil + default: + return nil, errorf("invalid message code: %d", code) + } + + if msg != nil { + if err := rlp.DecodeBytes(rawData, msg); err != nil { + return nil, errorf("could not rlp decode message: %v", err) + } + return msg, nil + } + return nil, errorf("invalid message: %s", string(rawData)) +} + +// Write writes a eth packet to the connection. +func (c *Conn) Write(msg Message) (uint32, error) { + payload, err := rlp.EncodeToBytes(msg) + if err != nil { + return 0, err + } + return c.Conn.Write(uint64(msg.Code()), payload) +} + +// peer performs both the protocol handshake and the status message +// exchange with the node in order to peer with it. +func (c *Conn) Peer(status *Status) error { + if err := c.handshake(); err != nil { + return fmt.Errorf("handshake failed: %v", err) + } + if _, err := c.statusExchange(status); err != nil { + return fmt.Errorf("status exchange failed: %v", err) + } + return nil +} + +// handshake performs a protocol handshake with the node. +func (c *Conn) handshake() error { + defer c.SetDeadline(time.Time{}) + c.SetDeadline(time.Now().Add(10 * time.Second)) + // write hello to client + pub0 := crypto.FromECDSAPub(&c.ourKey.PublicKey)[1:] + ourHandshake := &Hello{ + Version: 5, + Caps: c.caps, + ID: pub0, + } + if _, err := c.Write(ourHandshake); err != nil { + return fmt.Errorf("write to connection failed: %v", err) + } + // read hello from client + msg, err := c.Read() + if err != nil { + return err + } + switch msg := msg.(type) { + case *Hello: + // set snappy if version is at least 5 + if msg.Version >= 5 { + c.SetSnappy(true) + } + c.negotiateEthProtocol(msg.Caps) + if c.negotiatedProtoVersion == 0 { + return fmt.Errorf("could not negotiate eth protocol (remote caps: %v, local eth version: %v)", msg.Caps, c.ourHighestProtoVersion) + } + // If we require snap, verify that it was negotiated + if c.ourHighestSnapProtoVersion != c.negotiatedSnapProtoVersion { + return fmt.Errorf("could not negotiate snap protocol (remote caps: %v, local snap version: %v)", msg.Caps, c.ourHighestSnapProtoVersion) + } + return nil + default: + return fmt.Errorf("bad handshake: %#v", msg) + } +} + +// negotiateEthProtocol sets the Conn's eth protocol version to highest +// advertised capability from peer. +func (c *Conn) negotiateEthProtocol(caps []p2p.Cap) { + var highestEthVersion uint + var highestSnapVersion uint + for _, capability := range caps { + switch capability.Name { + case "eth": + if capability.Version > highestEthVersion && capability.Version <= c.ourHighestProtoVersion { + highestEthVersion = capability.Version + } + case "snap": + if capability.Version > highestSnapVersion && capability.Version <= c.ourHighestSnapProtoVersion { + highestSnapVersion = capability.Version + } + } + } + c.negotiatedProtoVersion = highestEthVersion + c.negotiatedSnapProtoVersion = highestSnapVersion +} + +// statusExchange performs a `Status` message exchange with the given node. +func (c *Conn) statusExchange(status *Status) (Message, error) { + defer c.SetDeadline(time.Time{}) + c.SetDeadline(time.Now().Add(20 * time.Second)) + + // read status message from client + var message Message +loop: + for { + msg, err := c.Read() + if err != nil { + return nil, err + } + switch msg := msg.(type) { + case *Status: + if have, want := msg.Head, c.consensusEngine.LatestHeader.Hash(); have != want { + return nil, fmt.Errorf("wrong head block in status, want: %#x (block %d) have %#x", + want, c.consensusEngine.LatestHeader.Number.Uint64(), have) + } + if have, want := msg.TD.Cmp(c.consensusEngine.ChainTotalDifficulty), 0; have != want { + return nil, fmt.Errorf("wrong TD in status: have %d want %d", have, want) + } + if have, want := msg.ForkID, c.consensusEngine.ForkID(); !reflect.DeepEqual(have, want) { + return nil, fmt.Errorf("wrong fork ID in status: have (hash=%#x, next=%d), want (hash=%#x, next=%d)", have.Hash, have.Next, want.Hash, want.Next) + } + if have, want := msg.ProtocolVersion, c.ourHighestProtoVersion; have != uint32(want) { + return nil, fmt.Errorf("wrong protocol version: have %d, want %d", have, want) + } + message = msg + break loop + case *Disconnect: + return nil, fmt.Errorf("disconnect received: %v", msg.Reason) + case *Ping: + c.Write(&Pong{}) // TODO (renaynay): in the future, this should be an error + // (PINGs should not be a response upon fresh connection) + default: + return nil, fmt.Errorf("bad status message: %s", pretty.Sdump(msg)) + } + } + // make sure eth protocol version is set for negotiation + if c.negotiatedProtoVersion == 0 { + return nil, errors.New("eth protocol version must be set in Conn") + } + if status == nil { + // default status message + status = &Status{ + ProtocolVersion: uint32(c.negotiatedProtoVersion), + NetworkID: c.consensusEngine.Genesis.Config.ChainID.Uint64(), + TD: c.consensusEngine.ChainTotalDifficulty, + Head: c.consensusEngine.LatestHeader.Hash(), + Genesis: c.consensusEngine.GenesisBlock().Hash(), + ForkID: c.consensusEngine.ForkID(), + } + } + if _, err := c.Write(status); err != nil { + return nil, fmt.Errorf("write to connection failed: %v", err) + } + return message, nil +} + +// readAndServe serves GetBlockHeaders requests while waiting +// on another message from the node. +func (c *Conn) readAndServe(timeout time.Duration) (Message, error) { + start := time.Now() + for time.Since(start) < timeout { + c.SetReadDeadline(time.Now().Add(10 * time.Second)) + + msg, err := c.Read() + if err != nil { + return nil, err + } + switch msg := msg.(type) { + case *Ping: + c.Write(&Pong{}) + case *GetBlockHeaders: + headers, err := c.consensusEngine.GetHeaders(msg.Amount, msg.Origin.Hash, msg.Origin.Number, msg.Reverse, msg.Skip) + if err != nil { + return nil, errorf("could not get headers for inbound header request: %v", err) + } + resp := &BlockHeaders{ + RequestId: msg.ReqID(), + BlockHeadersPacket: eth.BlockHeadersPacket(headers), + } + if _, err := c.Write(resp); err != nil { + return nil, errorf("could not write to connection: %v", err) + } + default: + return msg, nil + } + } + return nil, errorf("no message received within %v", timeout) +} + +// headersRequest executes the given `GetBlockHeaders` request. +func (c *Conn) headersRequest(request *GetBlockHeaders, reqID uint64) ([]*types.Header, error) { + defer c.SetReadDeadline(time.Time{}) + c.SetReadDeadline(time.Now().Add(20 * time.Second)) + + // write request + request.RequestId = reqID + if _, err := c.Write(request); err != nil { + return nil, fmt.Errorf("could not write to connection: %v", err) + } + + // wait for response + msg, err := c.WaitForResponse(timeout, request.RequestId) + if err != nil { + return nil, err + } + resp, ok := msg.(*BlockHeaders) + if !ok { + return nil, fmt.Errorf("unexpected message received: %s", pretty.Sdump(msg)) + } + headers := []*types.Header(resp.BlockHeadersPacket) + return headers, nil +} + +// WaitForResponse reads from the connection until a response with the expected +// request ID is received. +func (c *Conn) WaitForResponse(timeout time.Duration, requestID uint64) (Message, error) { + start := time.Now() + for { + msg, err := c.readAndServe(timeout) + if err != nil { + return nil, err + } + if msg.ReqID() == requestID { + return msg, nil + } + if time.Since(start) > timeout { + return nil, errorf("message id %d not received within %v", requestID, timeout) + } + } +} diff --git a/simulators/ethereum/engine/devp2p/devp2p.go b/simulators/ethereum/engine/devp2p/devp2p.go new file mode 100644 index 0000000000..c4205347c4 --- /dev/null +++ b/simulators/ethereum/engine/devp2p/devp2p.go @@ -0,0 +1,130 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package devp2p + +import ( + "fmt" + "net" + "time" + + "github.com/davecgh/go-spew/spew" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/rlpx" + "github.com/ethereum/hive/simulators/ethereum/engine/client" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" +) + +var ( + pretty = spew.ConfigState{ + Indent: " ", + DisableCapacities: true, + DisablePointerAddresses: true, + SortKeys: true, + } + timeout = 20 * time.Second +) + +type P2PDest struct { + *enode.Node + ConsensusEngine *clmock.CLMocker +} + +func PeerEngineClient(engine client.EngineClient, consensusEngine *clmock.CLMocker) (*Conn, error) { + enodeURL, err := engine.EnodeURL() + if err != nil { + return nil, fmt.Errorf("error getting enode: %v", err) + } + clientEnode, err := enode.ParseV4(enodeURL) + if err != nil { + return nil, fmt.Errorf("error parsing enode: %v", err) + } + p2pDest := P2PDest{ + Node: clientEnode, + ConsensusEngine: consensusEngine, + } + conn, err := p2pDest.Dial() + if err != nil { + return nil, fmt.Errorf("error dialing enode: %v", err) + } + + if err = conn.Peer(nil); err != nil { + return nil, err + } + return conn, nil +} + +// dial attempts to dial the given node and perform a handshake, +// returning the created Conn if successful. +func (d *P2PDest) Dial() (*Conn, error) { + // dial + var err error + fd, err := net.Dial("tcp", fmt.Sprintf("%v:%d", d.IP(), d.TCP())) + if err != nil { + return nil, err + } + conn := Conn{ + Conn: rlpx.NewConn(fd, d.Pubkey()), + consensusEngine: d.ConsensusEngine, + } + // do encHandshake + conn.ourKey, err = crypto.GenerateKey() + if err != nil { + return nil, err + } + pubKey, err := conn.Handshake(conn.ourKey) + if err != nil { + conn.Close() + return nil, err + } + conn.remoteKey = pubKey + // set default p2p capabilities + conn.caps = []p2p.Cap{ + {Name: "eth", Version: 66}, + {Name: "eth", Version: 67}, + {Name: "eth", Version: 68}, + } + conn.ourHighestProtoVersion = 68 + return &conn, nil +} + +// dialSnap creates a connection with snap/1 capability. +func (d *P2PDest) DialSnap() (*Conn, error) { + conn, err := d.Dial() + if err != nil { + return nil, fmt.Errorf("dial failed: %v", err) + } + conn.caps = append(conn.caps, p2p.Cap{Name: "snap", Version: 1}) + conn.ourHighestSnapProtoVersion = 1 + return conn, nil +} + +// createSendAndRecvConns creates two connections, one for sending messages to the +// node, and one for receiving messages from the node. +func (d *P2PDest) CreateSendAndRecvConns() (*Conn, *Conn, error) { + sendConn, err := d.Dial() + if err != nil { + return nil, nil, fmt.Errorf("dial failed: %v", err) + } + recvConn, err := d.Dial() + if err != nil { + sendConn.Close() + return nil, nil, fmt.Errorf("dial failed: %v", err) + } + return sendConn, recvConn, nil +} diff --git a/simulators/ethereum/engine/globals/globals.go b/simulators/ethereum/engine/globals/globals.go index 6f205b567f..c0e762c0d4 100644 --- a/simulators/ethereum/engine/globals/globals.go +++ b/simulators/ethereum/engine/globals/globals.go @@ -1,15 +1,43 @@ package globals import ( + "crypto/ecdsa" "math/big" "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/hive/hivesim" ) +type TestAccount struct { + KeyHex string + Address *common.Address + Key *ecdsa.PrivateKey +} + +func (a *TestAccount) GetKey() *ecdsa.PrivateKey { + if a.Key == nil { + key, err := crypto.HexToECDSA(a.KeyHex) + if err != nil { + panic(err) + } + a.Key = key + } + return a.Key +} + +func (a *TestAccount) GetAddress() common.Address { + if a.Address == nil { + key := a.GetKey() + addr := crypto.PubkeyToAddress(key.PublicKey) + a.Address = &addr + } + return *a.Address +} + var ( // Test chain parameters @@ -34,6 +62,40 @@ var ( VaultAccountAddress = common.HexToAddress("0xcf49fda3be353c69b41ed96333cd24302da4556f") VaultKey, _ = crypto.HexToECDSA("63b508a03c3b5937ceb903af8b1b0c191012ef6eb7e9c3fb7afa94e5d214d376") + // Accounts used for testing, including the vault account + TestAccounts = []*TestAccount{ + { + KeyHex: "63b508a03c3b5937ceb903af8b1b0c191012ef6eb7e9c3fb7afa94e5d214d376", + }, + { + KeyHex: "073786d6a43474fda30a10eb7b5c3a47a81dd1e2bf72cfb7f66d868ff4f9827c", + }, + { + KeyHex: "c99aa79d5b71da1ddbb020d9ca8c98fffb83b8317f4e06d9960e1ed102eaae73", + }, + { + KeyHex: "fcb29daf153be371a3cbaaf58ecd0c675b0ae83ca3ea61c33f71be795b007df1", + }, + { + KeyHex: "eac70caf07cca9ad271c9d80523b7e320013bd1d6bc941ef2b6eb51979323e62", + }, + { + KeyHex: "06ce09a48d7034b06b1c290ff88f26351d3d21001e82df46aaae9d2f6338b50d", + }, + { + KeyHex: "03f9ae8a83bbcbbbdc979ea4f22b040d82c5a32785488df63ec3066c8d89078a", + }, + { + KeyHex: "39731ae349b81dd5e7ad9f1e97e63883f4e469e46c5ce6aa6a1b6229a68a2c23", + }, + { + KeyHex: "f298d89779b49d5431162a40492b641f9c09d319fb0bdeffd94ad4b8919d9ccf", + }, + { + KeyHex: "c2a53ab2068f63f2fad05fa6b3b23ae997ceb68a4b7acac17c2354aeffb624a8", + }, + } + // Global test case timeout DefaultTestCaseTimeout = time.Second * 60 @@ -69,3 +131,29 @@ var ( "HIVE_MERGE_BLOCK_ID": "100", } ) + +// Global types +type ForkConfig struct { + ShanghaiTimestamp *big.Int + CancunTimestamp *big.Int +} + +func (f *ForkConfig) ConfigGenesis(genesis *core.Genesis) error { + if f.ShanghaiTimestamp != nil { + shanghaiTime := f.ShanghaiTimestamp.Uint64() + genesis.Config.ShanghaiTime = &shanghaiTime + } + if f.CancunTimestamp != nil { + cancunTime := f.CancunTimestamp.Uint64() + genesis.Config.CancunTime = &cancunTime + } + return nil +} + +func (f *ForkConfig) IsShanghai(blockTimestamp uint64) bool { + return f.ShanghaiTimestamp != nil && new(big.Int).SetUint64(blockTimestamp).Cmp(f.ShanghaiTimestamp) >= 0 +} + +func (f *ForkConfig) IsCancun(blockTimestamp uint64) bool { + return f.CancunTimestamp != nil && new(big.Int).SetUint64(blockTimestamp).Cmp(f.CancunTimestamp) >= 0 +} diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index f55958a4f0..4f18399ab9 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -3,9 +3,12 @@ module github.com/ethereum/hive/simulators/ethereum/engine go 1.20 require ( - github.com/ethereum/go-ethereum v1.12.1-0.20230718074416-e86ad5264046 + github.com/crate-crypto/go-kzg-4844 v0.3.0 + github.com/davecgh/go-spew v1.1.1 + github.com/ethereum/go-ethereum v1.12.1-0.20230728070838-8f2ae29b8f77 github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e github.com/golang-jwt/jwt/v4 v4.4.3 + github.com/holiman/uint256 v1.2.3 github.com/pkg/errors v0.9.1 golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc ) @@ -26,8 +29,6 @@ require ( github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.11.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect @@ -46,8 +47,8 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/graph-gophers/graphql-go v1.4.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect + github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c // indirect github.com/huin/goupnp v1.0.3 // indirect github.com/influxdata/influxdb-client-go/v2 v2.12.1 // indirect github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect @@ -80,7 +81,7 @@ require ( github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect - github.com/urfave/cli/v2 v2.23.7 // indirect + github.com/urfave/cli/v2 v2.24.1 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.9.0 // indirect diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index 0d7c6bab08..d5933e220c 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -84,8 +84,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.3.0 h1:3Y3hD6l5i0dEYsBL50C+Om644kve3pNqoAcvE26o9zI= github.com/ethereum/c-kzg-4844 v0.3.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= -github.com/ethereum/go-ethereum v1.12.1-0.20230718074416-e86ad5264046 h1:LO7IDV5FgQ7+O9mjOoWwf8BYC2HpOjd3iRTuAeEQU+I= -github.com/ethereum/go-ethereum v1.12.1-0.20230718074416-e86ad5264046/go.mod h1:WII7EML+9n033+WEChHAzFzZOVFB+md+oaonHFG8XQQ= +github.com/ethereum/go-ethereum v1.12.1-0.20230728070838-8f2ae29b8f77 h1:b3uiqqHx+e6Mnfb4cJMsAzS7FmJWpxs+PixCg//t2CY= +github.com/ethereum/go-ethereum v1.12.1-0.20230728070838-8f2ae29b8f77/go.mod h1:zKetLweqBR8ZS+1O9iJWI8DvmmD2NzD19apjEWDCsnw= github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= @@ -177,10 +177,12 @@ github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubC github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8= -github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= @@ -363,8 +365,8 @@ github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGr github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli/v2 v2.23.7 h1:YHDQ46s3VghFHFf1DdF+Sh7H4RqhcM+t0TmZRJx4oJY= -github.com/urfave/cli/v2 v2.23.7/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/urfave/cli/v2 v2.24.1 h1:/QYYr7g0EhwXEML8jO+8OYt5trPnLHS0p3mrgExJ5NU= +github.com/urfave/cli/v2 v2.24.1/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= diff --git a/simulators/ethereum/engine/helper/blobs.go b/simulators/ethereum/engine/helper/blobs.go new file mode 100644 index 0000000000..c2d8f13aa0 --- /dev/null +++ b/simulators/ethereum/engine/helper/blobs.go @@ -0,0 +1,324 @@ +package helper + +import ( + "bytes" + "crypto/ecdsa" + "crypto/sha256" + "encoding/binary" + "fmt" + "math/big" + "sync" + + "github.com/holiman/uint256" + "github.com/pkg/errors" + + gokzg4844 "github.com/crate-crypto/go-kzg-4844" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" +) + +var gCryptoCtx gokzg4844.Context +var initCryptoCtx sync.Once + +// InitializeCryptoCtx initializes the global context object returned via CryptoCtx +func InitializeCryptoCtx() { + initCryptoCtx.Do(func() { + // Initialize context to match the configurations that the + // specs are using. + ctx, err := gokzg4844.NewContext4096Insecure1337() + if err != nil { + panic(fmt.Sprintf("could not create context, err : %v", err)) + } + gCryptoCtx = *ctx + // Initialize the precompile return value + }) +} + +// CryptoCtx returns a context object stores all of the necessary configurations +// to allow one to create and verify blob proofs. +// This function is expensive to run if the crypto context isn't initialized, so it is recommended to +// pre-initialize by calling InitializeCryptoCtx +func CryptoCtx() gokzg4844.Context { + InitializeCryptoCtx() + return gCryptoCtx +} + +type BlobID uint64 + +type BlobIDs []BlobID + +func GetBlobList(startId BlobID, count uint64) BlobIDs { + blobList := make(BlobIDs, count) + for i := uint64(0); i < count; i++ { + blobList[i] = startId + BlobID(i) + } + return blobList +} + +func GetBlobListByIndex(startIndex BlobID, endIndex BlobID) BlobIDs { + count := uint64(0) + if endIndex > startIndex { + count = uint64(endIndex - startIndex + 1) + } else { + count = uint64(startIndex - endIndex + 1) + } + blobList := make(BlobIDs, count) + if endIndex > startIndex { + for i := uint64(0); i < count; i++ { + blobList[i] = startIndex + BlobID(i) + } + } else { + for i := uint64(0); i < count; i++ { + blobList[i] = endIndex - BlobID(i) + } + } + + return blobList +} + +// Blob transaction creator +type BlobTransactionCreator struct { + To *common.Address + GasLimit uint64 + GasFee *big.Int + GasTip *big.Int + BlobGasFee *big.Int + BlobID BlobID + BlobCount uint64 + Value *big.Int + Data []byte + PrivateKey *ecdsa.PrivateKey +} + +func (blobId BlobID) VerifyBlob(blob *typ.Blob) (bool, error) { + if blob == nil { + return false, errors.New("nil blob") + } + if blobId == 0 { + // Blob zero is empty blob + emptyFieldElem := [32]byte{} + for chunkIdx := 0; chunkIdx < typ.FieldElementsPerBlob; chunkIdx++ { + if !bytes.Equal(blob[chunkIdx*32:(chunkIdx+1)*32], emptyFieldElem[:]) { + return false, nil + } + } + return true, nil + } + + // Check the blob against the deterministic data + blobIdBytes := make([]byte, 8) + binary.BigEndian.PutUint64(blobIdBytes, uint64(blobId)) + + // First 32 bytes are the hash of the blob ID + currentHashed := sha256.Sum256(blobIdBytes) + + for chunkIdx := 0; chunkIdx < typ.FieldElementsPerBlob; chunkIdx++ { + var expectedFieldElem [32]byte + copy(expectedFieldElem[:], currentHashed[:]) + + // Check that no 32 bytes chunks are greater than the BLS modulus + for i := 0; i < 32; i++ { + // blobByteIdx := 32 - i - 1 + blobByteIdx := i + if expectedFieldElem[blobByteIdx] < gokzg4844.BlsModulus[i] { + // done with this field element + break + } else if expectedFieldElem[blobByteIdx] >= gokzg4844.BlsModulus[i] { + if gokzg4844.BlsModulus[i] > 0 { + // This chunk is greater than the modulus, and we can reduce it in this byte position + expectedFieldElem[blobByteIdx] = gokzg4844.BlsModulus[i] - 1 + // done with this field element + break + } else { + // This chunk is greater than the modulus, but we can't reduce it in this byte position, so we will try in the next byte position + expectedFieldElem[blobByteIdx] = gokzg4844.BlsModulus[i] + } + } + } + + if !bytes.Equal(blob[chunkIdx*32:(chunkIdx+1)*32], expectedFieldElem[:]) { + return false, nil + } + + // Hash the current hash + currentHashed = sha256.Sum256(currentHashed[:]) + } + return true, nil +} + +func (blobId BlobID) FillBlob(blob *typ.Blob) error { + if blob == nil { + return errors.New("nil blob") + } + if blobId == 0 { + // Blob zero is empty blob, so leave as is + return nil + } + // Fill the blob with deterministic data + blobIdBytes := make([]byte, 8) + binary.BigEndian.PutUint64(blobIdBytes, uint64(blobId)) + + // First 32 bytes are the hash of the blob ID + currentHashed := sha256.Sum256(blobIdBytes) + + for chunkIdx := 0; chunkIdx < typ.FieldElementsPerBlob; chunkIdx++ { + copy(blob[chunkIdx*32:(chunkIdx+1)*32], currentHashed[:]) + + // Check that no 32 bytes chunks are greater than the BLS modulus + for i := 0; i < 32; i++ { + //blobByteIdx := ((chunkIdx + 1) * 32) - i - 1 + blobByteIdx := (chunkIdx * 32) + i + if blob[blobByteIdx] < gokzg4844.BlsModulus[i] { + // go to next chunk + break + } else if blob[blobByteIdx] >= gokzg4844.BlsModulus[i] { + if gokzg4844.BlsModulus[i] > 0 { + // This chunk is greater than the modulus, and we can reduce it in this byte position + blob[blobByteIdx] = gokzg4844.BlsModulus[i] - 1 + // go to next chunk + break + } else { + // This chunk is greater than the modulus, but we can't reduce it in this byte position, so we will try in the next byte position + blob[blobByteIdx] = gokzg4844.BlsModulus[i] + } + } + } + + // Hash the current hash + currentHashed = sha256.Sum256(currentHashed[:]) + } + + return nil +} + +func (blobId BlobID) GenerateBlob() (*typ.Blob, *typ.KZGCommitment, error) { + blob := typ.Blob{} + if err := blobId.FillBlob(&blob); err != nil { + return nil, nil, errors.Wrap(err, "GenerateBlob (1)") + } + ctx_4844 := CryptoCtx() + + kzgCommitment, err := ctx_4844.BlobToKZGCommitment(gokzg4844.Blob(blob), 0) + if err != nil { + return nil, nil, errors.Wrap(err, "GenerateBlob (2)") + } + + typesKzgCommitment := typ.KZGCommitment(kzgCommitment) + + return &blob, &typesKzgCommitment, nil +} + +func (blobId BlobID) GetVersionedHash(commitmentVersion byte) (common.Hash, error) { + _, kzgCommitment, err := blobId.GenerateBlob() + if err != nil { + return common.Hash{}, errors.Wrap(err, "GetVersionedHash") + } + if kzgCommitment == nil { + return common.Hash{}, errors.New("nil kzgCommitment") + } + sha256Hash := sha256.Sum256((*kzgCommitment)[:]) + versionedHash := common.BytesToHash(append([]byte{commitmentVersion}, sha256Hash[1:]...)) + return versionedHash, nil +} + +func BlobDataGenerator(startBlobId BlobID, blobCount uint64) ([]common.Hash, *typ.BlobTxWrapData, error) { + blobData := typ.BlobTxWrapData{ + Blobs: make(typ.Blobs, blobCount), + Commitments: make([]typ.KZGCommitment, blobCount), + } + for i := uint64(0); i < blobCount; i++ { + if blob, kzgCommitment, err := (startBlobId + BlobID(i)).GenerateBlob(); err != nil { + return nil, nil, err + } else { + blobData.Blobs[i] = *blob + blobData.Commitments[i] = *kzgCommitment + } + } + + var hashes []common.Hash + for i := 0; i < len(blobData.Commitments); i++ { + hashes = append(hashes, blobData.Commitments[i].ComputeVersionedHash()) + } + _, _, proofs, err := blobData.Blobs.ComputeCommitmentsAndProofs(CryptoCtx()) + if err != nil { + return nil, nil, err + } + blobData.Proofs = proofs + return hashes, &blobData, nil +} + +func (tc *BlobTransactionCreator) GetSourceAddress() common.Address { + if tc.PrivateKey == nil { + return globals.VaultAccountAddress + } + return crypto.PubkeyToAddress(tc.PrivateKey.PublicKey) +} + +func (tc *BlobTransactionCreator) MakeTransaction(nonce uint64) (typ.Transaction, error) { + // Need tx wrap data that will pass blob verification + hashes, blobData, err := BlobDataGenerator(tc.BlobID, tc.BlobCount) + if err != nil { + return nil, err + } + + if tc.To == nil { + return nil, errors.New("nil to address") + } + + // Collect fields for transaction + var ( + address = *tc.To + chainID = uint256.MustFromBig(globals.ChainID) + gasFeeCap *uint256.Int + gasTipCap *uint256.Int + value *uint256.Int + blobGasFee *uint256.Int + ) + if tc.GasFee != nil { + gasFeeCap = uint256.MustFromBig(tc.GasFee) + } else { + gasFeeCap = uint256.MustFromBig(globals.GasPrice) + } + if tc.GasTip != nil { + gasTipCap = uint256.MustFromBig(tc.GasTip) + } else { + gasTipCap = uint256.MustFromBig(globals.GasTipPrice) + } + if tc.Value != nil { + value = uint256.MustFromBig(tc.Value) + } + if tc.BlobGasFee != nil { + blobGasFee = uint256.MustFromBig(tc.BlobGasFee) + } + + sbtx := &types.BlobTx{ + ChainID: chainID, + Nonce: nonce, + GasTipCap: gasTipCap, + GasFeeCap: gasFeeCap, + Gas: tc.GasLimit, + To: address, + Value: value, + Data: tc.Data, + AccessList: nil, + BlobFeeCap: blobGasFee, + BlobHashes: hashes, + } + + key := tc.PrivateKey + if key == nil { + key = globals.VaultKey + } + + signedTx, err := types.SignNewTx(key, types.NewCancunSigner(globals.ChainID), sbtx) + if err != nil { + return nil, err + } + return &typ.TransactionWithBlobData{ + Tx: signedTx, + BlobData: blobData, + }, nil +} diff --git a/simulators/ethereum/engine/helper/helper.go b/simulators/ethereum/engine/helper/helper.go index 9abee4189c..53775e4b01 100644 --- a/simulators/ethereum/engine/helper/helper.go +++ b/simulators/ethereum/engine/helper/helper.go @@ -2,15 +2,11 @@ package helper import ( "context" - "crypto/ecdsa" - "strings" "sync" "time" "bytes" - "encoding/binary" "encoding/json" - "errors" "fmt" "io" "io/ioutil" @@ -18,18 +14,23 @@ import ( "net/http" "os" - api "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/pkg/errors" + "github.com/ethereum/hive/simulators/ethereum/engine/client" "github.com/ethereum/hive/simulators/ethereum/engine/globals" + gokzg4844 "github.com/crate-crypto/go-kzg-4844" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/hive/hivesim" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) +var kzg4844Context *gokzg4844.Context + // From ethereum/rpc: // LoggingRoundTrip writes requests and responses to the test log. @@ -95,7 +96,7 @@ const ( InvalidTransactionChainID = "Transaction ChainID" ) -func TransactionInPayload(payload *api.ExecutableData, tx *types.Transaction) bool { +func TransactionInPayload(payload *typ.ExecutableData, tx typ.Transaction) bool { for _, bytesTx := range payload.Transactions { var currentTx types.Transaction if err := currentTx.UnmarshalBinary(bytesTx); err == nil { @@ -108,7 +109,7 @@ func TransactionInPayload(payload *api.ExecutableData, tx *types.Transaction) bo } // Use client specific rpc methods to debug a transaction that includes the PREVRANDAO opcode -func DebugPrevRandaoTransaction(ctx context.Context, c *rpc.Client, clientType string, tx *types.Transaction, expectedPrevRandao *common.Hash) error { +func DebugPrevRandaoTransaction(ctx context.Context, c *rpc.Client, clientType string, tx typ.Transaction, expectedPrevRandao *common.Hash) error { switch clientType { case "go-ethereum": return gethDebugPrevRandaoTransaction(ctx, c, tx, expectedPrevRandao) @@ -119,7 +120,7 @@ func DebugPrevRandaoTransaction(ctx context.Context, c *rpc.Client, clientType s return nil } -func gethDebugPrevRandaoTransaction(ctx context.Context, c *rpc.Client, tx *types.Transaction, expectedPrevRandao *common.Hash) error { +func gethDebugPrevRandaoTransaction(ctx context.Context, c *rpc.Client, tx typ.Transaction, expectedPrevRandao *common.Hash) error { type StructLogRes struct { Pc uint64 `json:"pc"` Op string `json:"op"` @@ -169,7 +170,7 @@ func gethDebugPrevRandaoTransaction(ctx context.Context, c *rpc.Client, tx *type return nil } -func nethermindDebugPrevRandaoTransaction(ctx context.Context, c *rpc.Client, tx *types.Transaction, expectedPrevRandao *common.Hash) error { +func nethermindDebugPrevRandaoTransaction(ctx context.Context, c *rpc.Client, tx typ.Transaction, expectedPrevRandao *common.Hash) error { var er *interface{} if err := c.CallContext(ctx, &er, "trace_transaction", tx.Hash()); err != nil { return err @@ -329,205 +330,3 @@ func WaitAnyClientForTTD(ecs []client.EngineClient, testCtx context.Context) (cl return nil, testCtx.Err() } } - -type TestTransactionType int - -const ( - UnspecifiedTransactionType TestTransactionType = iota - LegacyTxOnly - DynamicFeeTxOnly -) - -type TransactionCreator interface { - MakeTransaction(nonce uint64) (*types.Transaction, error) -} - -type BaseTransactionCreator struct { - Recipient *common.Address - GasLimit uint64 - Amount *big.Int - Payload []byte - TxType TestTransactionType - PrivateKey *ecdsa.PrivateKey -} - -func (tc *BaseTransactionCreator) MakeTransaction(nonce uint64) (*types.Transaction, error) { - var newTxData types.TxData - - var txTypeToUse int - switch tc.TxType { - case UnspecifiedTransactionType: - // Test case has no specific type of transaction to use. - // Select the type of tx based on the nonce. - switch nonce % 2 { - case 0: - txTypeToUse = types.LegacyTxType - case 1: - txTypeToUse = types.DynamicFeeTxType - } - case LegacyTxOnly: - txTypeToUse = types.LegacyTxType - case DynamicFeeTxOnly: - txTypeToUse = types.DynamicFeeTxType - } - - // Build the transaction depending on the specified type - switch txTypeToUse { - case types.LegacyTxType: - newTxData = &types.LegacyTx{ - Nonce: nonce, - To: tc.Recipient, - Value: tc.Amount, - Gas: tc.GasLimit, - GasPrice: globals.GasPrice, - Data: tc.Payload, - } - case types.DynamicFeeTxType: - gasFeeCap := new(big.Int).Set(globals.GasPrice) - gasTipCap := new(big.Int).Set(globals.GasTipPrice) - newTxData = &types.DynamicFeeTx{ - Nonce: nonce, - Gas: tc.GasLimit, - GasTipCap: gasTipCap, - GasFeeCap: gasFeeCap, - To: tc.Recipient, - Value: tc.Amount, - Data: tc.Payload, - } - } - - tx := types.NewTx(newTxData) - key := tc.PrivateKey - if key == nil { - key = globals.VaultKey - } - signedTx, err := types.SignTx(tx, types.NewLondonSigner(globals.ChainID), key) - if err != nil { - return nil, err - } - return signedTx, nil -} - -// Create a contract filled with zeros without going over the specified GasLimit -type BigContractTransactionCreator struct { - BaseTransactionCreator -} - -func (tc *BigContractTransactionCreator) MakeTransaction(nonce uint64) (*types.Transaction, error) { - // Total GAS: Gtransaction == 21000, Gcreate == 32000, Gcodedeposit == 200 - contractLength := uint64(0) - if tc.GasLimit > (21000 + 32000) { - contractLength = (tc.GasLimit - 21000 - 32000) / 200 - if contractLength >= 1 { - // Reduce by 1 to guarantee using less gas than requested - contractLength -= 1 - } - } - buf := make([]byte, 8) - binary.BigEndian.PutUint64(buf, contractLength) - - tc.Payload = []byte{ - 0x67, // PUSH8 - } - tc.Payload = append(tc.Payload, buf...) // Size of the contract in byte length - tc.Payload = append(tc.Payload, 0x38) // CODESIZE == 0x00 - tc.Payload = append(tc.Payload, 0xF3) // RETURN(offset, length) - if tc.Recipient != nil { - panic("invalid configuration for big contract tx creator") - } - return tc.BaseTransactionCreator.MakeTransaction(nonce) -} - -// Create a tx with the specified initcode length (all zeros) -type BigInitcodeTransactionCreator struct { - BaseTransactionCreator - InitcodeLength int - PadByte uint8 - Initcode []byte -} - -func (tc *BigInitcodeTransactionCreator) MakeTransaction(nonce uint64) (*types.Transaction, error) { - // This method caches the payload with the crafted initcode after first execution. - if tc.Payload == nil { - // Prepare initcode payload - if tc.Initcode != nil { - if len(tc.Initcode) > tc.InitcodeLength { - panic(fmt.Errorf("invalid initcode (too big)")) - } - tc.Payload = tc.Initcode - } else { - tc.Payload = []byte{} - } - - for { - if len(tc.Payload) == tc.InitcodeLength { - break - } - tc.Payload = append(tc.Payload, tc.PadByte) - } - } - if tc.Recipient != nil { - panic("invalid configuration for big contract tx creator") - } - return tc.BaseTransactionCreator.MakeTransaction(nonce) -} - -// Determines if the error we got from sending the raw tx is because the client -// already knew the tx (might happen if we produced a re-org where the tx was -// unwind back into the txpool) -func SentTxAlreadyKnown(err error) bool { - return strings.Contains(err.Error(), "already known") || strings.Contains(err.Error(), "already in the TxPool") || - strings.Contains(err.Error(), "AlreadyKnown") -} - -func SendNextTransaction(testCtx context.Context, node client.EngineClient, txCreator TransactionCreator) (*types.Transaction, error) { - nonce, err := node.GetNextAccountNonce(testCtx, globals.VaultAccountAddress) - if err != nil { - return nil, err - } - tx, err := txCreator.MakeTransaction(nonce) - if err != nil { - return nil, err - } - for { - ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) - defer cancel() - err := node.SendTransaction(ctx, tx) - if err == nil { - return tx, nil - } else if SentTxAlreadyKnown(err) { - return tx, nil - } - select { - case <-time.After(time.Second): - case <-testCtx.Done(): - return nil, testCtx.Err() - } - } -} - -func SendNextTransactions(testCtx context.Context, node client.EngineClient, txCreator TransactionCreator, txCount uint64) ([]*types.Transaction, error) { - var err error - nonce, err := node.GetNextAccountNonce(testCtx, globals.VaultAccountAddress) - if err != nil { - return nil, err - } - txs := make([]*types.Transaction, txCount) - for i := range txs { - txs[i], err = txCreator.MakeTransaction(nonce) - if err != nil { - return nil, err - } - nonce++ - } - ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) - defer cancel() - errs := node.SendTransactions(ctx, txs) - for _, err := range errs { - if err != nil && !SentTxAlreadyKnown(err) { - return txs, err - } - } - node.UpdateNonce(testCtx, globals.VaultAccountAddress, nonce+txCount) - return txs, nil -} diff --git a/simulators/ethereum/engine/helper/payload.go b/simulators/ethereum/engine/helper/payload.go index ecdf1c62c9..0d6f5126de 100644 --- a/simulators/ethereum/engine/helper/payload.go +++ b/simulators/ethereum/engine/helper/payload.go @@ -8,34 +8,47 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - api "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/trie" "github.com/ethereum/hive/simulators/ethereum/engine/globals" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" + "github.com/pkg/errors" ) +type PayloadCustomizer interface { + CustomizePayload(basePayload *typ.ExecutableData) (*typ.ExecutableData, error) +} + type CustomPayloadData struct { - ParentHash *common.Hash - FeeRecipient *common.Address - StateRoot *common.Hash - ReceiptsRoot *common.Hash - LogsBloom *[]byte - PrevRandao *common.Hash - Number *uint64 - GasLimit *uint64 - GasUsed *uint64 - Timestamp *uint64 - ExtraData *[]byte - BaseFeePerGas *big.Int - BlockHash *common.Hash - Transactions *[][]byte - Withdrawals types.Withdrawals - RemoveWithdrawals bool + ParentHash *common.Hash + FeeRecipient *common.Address + StateRoot *common.Hash + ReceiptsRoot *common.Hash + LogsBloom *[]byte + PrevRandao *common.Hash + Number *uint64 + GasLimit *uint64 + GasUsed *uint64 + Timestamp *uint64 + ExtraData *[]byte + BaseFeePerGas *big.Int + BlockHash *common.Hash + Transactions *[][]byte + Withdrawals types.Withdrawals + RemoveWithdrawals bool + BlobGasUsed *uint64 + RemoveBlobGasUsed bool + ExcessBlobGas *uint64 + RemoveExcessBlobGas bool + ParentBeaconBlockRoot *common.Hash + RemoveParentBeaconBlockRoot bool } +var _ PayloadCustomizer = (*CustomPayloadData)(nil) + // Construct a customized payload by taking an existing payload as base and mixing it CustomPayloadData // BlockHash is calculated automatically. -func CustomizePayload(basePayload *api.ExecutableData, customData *CustomPayloadData) (*api.ExecutableData, error) { +func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.ExecutableData) (*typ.ExecutableData, error) { txs := basePayload.Transactions if customData.Transactions != nil { txs = *customData.Transactions @@ -110,9 +123,26 @@ func CustomizePayload(basePayload *api.ExecutableData, customData *CustomPayload h := types.DeriveSha(types.Withdrawals(basePayload.Withdrawals), trie.NewStackTrie(nil)) customPayloadHeader.WithdrawalsHash = &h } + if customData.RemoveBlobGasUsed { + customPayloadHeader.BlobGasUsed = nil + } else if customData.BlobGasUsed != nil { + customPayloadHeader.BlobGasUsed = customData.BlobGasUsed + } else if basePayload.BlobGasUsed != nil { + customPayloadHeader.BlobGasUsed = basePayload.BlobGasUsed + } + if customData.RemoveExcessBlobGas { + customPayloadHeader.ExcessBlobGas = nil + } else if customData.ExcessBlobGas != nil { + customPayloadHeader.ExcessBlobGas = customData.ExcessBlobGas + } else if basePayload.ExcessBlobGas != nil { + customPayloadHeader.ExcessBlobGas = basePayload.ExcessBlobGas + } + if customData.ParentBeaconBlockRoot != nil { + return nil, errors.New("ParentBeaconBlockRoot is not supported") + } // Return the new payload - result := &api.ExecutableData{ + result := &typ.ExecutableData{ ParentHash: customPayloadHeader.ParentHash, FeeRecipient: customPayloadHeader.Coinbase, StateRoot: customPayloadHeader.Root, @@ -127,6 +157,8 @@ func CustomizePayload(basePayload *api.ExecutableData, customData *CustomPayload BaseFeePerGas: customPayloadHeader.BaseFee, BlockHash: customPayloadHeader.Hash(), Transactions: txs, + BlobGasUsed: customPayloadHeader.BlobGasUsed, + ExcessBlobGas: customPayloadHeader.ExcessBlobGas, } if customData.RemoveWithdrawals { result.Withdrawals = nil @@ -138,7 +170,7 @@ func CustomizePayload(basePayload *api.ExecutableData, customData *CustomPayload return result, nil } -func CustomizePayloadTransactions(basePayload *api.ExecutableData, customTransactions types.Transactions) (*api.ExecutableData, error) { +func CustomizePayloadTransactions(basePayload *typ.ExecutableData, customTransactions types.Transactions) (*typ.ExecutableData, error) { byteTxs := make([][]byte, 0) for _, tx := range customTransactions { bytes, err := tx.MarshalBinary() @@ -147,9 +179,9 @@ func CustomizePayloadTransactions(basePayload *api.ExecutableData, customTransac } byteTxs = append(byteTxs, bytes) } - return CustomizePayload(basePayload, &CustomPayloadData{ + return (&CustomPayloadData{ Transactions: &byteTxs, - }) + }).CustomizePayload(basePayload) } func (customData *CustomPayloadData) String() string { @@ -201,7 +233,7 @@ func (customData *CustomPayloadData) String() string { // This function generates an invalid payload by taking a base payload and modifying the specified field such that it ends up being invalid. // One small consideration is that the payload needs to contain transactions and specially transactions using the PREVRANDAO opcode for all the fields to be compatible with this function. -func GenerateInvalidPayload(basePayload *api.ExecutableData, payloadField InvalidPayloadBlockField) (*api.ExecutableData, error) { +func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField InvalidPayloadBlockField) (*typ.ExecutableData, error) { var customPayloadMod *CustomPayloadData switch payloadField { @@ -320,7 +352,7 @@ func GenerateInvalidPayload(basePayload *api.ExecutableData, payloadField Invali return ©Payload, nil } - alteredPayload, err := CustomizePayload(basePayload, customPayloadMod) + alteredPayload, err := customPayloadMod.CustomizePayload(basePayload) if err != nil { return nil, err } diff --git a/simulators/ethereum/engine/helper/tx.go b/simulators/ethereum/engine/helper/tx.go index d2a80ff1b8..3521d9f301 100644 --- a/simulators/ethereum/engine/helper/tx.go +++ b/simulators/ethereum/engine/helper/tx.go @@ -1,14 +1,22 @@ package helper import ( + "context" "crypto/ecdsa" + "encoding/binary" "fmt" "math/big" + "strings" + "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/trie" + "github.com/ethereum/hive/simulators/ethereum/engine/client" "github.com/ethereum/hive/simulators/ethereum/engine/globals" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" + "github.com/pkg/errors" ) type SignatureValues struct { @@ -165,3 +173,235 @@ func calcTxsHash(txsBytes [][]byte) (common.Hash, error) { } return types.DeriveSha(types.Transactions(txs), trie.NewStackTrie(nil)), nil } + +type TestTransactionType int + +const ( + UnspecifiedTransactionType TestTransactionType = iota + LegacyTxOnly + DynamicFeeTxOnly +) + +type TransactionCreator interface { + MakeTransaction(nonce uint64) (typ.Transaction, error) + GetSourceAddress() common.Address +} + +type BaseTransactionCreator struct { + Recipient *common.Address + GasLimit uint64 + Amount *big.Int + Payload []byte + TxType TestTransactionType + PrivateKey *ecdsa.PrivateKey +} + +func (tc *BaseTransactionCreator) GetSourceAddress() common.Address { + if tc.PrivateKey == nil { + return globals.VaultAccountAddress + } + return crypto.PubkeyToAddress(tc.PrivateKey.PublicKey) +} + +func (tc *BaseTransactionCreator) MakeTransaction(nonce uint64) (typ.Transaction, error) { + var newTxData types.TxData + + var txTypeToUse int + switch tc.TxType { + case UnspecifiedTransactionType: + // Test case has no specific type of transaction to use. + // Select the type of tx based on the nonce. + switch nonce % 2 { + case 0: + txTypeToUse = types.LegacyTxType + case 1: + txTypeToUse = types.DynamicFeeTxType + } + case LegacyTxOnly: + txTypeToUse = types.LegacyTxType + case DynamicFeeTxOnly: + txTypeToUse = types.DynamicFeeTxType + } + + // Build the transaction depending on the specified type + switch txTypeToUse { + case types.LegacyTxType: + newTxData = &types.LegacyTx{ + Nonce: nonce, + To: tc.Recipient, + Value: tc.Amount, + Gas: tc.GasLimit, + GasPrice: globals.GasPrice, + Data: tc.Payload, + } + case types.DynamicFeeTxType: + gasFeeCap := new(big.Int).Set(globals.GasPrice) + gasTipCap := new(big.Int).Set(globals.GasTipPrice) + newTxData = &types.DynamicFeeTx{ + Nonce: nonce, + Gas: tc.GasLimit, + GasTipCap: gasTipCap, + GasFeeCap: gasFeeCap, + To: tc.Recipient, + Value: tc.Amount, + Data: tc.Payload, + } + } + + tx := types.NewTx(newTxData) + key := tc.PrivateKey + if key == nil { + key = globals.VaultKey + } + return types.SignTx(tx, types.NewLondonSigner(globals.ChainID), key) +} + +// Create a contract filled with zeros without going over the specified GasLimit +type BigContractTransactionCreator struct { + BaseTransactionCreator +} + +func (tc *BigContractTransactionCreator) MakeTransaction(nonce uint64) (typ.Transaction, error) { + // Total GAS: Gtransaction == 21000, Gcreate == 32000, Gcodedeposit == 200 + contractLength := uint64(0) + if tc.GasLimit > (21000 + 32000) { + contractLength = (tc.GasLimit - 21000 - 32000) / 200 + if contractLength >= 1 { + // Reduce by 1 to guarantee using less gas than requested + contractLength -= 1 + } + } + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, contractLength) + + tc.Payload = []byte{ + 0x67, // PUSH8 + } + tc.Payload = append(tc.Payload, buf...) // Size of the contract in byte length + tc.Payload = append(tc.Payload, 0x38) // CODESIZE == 0x00 + tc.Payload = append(tc.Payload, 0xF3) // RETURN(offset, length) + if tc.Recipient != nil { + panic("invalid configuration for big contract tx creator") + } + return tc.BaseTransactionCreator.MakeTransaction(nonce) +} + +// Create a tx with the specified initcode length (all zeros) +type BigInitcodeTransactionCreator struct { + BaseTransactionCreator + InitcodeLength int + PadByte uint8 + Initcode []byte +} + +func (tc *BigInitcodeTransactionCreator) MakeTransaction(nonce uint64) (typ.Transaction, error) { + // This method caches the payload with the crafted initcode after first execution. + if tc.Payload == nil { + // Prepare initcode payload + if tc.Initcode != nil { + if len(tc.Initcode) > tc.InitcodeLength { + panic(fmt.Errorf("invalid initcode (too big)")) + } + tc.Payload = tc.Initcode + } else { + tc.Payload = []byte{} + } + + for { + if len(tc.Payload) == tc.InitcodeLength { + break + } + tc.Payload = append(tc.Payload, tc.PadByte) + } + } + if tc.Recipient != nil { + panic("invalid configuration for big contract tx creator") + } + return tc.BaseTransactionCreator.MakeTransaction(nonce) +} + +// Determines if the error we got from sending the raw tx is because the client +// already knew the tx (might happen if we produced a re-org where the tx was +// unwind back into the txpool) +func SentTxAlreadyKnown(err error) bool { + return strings.Contains(err.Error(), "already known") || strings.Contains(err.Error(), "already in the TxPool") || + strings.Contains(err.Error(), "AlreadyKnown") +} + +func SendNextTransaction(testCtx context.Context, node client.EngineClient, txCreator TransactionCreator) (typ.Transaction, error) { + nonce, err := node.GetNextAccountNonce(testCtx, txCreator.GetSourceAddress()) + if err != nil { + return nil, errors.Wrap(err, "error getting next account nonce") + } + tx, err := txCreator.MakeTransaction(nonce) + if err != nil { + return nil, errors.Wrap(err, "error crafting transaction") + } + for { + ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) + defer cancel() + err := node.SendTransaction(ctx, tx) + if err == nil { + return tx, nil + } else if SentTxAlreadyKnown(err) { + return tx, nil + } + select { + case <-time.After(time.Second): + case <-testCtx.Done(): + return nil, errors.Wrapf(testCtx.Err(), "timeout retrying SendTransaction, last error: %v", err) + } + } +} + +func SendNextTransactions(testCtx context.Context, node client.EngineClient, txCreator TransactionCreator, txCount uint64) ([]typ.Transaction, error) { + var err error + nonce, err := node.GetNextAccountNonce(testCtx, txCreator.GetSourceAddress()) + if err != nil { + return nil, errors.Wrap(err, "error getting next account nonce") + } + txs := make([]typ.Transaction, txCount) + for i := range txs { + txs[i], err = txCreator.MakeTransaction(nonce) + if err != nil { + return nil, errors.Wrap(err, "error crafting transaction") + } + nonce++ + } + ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) + defer cancel() + errs := node.SendTransactions(ctx, txs...) + for _, err := range errs { + if err != nil && !SentTxAlreadyKnown(err) { + return txs, errors.Wrap(err, "error on SendTransactions") + } + } + node.UpdateNonce(testCtx, txCreator.GetSourceAddress(), nonce+txCount) + return txs, nil +} + +func ReplaceLastTransaction(testCtx context.Context, node client.EngineClient, txCreator TransactionCreator) (typ.Transaction, error) { + nonce, err := node.GetLastAccountNonce(testCtx, txCreator.GetSourceAddress()) + if err != nil { + return nil, errors.Wrap(err, "error getting last account nonce") + } + tx, err := txCreator.MakeTransaction(nonce) + if err != nil { + return nil, errors.Wrap(err, "error crafting transaction") + } + for { + ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) + defer cancel() + err := node.SendTransaction(ctx, tx) + if err == nil { + return tx, nil + } else if SentTxAlreadyKnown(err) { + return tx, nil + } + select { + case <-time.After(time.Second): + case <-testCtx.Done(): + return nil, errors.Wrapf(testCtx.Err(), "timeout retrying ReplaceLastTransaction, last error: %v", err) + } + } +} diff --git a/simulators/ethereum/engine/main.go b/simulators/ethereum/engine/main.go index 6bc85ae30d..75d782b13c 100644 --- a/simulators/ethereum/engine/main.go +++ b/simulators/ethereum/engine/main.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/hive/simulators/ethereum/engine/test" suite_auth "github.com/ethereum/hive/simulators/ethereum/engine/suites/auth" + suite_blobs "github.com/ethereum/hive/simulators/ethereum/engine/suites/blobs" suite_engine "github.com/ethereum/hive/simulators/ethereum/engine/suites/engine" suite_ex_cap "github.com/ethereum/hive/simulators/ethereum/engine/suites/exchange_capabilities" suite_withdrawals "github.com/ethereum/hive/simulators/ethereum/engine/suites/withdrawals" @@ -44,6 +45,11 @@ func main() { Description: ` Test Engine API withdrawals, pre/post Shanghai.`[1:], } + blobs = hivesim.Suite{ + Name: "engine-blobs", + Description: ` + Test Engine API Blobs.`[1:], + } ) simulator := hivesim.New() @@ -53,6 +59,7 @@ func main() { addTestsToSuite(simulator, &excap, suite_ex_cap.Tests, "full") //suite_sync.AddSyncTestsToSuite(simulator, &sync, suite_sync.Tests) addTestsToSuite(simulator, &withdrawals, suite_withdrawals.Tests, "full") + addTestsToSuite(simulator, &blobs, suite_blobs.Tests, "full") // Mark suites for execution hivesim.MustRunSuite(simulator, engine) @@ -60,6 +67,7 @@ func main() { hivesim.MustRunSuite(simulator, excap) hivesim.MustRunSuite(simulator, sync) hivesim.MustRunSuite(simulator, withdrawals) + hivesim.MustRunSuite(simulator, blobs) } func specToInterface(src []test.Spec) []test.SpecInterface { @@ -77,6 +85,8 @@ func addTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests []test // Load the genesis file specified and dynamically bundle it. genesis := currentTest.GetGenesis() + forkConfig := currentTest.GetForkConfig() + forkConfig.ConfigGenesis(genesis) genesisStartOption, err := helper.GenesisStartOption(genesis) if err != nil { panic("unable to inject genesis") @@ -87,10 +97,13 @@ func addTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests []test // Configure Forks newParams := globals.DefaultClientEnv.Set("HIVE_TERMINAL_TOTAL_DIFFICULTY", fmt.Sprintf("%d", ttd)) - if currentTest.GetForkConfig().ShanghaiTimestamp != nil { - newParams = newParams.Set("HIVE_SHANGHAI_TIMESTAMP", fmt.Sprintf("%d", currentTest.GetForkConfig().ShanghaiTimestamp)) + if forkConfig.ShanghaiTimestamp != nil { + newParams = newParams.Set("HIVE_SHANGHAI_TIMESTAMP", fmt.Sprintf("%d", forkConfig.ShanghaiTimestamp)) // Ensure the merge transition is activated before shanghai. newParams = newParams.Set("HIVE_MERGE_BLOCK_ID", "0") + if forkConfig.CancunTimestamp != nil { + newParams = newParams.Set("HIVE_CANCUN_TIMESTAMP", fmt.Sprintf("%d", forkConfig.CancunTimestamp)) + } } if nodeType != "" { @@ -150,6 +163,7 @@ func addTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests []test t, c, genesis, + &forkConfig, newParams, testFiles, ) diff --git a/simulators/ethereum/engine/suites/blobs/README.md b/simulators/ethereum/engine/suites/blobs/README.md new file mode 100644 index 0000000000..9df40b57e5 --- /dev/null +++ b/simulators/ethereum/engine/suites/blobs/README.md @@ -0,0 +1,5 @@ +# Shard Blob Engine API Extension Testing + +This test suite verifies behavior of the Engine API on while using shard blob transaction extension: +https://github.com/ethereum/execution-apis/blob/main/src/engine/experimental/blob-extension.md + diff --git a/simulators/ethereum/engine/suites/blobs/config.go b/simulators/ethereum/engine/suites/blobs/config.go new file mode 100644 index 0000000000..aeeafef9ce --- /dev/null +++ b/simulators/ethereum/engine/suites/blobs/config.go @@ -0,0 +1,102 @@ +package suite_blobs + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" +) + +// Timestamp delta between genesis and the withdrawals fork +func (bs *BlobsBaseSpec) GetCancunGenesisTimeDelta() uint64 { + return bs.CancunForkHeight * bs.GetBlockTimeIncrements() +} + +// Calculates Shanghai fork timestamp given the amount of blocks that need to be +// produced beforehand. +func (bs *BlobsBaseSpec) GetCancunForkTime() uint64 { + return uint64(globals.GenesisTimestamp) + bs.GetCancunGenesisTimeDelta() +} + +// Generates the fork config, including cancun fork timestamp. +func (bs *BlobsBaseSpec) GetForkConfig() globals.ForkConfig { + return globals.ForkConfig{ + ShanghaiTimestamp: big.NewInt(0), // No test starts before Shanghai + CancunTimestamp: new(big.Int).SetUint64(bs.GetCancunForkTime()), + } +} + +// Get the per-block timestamp increments configured for this test +func (bs *BlobsBaseSpec) GetBlockTimeIncrements() uint64 { + return 1 +} + +// Timestamp delta between genesis and the withdrawals fork +func (bs *BlobsBaseSpec) GetBlobsGenesisTimeDelta() uint64 { + return bs.CancunForkHeight * bs.GetBlockTimeIncrements() +} + +// Calculates Shanghai fork timestamp given the amount of blocks that need to be +// produced beforehand. +func (bs *BlobsBaseSpec) GetBlobsForkTime() uint64 { + return uint64(globals.GenesisTimestamp) + bs.GetBlobsGenesisTimeDelta() +} + +// Append the accounts we are going to withdraw to, which should also include +// bytecode for testing purposes. +func (bs *BlobsBaseSpec) GetGenesis() *core.Genesis { + genesis := bs.Spec.GetGenesis() + + // Remove PoW altogether + genesis.Difficulty = common.Big0 + genesis.Config.TerminalTotalDifficulty = common.Big0 + genesis.Config.Clique = nil + genesis.ExtraData = []byte{} + + if bs.CancunForkHeight == 0 { + genesis.BlobGasUsed = pUint64(0) + genesis.ExcessBlobGas = pUint64(0) + // TODO (DEVNET 8): Add parent beacon block + } + + // Add accounts that use the DATAHASH opcode + datahashCode := []byte{ + 0x5F, // PUSH0 + 0x80, // DUP1 + 0x49, // DATAHASH + 0x55, // SSTORE + 0x60, // PUSH1(0x01) + 0x01, + 0x80, // DUP1 + 0x49, // DATAHASH + 0x55, // SSTORE + 0x60, // PUSH1(0x02) + 0x02, + 0x80, // DUP1 + 0x49, // DATAHASH + 0x55, // SSTORE + 0x60, // PUSH1(0x03) + 0x03, + 0x80, // DUP1 + 0x49, // DATAHASH + 0x55, // SSTORE + } + + for i := 0; i < DATAHASH_ADDRESS_COUNT; i++ { + address := big.NewInt(0).Add(DATAHASH_START_ADDRESS, big.NewInt(int64(i))) + genesis.Alloc[common.BigToAddress(address)] = core.GenesisAccount{ + Code: datahashCode, + Balance: common.Big0, + } + } + + return genesis +} + +// Changes the CL Mocker default time increments of 1 to the value specified +// in the test spec. +func (bs *BlobsBaseSpec) ConfigureCLMock(cl *clmock.CLMocker) { + cl.BlockTimestampIncrement = big.NewInt(int64(bs.GetBlockTimeIncrements())) +} diff --git a/simulators/ethereum/engine/suites/blobs/helpers.go b/simulators/ethereum/engine/suites/blobs/helpers.go new file mode 100644 index 0000000000..13963ab797 --- /dev/null +++ b/simulators/ethereum/engine/suites/blobs/helpers.go @@ -0,0 +1,129 @@ +package suite_blobs + +import ( + "bytes" + "context" + "encoding/hex" + "fmt" + "reflect" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/hive/simulators/ethereum/engine/client" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" +) + +func FakeExponential(factor, numerator, denominator uint64) uint64 { + var ( + i = uint64(1) + output = uint64(0) + numerator_accum = uint64(factor * denominator) + ) + + for numerator_accum > 0 { + output += numerator_accum + numerator_accum = (numerator_accum * numerator) / (denominator * i) + i += 1 + } + return output / denominator +} + +func GetBlobGasPrice(excessBlobGas uint64) uint64 { + return FakeExponential(MIN_DATA_GASPRICE, excessBlobGas, BLOB_GASPRICE_UPDATE_FRACTION) +} + +func GetMinExcessBlobGasForBlobGasPrice(data_gas_price uint64) uint64 { + var ( + current_excess_data_gas = uint64(0) + current_data_gas_price = uint64(1) + ) + for current_data_gas_price < data_gas_price { + current_excess_data_gas += GAS_PER_BLOB + current_data_gas_price = GetBlobGasPrice(current_excess_data_gas) + } + + return current_excess_data_gas +} + +func GetMinExcessBlobsForBlobGasPrice(data_gas_price uint64) uint64 { + return GetMinExcessBlobGasForBlobGasPrice(data_gas_price) / GAS_PER_BLOB +} + +func CalcExcessBlobGas(parentExcessBlobGas, parentBlobGasUsed uint64) uint64 { + if (parentExcessBlobGas + parentBlobGasUsed) < TARGET_BLOB_GAS_PER_BLOCK { + return 0 + } else { + return (parentExcessBlobGas + parentBlobGasUsed) - TARGET_BLOB_GAS_PER_BLOCK + } +} + +type TestBlobTxPool struct { + Mutex sync.Mutex + CurrentBlobID helper.BlobID + CurrentTransactionIndex uint64 + Transactions map[common.Hash]typ.Transaction + HashesByIndex map[uint64]common.Hash +} + +func (pool *TestBlobTxPool) AddBlobTransaction(tx typ.Transaction) { + if pool.Transactions == nil { + pool.Transactions = make(map[common.Hash]typ.Transaction) + } + pool.Transactions[tx.Hash()] = tx +} + +// Test two different transactions with the same blob, and check the blob bundle. + +func VerifyTransactionFromNode(ctx context.Context, eth client.Eth, tx typ.Transaction) error { + returnedTx, _, err := eth.TransactionByHash(ctx, tx.Hash()) + if err != nil { + return err + } + + // Verify that the tx fields are all the same + if returnedTx.Nonce() != tx.Nonce() { + return fmt.Errorf("nonce mismatch: %d != %d", returnedTx.Nonce(), tx.Nonce()) + } + if returnedTx.Gas() != tx.Gas() { + return fmt.Errorf("gas mismatch: %d != %d", returnedTx.Gas(), tx.Gas()) + } + if returnedTx.GasPrice().Cmp(tx.GasPrice()) != 0 { + return fmt.Errorf("gas price mismatch: %d != %d", returnedTx.GasPrice(), tx.GasPrice()) + } + if returnedTx.Value().Cmp(tx.Value()) != 0 { + return fmt.Errorf("value mismatch: %d != %d", returnedTx.Value(), tx.Value()) + } + if returnedTx.To() != nil && tx.To() != nil && returnedTx.To().Hex() != tx.To().Hex() { + return fmt.Errorf("to mismatch: %s != %s", returnedTx.To().Hex(), tx.To().Hex()) + } + if returnedTx.Data() != nil && tx.Data() != nil && !bytes.Equal(returnedTx.Data(), tx.Data()) { + return fmt.Errorf("data mismatch: %s != %s", hex.EncodeToString(returnedTx.Data()), hex.EncodeToString(tx.Data())) + } + if returnedTx.AccessList() != nil && tx.AccessList() != nil && !reflect.DeepEqual(returnedTx.AccessList(), tx.AccessList()) { + return fmt.Errorf("access list mismatch: %v != %v", returnedTx.AccessList(), tx.AccessList()) + } + if returnedTx.ChainId().Cmp(tx.ChainId()) != 0 { + return fmt.Errorf("chain id mismatch: %d != %d", returnedTx.ChainId(), tx.ChainId()) + } + if returnedTx.BlobGas() != tx.BlobGas() { + return fmt.Errorf("data gas mismatch: %d != %d", returnedTx.BlobGas(), tx.BlobGas()) + } + if returnedTx.GasFeeCap().Cmp(tx.GasFeeCap()) != 0 { + return fmt.Errorf("max fee per gas mismatch: %d != %d", returnedTx.GasFeeCap(), tx.GasFeeCap()) + } + if returnedTx.GasTipCap().Cmp(tx.GasTipCap()) != 0 { + return fmt.Errorf("max priority fee per gas mismatch: %d != %d", returnedTx.GasTipCap(), tx.GasTipCap()) + } + if returnedTx.BlobGasFeeCap().Cmp(tx.BlobGasFeeCap()) != 0 { + return fmt.Errorf("max fee per data gas mismatch: %d != %d", returnedTx.BlobGasFeeCap(), tx.BlobGasFeeCap()) + } + if returnedTx.BlobHashes() != nil && tx.BlobHashes() != nil && !reflect.DeepEqual(returnedTx.BlobHashes(), tx.BlobHashes()) { + return fmt.Errorf("blob versioned hashes mismatch: %v != %v", returnedTx.BlobHashes(), tx.BlobHashes()) + } + if returnedTx.Type() != tx.Type() { + return fmt.Errorf("type mismatch: %d != %d", returnedTx.Type(), tx.Type()) + } + + return nil +} diff --git a/simulators/ethereum/engine/suites/blobs/steps.go b/simulators/ethereum/engine/suites/blobs/steps.go new file mode 100644 index 0000000000..81b9e51713 --- /dev/null +++ b/simulators/ethereum/engine/suites/blobs/steps.go @@ -0,0 +1,753 @@ +package suite_blobs + +import ( + "bytes" + "context" + "fmt" + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/hive/simulators/ethereum/engine/client" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/devp2p" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" + "github.com/pkg/errors" +) + +type BlobTestContext struct { + *test.Env + *TestBlobTxPool +} + +// Interface to represent a single step in a test vector +type TestStep interface { + // Executes the step + Execute(testCtx *BlobTestContext) error + Description() string +} + +type TestSequence []TestStep + +// A step that runs two or more steps in parallel +type ParallelSteps struct { + Steps []TestStep +} + +func (step ParallelSteps) Execute(t *BlobTestContext) error { + // Run the steps in parallel + wg := sync.WaitGroup{} + errs := make(chan error, len(step.Steps)) + for _, s := range step.Steps { + wg.Add(1) + go func(s TestStep) { + defer wg.Done() + if err := s.Execute(t); err != nil { + errs <- err + } + }(s) + } + wg.Wait() + close(errs) + for err := range errs { + return err + } + return nil +} + +func (step ParallelSteps) Description() string { + desc := fmt.Sprintf("ParallelSteps: running steps in parallel:\n") + for i, step := range step.Steps { + desc += fmt.Sprintf("%d: %s\n", i, step.Description()) + } + + return desc +} + +// A step that launches a new client +type LaunchClients struct { + client.EngineStarter + ClientCount uint64 + SkipConnectingToBootnode bool + SkipAddingToCLMock bool +} + +func (step LaunchClients) GetClientCount() uint64 { + clientCount := step.ClientCount + if clientCount == 0 { + clientCount = 1 + } + return clientCount +} + +func (step LaunchClients) Execute(t *BlobTestContext) error { + // Launch a new client + var ( + client client.EngineClient + err error + ) + clientCount := step.GetClientCount() + for i := uint64(0); i < clientCount; i++ { + if !step.SkipConnectingToBootnode { + client, err = step.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles, t.Engines[0]) + } else { + client, err = step.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) + } + if err != nil { + return err + } + t.Engines = append(t.Engines, client) + t.TestEngines = append(t.TestEngines, test.NewTestEngineClient(t.Env, client)) + if !step.SkipAddingToCLMock { + t.CLMock.AddEngineClient(client) + } + } + return nil +} + +func (step LaunchClients) Description() string { + return fmt.Sprintf("Launch %d new engine client(s)", step.GetClientCount()) +} + +// A step that sends a new payload to the client +type NewPayloads struct { + // Payload Count + PayloadCount uint64 + // Number of blob transactions that are expected to be included in the payload + ExpectedIncludedBlobCount uint64 + // Blob IDs expected to be found in the payload + ExpectedBlobs []helper.BlobID + // Delay between FcU and GetPayload calls + GetPayloadDelay uint64 + // Extra modifications on NewPayload to the versioned hashes + VersionedHashes *VersionedHashes + // Extra modifications on NewPayload to potentially generate an invalid payload + PayloadCustomizer helper.PayloadCustomizer + // Version to use to call NewPayload + Version uint64 + // Expected responses on the NewPayload call + ExpectedError *int + ExpectedStatus test.PayloadStatus +} + +type VersionedHashes struct { + Blobs []helper.BlobID + HashVersions []byte +} + +func (v *VersionedHashes) VersionedHashes() (*[]common.Hash, error) { + if v.Blobs == nil { + return nil, nil + } + + versionedHashes := make([]common.Hash, len(v.Blobs)) + + for i, blobID := range v.Blobs { + var version byte + if v.HashVersions != nil && len(v.HashVersions) > i { + version = v.HashVersions[i] + } + var err error + versionedHashes[i], err = blobID.GetVersionedHash(version) + if err != nil { + return nil, err + } + + } + + return &versionedHashes, nil +} + +func (v *VersionedHashes) Description() string { + desc := "VersionedHashes: " + if v.Blobs != nil { + desc += fmt.Sprintf("%v", v.Blobs) + } + if v.HashVersions != nil { + desc += fmt.Sprintf(" with versions %v", v.HashVersions) + } + return desc + +} + +func (step NewPayloads) GetPayloadCount() uint64 { + payloadCount := step.PayloadCount + if payloadCount == 0 { + payloadCount = 1 + } + return payloadCount +} + +type BlobWrapData struct { + VersionedHash common.Hash + KZG typ.KZGCommitment + Blob typ.Blob + Proof typ.KZGProof +} + +func GetBlobDataInPayload(pool *TestBlobTxPool, payload *typ.ExecutableData) ([]*typ.TransactionWithBlobData, []*BlobWrapData, error) { + // Find all blob transactions included in the payload + var ( + blobDataInPayload = make([]*BlobWrapData, 0) + blobTxsInPayload = make([]*typ.TransactionWithBlobData, 0) + ) + signer := types.NewCancunSigner(globals.ChainID) + + for i, binaryTx := range payload.Transactions { + // Unmarshal the tx from the payload, which should be the minimal version + // of the blob transaction + txData := new(types.Transaction) + if err := txData.UnmarshalBinary(binaryTx); err != nil { + return nil, nil, err + } + + if txData.Type() != types.BlobTxType { + continue + } + + // Print transaction info + sender, err := signer.Sender(txData) + if err != nil { + return nil, nil, err + } + fmt.Printf("Tx %d in the payload: From: %s, Nonce: %d\n", i, sender, txData.Nonce()) + + // Find the transaction in the current pool of known transactions + if tx, ok := pool.Transactions[txData.Hash()]; ok { + if blobTx, ok := tx.(*typ.TransactionWithBlobData); ok { + if blobTx.BlobData == nil { + return nil, nil, fmt.Errorf("blob data is nil") + } + var ( + kzgs = blobTx.BlobData.Commitments + blobs = blobTx.BlobData.Blobs + proofs = blobTx.BlobData.Proofs + versionedHashes = blobTx.BlobHashes() + ) + + if len(versionedHashes) != len(kzgs) || len(kzgs) != len(blobs) || len(blobs) != len(proofs) { + return nil, nil, fmt.Errorf("invalid blob wrap data") + } + for i := 0; i < len(versionedHashes); i++ { + blobDataInPayload = append(blobDataInPayload, &BlobWrapData{ + VersionedHash: versionedHashes[i], + KZG: kzgs[i], + Blob: blobs[i], + Proof: proofs[i], + }) + } + blobTxsInPayload = append(blobTxsInPayload, blobTx) + } else { + return nil, nil, fmt.Errorf("could not find blob data in transaction %s, type=%T", txData.Hash().String(), tx) + } + + } else { + return nil, nil, fmt.Errorf("could not find transaction %s in the pool", txData.Hash().String()) + } + } + return blobTxsInPayload, blobDataInPayload, nil +} + +func (step NewPayloads) VerifyPayload(ctx context.Context, forkConfig *globals.ForkConfig, testEngine *test.TestEngineClient, blobTxsInPayload []*typ.TransactionWithBlobData, payload *typ.ExecutableData, previousPayload *typ.ExecutableData) error { + var ( + parentExcessBlobGas = uint64(0) + parentBlobGasUsed = uint64(0) + ) + if previousPayload != nil { + if previousPayload.ExcessBlobGas != nil { + parentExcessBlobGas = *previousPayload.ExcessBlobGas + } + if previousPayload.BlobGasUsed != nil { + parentBlobGasUsed = *previousPayload.BlobGasUsed + } + } + expectedExcessBlobGas := CalcExcessBlobGas(parentExcessBlobGas, parentBlobGasUsed) + + if forkConfig.IsCancun(payload.Timestamp) { + if payload.ExcessBlobGas == nil { + return fmt.Errorf("payload contains nil excessDataGas") + } + if payload.BlobGasUsed == nil { + return fmt.Errorf("payload contains nil dataGasUsed") + } + if *payload.ExcessBlobGas != expectedExcessBlobGas { + return fmt.Errorf("payload contains incorrect excessDataGas: want 0x%x, have 0x%x", expectedExcessBlobGas, *payload.ExcessBlobGas) + } + + totalBlobCount := uint64(0) + expectedBlobGasPrice := GetBlobGasPrice(expectedExcessBlobGas) + + for _, tx := range blobTxsInPayload { + blobCount := uint64(len(tx.BlobHashes())) + totalBlobCount += blobCount + + // Retrieve receipt from client + r := testEngine.TestTransactionReceipt(tx.Hash()) + expectedBlobGasUsed := blobCount * GAS_PER_BLOB + r.ExpectBlobGasUsed(&expectedBlobGasUsed) + r.ExpectBlobGasPrice(&expectedBlobGasPrice) + } + + if totalBlobCount != step.ExpectedIncludedBlobCount { + return fmt.Errorf("expected %d blobs in transactions, got %d", step.ExpectedIncludedBlobCount, totalBlobCount) + } + + } else { + if payload.ExcessBlobGas != nil { + return fmt.Errorf("payload contains non-nil excessDataGas pre-fork") + } + if payload.BlobGasUsed != nil { + return fmt.Errorf("payload contains non-nil dataGasUsed pre-fork") + } + } + + return nil +} + +func (step NewPayloads) VerifyBlobBundle(blobDataInPayload []*BlobWrapData, payload *typ.ExecutableData, blobBundle *typ.BlobsBundle) error { + + if len(blobBundle.Blobs) != len(blobBundle.Commitments) || len(blobBundle.Blobs) != len(blobBundle.Proofs) { + return fmt.Errorf("unexpected length in blob bundle: %d blobs, %d proofs, %d commitments", len(blobBundle.Blobs), len(blobBundle.Proofs), len(blobBundle.Commitments)) + } + if len(blobBundle.Blobs) != int(step.ExpectedIncludedBlobCount) { + return fmt.Errorf("expected %d blob, got %d", step.ExpectedIncludedBlobCount, len(blobBundle.Blobs)) + } + + // Verify that the calculated amount of blobs in the payload matches the + // amount of blobs in the bundle + if len(blobDataInPayload) != len(blobBundle.Blobs) { + return fmt.Errorf("expected %d blobs in the bundle, got %d", len(blobDataInPayload), len(blobBundle.Blobs)) + } + + for i, blobData := range blobDataInPayload { + bundleCommitment := blobBundle.Commitments[i] + bundleBlob := blobBundle.Blobs[i] + bundleProof := blobBundle.Proofs[i] + if !bytes.Equal(bundleCommitment[:], blobData.KZG[:]) { + return fmt.Errorf("KZG mismatch at index %d of the bundle", i) + } + if !bytes.Equal(bundleBlob[:], blobData.Blob[:]) { + return fmt.Errorf("blob mismatch at index %d of the bundle", i) + } + if !bytes.Equal(bundleProof[:], blobData.Proof[:]) { + return fmt.Errorf("proof mismatch at index %d of the bundle", i) + } + } + + if len(step.ExpectedBlobs) != 0 { + // Verify that the blobs in the payload match the expected blobs + for _, expectedBlob := range step.ExpectedBlobs { + found := false + for _, blobData := range blobDataInPayload { + if ok, err := expectedBlob.VerifyBlob(&blobData.Blob); err != nil { + return err + } else if ok { + found = true + break + } + } + if !found { + return fmt.Errorf("could not find expected blob %d", expectedBlob) + } + } + } + + return nil +} + +func (step NewPayloads) Execute(t *BlobTestContext) error { + // Create a new payload + // Produce the payload + payloadCount := step.GetPayloadCount() + + var originalGetPayloadDelay time.Duration + if step.GetPayloadDelay != 0 { + originalGetPayloadDelay = t.CLMock.PayloadProductionClientDelay + t.CLMock.PayloadProductionClientDelay = time.Duration(step.GetPayloadDelay) * time.Second + } + var ( + previousPayload = t.CLMock.LatestPayloadBuilt + ) + for p := uint64(0); p < payloadCount; p++ { + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnGetPayload: func() { + // Get the latest blob bundle + var ( + blobBundle = t.CLMock.LatestBlobBundle + payload = &t.CLMock.LatestPayloadBuilt + ) + + if !t.Env.ForkConfig.IsCancun(payload.Timestamp) { + // Nothing to do + return + } + if blobBundle == nil { + t.Fatalf("FAIL: Error getting blobs bundle (payload %d/%d): %v", p+1, payloadCount, blobBundle) + } + + _, blobDataInPayload, err := GetBlobDataInPayload(t.TestBlobTxPool, payload) + if err != nil { + t.Fatalf("FAIL: Error retrieving blob bundle (payload %d/%d): %v", p+1, payloadCount, err) + } + + if err := step.VerifyBlobBundle(blobDataInPayload, payload, blobBundle); err != nil { + t.Fatalf("FAIL: Error verifying blob bundle (payload %d/%d): %v", p+1, payloadCount, err) + } + }, + OnNewPayloadBroadcast: func() { + // Send a test NewPayload directive with either a modified payload or modifed versioned hashes + var ( + payload = &t.CLMock.LatestPayloadBuilt + versionedHashes *[]common.Hash = nil + r *test.NewPayloadResponseExpectObject + err error + ) + if step.VersionedHashes != nil { + // Send a new payload with the modified versioned hashes + versionedHashes, err = step.VersionedHashes.VersionedHashes() + if err != nil { + t.Fatalf("FAIL: Error getting modified versioned hashes (payload %d/%d): %v", p+1, payloadCount, err) + } + } else { + if t.CLMock.LatestBlobBundle != nil { + versionedHashes, err = t.CLMock.LatestBlobBundle.VersionedHashes(BLOB_COMMITMENT_VERSION_KZG) + if err != nil { + t.Fatalf("FAIL: Error getting versioned hashes (payload %d/%d): %v", p+1, payloadCount, err) + } + } + } + + if step.PayloadCustomizer != nil { + // Send a custom new payload + payload, err = step.PayloadCustomizer.CustomizePayload(payload) + if err != nil { + t.Fatalf("FAIL: Error customizing payload (payload %d/%d): %v", p+1, payloadCount, err) + } + } + + version := step.Version + if version == 0 { + if t.Env.ForkConfig.IsCancun(payload.Timestamp) { + version = 3 + } else { + version = 2 + } + } + + if version == 3 { + r = t.TestEngine.TestEngineNewPayloadV3(payload, versionedHashes) + } else if version == 2 { + r = t.TestEngine.TestEngineNewPayloadV2(payload) + } else { + t.Fatalf("FAIL: Unknown version %d", step.Version) + } + if step.ExpectedError != nil { + r.ExpectErrorCode(*step.ExpectedError) + } else { + r.ExpectNoError() + if step.ExpectedStatus != "" { + r.ExpectStatus(step.ExpectedStatus) + } + } + }, + OnForkchoiceBroadcast: func() { + // Verify the transaction receipts on incorporated transactions + payload := &t.CLMock.LatestPayloadBuilt + + blobTxsInPayload, _, err := GetBlobDataInPayload(t.TestBlobTxPool, payload) + if err != nil { + t.Fatalf("FAIL: Error retrieving blob bundle (payload %d/%d): %v", p+1, payloadCount, err) + } + if err := step.VerifyPayload(t.TimeoutContext, t.Env.ForkConfig, t.TestEngine, blobTxsInPayload, payload, &previousPayload); err != nil { + t.Fatalf("FAIL: Error verifying payload (payload %d/%d): %v", p+1, payloadCount, err) + } + previousPayload = t.CLMock.LatestPayloadBuilt + }, + }) + t.Logf("INFO: Correctly produced payload %d/%d", p+1, payloadCount) + } + if step.GetPayloadDelay != 0 { + // Restore the original delay + t.CLMock.PayloadProductionClientDelay = originalGetPayloadDelay + } + return nil +} + +func (step NewPayloads) Description() string { + if step.VersionedHashes != nil { + return fmt.Sprintf("NewPayloads: %d payloads, %d blobs expected, %s", step.GetPayloadCount(), step.ExpectedIncludedBlobCount, step.VersionedHashes.Description()) + } + return fmt.Sprintf("NewPayloads: %d payloads, %d blobs expected", step.GetPayloadCount(), step.ExpectedIncludedBlobCount) +} + +// A step that sends multiple new blobs to the client +type SendBlobTransactions struct { + // Number of blob transactions to send before this block's GetPayload request + BlobTransactionSendCount uint64 + // Blobs per transaction + BlobsPerTransaction uint64 + // Max Data Gas Cost for every blob transaction + BlobTransactionMaxBlobGasCost *big.Int + // Gas Fee Cap for every blob transaction + BlobTransactionGasFeeCap *big.Int + // Gas Tip Cap for every blob transaction + BlobTransactionGasTipCap *big.Int + // Replace transactions + ReplaceTransactions bool + // Skip verification of retrieving the tx from node + SkipVerificationFromNode bool + // Account index to send the blob transactions from + AccountIndex uint64 + // Client index to send the blob transactions to + ClientIndex uint64 +} + +func (step SendBlobTransactions) GetBlobsPerTransaction() uint64 { + blobCountPerTx := step.BlobsPerTransaction + if blobCountPerTx == 0 { + blobCountPerTx = 1 + } + return blobCountPerTx +} + +func (step SendBlobTransactions) Execute(t *BlobTestContext) error { + // Send a blob transaction + addr := common.BigToAddress(DATAHASH_START_ADDRESS) + blobCountPerTx := step.GetBlobsPerTransaction() + var engine client.EngineClient + if step.ClientIndex >= uint64(len(t.Engines)) { + return fmt.Errorf("invalid client index %d", step.ClientIndex) + } + engine = t.Engines[step.ClientIndex] + // Send the blob transactions + for bTx := uint64(0); bTx < step.BlobTransactionSendCount; bTx++ { + blobTxCreator := &helper.BlobTransactionCreator{ + To: &addr, + GasLimit: 100000, + GasTip: step.BlobTransactionGasTipCap, + GasFee: step.BlobTransactionGasFeeCap, + BlobGasFee: step.BlobTransactionMaxBlobGasCost, + BlobCount: blobCountPerTx, + BlobID: t.CurrentBlobID, + } + if step.AccountIndex != 0 { + if step.AccountIndex >= uint64(len(globals.TestAccounts)) { + return fmt.Errorf("invalid account index %d", step.AccountIndex) + } + key := globals.TestAccounts[step.AccountIndex].GetKey() + blobTxCreator.PrivateKey = key + } + var ( + blobTx typ.Transaction + err error + ) + if step.ReplaceTransactions { + blobTx, err = helper.ReplaceLastTransaction(t.TestContext, engine, + blobTxCreator, + ) + } else { + blobTx, err = helper.SendNextTransaction(t.TestContext, engine, + blobTxCreator, + ) + } + if err != nil { + t.Fatalf("FAIL: Error sending blob transaction: %v", err) + } + if !step.SkipVerificationFromNode { + VerifyTransactionFromNode(t.TestContext, engine, blobTx) + } + t.TestBlobTxPool.Mutex.Lock() + t.AddBlobTransaction(blobTx) + t.HashesByIndex[t.CurrentTransactionIndex] = blobTx.Hash() + t.CurrentTransactionIndex += 1 + t.Logf("INFO: Sent blob transaction: %s", blobTx.Hash().String()) + t.CurrentBlobID += helper.BlobID(blobCountPerTx) + t.TestBlobTxPool.Mutex.Unlock() + } + return nil +} + +func (step SendBlobTransactions) Description() string { + return fmt.Sprintf("SendBlobTransactions: %d Transactions, %d blobs each, %d max data gas fee", step.BlobTransactionSendCount, step.GetBlobsPerTransaction(), step.BlobTransactionMaxBlobGasCost.Uint64()) +} + +// Send a modified version of the latest payload produced using NewPayloadV3 +type SendModifiedLatestPayload struct { + ClientID uint64 + // Versioned hashes modification + VersionedHashes *VersionedHashes + // Expected responses on the NewPayload call + ExpectedError *int + ExpectedStatus test.PayloadStatus +} + +func (step SendModifiedLatestPayload) Execute(t *BlobTestContext) error { + // Get the latest payload + payload := &t.CLMock.LatestPayloadBuilt + if payload == nil { + return fmt.Errorf("no payload available") + } + // Modify the versioned hashes + versionedHashes, err := step.VersionedHashes.VersionedHashes() + if err != nil { + return fmt.Errorf("error getting modified versioned hashes: %v", err) + } + // Send the payload + if step.ClientID >= uint64(len(t.TestEngines)) { + return fmt.Errorf("invalid client index %d", step.ClientID) + } + testEngine := t.TestEngines[step.ClientID] + r := testEngine.TestEngineNewPayloadV3(payload, versionedHashes) + if step.ExpectedError != nil { + r.ExpectErrorCode(*step.ExpectedError) + } else { + r.ExpectStatus(step.ExpectedStatus) + } + return nil +} + +func (step SendModifiedLatestPayload) Description() string { + desc := fmt.Sprintf("SendModifiedLatestPayload: client %d, expected status %s, ", step.ClientID, step.ExpectedStatus) + if step.VersionedHashes != nil { + desc += step.VersionedHashes.Description() + } + + return desc +} + +// A step that requests a Transaction hash via P2P and expects the correct full blob tx +type DevP2PRequestPooledTransactionHash struct { + // Client index to request the transaction hash from + ClientIndex uint64 + // Transaction Index to request + TransactionIndexes []uint64 + // Wait for a new pooled transaction message before actually requesting the transaction + WaitForNewPooledTransaction bool +} + +func (step DevP2PRequestPooledTransactionHash) Execute(t *BlobTestContext) error { + // Get client index's enode + if step.ClientIndex >= uint64(len(t.TestEngines)) { + return fmt.Errorf("invalid client index %d", step.ClientIndex) + } + engine := t.Engines[step.ClientIndex] + conn, err := devp2p.PeerEngineClient(engine, t.CLMock) + if err != nil { + return fmt.Errorf("error peering engine client: %v", err) + } + defer conn.Close() + t.Logf("INFO: Connected to client %d, remote public key: %s", step.ClientIndex, conn.RemoteKey()) + + var ( + txHashes = make([]common.Hash, len(step.TransactionIndexes)) + txs = make([]typ.Transaction, len(step.TransactionIndexes)) + ok bool + ) + for i, txIndex := range step.TransactionIndexes { + txHashes[i], ok = t.TestBlobTxPool.HashesByIndex[txIndex] + if !ok { + return fmt.Errorf("transaction index %d not found", step.TransactionIndexes[0]) + } + txs[i], ok = t.TestBlobTxPool.Transactions[txHashes[i]] + if !ok { + return fmt.Errorf("transaction %s not found", txHashes[i].String()) + } + } + + // Timeout value for all requests + timeout := 20 * time.Second + + // Wait for a new pooled transaction message + if step.WaitForNewPooledTransaction { + msg, err := conn.WaitForResponse(timeout, 0) + if err != nil { + return errors.Wrap(err, "error waiting for response") + } + switch msg := msg.(type) { + case *devp2p.NewPooledTransactionHashes: + if len(msg.Hashes) != len(txHashes) { + return fmt.Errorf("expected %d hashes, got %d", len(txHashes), len(msg.Hashes)) + } + if len(msg.Types) != len(txHashes) { + return fmt.Errorf("expected %d types, got %d", len(txHashes), len(msg.Types)) + } + if len(msg.Sizes) != len(txHashes) { + return fmt.Errorf("expected %d sizes, got %d", len(txHashes), len(msg.Sizes)) + } + for i := 0; i < len(txHashes); i++ { + hash, typ, size := msg.Hashes[i], msg.Types[i], msg.Sizes[i] + // Get the transaction + tx, ok := t.TestBlobTxPool.Transactions[hash] + if !ok { + return fmt.Errorf("transaction %s not found", hash.String()) + } + + if typ != tx.Type() { + return fmt.Errorf("expected type %d, got %d", tx.Type(), typ) + } + + b, err := tx.MarshalBinary() + if err != nil { + return errors.Wrap(err, "error marshaling transaction") + } + if size != uint32(len(b)) { + return fmt.Errorf("expected size %d, got %d", len(b), size) + } + } + default: + return fmt.Errorf("unexpected message type: %T", msg) + } + } + + // Send the request for the pooled transactions + getTxReq := &devp2p.GetPooledTransactions{ + RequestId: 1234, + GetPooledTransactionsPacket: txHashes, + } + if size, err := conn.Write(getTxReq); err != nil { + return errors.Wrap(err, "could not write to conn") + } else { + t.Logf("INFO: Wrote %d bytes to conn", size) + } + + // Wait for the response + msg, err := conn.WaitForResponse(timeout, getTxReq.RequestId) + if err != nil { + return errors.Wrap(err, "error waiting for response") + } + switch msg := msg.(type) { + case *devp2p.PooledTransactions: + if len(msg.PooledTransactionsBytesPacket) != len(txHashes) { + return fmt.Errorf("expected %d txs, got %d", len(txHashes), len(msg.PooledTransactionsBytesPacket)) + } + for i, txBytes := range msg.PooledTransactionsBytesPacket { + tx := txs[i] + + expBytes, err := tx.MarshalBinary() + if err != nil { + return errors.Wrap(err, "error marshaling transaction") + } + + if len(expBytes) != len(txBytes) { + return fmt.Errorf("expected size %d, got %d", len(expBytes), len(txBytes)) + } + + if bytes.Compare(expBytes, txBytes) != 0 { + return fmt.Errorf("expected tx %#x, got %#x", expBytes, txBytes) + } + + } + default: + return fmt.Errorf("unexpected message type: %T", msg) + } + return nil +} + +func (step DevP2PRequestPooledTransactionHash) Description() string { + return fmt.Sprintf("DevP2PRequestPooledTransactionHash: client %d, transaction indexes %v", step.ClientIndex, step.TransactionIndexes) +} diff --git a/simulators/ethereum/engine/suites/blobs/tests.go b/simulators/ethereum/engine/suites/blobs/tests.go new file mode 100644 index 0000000000..4d67db1c15 --- /dev/null +++ b/simulators/ethereum/engine/suites/blobs/tests.go @@ -0,0 +1,1316 @@ +// # Test suite for blob tests +package suite_blobs + +import ( + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/hive/simulators/ethereum/engine/client/hive_rpc" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" +) + +var ( + DATAHASH_START_ADDRESS = big.NewInt(0x100) + DATAHASH_ADDRESS_COUNT = 1000 + + // Fork specific constants + GAS_PER_BLOB = uint64(0x20000) + + MIN_DATA_GASPRICE = uint64(1) + MAX_BLOB_GAS_PER_BLOCK = uint64(786432) + TARGET_BLOB_GAS_PER_BLOCK = uint64(393216) + + TARGET_BLOBS_PER_BLOCK = uint64(TARGET_BLOB_GAS_PER_BLOCK / GAS_PER_BLOB) + MAX_BLOBS_PER_BLOCK = uint64(MAX_BLOB_GAS_PER_BLOCK / GAS_PER_BLOB) + + BLOB_GASPRICE_UPDATE_FRACTION = uint64(3338477) + + BLOB_COMMITMENT_VERSION_KZG = byte(0x01) + + // Engine API errors + INVALID_PARAMS_ERROR = pInt(-32602) + UNSUPPORTED_FORK_ERROR = pInt(-38005) +) + +// Precalculate the first data gas cost increase +var ( + DATA_GAS_COST_INCREMENT_EXCEED_BLOBS = GetMinExcessBlobsForBlobGasPrice(2) +) + +func pUint64(v uint64) *uint64 { + return &v +} + +func pInt(v int) *int { + return &v +} + +// Execution specification reference: +// https://github.com/ethereum/execution-apis/blob/main/src/engine/specification.md + +// List of all blob tests +var Tests = []test.SpecInterface{ + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "Blob Transactions On Block 1, Shanghai Genesis", + About: ` + Tests the Cancun fork since Block 1. + `, + }, + + // We fork on genesis + CancunForkHeight: 1, + + TestSequence: TestSequence{ + // We are starting at Shanghai genesis so send a couple payloads to reach the fork + NewPayloads{}, + + // First, we send a couple of blob transactions on genesis, + // with enough data gas cost to make sure they are included in the first block. + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + + // We create the first payload, and verify that the blob transactions + // are included in the payload. + // We also verify that the blob transactions are included in the blobs bundle. + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + }, + + // Try to increase the data gas cost of the blob transactions + // by maxing out the number of blobs for the next payloads. + SendBlobTransactions{ + BlobTransactionSendCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS/(MAX_BLOBS_PER_BLOCK-TARGET_BLOBS_PER_BLOCK) + 1, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + + // Next payloads will have max data blobs each + NewPayloads{ + PayloadCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS / (MAX_BLOBS_PER_BLOCK - TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + }, + + // But there will be an empty payload, since the data gas cost increased + // and the last blob transaction was not included. + NewPayloads{ + ExpectedIncludedBlobCount: 0, + }, + + // But it will be included in the next payload + NewPayloads{ + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + }, + }, + }, + + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "Blob Transactions On Block 1, Cancun Genesis", + About: ` + Tests the Cancun fork since genesis. + `, + }, + + // We fork on genesis + CancunForkHeight: 0, + + TestSequence: TestSequence{ + NewPayloads{}, // Create a single empty payload to push the client through the fork. + // First, we send a couple of blob transactions on genesis, + // with enough data gas cost to make sure they are included in the first block. + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + + // We create the first payload, and verify that the blob transactions + // are included in the payload. + // We also verify that the blob transactions are included in the blobs bundle. + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + }, + + // Try to increase the data gas cost of the blob transactions + // by maxing out the number of blobs for the next payloads. + SendBlobTransactions{ + BlobTransactionSendCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS/(MAX_BLOBS_PER_BLOCK-TARGET_BLOBS_PER_BLOCK) + 1, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + + // Next payloads will have max data blobs each + NewPayloads{ + PayloadCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS / (MAX_BLOBS_PER_BLOCK - TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + }, + + // But there will be an empty payload, since the data gas cost increased + // and the last blob transaction was not included. + NewPayloads{ + ExpectedIncludedBlobCount: 0, + }, + + // But it will be included in the next payload + NewPayloads{ + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + }, + }, + }, + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "Blob Transaction Ordering, Single Account", + About: ` + Send N blob transactions with MAX_BLOBS_PER_BLOCK-1 blobs each, + using account A. + Using same account, and an increased nonce from the previously sent + transactions, send N blob transactions with 1 blob each. + Verify that the payloads are created with the correct ordering: + - The first payloads must include the first N blob transactions. + - The last payloads must include the last single-blob transactions. + All transactions have sufficient data gas price to be included any + of the payloads. + `, + }, + + // We fork on genesis + CancunForkHeight: 0, + + TestSequence: TestSequence{ + // First send the MAX_BLOBS_PER_BLOCK-1 blob transactions. + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK - 1, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + }, + // Then send the single-blob transactions + SendBlobTransactions{ + BlobTransactionSendCount: MAX_BLOBS_PER_BLOCK + 1, + BlobsPerTransaction: 1, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + }, + + // First four payloads have MAX_BLOBS_PER_BLOCK-1 blobs each + NewPayloads{ + PayloadCount: 4, + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK - 1, + }, + + // The rest of the payloads have full blobs + NewPayloads{ + PayloadCount: 2, + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + }, + }, + }, + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "Blob Transaction Ordering, Single Account 2", + About: ` + Send N blob transactions with MAX_BLOBS_PER_BLOCK-1 blobs each, + using account A. + Using same account, and an increased nonce from the previously sent + transactions, send a single 2-blob transaction, and send N blob + transactions with 1 blob each. + Verify that the payloads are created with the correct ordering: + - The first payloads must include the first N blob transactions. + - The last payloads must include the rest of the transactions. + All transactions have sufficient data gas price to be included any + of the payloads. + `, + }, + + // We fork on genesis + CancunForkHeight: 0, + + TestSequence: TestSequence{ + // First send the MAX_BLOBS_PER_BLOCK-1 blob transactions. + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK - 1, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + }, + + // Then send the dual-blob transaction + SendBlobTransactions{ + BlobTransactionSendCount: 1, + BlobsPerTransaction: 2, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + }, + + // Then send the single-blob transactions + SendBlobTransactions{ + BlobTransactionSendCount: MAX_BLOBS_PER_BLOCK - 2, + BlobsPerTransaction: 1, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + }, + + // First five payloads have MAX_BLOBS_PER_BLOCK-1 blobs each + NewPayloads{ + PayloadCount: 5, + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK - 1, + }, + + // The rest of the payloads have full blobs + NewPayloads{ + PayloadCount: 1, + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + }, + }, + }, + + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "Blob Transaction Ordering, Multiple Accounts", + About: ` + Send N blob transactions with MAX_BLOBS_PER_BLOCK-1 blobs each, + using account A. + Send N blob transactions with 1 blob each from account B. + Verify that the payloads are created with the correct ordering: + - All payloads must have full blobs. + All transactions have sufficient data gas price to be included any + of the payloads. + `, + }, + + // We fork on genesis + CancunForkHeight: 0, + + TestSequence: TestSequence{ + // First send the MAX_BLOBS_PER_BLOCK-1 blob transactions from + // account A. + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK - 1, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 0, + }, + // Then send the single-blob transactions from account B + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: 1, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 1, + }, + + // All payloads have full blobs + NewPayloads{ + PayloadCount: 5, + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + }, + }, + }, + + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "Blob Transaction Ordering, Multiple Clients", + About: ` + Send N blob transactions with MAX_BLOBS_PER_BLOCK-1 blobs each, + using account A, to client A. + Send N blob transactions with 1 blob each from account B, to client + B. + Verify that the payloads are created with the correct ordering: + - All payloads must have full blobs. + All transactions have sufficient data gas price to be included any + of the payloads. + `, + }, + + // We fork on genesis + CancunForkHeight: 0, + + TestSequence: TestSequence{ + // Start a secondary client to also receive blob transactions + LaunchClients{ + EngineStarter: hive_rpc.HiveRPCEngineStarter{}, + // Skip adding the second client to the CL Mock to guarantee + // that all payloads are produced by client A. + // This is done to not have client B prioritizing single-blob + // transactions to fill one single payload. + SkipAddingToCLMock: true, + }, + + // Create a block without any blobs to get past genesis + NewPayloads{ + PayloadCount: 1, + ExpectedIncludedBlobCount: 0, + }, + + // First send the MAX_BLOBS_PER_BLOCK-1 blob transactions from + // account A, to client A. + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK - 1, + BlobTransactionMaxBlobGasCost: big.NewInt(120), + AccountIndex: 0, + ClientIndex: 0, + }, + // Then send the single-blob transactions from account B, to client + // B. + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: 1, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 1, + ClientIndex: 1, + }, + + // All payloads have full blobs + NewPayloads{ + PayloadCount: 5, + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + // Wait a bit more on before requesting the built payload from the client + GetPayloadDelay: 2, + }, + }, + }, + + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "Replace Blob Transactions", + About: ` + Test sending multiple blob transactions with the same nonce, but + higher gas tip so the transaction is replaced. + `, + }, + + // We fork on genesis + CancunForkHeight: 0, + + TestSequence: TestSequence{ + // Send multiple blob transactions with the same nonce. + SendBlobTransactions{ // Blob ID 0 + BlobTransactionSendCount: 1, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + BlobTransactionGasFeeCap: big.NewInt(1e9), + BlobTransactionGasTipCap: big.NewInt(1e9), + }, + SendBlobTransactions{ // Blob ID 1 + BlobTransactionSendCount: 1, + BlobTransactionMaxBlobGasCost: big.NewInt(1e2), + BlobTransactionGasFeeCap: big.NewInt(1e10), + BlobTransactionGasTipCap: big.NewInt(1e10), + ReplaceTransactions: true, + }, + SendBlobTransactions{ // Blob ID 2 + BlobTransactionSendCount: 1, + BlobTransactionMaxBlobGasCost: big.NewInt(1e3), + BlobTransactionGasFeeCap: big.NewInt(1e11), + BlobTransactionGasTipCap: big.NewInt(1e11), + ReplaceTransactions: true, + }, + SendBlobTransactions{ // Blob ID 3 + BlobTransactionSendCount: 1, + BlobTransactionMaxBlobGasCost: big.NewInt(1e4), + BlobTransactionGasFeeCap: big.NewInt(1e12), + BlobTransactionGasTipCap: big.NewInt(1e12), + ReplaceTransactions: true, + }, + + // We create the first payload, which must contain the blob tx + // with the higher tip. + NewPayloads{ + ExpectedIncludedBlobCount: 1, + ExpectedBlobs: []helper.BlobID{3}, + }, + }, + }, + + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "Parallel Blob Transactions", + About: ` + Test sending multiple blob transactions in parallel from different accounts. + `, + }, + + // We fork on genesis + CancunForkHeight: 0, + + TestSequence: TestSequence{ + // Send multiple blob transactions with the same nonce. + ParallelSteps{ + Steps: []TestStep{ + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 0, + }, + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 1, + }, + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 2, + }, + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 3, + }, + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 4, + }, + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 5, + }, + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 6, + }, + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 7, + }, + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 8, + }, + SendBlobTransactions{ + BlobTransactionSendCount: 5, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + AccountIndex: 9, + }, + }, + }, + + // We create the first payload, which is guaranteed to have the first MAX_BLOBS_PER_BLOCK blobs. + NewPayloads{ + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, MAX_BLOBS_PER_BLOCK), + }, + }, + }, + + // NewPayloadV3 Before Cancun, Negative Tests + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Nil Versioned Hashes", + About: ` + Test sending NewPayloadV3 Before Cancun with: + - nil ExcessBlobGas + - nil BlobGasUsed + - nil Versioned Hashes Array + `, + }, + + CancunForkHeight: 2, + + TestSequence: TestSequence{ + NewPayloads{ + ExpectedIncludedBlobCount: 0, + Version: 3, + VersionedHashes: &VersionedHashes{ + Blobs: nil, + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, + }, + }, + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Before Cancun, Nil ExcessBlobGas, 0x00 BlobGasUsed, Nil Versioned Hashes", + About: ` + Test sending NewPayloadV3 Before Cancun with: + - nil ExcessBlobGas + - 0x00 BlobGasUsed + - nil Versioned Hashes Array + `, + }, + + CancunForkHeight: 2, + + TestSequence: TestSequence{ + NewPayloads{ + ExpectedIncludedBlobCount: 0, + Version: 3, + PayloadCustomizer: &helper.CustomPayloadData{ + BlobGasUsed: pUint64(0), + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, + }, + }, + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Before Cancun, 0x00 ExcessBlobGas, Nil BlobGasUsed, Nil Versioned Hashes", + About: ` + Test sending NewPayloadV3 Before Cancun with: + - 0x00 ExcessBlobGas + - nil BlobGasUsed + - nil Versioned Hashes Array + `, + }, + + CancunForkHeight: 2, + + TestSequence: TestSequence{ + NewPayloads{ + ExpectedIncludedBlobCount: 0, + Version: 3, + PayloadCustomizer: &helper.CustomPayloadData{ + ExcessBlobGas: pUint64(0), + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, + }, + }, + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Empty Array Versioned Hashes", + About: ` + Test sending NewPayloadV3 Before Cancun with: + - nil ExcessBlobGas + - nil BlobGasUsed + - Empty Versioned Hashes Array + `, + }, + + CancunForkHeight: 2, + + TestSequence: TestSequence{ + NewPayloads{ + ExpectedIncludedBlobCount: 0, + Version: 3, + VersionedHashes: &VersionedHashes{ + Blobs: []helper.BlobID{}, + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, + }, + }, + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Before Cancun, 0x00 Data Fields, Empty Array Versioned Hashes", + About: ` + Test sending NewPayloadV3 Before Cancun with: + - 0x00 ExcessBlobGas + - 0x00 BlobGasUsed + - Empty Versioned Hashes Array + `, + }, + + CancunForkHeight: 2, + + TestSequence: TestSequence{ + NewPayloads{ + ExpectedIncludedBlobCount: 0, + Version: 3, + VersionedHashes: &VersionedHashes{ + Blobs: []helper.BlobID{}, + }, + PayloadCustomizer: &helper.CustomPayloadData{ + ExcessBlobGas: pUint64(0), + BlobGasUsed: pUint64(0), + }, + ExpectedError: UNSUPPORTED_FORK_ERROR, + }, + }, + }, + + // NewPayloadV3 After Cancun, Negative Tests + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 After Cancun, Nil ExcessBlobGas, 0x00 BlobGasUsed, Empty Array Versioned Hashes", + About: ` + Test sending NewPayloadV3 After Cancun with: + - nil ExcessBlobGas + - 0x00 BlobGasUsed + - Empty Versioned Hashes Array + `, + }, + + CancunForkHeight: 1, + + TestSequence: TestSequence{ + NewPayloads{ + ExpectedIncludedBlobCount: 0, + Version: 3, + PayloadCustomizer: &helper.CustomPayloadData{ + RemoveExcessBlobGas: true, + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, + }, + }, + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 After Cancun, 0x00 ExcessBlobGas, Nil BlobGasUsed, Empty Array Versioned Hashes", + About: ` + Test sending NewPayloadV3 After Cancun with: + - 0x00 ExcessBlobGas + - nil BlobGasUsed + - Empty Versioned Hashes Array + `, + }, + + CancunForkHeight: 1, + + TestSequence: TestSequence{ + NewPayloads{ + ExpectedIncludedBlobCount: 0, + Version: 3, + PayloadCustomizer: &helper.CustomPayloadData{ + RemoveBlobGasUsed: true, + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, + }, + }, + + // Test versioned hashes in Engine API NewPayloadV3 + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Missing Hash", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + is missing one of the hashes. + `, + }, + TestSequence: TestSequence{ + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + VersionedHashes: &VersionedHashes{ + Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Extra Hash", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + is has an extra hash for a blob that is not in the payload. + `, + }, + // TODO: It could be worth it to also test this with a blob that is in the + // mempool but was not included in the payload. + TestSequence: TestSequence{ + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + VersionedHashes: &VersionedHashes{ + Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK+1), + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Out of Order", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + is out of order. + `, + }, + TestSequence: TestSequence{ + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + VersionedHashes: &VersionedHashes{ + Blobs: helper.GetBlobListByIndex(helper.BlobID(TARGET_BLOBS_PER_BLOCK-1), 0), + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Repeated Hash", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + has a blob that is repeated in the array. + `, + }, + TestSequence: TestSequence{ + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + VersionedHashes: &VersionedHashes{ + Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), helper.BlobID(TARGET_BLOBS_PER_BLOCK-1)), + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Incorrect Hash", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + has a blob hash that does not belong to any blob contained in the payload. + `, + }, + TestSequence: TestSequence{ + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + VersionedHashes: &VersionedHashes{ + Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), helper.BlobID(TARGET_BLOBS_PER_BLOCK)), + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Incorrect Version", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + has a single blob that has an incorrect version. + `, + }, + TestSequence: TestSequence{ + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + VersionedHashes: &VersionedHashes{ + Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + HashVersions: []byte{BLOB_COMMITMENT_VERSION_KZG, BLOB_COMMITMENT_VERSION_KZG + 1}, + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Nil Hashes", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + is nil, even though the fork has already happened. + `, + }, + TestSequence: TestSequence{ + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + VersionedHashes: &VersionedHashes{ + Blobs: nil, + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, + }, + }, + + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Empty Hashes", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + is empty, even though there are blobs in the payload. + `, + }, + TestSequence: TestSequence{ + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + VersionedHashes: &VersionedHashes{ + Blobs: []helper.BlobID{}, + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Non-Empty Hashes", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + is contains hashes, even though there are no blobs in the payload. + `, + }, + TestSequence: TestSequence{ + NewPayloads{ + ExpectedIncludedBlobCount: 0, + ExpectedBlobs: []helper.BlobID{}, + VersionedHashes: &VersionedHashes{ + Blobs: []helper.BlobID{0}, + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + + // Test versioned hashes in Engine API NewPayloadV3 on syncing clients + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Missing Hash (Syncing)", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + is missing one of the hashes. + `, + }, + TestSequence: TestSequence{ + NewPayloads{}, // Send new payload so the parent is unknown to the secondary client + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + }, + + LaunchClients{ + EngineStarter: hive_rpc.HiveRPCEngineStarter{}, + SkipAddingToCLMock: true, + SkipConnectingToBootnode: true, // So the client is in a perpetual syncing state + }, + SendModifiedLatestPayload{ + ClientID: 1, + VersionedHashes: &VersionedHashes{ + Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Extra Hash (Syncing)", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + is has an extra hash for a blob that is not in the payload. + `, + }, + // TODO: It could be worth it to also test this with a blob that is in the + // mempool but was not included in the payload. + TestSequence: TestSequence{ + NewPayloads{}, // Send new payload so the parent is unknown to the secondary client + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + }, + + LaunchClients{ + EngineStarter: hive_rpc.HiveRPCEngineStarter{}, + SkipAddingToCLMock: true, + SkipConnectingToBootnode: true, // So the client is in a perpetual syncing state + }, + SendModifiedLatestPayload{ + ClientID: 1, + VersionedHashes: &VersionedHashes{ + Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK+1), + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Out of Order (Syncing)", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + is out of order. + `, + }, + TestSequence: TestSequence{ + NewPayloads{}, // Send new payload so the parent is unknown to the secondary client + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + }, + LaunchClients{ + EngineStarter: hive_rpc.HiveRPCEngineStarter{}, + SkipAddingToCLMock: true, + SkipConnectingToBootnode: true, // So the client is in a perpetual syncing state + }, + SendModifiedLatestPayload{ + ClientID: 1, + VersionedHashes: &VersionedHashes{ + Blobs: helper.GetBlobListByIndex(helper.BlobID(TARGET_BLOBS_PER_BLOCK-1), 0), + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Repeated Hash (Syncing)", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + has a blob that is repeated in the array. + `, + }, + TestSequence: TestSequence{ + NewPayloads{}, // Send new payload so the parent is unknown to the secondary client + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + }, + + LaunchClients{ + EngineStarter: hive_rpc.HiveRPCEngineStarter{}, + SkipAddingToCLMock: true, + SkipConnectingToBootnode: true, // So the client is in a perpetual syncing state + }, + SendModifiedLatestPayload{ + ClientID: 1, + VersionedHashes: &VersionedHashes{ + Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), helper.BlobID(TARGET_BLOBS_PER_BLOCK-1)), + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Incorrect Hash (Syncing)", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + has a blob that is repeated in the array. + `, + }, + TestSequence: TestSequence{ + NewPayloads{}, // Send new payload so the parent is unknown to the secondary client + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + }, + + LaunchClients{ + EngineStarter: hive_rpc.HiveRPCEngineStarter{}, + SkipAddingToCLMock: true, + SkipConnectingToBootnode: true, // So the client is in a perpetual syncing state + }, + SendModifiedLatestPayload{ + ClientID: 1, + VersionedHashes: &VersionedHashes{ + Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), helper.BlobID(TARGET_BLOBS_PER_BLOCK)), + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Incorrect Version (Syncing)", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + has a single blob that has an incorrect version. + `, + }, + TestSequence: TestSequence{ + NewPayloads{}, // Send new payload so the parent is unknown to the secondary client + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + }, + + LaunchClients{ + EngineStarter: hive_rpc.HiveRPCEngineStarter{}, + SkipAddingToCLMock: true, + SkipConnectingToBootnode: true, // So the client is in a perpetual syncing state + }, + SendModifiedLatestPayload{ + ClientID: 1, + VersionedHashes: &VersionedHashes{ + Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + HashVersions: []byte{BLOB_COMMITMENT_VERSION_KZG, BLOB_COMMITMENT_VERSION_KZG + 1}, + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Nil Hashes (Syncing)", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + is nil, even though the fork has already happened. + `, + }, + TestSequence: TestSequence{ + NewPayloads{}, // Send new payload so the parent is unknown to the secondary client + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + }, + + LaunchClients{ + EngineStarter: hive_rpc.HiveRPCEngineStarter{}, + SkipAddingToCLMock: true, + SkipConnectingToBootnode: true, // So the client is in a perpetual syncing state + }, + SendModifiedLatestPayload{ + ClientID: 1, + VersionedHashes: &VersionedHashes{ + Blobs: nil, + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, + }, + }, + + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Empty Hashes (Syncing)", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + is empty, even though there are blobs in the payload. + `, + }, + TestSequence: TestSequence{ + NewPayloads{}, // Send new payload so the parent is unknown to the secondary client + SendBlobTransactions{ + BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + }, + + LaunchClients{ + EngineStarter: hive_rpc.HiveRPCEngineStarter{}, + SkipAddingToCLMock: true, + SkipConnectingToBootnode: true, // So the client is in a perpetual syncing state + }, + SendModifiedLatestPayload{ + ClientID: 1, + VersionedHashes: &VersionedHashes{ + Blobs: []helper.BlobID{}, + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Versioned Hashes, Non-Empty Hashes (Syncing)", + About: ` + Tests VersionedHashes in Engine API NewPayloadV3 where the array + is contains hashes, even though there are no blobs in the payload. + `, + }, + TestSequence: TestSequence{ + NewPayloads{}, // Send new payload so the parent is unknown to the secondary client + NewPayloads{ + ExpectedIncludedBlobCount: 0, + ExpectedBlobs: []helper.BlobID{}, + }, + + LaunchClients{ + EngineStarter: hive_rpc.HiveRPCEngineStarter{}, + SkipAddingToCLMock: true, + SkipConnectingToBootnode: true, // So the client is in a perpetual syncing state + }, + SendModifiedLatestPayload{ + ClientID: 1, + VersionedHashes: &VersionedHashes{ + Blobs: []helper.BlobID{0}, + }, + ExpectedStatus: test.Invalid, + }, + }, + }, + + // BlobGasUsed, ExcessBlobGas Negative Tests + // Most cases are contained in https://github.com/ethereum/execution-spec-tests/tree/main/tests/eips/eip4844 + // and can be executed using `pyspec` simulator. + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "Incorrect BlobGasUsed: Non-Zero on Zero Blobs", + About: ` + Send a payload with zero blobs, but non-zero BlobGasUsed. + `, + }, + TestSequence: TestSequence{ + NewPayloads{ + ExpectedIncludedBlobCount: 0, + PayloadCustomizer: &helper.CustomPayloadData{ + BlobGasUsed: pUint64(1), + }, + }, + }, + }, + &BlobsBaseSpec{ + + Spec: test.Spec{ + Name: "Incorrect BlobGasUsed: GAS_PER_BLOB on Zero Blobs", + About: ` + Send a payload with zero blobs, but non-zero BlobGasUsed. + `, + }, + TestSequence: TestSequence{ + NewPayloads{ + ExpectedIncludedBlobCount: 0, + PayloadCustomizer: &helper.CustomPayloadData{ + BlobGasUsed: pUint64(GAS_PER_BLOB), + }, + }, + }, + }, + + // DevP2P tests + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "Request Blob Pooled Transactions", + About: ` + Requests blob pooled transactions and verify correct coding. + `, + }, + TestSequence: TestSequence{ + // Get past the genesis + NewPayloads{ + ExpectedIncludedBlobCount: 0, + }, + // Send multiple transactions with multiple blobs each + SendBlobTransactions{ + BlobTransactionSendCount: 1, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + DevP2PRequestPooledTransactionHash{ + ClientIndex: 0, + TransactionIndexes: []uint64{0}, + WaitForNewPooledTransaction: true, + }, + }, + }, +} + +// Blobs base spec +// This struct contains the base spec for all blob tests. It contains the +// timestamp increments per block, the withdrawals fork height, and the list of +// payloads to produce during the test. +type BlobsBaseSpec struct { + test.Spec + TimeIncrements uint64 // Timestamp increments per block throughout the test + GetPayloadDelay uint64 // Delay between FcU and GetPayload calls + CancunForkHeight uint64 // Withdrawals activation fork height + TestSequence +} + +// Base test case execution procedure for blobs tests. +func (bs *BlobsBaseSpec) Execute(t *test.Env) { + + t.CLMock.WaitForTTD() + + blobTestCtx := &BlobTestContext{ + Env: t, + TestBlobTxPool: new(TestBlobTxPool), + } + + blobTestCtx.TestBlobTxPool.HashesByIndex = make(map[uint64]common.Hash) + + if bs.GetPayloadDelay != 0 { + t.CLMock.PayloadProductionClientDelay = time.Duration(bs.GetPayloadDelay) * time.Second + } + + for stepId, step := range bs.TestSequence { + t.Logf("INFO: Executing step %d: %s", stepId+1, step.Description()) + if err := step.Execute(blobTestCtx); err != nil { + t.Fatalf("FAIL: Error executing step %d: %v", stepId+1, err) + } + } + +} diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index 66857c12b7..fad0366c2b 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -11,11 +11,11 @@ import ( "github.com/ethereum/hive/simulators/ethereum/engine/client" "github.com/ethereum/hive/simulators/ethereum/engine/client/hive_rpc" "github.com/ethereum/hive/simulators/ethereum/engine/client/node" - client_types "github.com/ethereum/hive/simulators/ethereum/engine/client/types" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" "github.com/ethereum/hive/simulators/ethereum/engine/test" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -847,8 +847,8 @@ func inconsistentForkchoiceStateGen(inconsistency string) func(t *test.Env) { // Wait until TTD is reached by this client t.CLMock.WaitForTTD() - canonicalPayloads := make([]*api.ExecutableData, 0) - alternativePayloads := make([]*api.ExecutableData, 0) + canonicalPayloads := make([]*typ.ExecutableData, 0) + alternativePayloads := make([]*typ.ExecutableData, 0) // Produce blocks before starting the test t.CLMock.ProduceBlocks(3, clmock.BlockProcessCallbacks{ OnGetPayload: func() { @@ -858,7 +858,7 @@ func inconsistentForkchoiceStateGen(inconsistency string) func(t *test.Env) { if len(alternativePayloads) > 0 { customData.ParentHash = &alternativePayloads[len(alternativePayloads)-1].BlockHash } - alternativePayload, err := helper.CustomizePayload(&t.CLMock.LatestPayloadBuilt, &customData) + alternativePayload, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to construct alternative payload: %v", t.TestName, err) } @@ -1051,7 +1051,7 @@ func badHashOnNewPayloadGen(syncing bool, sidechain bool) func(*test.Env) { t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) var ( - alteredPayload api.ExecutableData + alteredPayload typ.ExecutableData invalidPayloadHash common.Hash ) @@ -1106,9 +1106,10 @@ func badHashOnNewPayloadGen(syncing bool, sidechain bool) func(*test.Env) { t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ // Run test after the new payload has been obtained OnGetPayload: func() { - alteredPayload, err := helper.CustomizePayload(&t.CLMock.LatestPayloadBuilt, &helper.CustomPayloadData{ - ParentHash: &invalidPayloadHash, - }) + customizer := &helper.CustomPayloadData{ + ParentHash: &alteredPayload.BlockHash, + } + alteredPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to modify payload: %v", t.TestName, err) } @@ -1207,7 +1208,7 @@ func invalidPayloadTestCaseGen(payloadField helper.InvalidPayloadBlockField, syn } var ( - alteredPayload *api.ExecutableData + alteredPayload *typ.ExecutableData err error ) @@ -1344,9 +1345,10 @@ func invalidPayloadTestCaseGen(payloadField helper.InvalidPayloadBlockField, syn t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ // Run test after the new payload has been obtained OnGetPayload: func() { - followUpAlteredPayload, err := helper.CustomizePayload(&t.CLMock.LatestPayloadBuilt, &helper.CustomPayloadData{ + customizer := &helper.CustomPayloadData{ ParentHash: &alteredPayload.BlockHash, - }) + } + followUpAlteredPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to modify payload: %v", t.TestName, err) } @@ -1388,7 +1390,7 @@ func invalidMissingAncestorReOrgGen(invalid_index int, payloadField helper.Inval n := 10 // Slice to save the side B chain - altChainPayloads := make([]*api.ExecutableData, 0) + altChainPayloads := make([]*typ.ExecutableData, 0) // Append the common ancestor altChainPayloads = append(altChainPayloads, &cA) @@ -1422,14 +1424,15 @@ func invalidMissingAncestorReOrgGen(invalid_index int, payloadField helper.Inval }, OnGetPayload: func() { var ( - sidePayload *api.ExecutableData + sidePayload *typ.ExecutableData err error ) // Insert extraData to ensure we deviate from the main payload, which contains empty extradata - sidePayload, err = helper.CustomizePayload(&t.CLMock.LatestPayloadBuilt, &helper.CustomPayloadData{ + customizer := &helper.CustomPayloadData{ ParentHash: &altChainPayloads[len(altChainPayloads)-1].BlockHash, ExtraData: &([]byte{0x01}), - }) + } + sidePayload, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -1580,7 +1583,7 @@ func (spec InvalidMissingAncestorReOrgSpec) GenerateSync() func(*test.Env) { cA = b } else { t.CLMock.ProduceBlocks(int(cAHeight.Int64()), clmock.BlockProcessCallbacks{}) - cA, err = api.ExecutableDataToBlock(t.CLMock.LatestPayloadBuilt, nil) + cA, err = typ.ExecutableDataToBlock(t.CLMock.LatestPayloadBuilt, nil) if err != nil { t.Fatalf("FAIL (%s): Error converting payload to block: %v", t.TestName, err) } @@ -1628,15 +1631,16 @@ func (spec InvalidMissingAncestorReOrgSpec) GenerateSync() func(*test.Env) { }, OnGetPayload: func() { var ( - sidePayload *api.ExecutableData + sidePayload *typ.ExecutableData err error ) // Insert extraData to ensure we deviate from the main payload, which contains empty extradata pHash := altChainPayloads[len(altChainPayloads)-1].Hash() - sidePayload, err = helper.CustomizePayload(&t.CLMock.LatestPayloadBuilt, &helper.CustomPayloadData{ + customizer := &helper.CustomPayloadData{ ParentHash: &pHash, ExtraData: &([]byte{0x01}), - }) + } + sidePayload, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -1647,7 +1651,7 @@ func (spec InvalidMissingAncestorReOrgSpec) GenerateSync() func(*test.Env) { } } - sideBlock, err := api.ExecutableDataToBlock(*sidePayload, nil) + sideBlock, err := typ.ExecutableDataToBlock(*sidePayload, nil) if err != nil { t.Fatalf("FAIL (%s): Error converting payload to block: %v", t.TestName, err) } @@ -1656,7 +1660,7 @@ func (spec InvalidMissingAncestorReOrgSpec) GenerateSync() func(*test.Env) { if spec.PayloadField == helper.InvalidOmmers { if unclePayload, ok := t.CLMock.ExecutedPayloadHistory[sideBlock.NumberU64()-1]; ok && unclePayload != nil { // Uncle is a PoS payload - uncle, err = api.ExecutableDataToBlock(*unclePayload, nil) + uncle, err = typ.ExecutableDataToBlock(*unclePayload, nil) if err != nil { t.Fatalf("FAIL (%s): Unable to get uncle block: %v", t.TestName, err) } @@ -1695,9 +1699,9 @@ func (spec InvalidMissingAncestorReOrgSpec) GenerateSync() func(*test.Env) { ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) defer cancel() - p := api.BlockToExecutableData(altChainPayloads[i], common.Big0, nil, nil, nil).ExecutionPayload - pv1 := &client_types.ExecutableDataV1{} - pv1.FromExecutableData(p) + p := typ.BlockToExecutableData(altChainPayloads[i], common.Big0) + pv1 := &typ.ExecutableDataV1{} + pv1.FromExecutableData(&p) status, err := secondaryClient.NewPayloadV1(ctx, pv1) if err != nil { t.Fatalf("FAIL (%s): TEST ISSUE - Unable to send new payload: %v", t.TestName, err) @@ -1760,8 +1764,8 @@ func (spec InvalidMissingAncestorReOrgSpec) GenerateSync() func(*test.Env) { } // If we are syncing through p2p, we need to keep polling until the client syncs the missing payloads for { - ed := api.BlockToExecutableData(altChainPayloads[n], common.Big0, nil, nil, nil) - r := t.TestEngine.TestEngineNewPayloadV1(ed.ExecutionPayload) + ed := typ.BlockToExecutableData(altChainPayloads[n], common.Big0) + r := t.TestEngine.TestEngineNewPayloadV1(&ed) t.Logf("INFO (%s): Response from main client: %v", t.TestName, r.Status) s := t.TestEngine.TestEngineForkchoiceUpdatedV1(&api.ForkchoiceStateV1{ HeadBlockHash: altChainPayloads[n].Hash(), @@ -1846,7 +1850,7 @@ func blockStatusExecPayload(t *test.Env) { // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - var tx *types.Transaction + var tx typ.Transaction t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ OnPayloadProducerSelected: func() { var err error @@ -1890,7 +1894,7 @@ func blockStatusHeadBlock(t *test.Env) { // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - var tx *types.Transaction + var tx typ.Transaction t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ OnPayloadProducerSelected: func() { var err error @@ -2011,15 +2015,16 @@ func blockStatusReorg(t *test.Env) { // Run using an alternative Payload, verify that the latest info is updated after re-org customRandom := common.Hash{} rand.Read(customRandom[:]) - customizedPayload, err := helper.CustomizePayload(&t.CLMock.LatestPayloadBuilt, &helper.CustomPayloadData{ + customizer := &helper.CustomPayloadData{ PrevRandao: &customRandom, - }) + } + customizedPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } // Send custom payload and fcU to it - t.CLMock.BroadcastNewPayload(customizedPayload) + t.CLMock.BroadcastNewPayload(customizedPayload, nil) t.CLMock.BroadcastForkchoiceUpdated(&api.ForkchoiceStateV1{ HeadBlockHash: customizedPayload.BlockHash, SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, @@ -2084,7 +2089,7 @@ func reorgPrevValidatedPayloadOnSideChain(t *test.Env) { t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) var ( - sidechainPayloads = make([]*api.ExecutableData, 0) + sidechainPayloads = make([]*typ.ExecutableData, 0) sidechainPayloadCount = 5 ) @@ -2099,7 +2104,7 @@ func reorgPrevValidatedPayloadOnSideChain(t *test.Env) { if len(sidechainPayloads) > 0 { customData.ParentHash = &sidechainPayloads[len(sidechainPayloads)-1].BlockHash } - altPayload, err := helper.CustomizePayload(&t.CLMock.LatestPayloadBuilt, &customData) + altPayload, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -2148,7 +2153,7 @@ func safeReorgToSideChain(t *test.Env) { t.CLMock.WaitForTTD() // Produce an alternative chain - sidechainPayloads := make([]*api.ExecutableData, 0) + sidechainPayloads := make([]*typ.ExecutableData, 0) // Produce three payloads `P1`, `P2`, `P3`, along with the side chain payloads `P2'`, `P3'` // First payload is finalized so no alternative payload @@ -2160,11 +2165,11 @@ func safeReorgToSideChain(t *test.Env) { if len(sidechainPayloads) > 0 { altParentHash = sidechainPayloads[len(sidechainPayloads)-1].BlockHash } - altPayload, err := helper.CustomizePayload(&t.CLMock.LatestPayloadBuilt, - &helper.CustomPayloadData{ - ParentHash: &altParentHash, - ExtraData: &([]byte{0x01}), - }) + customizer := &helper.CustomPayloadData{ + ParentHash: &altParentHash, + ExtraData: &([]byte{0x01}), + } + altPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -2215,7 +2220,7 @@ func reorgBackFromSyncing(t *test.Env) { t.CLMock.WaitForTTD() // Produce an alternative chain - sidechainPayloads := make([]*api.ExecutableData, 0) + sidechainPayloads := make([]*typ.ExecutableData, 0) t.CLMock.ProduceBlocks(10, clmock.BlockProcessCallbacks{ OnGetPayload: func() { // Generate an alternative payload by simply adding extraData to the block @@ -2223,11 +2228,11 @@ func reorgBackFromSyncing(t *test.Env) { if len(sidechainPayloads) > 0 { altParentHash = sidechainPayloads[len(sidechainPayloads)-1].BlockHash } - altPayload, err := helper.CustomizePayload(&t.CLMock.LatestPayloadBuilt, - &helper.CustomPayloadData{ - ParentHash: &altParentHash, - ExtraData: &([]byte{0x01}), - }) + customizer := &helper.CustomPayloadData{ + ParentHash: &altParentHash, + ExtraData: &([]byte{0x01}), + } + altPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -2275,8 +2280,8 @@ func transactionReorg(t *test.Env) { for i := 0; i < txCount; i++ { var ( - noTxnPayload api.ExecutableData - tx *types.Transaction + noTxnPayload typ.ExecutableData + tx typ.Transaction ) // Generate two payloads, one with the transaction and the other one without it t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ @@ -2388,9 +2393,9 @@ func transactionReorgBlockhash(newNPOnRevert bool) func(t *test.Env) { for i := 0; i < txCount; i++ { var ( - mainPayload *api.ExecutableData - sidePayload *api.ExecutableData - tx *types.Transaction + mainPayload *typ.ExecutableData + sidePayload *typ.ExecutableData + tx typ.Transaction ) t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ @@ -2437,9 +2442,10 @@ func transactionReorgBlockhash(newNPOnRevert bool) func(t *test.Env) { // Create side payload with different hash var err error - sidePayload, err = helper.CustomizePayload(mainPayload, &helper.CustomPayloadData{ + customizer := &helper.CustomPayloadData{ ExtraData: &([]byte{0x01}), - }) + } + sidePayload, err = customizer.CustomizePayload(mainPayload) if err != nil { t.Fatalf("Error creating reorg payload %v", err) } @@ -2623,9 +2629,10 @@ func multipleNewCanonicalPayloads(t *test.Env) { for i := 0; i < payloadCount; i++ { newPrevRandao := common.Hash{} rand.Read(newPrevRandao[:]) - newPayload, err := helper.CustomizePayload(&basePayload, &helper.CustomPayloadData{ + customizer := &helper.CustomPayloadData{ PrevRandao: &newPrevRandao, - }) + } + newPayload, err := customizer.CustomizePayload(&basePayload) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload %v: %v", t.TestName, i, err) } @@ -2735,7 +2742,7 @@ func inOrderPayloads(t *test.Env) { func validPayloadFcUSyncingClient(t *test.Env) { var ( secondaryClient client.EngineClient - previousPayload api.ExecutableData + previousPayload typ.ExecutableData ) { // To allow sending the primary engine client into SYNCING state, we need a secondary client to guide the payload creation @@ -2888,7 +2895,7 @@ func payloadBuildAfterNewInvalidPayload(t *test.Env) { if t.CLMock.NextBlockProducer == invalidPayloadProducer.Engine { invalidPayloadProducer = secondaryEngineTest } - var inv_p *api.ExecutableData + var inv_p *typ.ExecutableData { // Get a payload from the invalid payload producer and invalidate it @@ -3061,7 +3068,7 @@ func prevRandaoOpcodeTx(t *test.Env) { var ( txCount = 10 currentTxIndex = 0 - txs = make([]*types.Transaction, 0) + txs = make([]typ.Transaction, 0) ) t.CLMock.ProduceBlocks(txCount, clmock.BlockProcessCallbacks{ OnPayloadProducerSelected: func() { diff --git a/simulators/ethereum/engine/suites/exchange_capabilities/tests.go b/simulators/ethereum/engine/suites/exchange_capabilities/tests.go index 14d1029678..bbf3630787 100644 --- a/simulators/ethereum/engine/suites/exchange_capabilities/tests.go +++ b/simulators/ethereum/engine/suites/exchange_capabilities/tests.go @@ -3,6 +3,7 @@ package suite_exchange_capabilities import ( "math/big" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/test" "golang.org/x/exp/slices" ) @@ -29,10 +30,12 @@ var ( ) var Tests = []test.SpecInterface{ + + // Shanghai ExchangeCapabilitiesSpec{ Spec: test.Spec{ Name: "Exchange Capabilities - Shanghai", - ForkConfig: test.ForkConfig{ + ForkConfig: globals.ForkConfig{ ShanghaiTimestamp: big.NewInt(0), }, }, @@ -41,12 +44,34 @@ var Tests = []test.SpecInterface{ ExchangeCapabilitiesSpec{ Spec: test.Spec{ Name: "Exchange Capabilities - Shanghai (Not active)", - ForkConfig: test.ForkConfig{ + ForkConfig: globals.ForkConfig{ ShanghaiTimestamp: big.NewInt(1000), }, }, MinimalExpectedCapabilitiesSet: ShanghaiCapabilities, }, + + // Cancun + ExchangeCapabilitiesSpec{ + Spec: test.Spec{ + Name: "Exchange Capabilities - Cancun", + ForkConfig: globals.ForkConfig{ + ShanghaiTimestamp: big.NewInt(0), + CancunTimestamp: big.NewInt(0), + }, + }, + MinimalExpectedCapabilitiesSet: CancunCapabilities, + }, + ExchangeCapabilitiesSpec{ + Spec: test.Spec{ + Name: "Exchange Capabilities - Cancun (Not active)", + ForkConfig: globals.ForkConfig{ + ShanghaiTimestamp: big.NewInt(0), + CancunTimestamp: big.NewInt(1000), + }, + }, + MinimalExpectedCapabilitiesSet: CancunCapabilities, + }, } type ExchangeCapabilitiesSpec struct { diff --git a/simulators/ethereum/engine/suites/sync/tests.go b/simulators/ethereum/engine/suites/sync/tests.go index 9f4f166fd7..ee565ef5d7 100644 --- a/simulators/ethereum/engine/suites/sync/tests.go +++ b/simulators/ethereum/engine/suites/sync/tests.go @@ -99,7 +99,7 @@ func AddSyncTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests [] } // Run the test case - test.Run(currentTest, big.NewInt(ttd), timeout, t, c, &genesis, syncClientParams, testFiles.Copy()) + test.Run(currentTest, big.NewInt(ttd), timeout, t, c, &genesis, nil, syncClientParams, testFiles.Copy()) }, }) } diff --git a/simulators/ethereum/engine/suites/withdrawals/tests.go b/simulators/ethereum/engine/suites/withdrawals/tests.go index 4d94c9e274..5269529f10 100644 --- a/simulators/ethereum/engine/suites/withdrawals/tests.go +++ b/simulators/ethereum/engine/suites/withdrawals/tests.go @@ -15,11 +15,11 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/hive/simulators/ethereum/engine/client/hive_rpc" - client_types "github.com/ethereum/hive/simulators/ethereum/engine/client/types" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" "github.com/ethereum/hive/simulators/ethereum/engine/test" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) var ( @@ -939,8 +939,8 @@ func (ws *WithdrawalsBaseSpec) GetWithdrawalsForkTime() uint64 { } // Generates the fork config, including withdrawals fork timestamp. -func (ws *WithdrawalsBaseSpec) GetForkConfig() test.ForkConfig { - return test.ForkConfig{ +func (ws *WithdrawalsBaseSpec) GetForkConfig() globals.ForkConfig { + return globals.ForkConfig{ ShanghaiTimestamp: big.NewInt(int64(ws.GetWithdrawalsForkTime())), } } @@ -1214,9 +1214,10 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { // Send produced payload but try to include non-nil // `withdrawals`, it should fail. emptyWithdrawalsList := make(types.Withdrawals, 0) - payloadPlusWithdrawals, err := helper.CustomizePayload(&t.CLMock.LatestPayloadBuilt, &helper.CustomPayloadData{ + customizer := &helper.CustomPayloadData{ Withdrawals: emptyWithdrawalsList, - }) + } + payloadPlusWithdrawals, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("Unable to append withdrawals: %v", err) } @@ -1309,9 +1310,10 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { // with null, and client must respond with `InvalidParamsError`. // Note that StateRoot is also incorrect but null withdrawals should // be checked first instead of responding `INVALID` - nilWithdrawalsPayload, err := helper.CustomizePayload(&t.CLMock.LatestPayloadBuilt, &helper.CustomPayloadData{ + customizer := &helper.CustomPayloadData{ RemoveWithdrawals: true, - }) + } + nilWithdrawalsPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("Unable to append withdrawals: %v", err) } @@ -1564,7 +1566,7 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { sidechainStartAccount = new(big.Int).SetBit(common.Big0, 160, 1) sidechainNextIndex = uint64(0) sidechainWithdrawalsHistory = make(WithdrawalsHistory) - sidechain = make(map[uint64]*beacon.ExecutableData) + sidechain = make(map[uint64]*typ.ExecutableData) sidechainPayloadId *beacon.PayloadID ) @@ -1613,7 +1615,7 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { } // Error will be ignored here since the tx could have been already relayed - secondaryEngine.SendTransactions(t.TestContext, txs) + secondaryEngine.SendTransactions(t.TestContext, txs...) if t.CLMock.CurrentPayloadNumber >= ws.GetSidechainSplitHeight() { // Also request a payload from the sidechain @@ -1664,7 +1666,7 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { OnGetPayload: func() { var ( version int - payload *beacon.ExecutableData + payload *typ.ExecutableData ) if t.CLMock.CurrentPayloadNumber >= ws.GetSidechainWithdrawalsForkHeight() { version = 2 @@ -1916,14 +1918,19 @@ func (s *MaxInitcodeSizeSpec) Execute(t *test.Env) { t.Fatalf("FAIL: Client did not include valid tx with MAX_INITCODE_SIZE") } // Customize the payload to include a tx with an invalid initcode - customPayload, err := helper.CustomizePayloadTransactions(&t.CLMock.LatestPayloadBuilt, types.Transactions{invalidTx}) - if err != nil { - t.Fatalf("FAIL: Unable to customize payload: %v", err) - } + if invTx, ok := invalidTx.(*types.Transaction); ok { + + customPayload, err := helper.CustomizePayloadTransactions(&t.CLMock.LatestPayloadBuilt, types.Transactions{invTx}) + if err != nil { + t.Fatalf("FAIL: Unable to customize payload: %v", err) + } - r := t.TestEngine.TestEngineNewPayloadV2(customPayload) - r.ExpectStatus(test.Invalid) - r.ExpectLatestValidHash(&t.CLMock.LatestPayloadBuilt.ParentHash) + r := t.TestEngine.TestEngineNewPayloadV2(customPayload) + r.ExpectStatus(test.Invalid) + r.ExpectLatestValidHash(&t.CLMock.LatestPayloadBuilt.ParentHash) + } else { + t.Fatalf("FAIL: Unable to cast invalid tx to types.Transaction") + } }, }) } @@ -1980,7 +1987,7 @@ func (req GetPayloadBodyRequestByRange) Verify(reqIndex int, testEngine *test.Te for i := req.Start; i < req.Start+count; i++ { p := payloadHistory[i] - r.ExpectPayloadBody(i-req.Start, &client_types.ExecutionPayloadBodyV1{ + r.ExpectPayloadBody(i-req.Start, &typ.ExecutionPayloadBodyV1{ Transactions: p.Transactions, Withdrawals: p.Withdrawals, }) @@ -2000,7 +2007,7 @@ func (req GetPayloadBodyRequestByHashIndex) Verify(reqIndex int, testEngine *tes defer func() { testEngine.Logf("INFO: Ended GetPayloadBodyByHash request %d, %s", reqIndex, time.Since(startTime)) }() - payloads := make([]*beacon.ExecutableData, 0) + payloads := make([]*typ.ExecutableData, 0) hashes := make([]common.Hash, 0) if len(req.BlockNumbers) > 0 { for _, n := range req.BlockNumbers { @@ -2037,9 +2044,9 @@ func (req GetPayloadBodyRequestByHashIndex) Verify(reqIndex int, testEngine *tes r := testEngine.TestEngineGetPayloadBodiesByHashV1(hashes) r.ExpectPayloadBodiesCount(uint64(len(payloads))) for i, p := range payloads { - var expectedPayloadBody *client_types.ExecutionPayloadBodyV1 + var expectedPayloadBody *typ.ExecutionPayloadBodyV1 if p != nil { - expectedPayloadBody = &client_types.ExecutionPayloadBodyV1{ + expectedPayloadBody = &typ.ExecutionPayloadBodyV1{ Transactions: p.Transactions, Withdrawals: p.Withdrawals, } @@ -2085,17 +2092,18 @@ func (ws *GetPayloadBodiesSpec) Execute(t *test.Env) { // Now we have an extra payload that follows the canonical chain, // but we need a side chain for the test. - sidechainCurrent, err := helper.CustomizePayload(&t.CLMock.LatestExecutedPayload, &helper.CustomPayloadData{ + customizer := &helper.CustomPayloadData{ Withdrawals: helper.RandomizeWithdrawalsOrder(t.CLMock.LatestExecutedPayload.Withdrawals), - }) + } + sidechainCurrent, err := customizer.CustomizePayload(&t.CLMock.LatestExecutedPayload) if err != nil { t.Fatalf("FAIL (%s): Error obtaining custom sidechain payload: %v", t.TestName, err) } - - sidechainHead, err := helper.CustomizePayload(nextCanonicalPayload, &helper.CustomPayloadData{ + customizer = &helper.CustomPayloadData{ ParentHash: &sidechainCurrent.BlockHash, Withdrawals: helper.RandomizeWithdrawalsOrder(nextCanonicalPayload.Withdrawals), - }) + } + sidechainHead, err := customizer.CustomizePayload(nextCanonicalPayload) if err != nil { t.Fatalf("FAIL (%s): Error obtaining custom sidechain payload: %v", t.TestName, err) } diff --git a/simulators/ethereum/engine/test/env.go b/simulators/ethereum/engine/test/env.go index 02281e2818..e3a0664ff9 100644 --- a/simulators/ethereum/engine/test/env.go +++ b/simulators/ethereum/engine/test/env.go @@ -29,16 +29,19 @@ type Env struct { TestContext context.Context // RPC Clients - Engine client.EngineClient - Eth client.Eth - TestEngine *TestEngineClient - HiveEngine *hive_rpc.HiveRPCEngineClient + Engine client.EngineClient + Eth client.Eth + TestEngine *TestEngineClient + HiveEngine *hive_rpc.HiveRPCEngineClient + Engines []client.EngineClient + TestEngines []*TestEngineClient // Consensus Layer Mocker Instance CLMock *clmock.CLMocker // Client parameters used to launch the default client Genesis *core.Genesis + ForkConfig *globals.ForkConfig ClientParams hivesim.Params ClientFiles hivesim.Params @@ -46,15 +49,16 @@ type Env struct { TestTransactionType helper.TestTransactionType } -func Run(testSpec SpecInterface, ttd *big.Int, timeout time.Duration, t *hivesim.T, c *hivesim.Client, genesis *core.Genesis, cParams hivesim.Params, cFiles hivesim.Params) { +func Run(testSpec SpecInterface, ttd *big.Int, timeout time.Duration, t *hivesim.T, c *hivesim.Client, genesis *core.Genesis, forkConfig *globals.ForkConfig, cParams hivesim.Params, cFiles hivesim.Params) { // Setup the CL Mocker for this test consensusConfig := testSpec.GetConsensusConfig() clMocker := clmock.NewCLMocker( t, + genesis, consensusConfig.SlotsToSafe, consensusConfig.SlotsToFinalized, big.NewInt(consensusConfig.SafeSlotsToImportOptimistically), - testSpec.GetForkConfig().ShanghaiTimestamp) + testSpec.GetForkConfig()) // Send the CLMocker for configuration by the spec, if any. testSpec.ConfigureCLMock(clMocker) @@ -80,14 +84,18 @@ func Run(testSpec SpecInterface, ttd *big.Int, timeout time.Duration, t *hivesim TestName: testSpec.GetName(), Client: c, Engine: ec, + Engines: make([]client.EngineClient, 0), Eth: ec, HiveEngine: ec, CLMock: clMocker, Genesis: genesis, + ForkConfig: forkConfig, ClientParams: cParams, ClientFiles: cFiles, TestTransactionType: testSpec.GetTestTransactionType(), } + env.Engines = append(env.Engines, ec) + env.TestEngines = append(env.TestEngines, env.TestEngine) // Before running the test, make sure Eth and Engine ports are open for the client if err := hive_rpc.CheckEthEngineLive(c); err != nil { diff --git a/simulators/ethereum/engine/test/expect.go b/simulators/ethereum/engine/test/expect.go index 6566c3dcfd..5737c4e185 100644 --- a/simulators/ethereum/engine/test/expect.go +++ b/simulators/ethereum/engine/test/expect.go @@ -14,8 +14,8 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/hive/simulators/ethereum/engine/client" - client_types "github.com/ethereum/hive/simulators/ethereum/engine/client/types" "github.com/ethereum/hive/simulators/ethereum/engine/globals" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) // Print the caller to this file @@ -208,17 +208,17 @@ func (exp *ForkchoiceResponseExpectObject) ExpectUpdatedPayloadID(previousID *ap type NewPayloadResponseExpectObject struct { *ExpectEnv - Payload *api.ExecutableData + Payload *typ.ExecutableData Status api.PayloadStatusV1 Version int Error error ErrorCode int } -func (tec *TestEngineClient) TestEngineNewPayloadV1(payload *api.ExecutableData) *NewPayloadResponseExpectObject { +func (tec *TestEngineClient) TestEngineNewPayloadV1(payload *typ.ExecutableData) *NewPayloadResponseExpectObject { ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) defer cancel() - edv1 := &client_types.ExecutableDataV1{} + edv1 := &typ.ExecutableDataV1{} edv1.FromExecutableData(payload) status, err := tec.Engine.NewPayloadV1(ctx, edv1) ret := &NewPayloadResponseExpectObject{ @@ -234,7 +234,7 @@ func (tec *TestEngineClient) TestEngineNewPayloadV1(payload *api.ExecutableData) return ret } -func (tec *TestEngineClient) TestEngineNewPayloadV2(payload *api.ExecutableData) *NewPayloadResponseExpectObject { +func (tec *TestEngineClient) TestEngineNewPayloadV2(payload *typ.ExecutableData) *NewPayloadResponseExpectObject { ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) defer cancel() status, err := tec.Engine.NewPayloadV2(ctx, payload) @@ -251,7 +251,24 @@ func (tec *TestEngineClient) TestEngineNewPayloadV2(payload *api.ExecutableData) return ret } -func (tec *TestEngineClient) TestEngineNewPayload(payload *api.ExecutableData, version int) *NewPayloadResponseExpectObject { +func (tec *TestEngineClient) TestEngineNewPayloadV3(payload *typ.ExecutableData, versionedHashes *[]common.Hash) *NewPayloadResponseExpectObject { + ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) + defer cancel() + status, err := tec.Engine.NewPayloadV3(ctx, payload, versionedHashes) + ret := &NewPayloadResponseExpectObject{ + ExpectEnv: &ExpectEnv{Env: tec.Env}, + Payload: payload, + Status: status, + Version: 3, + Error: err, + } + if err, ok := err.(rpc.Error); ok { + ret.ErrorCode = err.ErrorCode() + } + return ret +} + +func (tec *TestEngineClient) TestEngineNewPayload(payload *typ.ExecutableData, version int) *NewPayloadResponseExpectObject { if version == 2 { return tec.TestEngineNewPayloadV2(payload) } @@ -317,7 +334,7 @@ func (exp *NewPayloadResponseExpectObject) ExpectLatestValidHash(lvh *common.Has // GetPayload type GetPayloadResponseExpectObject struct { *ExpectEnv - Payload api.ExecutableData + Payload typ.ExecutableData BlockValue *big.Int Version int Error error @@ -384,7 +401,7 @@ func (exp *GetPayloadResponseExpectObject) ExpectErrorCode(code int) { } } -func ComparePayloads(want *api.ExecutableData, got *api.ExecutableData) error { +func ComparePayloads(want *typ.ExecutableData, got *typ.ExecutableData) error { if want == nil || got == nil { if want == nil && got == nil { return nil @@ -455,7 +472,7 @@ func ComparePayloads(want *api.ExecutableData, got *api.ExecutableData) error { return nil } -func (exp *GetPayloadResponseExpectObject) ExpectPayload(expectedPayload *api.ExecutableData) { +func (exp *GetPayloadResponseExpectObject) ExpectPayload(expectedPayload *typ.ExecutableData) { exp.ExpectNoError() if err := ComparePayloads(expectedPayload, &exp.Payload); err != nil { exp.Fatalf("FAIL (%s): Unexpected payload returned on EngineGetPayloadV%d: %v", exp.TestName, exp.Version, err) @@ -493,7 +510,7 @@ func (exp *GetPayloadResponseExpectObject) ExpectTimestamp(expectedTimestamp uin // GetPayloadBodies type GetPayloadBodiesResponseExpectObject struct { *ExpectEnv - PayloadBodies []*client_types.ExecutionPayloadBodyV1 + PayloadBodies []*typ.ExecutionPayloadBodyV1 BlockValue *big.Int Version int Error error @@ -630,7 +647,7 @@ func CompareWithdrawals(want []*types.Withdrawal, got []*types.Withdrawal) error return nil } -func ComparePayloadBodies(want *client_types.ExecutionPayloadBodyV1, got *client_types.ExecutionPayloadBodyV1) error { +func ComparePayloadBodies(want *typ.ExecutionPayloadBodyV1, got *typ.ExecutionPayloadBodyV1) error { if want == nil || got == nil { if want == nil && got == nil { return nil @@ -649,7 +666,7 @@ func ComparePayloadBodies(want *client_types.ExecutionPayloadBodyV1, got *client return nil } -func (exp *GetPayloadBodiesResponseExpectObject) ExpectPayloadBody(index uint64, payloadBody *client_types.ExecutionPayloadBodyV1) { +func (exp *GetPayloadBodiesResponseExpectObject) ExpectPayloadBody(index uint64, payloadBody *typ.ExecutionPayloadBodyV1) { exp.ExpectNoError() if exp.PayloadBodies == nil { exp.Fatalf("FAIL (%s): Expected payload body in list on EngineGetPayloadBodiesV%d, but list is nil", exp.TestName, exp.Version) @@ -1017,3 +1034,27 @@ func (exp *TransactionReceiptExpectObject) ExpectBlockHash(expectedHash common.H exp.Fatalf("FAIL (%s): Unexpected transaction block hash on %s: %v, blockhash=%v, expected=%v", exp.TestName, exp.Call, exp.Receipt.TxHash, exp.Receipt.BlockHash, expectedHash) } } + +func (exp *TransactionReceiptExpectObject) ExpectBlobGasUsed(expectedBlobGasUsed *uint64) { + exp.ExpectNoError() + /* + TODO: ENABLE! + if (expectedBlobGasUsed == nil || exp.Receipt.BlobGasUsed == nil) && expectedBlobGasUsed != exp.Receipt.BlobGasUsed { + exp.Fatalf("FAIL (%s): Unexpected transaction data gas used on %s: %v, dataGasUsed=%v, expected=%v", exp.TestName, exp.Call, exp.Receipt.TxHash, exp.Receipt.BlobGasUsed, expectedBlobGasUsed) + } else if expectedBlobGasUsed != nil && exp.Receipt.BlobGasUsed != nil && *expectedBlobGasUsed != *exp.Receipt.BlobGasUsed { + exp.Fatalf("FAIL (%s): Unexpected transaction data gas used on %s: %v, dataGasUsed=0x%x, expected=0x%x", exp.TestName, exp.Call, exp.Receipt.TxHash, *exp.Receipt.BlobGasUsed, *expectedBlobGasUsed) + } + */ +} + +func (exp *TransactionReceiptExpectObject) ExpectBlobGasPrice(expectedBlobGasPrice *uint64) { + exp.ExpectNoError() + /* + TODO: ENABLE! + if (expectedBlobGasPrice == nil || exp.Receipt.BlobGasPrice == nil) && expectedBlobGasPrice != exp.Receipt.BlobGasPrice { + exp.Fatalf("FAIL (%s): Unexpected transaction data gas price on %s: %v, BlobGasPrice=%v, expected=%v", exp.TestName, exp.Call, exp.Receipt.TxHash, exp.Receipt.BlobGasPrice, expectedBlobGasPrice) + } else if expectedBlobGasPrice != nil && exp.Receipt.BlobGasPrice != nil && *expectedBlobGasPrice != *exp.Receipt.BlobGasPrice { + exp.Fatalf("FAIL (%s): Unexpected transaction data gas price on %s: %v, BlobGasPrice=0x%x, expected=0x%x", exp.TestName, exp.Call, exp.Receipt.TxHash, *exp.Receipt.BlobGasPrice, *expectedBlobGasPrice) + } + */ +} diff --git a/simulators/ethereum/engine/test/spec.go b/simulators/ethereum/engine/test/spec.go index d2c14fcc5f..cb6834d30d 100644 --- a/simulators/ethereum/engine/test/spec.go +++ b/simulators/ethereum/engine/test/spec.go @@ -1,19 +1,16 @@ package test import ( + "errors" "fmt" "math/big" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" ) -type ForkConfig struct { - // Shanghai Fork Timestamp - ShanghaiTimestamp *big.Int -} - type ConsensusConfig struct { SlotsToSafe *big.Int SlotsToFinalized *big.Int @@ -26,7 +23,7 @@ type SpecInterface interface { GetAbout() string GetConsensusConfig() ConsensusConfig GetChainFile() string - GetForkConfig() ForkConfig + GetForkConfig() globals.ForkConfig GetGenesis() *core.Genesis GetName() string GetTestTransactionType() helper.TestTransactionType @@ -76,7 +73,7 @@ type Spec struct { TestTransactionType helper.TestTransactionType // Fork Config - ForkConfig + globals.ForkConfig } func (s Spec) Execute(env *Env) { @@ -102,7 +99,7 @@ func (s Spec) GetChainFile() string { return s.ChainFile } -func (s Spec) GetForkConfig() ForkConfig { +func (s Spec) GetForkConfig() globals.ForkConfig { return s.ForkConfig } @@ -116,6 +113,18 @@ func (s Spec) GetGenesis() *core.Genesis { if genesis.Difficulty.Cmp(genesis.Config.TerminalTotalDifficulty) <= 0 { genesis.Config.TerminalTotalDifficultyPassed = true } + + // Add balance to all the test accounts + for _, testAcc := range globals.TestAccounts { + balance, ok := new(big.Int).SetString("123450000000000000000", 16) + if !ok { + panic(errors.New("failed to parse balance")) + } + genesis.Alloc[testAcc.GetAddress()] = core.GenesisAccount{ + Balance: balance, + } + } + return &genesis } @@ -135,6 +144,6 @@ func (s Spec) IsMiningDisabled() bool { return s.DisableMining } -var LatestFork = ForkConfig{ +var LatestFork = globals.ForkConfig{ ShanghaiTimestamp: big.NewInt(0), } diff --git a/simulators/ethereum/engine/types/blobs.go b/simulators/ethereum/engine/types/blobs.go new file mode 100644 index 0000000000..6bfb764b3d --- /dev/null +++ b/simulators/ethereum/engine/types/blobs.go @@ -0,0 +1,163 @@ +package types + +import ( + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + + gokzg4844 "github.com/crate-crypto/go-kzg-4844" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +// Blob Types + +const ( + BlobCommitmentVersionKZG uint8 = 0x01 + FieldElementsPerBlob int = 4096 +) + +type KZGCommitment [48]byte + +func (p KZGCommitment) MarshalText() ([]byte, error) { + return []byte("0x" + hex.EncodeToString(p[:])), nil +} + +func (p KZGCommitment) String() string { + return "0x" + hex.EncodeToString(p[:]) +} + +func (p *KZGCommitment) UnmarshalText(text []byte) error { + return hexutil.UnmarshalFixedText("KZGCommitment", text, p[:]) +} + +// KZGToVersionedHash implements kzg_to_versioned_hash from EIP-4844 +func KZGToVersionedHash(kzg gokzg4844.KZGCommitment) common.Hash { + h := sha256.Sum256(kzg[:]) + h[0] = BlobCommitmentVersionKZG + + return h +} + +func (c KZGCommitment) ComputeVersionedHash() common.Hash { + return common.Hash(KZGToVersionedHash(gokzg4844.KZGCommitment(c))) +} + +type KZGProof [48]byte + +func (p KZGProof) MarshalText() ([]byte, error) { + return []byte("0x" + hex.EncodeToString(p[:])), nil +} + +func (p KZGProof) String() string { + return "0x" + hex.EncodeToString(p[:]) +} + +func (p *KZGProof) UnmarshalText(text []byte) error { + return hexutil.UnmarshalFixedText("KZGProof", text, p[:]) +} + +type BLSFieldElement [32]byte + +func (p BLSFieldElement) String() string { + return "0x" + hex.EncodeToString(p[:]) +} + +func (p *BLSFieldElement) UnmarshalText(text []byte) error { + return hexutil.UnmarshalFixedText("BLSFieldElement", text, p[:]) +} + +type Blob [FieldElementsPerBlob * 32]byte + +func (blob *Blob) MarshalText() ([]byte, error) { + out := make([]byte, 2+FieldElementsPerBlob*32*2) + copy(out[:2], "0x") + hex.Encode(out[2:], blob[:]) + + return out, nil +} + +func (blob *Blob) String() string { + v, err := blob.MarshalText() + if err != nil { + return "" + } + return string(v) +} + +func (blob *Blob) UnmarshalText(text []byte) error { + if blob == nil { + return errors.New("cannot decode text into nil Blob") + } + l := 2 + FieldElementsPerBlob*32*2 + if len(text) != l { + return fmt.Errorf("expected %d characters but got %d", l, len(text)) + } + if !(text[0] == '0' && text[1] == 'x') { + return fmt.Errorf("expected '0x' prefix in Blob string") + } + if _, err := hex.Decode(blob[:], text[2:]); err != nil { + return fmt.Errorf("blob is not formatted correctly: %v", err) + } + + return nil +} + +type BlobKzgs []KZGCommitment + +type KZGProofs []KZGProof + +type Blobs []Blob + +// Return KZG commitments, versioned hashes and the proofs that correspond to these blobs +func (blobs Blobs) ComputeCommitmentsAndProofs(cryptoCtx gokzg4844.Context) (commitments []KZGCommitment, versionedHashes []common.Hash, proofs []KZGProof, err error) { + commitments = make([]KZGCommitment, len(blobs)) + proofs = make([]KZGProof, len(blobs)) + versionedHashes = make([]common.Hash, len(blobs)) + + for i, blob := range blobs { + commitment, err := cryptoCtx.BlobToKZGCommitment(gokzg4844.Blob(blob), 1) + if err != nil { + return nil, nil, nil, fmt.Errorf("could not convert blob to commitment: %v", err) + } + + proof, err := cryptoCtx.ComputeBlobKZGProof(gokzg4844.Blob(blob), commitment, 1) + if err != nil { + return nil, nil, nil, fmt.Errorf("could not compute proof for blob: %v", err) + } + commitments[i] = KZGCommitment(commitment) + proofs[i] = KZGProof(proof) + versionedHashes[i] = common.Hash(KZGToVersionedHash(gokzg4844.KZGCommitment(commitment))) + } + + return commitments, versionedHashes, proofs, nil +} + +type BlobTxWrapData struct { + Blobs Blobs + Commitments BlobKzgs + Proofs KZGProofs +} + +// BlobsBundle holds the blobs of an execution payload +type BlobsBundle struct { + Commitments []KZGCommitment `json:"commitments" gencodec:"required"` + Blobs []Blob `json:"blobs" gencodec:"required"` + Proofs []KZGProof `json:"proofs" gencodec:"required"` +} + +func (bb *BlobsBundle) VersionedHashes(commitmentVersion byte) (*[]common.Hash, error) { + if bb == nil { + return nil, errors.New("nil blob bundle") + } + if bb.Commitments == nil { + return nil, errors.New("nil commitments") + } + versionedHashes := make([]common.Hash, len(bb.Commitments)) + for i, commitment := range bb.Commitments { + sha256Hash := sha256.Sum256(commitment[:]) + versionedHashes[i] = common.BytesToHash(append([]byte{commitmentVersion}, sha256Hash[1:]...)) + } + return &versionedHashes, nil +} diff --git a/simulators/ethereum/engine/types/gen_blockparams.go b/simulators/ethereum/engine/types/gen_blockparams.go new file mode 100644 index 0000000000..c4a589e583 --- /dev/null +++ b/simulators/ethereum/engine/types/gen_blockparams.go @@ -0,0 +1,66 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package types + +import ( + "encoding/json" + "errors" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" +) + +var _ = (*payloadAttributesMarshaling)(nil) + +// MarshalJSON marshals as JSON. +func (p PayloadAttributes) MarshalJSON() ([]byte, error) { + type PayloadAttributes struct { + Timestamp hexutil.Uint64 `json:"timestamp" gencodec:"required"` + Random common.Hash `json:"prevRandao" gencodec:"required"` + SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient" gencodec:"required"` + Withdrawals []*types.Withdrawal `json:"withdrawals"` + ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` + } + var enc PayloadAttributes + enc.Timestamp = hexutil.Uint64(p.Timestamp) + enc.Random = p.Random + enc.SuggestedFeeRecipient = p.SuggestedFeeRecipient + enc.Withdrawals = p.Withdrawals + enc.ParentBeaconBlockRoot = p.ParentBeaconBlockRoot + return json.Marshal(&enc) +} + +// UnmarshalJSON unmarshals from JSON. +func (p *PayloadAttributes) UnmarshalJSON(input []byte) error { + type PayloadAttributes struct { + Timestamp *hexutil.Uint64 `json:"timestamp" gencodec:"required"` + Random *common.Hash `json:"prevRandao" gencodec:"required"` + SuggestedFeeRecipient *common.Address `json:"suggestedFeeRecipient" gencodec:"required"` + Withdrawals []*types.Withdrawal `json:"withdrawals"` + ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` + } + var dec PayloadAttributes + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.Timestamp == nil { + return errors.New("missing required field 'timestamp' for PayloadAttributes") + } + p.Timestamp = uint64(*dec.Timestamp) + if dec.Random == nil { + return errors.New("missing required field 'prevRandao' for PayloadAttributes") + } + p.Random = *dec.Random + if dec.SuggestedFeeRecipient == nil { + return errors.New("missing required field 'suggestedFeeRecipient' for PayloadAttributes") + } + p.SuggestedFeeRecipient = *dec.SuggestedFeeRecipient + if dec.Withdrawals != nil { + p.Withdrawals = dec.Withdrawals + } + if dec.ParentBeaconBlockRoot != nil { + p.ParentBeaconBlockRoot = dec.ParentBeaconBlockRoot + } + return nil +} diff --git a/simulators/ethereum/engine/types/gen_ed.go b/simulators/ethereum/engine/types/gen_ed.go new file mode 100644 index 0000000000..b4e127b73a --- /dev/null +++ b/simulators/ethereum/engine/types/gen_ed.go @@ -0,0 +1,164 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package types + +import ( + "encoding/json" + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" +) + +var _ = (*executableDataMarshaling)(nil) + +// MarshalJSON marshals as JSON. +func (e ExecutableData) MarshalJSON() ([]byte, error) { + type ExecutableData struct { + ParentHash common.Hash `json:"parentHash" gencodec:"required"` + FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` + StateRoot common.Hash `json:"stateRoot" gencodec:"required"` + ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` + LogsBloom hexutil.Bytes `json:"logsBloom" gencodec:"required"` + Random common.Hash `json:"prevRandao" gencodec:"required"` + Number hexutil.Uint64 `json:"blockNumber" gencodec:"required"` + GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"` + GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` + Timestamp hexutil.Uint64 `json:"timestamp" gencodec:"required"` + ExtraData hexutil.Bytes `json:"extraData" gencodec:"required"` + BaseFeePerGas *hexutil.Big `json:"baseFeePerGas" gencodec:"required"` + BlockHash common.Hash `json:"blockHash" gencodec:"required"` + Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` + Withdrawals []*types.Withdrawal `json:"withdrawals"` + BlobGasUsed *hexutil.Uint64 `json:"blobGasUsed"` + ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas"` + ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` + } + var enc ExecutableData + enc.ParentHash = e.ParentHash + enc.FeeRecipient = e.FeeRecipient + enc.StateRoot = e.StateRoot + enc.ReceiptsRoot = e.ReceiptsRoot + enc.LogsBloom = e.LogsBloom + enc.Random = e.Random + enc.Number = hexutil.Uint64(e.Number) + enc.GasLimit = hexutil.Uint64(e.GasLimit) + enc.GasUsed = hexutil.Uint64(e.GasUsed) + enc.Timestamp = hexutil.Uint64(e.Timestamp) + enc.ExtraData = e.ExtraData + enc.BaseFeePerGas = (*hexutil.Big)(e.BaseFeePerGas) + enc.BlockHash = e.BlockHash + if e.Transactions != nil { + enc.Transactions = make([]hexutil.Bytes, len(e.Transactions)) + for k, v := range e.Transactions { + enc.Transactions[k] = v + } + } + enc.Withdrawals = e.Withdrawals + enc.BlobGasUsed = (*hexutil.Uint64)(e.BlobGasUsed) + enc.ExcessBlobGas = (*hexutil.Uint64)(e.ExcessBlobGas) + enc.ParentBeaconBlockRoot = e.ParentBeaconBlockRoot + return json.Marshal(&enc) +} + +// UnmarshalJSON unmarshals from JSON. +func (e *ExecutableData) UnmarshalJSON(input []byte) error { + type ExecutableData struct { + ParentHash *common.Hash `json:"parentHash" gencodec:"required"` + FeeRecipient *common.Address `json:"feeRecipient" gencodec:"required"` + StateRoot *common.Hash `json:"stateRoot" gencodec:"required"` + ReceiptsRoot *common.Hash `json:"receiptsRoot" gencodec:"required"` + LogsBloom *hexutil.Bytes `json:"logsBloom" gencodec:"required"` + Random *common.Hash `json:"prevRandao" gencodec:"required"` + Number *hexutil.Uint64 `json:"blockNumber" gencodec:"required"` + GasLimit *hexutil.Uint64 `json:"gasLimit" gencodec:"required"` + GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"` + Timestamp *hexutil.Uint64 `json:"timestamp" gencodec:"required"` + ExtraData *hexutil.Bytes `json:"extraData" gencodec:"required"` + BaseFeePerGas *hexutil.Big `json:"baseFeePerGas" gencodec:"required"` + BlockHash *common.Hash `json:"blockHash" gencodec:"required"` + Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` + Withdrawals []*types.Withdrawal `json:"withdrawals"` + BlobGasUsed *hexutil.Uint64 `json:"blobGasUsed"` + ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas"` + ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` + } + var dec ExecutableData + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.ParentHash == nil { + return errors.New("missing required field 'parentHash' for ExecutableData") + } + e.ParentHash = *dec.ParentHash + if dec.FeeRecipient == nil { + return errors.New("missing required field 'feeRecipient' for ExecutableData") + } + e.FeeRecipient = *dec.FeeRecipient + if dec.StateRoot == nil { + return errors.New("missing required field 'stateRoot' for ExecutableData") + } + e.StateRoot = *dec.StateRoot + if dec.ReceiptsRoot == nil { + return errors.New("missing required field 'receiptsRoot' for ExecutableData") + } + e.ReceiptsRoot = *dec.ReceiptsRoot + if dec.LogsBloom == nil { + return errors.New("missing required field 'logsBloom' for ExecutableData") + } + e.LogsBloom = *dec.LogsBloom + if dec.Random == nil { + return errors.New("missing required field 'prevRandao' for ExecutableData") + } + e.Random = *dec.Random + if dec.Number == nil { + return errors.New("missing required field 'blockNumber' for ExecutableData") + } + e.Number = uint64(*dec.Number) + if dec.GasLimit == nil { + return errors.New("missing required field 'gasLimit' for ExecutableData") + } + e.GasLimit = uint64(*dec.GasLimit) + if dec.GasUsed == nil { + return errors.New("missing required field 'gasUsed' for ExecutableData") + } + e.GasUsed = uint64(*dec.GasUsed) + if dec.Timestamp == nil { + return errors.New("missing required field 'timestamp' for ExecutableData") + } + e.Timestamp = uint64(*dec.Timestamp) + if dec.ExtraData == nil { + return errors.New("missing required field 'extraData' for ExecutableData") + } + e.ExtraData = *dec.ExtraData + if dec.BaseFeePerGas == nil { + return errors.New("missing required field 'baseFeePerGas' for ExecutableData") + } + e.BaseFeePerGas = (*big.Int)(dec.BaseFeePerGas) + if dec.BlockHash == nil { + return errors.New("missing required field 'blockHash' for ExecutableData") + } + e.BlockHash = *dec.BlockHash + if dec.Transactions == nil { + return errors.New("missing required field 'transactions' for ExecutableData") + } + e.Transactions = make([][]byte, len(dec.Transactions)) + for k, v := range dec.Transactions { + e.Transactions[k] = v + } + if dec.Withdrawals != nil { + e.Withdrawals = dec.Withdrawals + } + if dec.BlobGasUsed != nil { + e.BlobGasUsed = (*uint64)(dec.BlobGasUsed) + } + if dec.ExcessBlobGas != nil { + e.ExcessBlobGas = (*uint64)(dec.ExcessBlobGas) + } + if dec.ParentBeaconBlockRoot != nil { + e.ParentBeaconBlockRoot = dec.ParentBeaconBlockRoot + } + return nil +} diff --git a/simulators/ethereum/engine/client/types/gen_edv1.go b/simulators/ethereum/engine/types/gen_edv1.go similarity index 100% rename from simulators/ethereum/engine/client/types/gen_edv1.go rename to simulators/ethereum/engine/types/gen_edv1.go diff --git a/simulators/ethereum/engine/client/types/gen_epbv1.go b/simulators/ethereum/engine/types/gen_epbv1.go similarity index 100% rename from simulators/ethereum/engine/client/types/gen_epbv1.go rename to simulators/ethereum/engine/types/gen_epbv1.go diff --git a/simulators/ethereum/engine/types/gen_epe.go b/simulators/ethereum/engine/types/gen_epe.go new file mode 100644 index 0000000000..82d87eecb4 --- /dev/null +++ b/simulators/ethereum/engine/types/gen_epe.go @@ -0,0 +1,52 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package types + +import ( + "encoding/json" + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/common/hexutil" +) + +var _ = (*executionPayloadEnvelopeMarshaling)(nil) + +// MarshalJSON marshals as JSON. +func (e ExecutionPayloadEnvelope) MarshalJSON() ([]byte, error) { + type ExecutionPayloadEnvelope struct { + ExecutionPayload *ExecutableData `json:"executionPayload" gencodec:"required"` + BlockValue *hexutil.Big `json:"blockValue" gencodec:"required"` + BlobsBundle *BlobsBundle `json:"blobsBundle" gencodec:"omitempty"` + } + var enc ExecutionPayloadEnvelope + enc.ExecutionPayload = e.ExecutionPayload + enc.BlockValue = (*hexutil.Big)(e.BlockValue) + enc.BlobsBundle = e.BlobsBundle + return json.Marshal(&enc) +} + +// UnmarshalJSON unmarshals from JSON. +func (e *ExecutionPayloadEnvelope) UnmarshalJSON(input []byte) error { + type ExecutionPayloadEnvelope struct { + ExecutionPayload *ExecutableData `json:"executionPayload" gencodec:"required"` + BlockValue *hexutil.Big `json:"blockValue" gencodec:"required"` + BlobsBundle *BlobsBundle `json:"blobsBundle" gencodec:"omitempty"` + } + var dec ExecutionPayloadEnvelope + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.ExecutionPayload == nil { + return errors.New("missing required field 'executionPayload' for ExecutionPayloadEnvelope") + } + e.ExecutionPayload = dec.ExecutionPayload + if dec.BlockValue == nil { + return errors.New("missing required field 'blockValue' for ExecutionPayloadEnvelope") + } + e.BlockValue = (*big.Int)(dec.BlockValue) + if dec.BlobsBundle != nil { + e.BlobsBundle = dec.BlobsBundle + } + return nil +} diff --git a/simulators/ethereum/engine/types/transactions.go b/simulators/ethereum/engine/types/transactions.go new file mode 100644 index 0000000000..05f8d8758c --- /dev/null +++ b/simulators/ethereum/engine/types/transactions.go @@ -0,0 +1,162 @@ +package types + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rlp" + "github.com/holiman/uint256" +) + +// Transaction interface +type Transaction interface { + BinaryMarshable + Protected() bool + Type() uint8 + ChainId() *big.Int + Data() []byte + AccessList() types.AccessList + Gas() uint64 + GasPrice() *big.Int + GasTipCap() *big.Int + GasFeeCap() *big.Int + Value() *big.Int + Nonce() uint64 + To() *common.Address + + Hash() common.Hash + + // Blob stuff + BlobGas() uint64 + BlobGasFeeCap() *big.Int + BlobHashes() []common.Hash +} + +// Geth's transaction type must implement the interface +var _ Transaction = (*types.Transaction)(nil) + +type TransactionWithBlobData struct { + Tx *types.Transaction + BlobData *BlobTxWrapData + MarshalMinimal bool +} + +func (tx *TransactionWithBlobData) Protected() bool { + return tx.Tx.Protected() +} + +func (tx *TransactionWithBlobData) Type() uint8 { + return tx.Tx.Type() +} + +func (tx *TransactionWithBlobData) ChainId() *big.Int { + return tx.Tx.ChainId() +} + +func (tx *TransactionWithBlobData) Data() []byte { + return tx.Tx.Data() +} + +func (tx *TransactionWithBlobData) AccessList() types.AccessList { + return tx.Tx.AccessList() +} + +func (tx *TransactionWithBlobData) Gas() uint64 { + return tx.Tx.Gas() +} + +func (tx *TransactionWithBlobData) GasPrice() *big.Int { + return tx.Tx.GasPrice() +} + +func (tx *TransactionWithBlobData) GasTipCap() *big.Int { + return tx.Tx.GasTipCap() +} + +func (tx *TransactionWithBlobData) GasFeeCap() *big.Int { + return tx.Tx.GasFeeCap() +} + +func (tx *TransactionWithBlobData) Value() *big.Int { + return tx.Tx.Value() +} + +func (tx *TransactionWithBlobData) Nonce() uint64 { + return tx.Tx.Nonce() +} + +func (tx *TransactionWithBlobData) To() *common.Address { + return tx.Tx.To() +} + +func (tx *TransactionWithBlobData) Hash() common.Hash { + return tx.Tx.Hash() +} + +func (tx *TransactionWithBlobData) BlobGas() uint64 { + return tx.Tx.BlobGas() +} + +func (tx *TransactionWithBlobData) BlobGasFeeCap() *big.Int { + return tx.Tx.BlobGasFeeCap() +} + +func (tx *TransactionWithBlobData) BlobHashes() []common.Hash { + return tx.Tx.BlobHashes() +} + +func (tx *TransactionWithBlobData) MarshalBinary() ([]byte, error) { + + if tx.BlobData == nil || tx.MarshalMinimal { + return tx.Tx.MarshalBinary() + } + + type MarshalType struct { + TxPayload types.BlobTx + Blobs []Blob + Commitments []KZGCommitment + Proofs []KZGProof + } + + pTo := tx.Tx.To() + if pTo == nil { + return nil, fmt.Errorf("to address is nil") + } + to := *pTo + + v, r, s := tx.Tx.RawSignatureValues() + + marshalBlobTx := MarshalType{ + TxPayload: types.BlobTx{ + ChainID: uint256.MustFromBig(tx.Tx.ChainId()), + Nonce: tx.Tx.Nonce(), + GasTipCap: uint256.MustFromBig(tx.Tx.GasTipCap()), + GasFeeCap: uint256.MustFromBig(tx.Tx.GasFeeCap()), + Gas: tx.Tx.Gas(), + To: to, + Value: uint256.MustFromBig(tx.Tx.Value()), + Data: tx.Tx.Data(), + AccessList: tx.Tx.AccessList(), + BlobFeeCap: uint256.MustFromBig(tx.Tx.BlobGasFeeCap()), + BlobHashes: tx.Tx.BlobHashes(), + + // Signature values + V: uint256.MustFromBig(v), + R: uint256.MustFromBig(r), + S: uint256.MustFromBig(s), + }, + Blobs: tx.BlobData.Blobs, + Commitments: tx.BlobData.Commitments, + Proofs: tx.BlobData.Proofs, + } + payloadBytes, err := rlp.EncodeToBytes(marshalBlobTx) + if err != nil { + return nil, err + } + return append([]byte{tx.Tx.Type()}, payloadBytes...), nil +} + +// Transaction with blob data must also implement the interface +var _ Transaction = (*TransactionWithBlobData)(nil) diff --git a/simulators/ethereum/engine/types/types.go b/simulators/ethereum/engine/types/types.go new file mode 100644 index 0000000000..4f1e277a47 --- /dev/null +++ b/simulators/ethereum/engine/types/types.go @@ -0,0 +1,232 @@ +package types + +import ( + "fmt" + "math/big" + + geth_beacon "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" +) + +type BinaryMarshable interface { + MarshalBinary() ([]byte, error) +} + +//go:generate go run github.com/fjl/gencodec -type ExecutionPayloadBodyV1 -field-override executionPayloadBodyV1Marshaling -out gen_epbv1.go +type ExecutionPayloadBodyV1 struct { + Transactions [][]byte `json:"transactions" gencodec:"required"` + Withdrawals []*types.Withdrawal `json:"withdrawals"` +} + +// JSON type overrides for executableData. +type executionPayloadBodyV1Marshaling struct { + Transactions []hexutil.Bytes +} + +// ExecutableData is the data necessary to execute an EL payload. +// +//go:generate go run github.com/fjl/gencodec -type ExecutableDataV1 -field-override executableDataV1Marshaling -out gen_edv1.go +type ExecutableDataV1 struct { + ParentHash common.Hash `json:"parentHash" gencodec:"required"` + FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` + StateRoot common.Hash `json:"stateRoot" gencodec:"required"` + ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` + LogsBloom []byte `json:"logsBloom" gencodec:"required"` + Random common.Hash `json:"prevRandao" gencodec:"required"` + Number uint64 `json:"blockNumber" gencodec:"required"` + GasLimit uint64 `json:"gasLimit" gencodec:"required"` + GasUsed uint64 `json:"gasUsed" gencodec:"required"` + Timestamp uint64 `json:"timestamp" gencodec:"required"` + ExtraData []byte `json:"extraData" gencodec:"required"` + BaseFeePerGas *big.Int `json:"baseFeePerGas" gencodec:"required"` + BlockHash common.Hash `json:"blockHash" gencodec:"required"` + Transactions [][]byte `json:"transactions" gencodec:"required"` +} + +// JSON type overrides for executableData. +type executableDataV1Marshaling struct { + Number hexutil.Uint64 + GasLimit hexutil.Uint64 + GasUsed hexutil.Uint64 + Timestamp hexutil.Uint64 + BaseFeePerGas *hexutil.Big + ExtraData hexutil.Bytes + LogsBloom hexutil.Bytes + Transactions []hexutil.Bytes +} + +func (edv1 *ExecutableDataV1) ToExecutableData() ExecutableData { + return ExecutableData{ + ParentHash: edv1.ParentHash, + FeeRecipient: edv1.FeeRecipient, + StateRoot: edv1.StateRoot, + ReceiptsRoot: edv1.ReceiptsRoot, + LogsBloom: edv1.LogsBloom, + Random: edv1.Random, + Number: edv1.Number, + GasLimit: edv1.GasLimit, + GasUsed: edv1.GasUsed, + Timestamp: edv1.Timestamp, + ExtraData: edv1.ExtraData, + BaseFeePerGas: edv1.BaseFeePerGas, + BlockHash: edv1.BlockHash, + Transactions: edv1.Transactions, + } +} + +func (edv1 *ExecutableDataV1) FromExecutableData(ed *ExecutableData) { + if ed.Withdrawals != nil { + panic("source executable data contains withdrawals, not supported by V1") + } + edv1.ParentHash = ed.ParentHash + edv1.FeeRecipient = ed.FeeRecipient + edv1.StateRoot = ed.StateRoot + edv1.ReceiptsRoot = ed.ReceiptsRoot + edv1.LogsBloom = ed.LogsBloom + edv1.Random = ed.Random + edv1.Number = ed.Number + edv1.GasLimit = ed.GasLimit + edv1.GasUsed = ed.GasUsed + edv1.Timestamp = ed.Timestamp + edv1.ExtraData = ed.ExtraData + edv1.BaseFeePerGas = ed.BaseFeePerGas + edv1.BlockHash = ed.BlockHash + edv1.Transactions = ed.Transactions +} + +//go:generate go run github.com/fjl/gencodec -type PayloadAttributes -field-override payloadAttributesMarshaling -out gen_blockparams.go + +// PayloadAttributes describes the environment context in which a block should +// be built. +type PayloadAttributes struct { + Timestamp uint64 `json:"timestamp" gencodec:"required"` + Random common.Hash `json:"prevRandao" gencodec:"required"` + SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient" gencodec:"required"` + Withdrawals []*types.Withdrawal `json:"withdrawals"` + ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` +} + +// JSON type overrides for PayloadAttributes. +type payloadAttributesMarshaling struct { + Timestamp hexutil.Uint64 +} + +//go:generate go run github.com/fjl/gencodec -type ExecutableData -field-override executableDataMarshaling -out gen_ed.go + +// ExecutableData is the data necessary to execute an EL payload. +type ExecutableData struct { + ParentHash common.Hash `json:"parentHash" gencodec:"required"` + FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` + StateRoot common.Hash `json:"stateRoot" gencodec:"required"` + ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` + LogsBloom []byte `json:"logsBloom" gencodec:"required"` + Random common.Hash `json:"prevRandao" gencodec:"required"` + Number uint64 `json:"blockNumber" gencodec:"required"` + GasLimit uint64 `json:"gasLimit" gencodec:"required"` + GasUsed uint64 `json:"gasUsed" gencodec:"required"` + Timestamp uint64 `json:"timestamp" gencodec:"required"` + ExtraData []byte `json:"extraData" gencodec:"required"` + BaseFeePerGas *big.Int `json:"baseFeePerGas" gencodec:"required"` + BlockHash common.Hash `json:"blockHash" gencodec:"required"` + Transactions [][]byte `json:"transactions" gencodec:"required"` + Withdrawals []*types.Withdrawal `json:"withdrawals"` + BlobGasUsed *uint64 `json:"blobGasUsed"` + ExcessBlobGas *uint64 `json:"excessBlobGas"` + ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` +} + +// JSON type overrides for executableData. +type executableDataMarshaling struct { + Number hexutil.Uint64 + GasLimit hexutil.Uint64 + GasUsed hexutil.Uint64 + Timestamp hexutil.Uint64 + BaseFeePerGas *hexutil.Big + ExtraData hexutil.Bytes + LogsBloom hexutil.Bytes + Transactions []hexutil.Bytes + BlobGasUsed *hexutil.Uint64 + ExcessBlobGas *hexutil.Uint64 +} + +//go:generate go run github.com/fjl/gencodec -type ExecutionPayloadEnvelope -field-override executionPayloadEnvelopeMarshaling -out gen_epe.go + +type ExecutionPayloadEnvelope struct { + ExecutionPayload *ExecutableData `json:"executionPayload" gencodec:"required"` + BlockValue *big.Int `json:"blockValue" gencodec:"required"` + BlobsBundle *BlobsBundle `json:"blobsBundle" gencodec:"omitempty"` +} + +type executionPayloadEnvelopeMarshaling struct { + BlockValue *hexutil.Big +} + +// Convert Execution Payload Types +func ToBeaconExecutableData(pl *ExecutableData) (geth_beacon.ExecutableData, error) { + if pl.ParentBeaconBlockRoot != nil { + return geth_beacon.ExecutableData{}, fmt.Errorf("parent geth_beacon block root is not nil is unsupported") + } + return geth_beacon.ExecutableData{ + ParentHash: pl.ParentHash, + FeeRecipient: pl.FeeRecipient, + StateRoot: pl.StateRoot, + ReceiptsRoot: pl.ReceiptsRoot, + LogsBloom: pl.LogsBloom, + Random: pl.Random, + Number: pl.Number, + GasLimit: pl.GasLimit, + GasUsed: pl.GasUsed, + Timestamp: pl.Timestamp, + ExtraData: pl.ExtraData, + BaseFeePerGas: pl.BaseFeePerGas, + BlockHash: pl.BlockHash, + Transactions: pl.Transactions, + Withdrawals: pl.Withdrawals, + BlobGasUsed: pl.BlobGasUsed, + ExcessBlobGas: pl.ExcessBlobGas, + }, nil +} + +func FromBeaconExecutableData(ed *geth_beacon.ExecutableData) (ExecutableData, error) { + return ExecutableData{ + FeeRecipient: ed.FeeRecipient, + StateRoot: ed.StateRoot, + ReceiptsRoot: ed.ReceiptsRoot, + LogsBloom: ed.LogsBloom, + Random: ed.Random, + Number: ed.Number, + GasLimit: ed.GasLimit, + GasUsed: ed.GasUsed, + Timestamp: ed.Timestamp, + ExtraData: ed.ExtraData, + BaseFeePerGas: ed.BaseFeePerGas, + BlockHash: ed.BlockHash, + Transactions: ed.Transactions, + Withdrawals: ed.Withdrawals, + BlobGasUsed: ed.BlobGasUsed, + ExcessBlobGas: ed.ExcessBlobGas, + }, nil +} + +func ExecutableDataToBlock(ed ExecutableData, versionedHashes []common.Hash) (*types.Block, error) { + if ed.ParentBeaconBlockRoot != nil { + return nil, fmt.Errorf("parent geth_beacon block root is not nil is unsupported") + } + geth_ed, err := ToBeaconExecutableData(&ed) + if err != nil { + return nil, err + } + return geth_beacon.ExecutableDataToBlock(geth_ed, versionedHashes) +} + +func BlockToExecutableData(block *types.Block, fees *big.Int) ExecutableData { + // TODO (DEVNET 8): Add blobs + geth_envelope := geth_beacon.BlockToExecutableData(block, fees, nil, nil, nil) + ed, err := FromBeaconExecutableData(geth_envelope.ExecutionPayload) + if err != nil { + panic(err) + } + return ed +} diff --git a/simulators/ethereum/go.work.sum b/simulators/ethereum/go.work.sum index a4aa31046a..05b4a8aee8 100644 --- a/simulators/ethereum/go.work.sum +++ b/simulators/ethereum/go.work.sum @@ -136,122 +136,67 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae h1:AMzIhMUqU3jMrZiTuW0zkYeKlKDAFD+DG20IoO421/Y= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= -github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db h1:nxAtV4VajJDhKysp2kdcJZsq8Ss1xSA0vZTkVHHJd0E= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.15.11 h1:m45+Ru/wA+73cOZXiEGLDH2d9uLN3iHqMc0/z4noDXE= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go-v2 v1.2.0 h1:BS+UYpbsElC82gB+2E2jiCBg36i8HlubTB/dO/moQ9c= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1 h1:ZAoq32boMzcaTW9bcUacBswAmHTbvlvDJICgHFZuECo= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1 h1:NbvWIM1Mx6sNPTxowHgS2ewXCRp+NGTzUYb/96FZJbY= github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2 h1:EtEU7WRaWliitZh2nmuxEXrN0Cb8EgPUFGIoTMeqbzI= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2 h1:4AH9fFjUlVktQMznF+YN33aWNXaR4VgDXyP28qokJC0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1 h1:cKr6St+CtC3/dl/rEBJvlk7A/IN5D5F02GNkGzfbtVU= github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1 h1:37QubsarExl5ZuCBlnRP+7l1tNwZPBSTqpTBrPH98RU= github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1 h1:TJoIfnIFubCX0ACVeJ0w46HEH5MwjwYN4iFhuYIhfIY= github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0 h1:D6CSsM3gdxaGaqXnPgOBCeL6Mophqzu7KJOu7zW78sU= github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= -github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible h1:Ppm0npCCsmuR9oQaBtRuZcmILVE74aXE+AmrJj8L2ns= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40 h1:y4B3+GPxKlrigF1ha5FFErxK+sr6sWxQovRMzwMhejo= -github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1 h1:pgAtgj+A31JBVtEHu2uHuEx0n+2ukqUJnS2vVe5pQNA= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44 h1:y853v6rXx+zefEcjET3JuKAqvhj+FKflQijjeaSv2iA= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= -github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v4 v4.1.0 h1:WW2B2uxx9KWF6bGlHqhm8Okiafwwx7Y2kcpn8lCpjgo= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.7.0 h1:1k/q3ATgxSXRdrmPfH8d7YK0GfqVsEKZAX9dQZvs56k= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= -github.com/cloudflare/cloudflare-go v0.14.0 h1:gFqGlGl/5f9UGXAaKapCGUfaTCgRKKnzu2VvzMZlOFA= github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403 h1:cqQfy1jclcSy/FwLjemeg3SR1yaINm74aQyupQ0Bl8M= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed h1:OZmjad4L3H8ncOIR8rnb5MREYqG8ixi5+WbeUsquF0c= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= -github.com/consensys/gnark-crypto v0.9.1-0.20230105202408-1a7a29904a7c/go.mod h1:CkbdF9hbRidRJYMRzmfX8TMOr95I2pYXRHF18MzRrvA= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0 h1:2oeJiwX5HstO7shSrPZjrohJZLzK36wvpdmzDRkL/LY= github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0 h1:osn1exbzdub9L5SouXO5swW4ea/xVdJZ3wokxN5GrnA= github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= @@ -260,14 +205,12 @@ github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4S github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= @@ -283,7 +226,6 @@ github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09Zvgq github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -292,311 +234,189 @@ github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cE github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0 h1:6PirWBr9/L7GDamKr+XM0IeUFXu5mf3M/BPpH9gaLBU= github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-cni v1.1.6 h1:el5WPymG5nRRLQF1EfB97FWob4Tdc8INg8RZMaXWZlo= -github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0= github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/imgcrypt v1.1.4 h1:iKTstFebwy3Ak5UF0RHSeuCTahC5OIrPJa6vjMAM81s= -github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0 h1:6QioHRlThlKh2RkRTR4kIT3PKAcrLo3gIWnjkM4dQmQ= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.4.1 h1:5e7heayhB7CcgdTkqfZqrNaNv15gABwr3Q2jBTbLlt4= github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI= github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0 h1:cXLJbx+4Jj7rNsTiqVfm6i+RNLx6FFA2fMmDlEf+Wm8= github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v1.1.1 h1:ky20T7c0MvKvbMOwS/FrlbNwjEoqJEUUYfsL4b0mc4k= -github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containernetworking/plugins v1.1.1 h1:+AGfFigZ5TiQH00vhR8qPeSatj53eNGz0C1d3wVYlHE= -github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.3 h1:uMxn2wTb4nDR7GqG3rnZSfpJXqWURfzZ7nKydzIeKpA= -github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= -github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= -github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0 h1:mw6SAibtHKZcNzAsOxjoHIG0gy5YFHhypWSSNc6EjbQ= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7 h1:6IrxszG5G+O7zhtkWxq6+unVvnrm1fqV2Pe+T95DUzw= github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w= -github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c h1:/ovYnF02fwL0kvspmy9AuyKg1JhdTRUgPw4nUxd9oZM= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c h1:Xo2rK1pzOm0jO6abTPIQwbAmqBIOj132otexc1mmzFc= github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0 h1:suYBsYZIkSlUMEz4TAYCczKf62IA2UWC+O8+KtdOhCo= github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5 h1:+CpLbZIeUn94m02LdEKPcgErLJ347NUwxPKs5u8ieiY= github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4 h1:itqmmf1PFpC4n5JW+j4BU7X4MTfVurhYRTjODoPb2Y8= github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba h1:p6poVbjHDkKa+wtC8frBMwQtT3BmqGYBjzMwJ63tuR4= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8 h1:akOQj8IVgoeFfBTzGOEQakCYshWD6RNo1M5pivFXt70= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017 h1:2HQmlpI3yI9deH18Q6xiSOIjXD4sLI55Y/gfpa8/558= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.6.2/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7 h1:kgvzE5wLsLa7XKfV85VZl40QXaMCaeFtHpPwJ8fhotY= github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= -github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d h1:W1n4DvpzZGOISgp7wWNtraLcHtnmnTwBlJidqtMIuwQ= github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/eclipse/paho.mqtt.golang v1.2.0 h1:1F8mhG9+aO5/xpdtFkW4SxOJB67ukuDC3t2y2qayIX0= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d h1:QyzYnTnPE15SQyUeqU6qLbWxMkwyAyu+vGksa0b7j00= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0 h1:dulLQAYQFYtG5MTplgNGHWuV2D+OBD+Z8lmDBmbLg+s= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= -github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM= +github.com/ethereum/c-kzg-4844 v0.2.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= github.com/ethereum/go-ethereum v1.12.0/go.mod h1:/oo2X/dZLJjf2mJ6YT9wcWxa4nNJDBKDBU6sFIpx1Gs= -github.com/ethereum/hive/hiveproxy v0.0.0-20220708193637-ec524d7345a1/go.mod h1:XtF0Q/5ESJpak7na/6prPgfpTZ+IAFU2qQzHvnqc5as= -github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138 h1:Y74Ksk90DLCMWnpOfOEWRLxVjsf/67vY+hX5kWu9UY0= +github.com/ethereum/go-ethereum v1.12.1-0.20230724161334-2274a03e339f h1:b/1ztbo5mQzQuuyO8A3mVAHOjgiIf7wE8B9/r1Ul4OQ= +github.com/ethereum/go-ethereum v1.12.1-0.20230724161334-2274a03e339f/go.mod h1:WII7EML+9n033+WEChHAzFzZOVFB+md+oaonHFG8XQQ= github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138/go.mod h1:1LWNU6/EYsIOXZGa2KdklD1ET77gLTeEyhq+WTZ+37o= -github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanw/esbuild v0.17.6 h1:4TFYbndxF6+KQwLTyZ4PGIal5Pc6g6AK6jp0IU4Elf0= github.com/evanw/esbuild v0.17.6/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 h1:DddqAaWDpywytcG8w/qoQ5sAN8X12d3Z3koB0C3Rxsc= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= -github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c h1:CndMRAH4JIwxbW8KYq6Q+cGWcGHz0FjGR3QqcInWcW0= -github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= +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/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= -github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90 h1:WXb3TSNmHp2vHoCroCIB1foO/yQ36swABL8aOVeDpgg= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsouza/go-dockerclient v1.8.1 h1:a27vHYqNSZz88nUAurI1o6W5PgEt63nAWilOI+j63RE= github.com/fsouza/go-dockerclient v1.8.1/go.mod h1:zmA2ogSxRnXmbZcy0Aq7yhRoCdP/bDns/qghCK9SWtM= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvDvId8XSGPu3rmpmSe+wKRcEWNgsfWU= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7 h1:LofdAjjjqCSXMwLGgOgnE+rdPuvX9DxCqaHwKy7i/ko= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732 h1:AB7YjNrzlVHsYz06zCULVV2zYCEft82P86dSmtwxKL0= github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.107.0 h1:bxhL6QArW7BXQj8NjXfIJQy680NsMKd25nwhvpCXchg= github.com/getkin/kin-openapi v0.107.0/go.mod h1:9Dhr+FasATJZjS4iOLvB0hkaxgYdulrNYm2e9epLWOo= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= -github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72 h1:b+9H1GAsx5RsjvDFLoS5zkNBzIQMuVKUYQDmxU3N5XE= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -606,33 +426,25 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 h1:utua3L2IbQJmauC5IXdEA547bcoU5dozgQAfc8Onsg4= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -641,40 +453,25 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1 h1:/+mFTs4AlwsJ/mJe8NDtKb7BxLtbZFpcn8vDsneEkwQ= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= -github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33 h1:893HsJqtxp9z1SF76gg6hY70hRY1wVlTSnC/h1yUDCo= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -683,251 +480,122 @@ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/holiman/billy v0.0.0-20230616073924-97ff6efa2b93/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150 h1:vlNjIqmUZ9CMAWsbURYl3a6wZbw7q5RHVvlXTNS/Bs8= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91 h1:KyZDvZ/GGn+r+Y3DKZ7UOQ/TP4xV6HNkrwiVMB1GnNY= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weKRL81bEnm8A0HT1/CAelMQDBuQIfLw8n+d6xI= github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= -github.com/influxdata/influxdb v1.8.3 h1:WEypI1BQFTT4teLM+1qkEcvUi0dAvopAI/ir0vAiBg8= github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= -github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/promql/v2 v2.12.0 h1:kXn3p0D7zPw16rOtfDR+wo6aaiH8tSMfhPwONTxrlEc= -github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6 h1:UzJnB7VRL4PSkUJHwsyzseGOmrO/r4yA+AuxGJxiZmA= -github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9 h1:MHTrDWmQpHq/hkq+7cw9oYAt2PqUw52TZazRA0N7PGE= -github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368 h1:+TUUmaFa4YD1Q+7bH9o5NCHQGPMqZCYJiNW6lIIS9z4= -github.com/intel/goresctrl v0.2.0 h1:JyZjdMQu9Kl/wLXe9xA6s1X+tF6BWsQPFGJMEeCfWzE= -github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= -github.com/invopop/yaml v0.1.0 h1:YW3WGUoJEXYfzWBjn00zIlrw7brGVD0fUKRYDPAPhrc= github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= -github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= -github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= -github.com/iris-contrib/jade v1.1.4 h1:WoYdfyJFfZIUgqNAeOyRfTNQZOksSlZ6+FnXR3AEpX0= -github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= -github.com/iris-contrib/pongo2 v0.0.1 h1:zGP7pW51oi5eQZMIlGA3I+FHY9/HOQWDB+572yin0to= -github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= -github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56 h1:742eGXur0715JMq73aD95/FU0XpVKXqNuTnEfXsLOYQ= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e h1:UvSe12bq+Uj2hWd8aOlwPmoZ+CITRFrdit+sDGfAg8U= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joefitzgerald/rainbow-reporter v0.1.0 h1:AuMG652zjdzI0YCCnXAqATtRBpGXMcAnrajcaTrSeuo= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= -github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= -github.com/kataras/golog v0.1.7 h1:0TY5tHn5L5DlRIikepcaRR/6oInIr9AiWsxzt0vvlBE= -github.com/kataras/golog v0.1.7/go.mod h1:jOSQ+C5fUqsNSwurB/oAHq1IFSb0KI3l6GMa7xB6dZA= -github.com/kataras/iris/v12 v12.2.0-beta5 h1:grB/oCf5baZhmYIeDMfgN3LYrtEcmK8pbxlRvEZ2pgw= -github.com/kataras/iris/v12 v12.2.0-beta5/go.mod h1:q26aoWJ0Knx/00iPKg5iizDK7oQQSPjbD8np0XDh6dc= -github.com/kataras/neffos v0.0.14 h1:pdJaTvUG3NQfeMbbVCI8JT2T5goPldyyfUB2PJfh1Bs= -github.com/kataras/pio v0.0.11 h1:kqreJ5KOEXGMwHAWHDwIl+mjfNCPhAwZPa8gK7MKlyw= -github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= -github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= -github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= -github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= -github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= -github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= -github.com/kr/pty v1.1.5 h1:hyz3dwM5QLc1Rfoz4FuWJQG5BN7tc6K1MndAUnGpQr4= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/echo/v4 v4.9.1 h1:GliPYSpzGKlyOhqIbG8nmHBo3i1saKWFOgh41AN3b+Y= github.com/labstack/echo/v4 v4.9.1/go.mod h1:Pop5HLc+xoc4qhTZ1ip6C0RtP7Z+4VzRLWZZFKqbbjo= -github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= -github.com/lestrrat-go/blackmagic v1.0.0 h1:XzdxDbuQTz0RZZEmdU7cnQxUtFUzgCSPq8RCz4BxIi4= github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= -github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= -github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= -github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0otA= github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= -github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= -github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3 h1:jUp75lepDg0phMUJBCmvaeFDldD2N3S1lBuPwUTszio= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= -github.com/mailgun/raymond/v2 v2.0.46 h1:aOYHhvTpF5USySJ0o7cpPno/Uh2I5qg2115K25A+Ft4= -github.com/mailgun/raymond/v2 v2.0.46/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marioevz/go-ethereum v1.10.14-0.20230603001731-58fefdcc84b0/go.mod h1:GXnDoy6ShaCzPXPfMcof5rPnVDwuckBAlW8jgH1jdl4= -github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/matryer/moq v0.2.7 h1:RtpiPUM8L7ZSCbSwK+QcZH/E9tgqAkFjKQxsRs25b4w= github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.6 h1:9Jok5pILi5S1MnDirGVTufYGtksUs/V2BWUP3ZkeUUI= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2 h1:g+4J5sZg6osfvEfkRZxJ1em0VT95/UOZgi/l7zi1/oE= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/mediocregopher/radix/v3 v3.4.2 h1:galbPBjIwmyREgwGCfQEN4X8lxbJnKBYurgz+VfcStA= -github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= -github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= -github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible h1:aKW/4cBs+yK6gpqU3K/oIwk9Q/XICqd3zOX/UFuvqmk= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f h1:2+myh5ml7lgEU/51gbeLHfKGNfgEQQIWrlbdaOsidbQ= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mmcloughlin/profile v0.1.1 h1:jhDmAqPyebOsVDOCICJoINoLb/AnLBaUw58nFzxWS2w= -github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs= github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= -github.com/moby/sys/signal v0.6.0 h1:aDpY94H8VlhTGa9sNYUFCFsMZIUh5wm0B6XkIoJj/iY= -github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= -github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= -github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nats-io/jwt v0.3.0 h1:xdnzwFETV++jNc4W1mw//qFyJGb2ABOombmZJQS4+Qo= -github.com/nats-io/nats.go v1.9.1 h1:ik3HbLhZ0YABLto7iX80pZLPw/6dx3T+++MZJwLnMrQ= -github.com/nats-io/nkeys v0.1.0 h1:qMd4+pRHgdr1nAClu+2h/2a5F2TmKcCzjCDazVgRoX4= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/ncw/swift v1.0.47 h1:4DQRPj35Y41WogBxyhOXlrI37nzGlyEcsforeudyYPQ= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -937,7 +605,6 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -948,11 +615,9 @@ github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1 github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= @@ -960,42 +625,25 @@ github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.1.2 h1:2VSZwLx5k/BfsBxMMipG/LYUnmqOD/BPkIVgQUcTlLw= -github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39 h1:H7DMc6FAjgwZZi8BRqjrAAHWoqEr5e5L6pS4V0ezet4= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opencontainers/selinux v1.10.1 h1:09LIPVRP3uuZGQvgR+SgMSNBd1Eb3vlRbGqQpoHsF8w= -github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5 h1:tFwafIEMf0B7NlcxV/zJ6leBIa81D3hgGSgsE5hCkOQ= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021 h1:0XM1XL/OFFJjXsYXlG30spTkV/E9+gmd5GD1w2HE8xM= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -1003,8 +651,6 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1015,8 +661,6 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1028,35 +672,20 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= -github.com/protolambda/ztyp v0.2.1 h1:+rfw75/Zh8EopNlG652TGDXlLgJflj6XWxJ9yCVpJws= -github.com/protolambda/ztyp v0.2.1/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= -github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52 h1:RnWNS9Hlm8BIkjr6wx8li5abe0fr73jljLycdfemTp0= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8 h1:2c1EFnZHIPCW8qKWgHMH/fX2PkSabFc5mrVzfUNdg5U= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= -github.com/sclevine/spec v1.2.0 h1:1Jwdf9jSfDl9NVmt8ndHqbTZ7XCCPbh1jI3hkDBHVYA= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/segmentio/kafka-go v0.2.0 h1:HtCSf6B4gN/87yc5qTl7WsxPKQIIGXLPPM1bMCPOsoY= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -1065,65 +694,36 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= -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/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= -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= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/supranational/blst v0.3.8-0.20220526154634-513d2456b344 h1:m+8fKfQwCAy1QjzINvKe/pYtLjo2dl59x2w9YSEJxuY= -github.com/supranational/blst v0.3.8-0.20220526154634-513d2456b344/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tchap/go-patricia v2.2.6+incompatible h1:JvoDL7JSoIP2HDE8AbDH3zC8QBPxmzYe32HHy5yQ+Ck= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tdewolff/minify/v2 v2.12.4 h1:kejsHQMM17n6/gwdw53qsi6lg0TGddZADVyQOz1KMdE= -github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= -github.com/tdewolff/parse/v2 v2.6.4 h1:KCkDvNUMof10e3QExio9OPZJT8SbdKojLBumw8YZycQ= -github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= -github.com/tinylib/msgp v1.0.2 h1:DfdQrzQa7Yh2es9SuLkixqxuXS2SxsdYn0KbdrOGWD8= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -1132,98 +732,39 @@ github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= -github.com/urfave/cli/v2 v2.24.1/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= -github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= -github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= -github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5 h1:+UB2BJA852UkGH42H+Oee69djmxS3ANzl2b/JtT1YiA= -github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/willf/bitset v1.1.3 h1:ekJIKh6+YbUIVt9DfNbkR5d6aFcFTLDRyJNAACURBg8= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6 h1:YdYsPAZ2pC6Tow/nPZOPQ96O3hm/ToAkGsPLzedXERk= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= -github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= -github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 h1:Ky1MObd188aGbgb5OgNnwGuEEwI9MVIcc7rBW6zk5Ak= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= -go.opentelemetry.io/otel v1.6.3 h1:FLOfo8f9JzFVFVyU+MSRJc2HdEAXQgm7pIv2uFKRSZE= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 h1:giGm8w67Ja7amYNfYMdme7xSp2pIxThWopw8+QP51Yk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 h1:VQbUHoJqytHHSJ1OZodPH9tvZZSVzUHjPHpkO85sT6k= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0 h1:Ydage/P0fRrSPpZeCVxzjqGcI6iVmG2xb43+IR8cjqM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= -go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI= -go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= -go.opentelemetry.io/otel/trace v1.6.3 h1:IqN4L+5b0mPNjdXIiZ90Ni4Bl5BRkDQywePLWemd9bc= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU= -go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= -go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o= -go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1240,9 +781,6 @@ golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= @@ -1253,7 +791,6 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1270,10 +807,9 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1293,10 +829,6 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -1306,27 +838,18 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1358,7 +881,6 @@ golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1367,17 +889,11 @@ golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1390,12 +906,10 @@ golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1408,21 +922,14 @@ golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1431,12 +938,9 @@ golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1456,43 +960,26 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1503,59 +990,35 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0 h1:J1Pl9P2lnmYFSJvgs70DKELqHNh8CNWXPbud4njEE2s= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 h1:Cpp2P6TPjujNoC5M2KHY6g7wfyLYfIWRZaSdIKfDasA= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84 h1:R1r5J0u6Cx+RNl/6mezTw6oA14cmKC96FeUwL6A9bd4= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 h1:hrbNEivu7Zn1pxvHk6MBrq9iE22woVILTHqexqBxe6I= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1564,47 +1027,26 @@ google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= -gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= -gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1613,83 +1055,50 @@ gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.22.5 h1:xk7C+rMjF/EGELiD560jdmwzrB788mfcHiNbMQLIVI8= -k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.22.5 h1:cIPwldOYm1Slq9VLBRPtEYpyhjIm1C6aAMAoENuvN9s= -k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.22.5 h1:71krQxCUz218ecb+nPhfDsNB6QgP1/4EMvi1a2uYBlg= -k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.22.5 h1:I8Zn/UqIdi2r02aZmhaJ1hqMxcpfJ3t5VqvHtctHYFo= -k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= -k8s.io/code-generator v0.19.7 h1:kM/68Y26Z/u//TFc1ggVVcg62te8A2yQh57jBfD0FWQ= k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.22.5 h1:U0eHqZm7mAFE42hFwYhY6ze/MmVaW00JpMrzVsQmzYE= -k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/cri-api v0.25.0 h1:INwdXsCDSA/0hGNdPxdE2dQD6ft/5K1EaKXZixvSQxg= -k8s.io/cri-api v0.25.0/go.mod h1:J1rAyQkSJ2Q6I+aBMOVgg2/cbbebso6FNa0UagiR0kc= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded h1:JApXBKYyB7l9xx+DK7/+mFjC7A9Bt5A93FPvFD0HIFE= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.30.0 h1:bUO6drIvCIsvZ/XFgfxoGFQU/a4Qkh0iAlvUR7vlHJw= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b h1:wxEMGetGMur3J1xuGLQY7GEQYg9bZxKn3tKo5k/eYcs= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= -rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15 h1:4uqm9Mv+w2MmBYD+F4qf/v6tDFUdPOk29C095RbU5mY= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 6d73a71a0708532c7f1ef404aa8aaa76a5964301 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 28 Jul 2023 17:05:27 +0000 Subject: [PATCH 02/19] simulators/ethereum/engine: don't populate empty fields --- simulators/ethereum/engine/types/gen_ed.go | 12 ++++++------ simulators/ethereum/engine/types/types.go | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/simulators/ethereum/engine/types/gen_ed.go b/simulators/ethereum/engine/types/gen_ed.go index b4e127b73a..319d31d6d7 100644 --- a/simulators/ethereum/engine/types/gen_ed.go +++ b/simulators/ethereum/engine/types/gen_ed.go @@ -32,9 +32,9 @@ func (e ExecutableData) MarshalJSON() ([]byte, error) { BlockHash common.Hash `json:"blockHash" gencodec:"required"` Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` Withdrawals []*types.Withdrawal `json:"withdrawals"` - BlobGasUsed *hexutil.Uint64 `json:"blobGasUsed"` - ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas"` - ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` + BlobGasUsed *hexutil.Uint64 `json:"blobGasUsed,omitempty"` + ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas,omitempty"` + ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot,omitempty"` } var enc ExecutableData enc.ParentHash = e.ParentHash @@ -81,9 +81,9 @@ func (e *ExecutableData) UnmarshalJSON(input []byte) error { BlockHash *common.Hash `json:"blockHash" gencodec:"required"` Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` Withdrawals []*types.Withdrawal `json:"withdrawals"` - BlobGasUsed *hexutil.Uint64 `json:"blobGasUsed"` - ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas"` - ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` + BlobGasUsed *hexutil.Uint64 `json:"blobGasUsed,omitempty"` + ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas,omitempty"` + ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot,omitempty"` } var dec ExecutableData if err := json.Unmarshal(input, &dec); err != nil { diff --git a/simulators/ethereum/engine/types/types.go b/simulators/ethereum/engine/types/types.go index 4f1e277a47..ac7a1cb41f 100644 --- a/simulators/ethereum/engine/types/types.go +++ b/simulators/ethereum/engine/types/types.go @@ -132,9 +132,9 @@ type ExecutableData struct { BlockHash common.Hash `json:"blockHash" gencodec:"required"` Transactions [][]byte `json:"transactions" gencodec:"required"` Withdrawals []*types.Withdrawal `json:"withdrawals"` - BlobGasUsed *uint64 `json:"blobGasUsed"` - ExcessBlobGas *uint64 `json:"excessBlobGas"` - ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` + BlobGasUsed *uint64 `json:"blobGasUsed,omitempty"` + ExcessBlobGas *uint64 `json:"excessBlobGas,omitempty"` + ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot,omitempty"` } // JSON type overrides for executableData. From 067782dca5339084a430cdca98d672342677c9d7 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 28 Jul 2023 00:52:05 +0000 Subject: [PATCH 03/19] simulators/ethereum/engine: modify types, remove beacon root from payload --- simulators/ethereum/engine/client/engine.go | 9 ++- .../engine/client/hive_rpc/hive_rpc.go | 14 ++-- .../ethereum/engine/client/node/node.go | 27 +++++-- simulators/ethereum/engine/clmock/clmock.go | 34 +++++++-- .../ethereum/engine/suites/engine/tests.go | 24 +++--- .../engine/suites/withdrawals/tests.go | 12 +-- simulators/ethereum/engine/test/expect.go | 6 +- simulators/ethereum/engine/types/gen_ed.go | 74 +++++++++---------- simulators/ethereum/engine/types/types.go | 42 +++++------ 9 files changed, 135 insertions(+), 107 deletions(-) diff --git a/simulators/ethereum/engine/client/engine.go b/simulators/ethereum/engine/client/engine.go index 0a11c03ba9..26b755eb54 100644 --- a/simulators/ethereum/engine/client/engine.go +++ b/simulators/ethereum/engine/client/engine.go @@ -29,9 +29,10 @@ type Eth interface { } type Engine interface { - ForkchoiceUpdatedV1(ctx context.Context, fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) (api.ForkChoiceResponse, error) - ForkchoiceUpdatedV2(ctx context.Context, fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) (api.ForkChoiceResponse, error) - ForkchoiceUpdated(ctx context.Context, version int, fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) (api.ForkChoiceResponse, error) + ForkchoiceUpdatedV1(ctx context.Context, fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) (api.ForkChoiceResponse, error) + ForkchoiceUpdatedV2(ctx context.Context, fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) (api.ForkChoiceResponse, error) + ForkchoiceUpdatedV3(ctx context.Context, fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) (api.ForkChoiceResponse, error) + ForkchoiceUpdated(ctx context.Context, version int, fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) (api.ForkChoiceResponse, error) GetPayloadV1(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, error) GetPayloadV2(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, error) @@ -45,7 +46,7 @@ type Engine interface { GetPayloadBodiesByRangeV1(ctx context.Context, start uint64, count uint64) ([]*typ.ExecutionPayloadBodyV1, error) GetPayloadBodiesByHashV1(ctx context.Context, hashes []common.Hash) ([]*typ.ExecutionPayloadBodyV1, error) - LatestForkchoiceSent() (fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) + LatestForkchoiceSent() (fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) LatestNewPayloadSent() (payload *typ.ExecutableData) LatestForkchoiceResponse() (fcuResponse *api.ForkChoiceResponse) diff --git a/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go b/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go index 2bff753535..d1ec2385a2 100644 --- a/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go +++ b/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go @@ -159,7 +159,7 @@ type HiveRPCEngineClient struct { // Engine updates info latestFcUStateSent *api.ForkchoiceStateV1 - latestPAttrSent *api.PayloadAttributes + latestPAttrSent *typ.PayloadAttributes latestFcUResponse *api.ForkChoiceResponse latestPayloadSent *typ.ExecutableData @@ -338,7 +338,7 @@ func (ec *HiveRPCEngineClient) PrepareDefaultAuthCallToken() error { // Engine API Call Methods // Forkchoice Updated API Calls -func (ec *HiveRPCEngineClient) ForkchoiceUpdated(ctx context.Context, version int, fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) (api.ForkChoiceResponse, error) { +func (ec *HiveRPCEngineClient) ForkchoiceUpdated(ctx context.Context, version int, fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) (api.ForkChoiceResponse, error) { var result api.ForkChoiceResponse if err := ec.PrepareDefaultAuthCallToken(); err != nil { return result, err @@ -354,14 +354,18 @@ func (ec *HiveRPCEngineClient) ForkchoiceUpdated(ctx context.Context, version in return result, err } -func (ec *HiveRPCEngineClient) ForkchoiceUpdatedV1(ctx context.Context, fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) (api.ForkChoiceResponse, error) { +func (ec *HiveRPCEngineClient) ForkchoiceUpdatedV1(ctx context.Context, fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) (api.ForkChoiceResponse, error) { return ec.ForkchoiceUpdated(ctx, 1, fcState, pAttributes) } -func (ec *HiveRPCEngineClient) ForkchoiceUpdatedV2(ctx context.Context, fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) (api.ForkChoiceResponse, error) { +func (ec *HiveRPCEngineClient) ForkchoiceUpdatedV2(ctx context.Context, fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) (api.ForkChoiceResponse, error) { return ec.ForkchoiceUpdated(ctx, 2, fcState, pAttributes) } +func (ec *HiveRPCEngineClient) ForkchoiceUpdatedV3(ctx context.Context, fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) (api.ForkChoiceResponse, error) { + return ec.ForkchoiceUpdated(ctx, 3, fcState, pAttributes) +} + // Get Payload API Calls func (ec *HiveRPCEngineClient) GetPayload(ctx context.Context, version int, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, *typ.BlobsBundle, error) { @@ -599,7 +603,7 @@ func (ec *HiveRPCEngineClient) PostRunVerifications() error { return nil } -func (ec *HiveRPCEngineClient) LatestForkchoiceSent() (fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) { +func (ec *HiveRPCEngineClient) LatestForkchoiceSent() (fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) { return ec.latestFcUStateSent, ec.latestPAttrSent } diff --git a/simulators/ethereum/engine/client/node/node.go b/simulators/ethereum/engine/client/node/node.go index 8e081308ac..7ba64be031 100644 --- a/simulators/ethereum/engine/client/node/node.go +++ b/simulators/ethereum/engine/client/node/node.go @@ -152,7 +152,7 @@ type GethNode struct { // Engine updates info latestFcUStateSent *beacon.ForkchoiceStateV1 - latestPAttrSent *beacon.PayloadAttributes + latestPAttrSent *typ.PayloadAttributes latestFcUResponse *beacon.ForkChoiceResponse latestPayloadSent *typ.ExecutableData @@ -490,7 +490,7 @@ func (n *GethNode) NewPayloadV3(ctx context.Context, pl *typ.ExecutableData, ver return resp, err } -func (n *GethNode) ForkchoiceUpdated(ctx context.Context, version int, fcs *beacon.ForkchoiceStateV1, payload *beacon.PayloadAttributes) (beacon.ForkChoiceResponse, error) { +func (n *GethNode) ForkchoiceUpdated(ctx context.Context, version int, fcs *beacon.ForkchoiceStateV1, payload *typ.PayloadAttributes) (beacon.ForkChoiceResponse, error) { switch version { case 1: return n.ForkchoiceUpdatedV1(ctx, fcs, payload) @@ -501,22 +501,35 @@ func (n *GethNode) ForkchoiceUpdated(ctx context.Context, version int, fcs *beac } } -func (n *GethNode) ForkchoiceUpdatedV1(ctx context.Context, fcs *beacon.ForkchoiceStateV1, payload *beacon.PayloadAttributes) (beacon.ForkChoiceResponse, error) { +func (n *GethNode) ForkchoiceUpdatedV1(ctx context.Context, fcs *beacon.ForkchoiceStateV1, payload *typ.PayloadAttributes) (beacon.ForkChoiceResponse, error) { n.latestFcUStateSent = fcs n.latestPAttrSent = payload - fcr, err := n.api.ForkchoiceUpdatedV1(*fcs, payload) + fcr, err := n.api.ForkchoiceUpdatedV1(*fcs, &beacon.PayloadAttributes{ + Timestamp: payload.Timestamp, + Random: payload.Random, + SuggestedFeeRecipient: payload.SuggestedFeeRecipient, + }) n.latestFcUResponse = &fcr return fcr, err } -func (n *GethNode) ForkchoiceUpdatedV2(ctx context.Context, fcs *beacon.ForkchoiceStateV1, payload *beacon.PayloadAttributes) (beacon.ForkChoiceResponse, error) { +func (n *GethNode) ForkchoiceUpdatedV2(ctx context.Context, fcs *beacon.ForkchoiceStateV1, payload *typ.PayloadAttributes) (beacon.ForkChoiceResponse, error) { n.latestFcUStateSent = fcs n.latestPAttrSent = payload - fcr, err := n.api.ForkchoiceUpdatedV2(*fcs, payload) + fcr, err := n.api.ForkchoiceUpdatedV2(*fcs, &beacon.PayloadAttributes{ + Timestamp: payload.Timestamp, + Random: payload.Random, + SuggestedFeeRecipient: payload.SuggestedFeeRecipient, + Withdrawals: payload.Withdrawals, + }) n.latestFcUResponse = &fcr return fcr, err } +func (n *GethNode) ForkchoiceUpdatedV3(ctx context.Context, fcs *beacon.ForkchoiceStateV1, payload *typ.PayloadAttributes) (beacon.ForkChoiceResponse, error) { + panic("not supported yet") +} + func (n *GethNode) GetPayloadV1(ctx context.Context, payloadId *beacon.PayloadID) (typ.ExecutableData, error) { p, err := n.api.GetPayloadV1(*payloadId) if p == nil || err != nil { @@ -767,7 +780,7 @@ func (n *GethNode) PostRunVerifications() error { return nil } -func (n *GethNode) LatestForkchoiceSent() (fcState *beacon.ForkchoiceStateV1, pAttributes *beacon.PayloadAttributes) { +func (n *GethNode) LatestForkchoiceSent() (fcState *beacon.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) { return n.latestFcUStateSent, n.latestPAttrSent } diff --git a/simulators/ethereum/engine/clmock/clmock.go b/simulators/ethereum/engine/clmock/clmock.go index 6ffe33fdc7..13004e3f4a 100644 --- a/simulators/ethereum/engine/clmock/clmock.go +++ b/simulators/ethereum/engine/clmock/clmock.go @@ -2,6 +2,8 @@ package clmock import ( "context" + "crypto/sha256" + "encoding/binary" "encoding/json" "errors" "fmt" @@ -98,7 +100,7 @@ type CLMocker struct { LatestPayloadBuilt typ.ExecutableData LatestBlockValue *big.Int LatestBlobBundle *typ.BlobsBundle - LatestPayloadAttributes api.PayloadAttributes + LatestPayloadAttributes typ.PayloadAttributes LatestExecutedPayload typ.ExecutableData LatestForkchoice api.ForkchoiceStateV1 @@ -377,12 +379,24 @@ func (cl *CLMocker) SetNextWithdrawals(nextWithdrawals types.Withdrawals) { cl.NextWithdrawals = nextWithdrawals } +func TimestampToBeaconRoot(timestamp uint64) common.Hash { + // Generates a deterministic hash from the timestamp + beaconBlockRoot := common.Hash{} + timestampBytes := make([]byte, 8) + binary.BigEndian.PutUint64(timestampBytes[:], timestamp) + md := sha256.New() + md.Write(timestampBytes) + timestampHash := md.Sum(nil) + copy(beaconBlockRoot[:], timestampHash) + return beaconBlockRoot +} + func (cl *CLMocker) RequestNextPayload() { // Generate a random value for the PrevRandao field nextPrevRandao := common.Hash{} rand.Read(nextPrevRandao[:]) - cl.LatestPayloadAttributes = api.PayloadAttributes{ + cl.LatestPayloadAttributes = typ.PayloadAttributes{ Random: nextPrevRandao, SuggestedFeeRecipient: cl.NextFeeRecipient, Timestamp: cl.GetNextBlockTimestamp(), @@ -392,6 +406,12 @@ func (cl *CLMocker) RequestNextPayload() { cl.LatestPayloadAttributes.Withdrawals = cl.NextWithdrawals } + if cl.IsCancun(cl.LatestPayloadAttributes.Timestamp) { + // Write a deterministic hash based on the block number + beaconBlockRoot := TimestampToBeaconRoot(cl.LatestPayloadAttributes.Timestamp) + cl.LatestPayloadAttributes.ParentBeaconBlockRoot = &beaconBlockRoot + } + // Save random value cl.PrevRandaoHistory[cl.LatestHeader.Number.Uint64()+1] = nextPrevRandao @@ -402,14 +422,14 @@ func (cl *CLMocker) RequestNextPayload() { fcUVersion int err error ) - if cl.IsShanghai(cl.LatestPayloadAttributes.Timestamp) { + if cl.IsCancun(cl.LatestPayloadAttributes.Timestamp) { + fcUVersion = 3 + } else if cl.IsShanghai(cl.LatestPayloadAttributes.Timestamp) { fcUVersion = 2 - resp, err = cl.NextBlockProducer.ForkchoiceUpdatedV2(ctx, &cl.LatestForkchoice, &cl.LatestPayloadAttributes) - } else { fcUVersion = 1 - resp, err = cl.NextBlockProducer.ForkchoiceUpdatedV1(ctx, &cl.LatestForkchoice, &cl.LatestPayloadAttributes) } + resp, err = cl.NextBlockProducer.ForkchoiceUpdated(ctx, fcUVersion, &cl.LatestForkchoice, &cl.LatestPayloadAttributes) if err != nil { cl.Fatalf("CLMocker: Could not send forkchoiceUpdatedV%d (%v): %v", fcUVersion, cl.NextBlockProducer.ID(), err) } @@ -717,7 +737,7 @@ type ForkChoiceOutcome struct { Error error } -func (cl *CLMocker) BroadcastForkchoiceUpdated(fcstate *api.ForkchoiceStateV1, payloadAttr *api.PayloadAttributes, version int) []ForkChoiceOutcome { +func (cl *CLMocker) BroadcastForkchoiceUpdated(fcstate *api.ForkchoiceStateV1, payloadAttr *typ.PayloadAttributes, version int) []ForkChoiceOutcome { responses := make([]ForkChoiceOutcome, len(cl.EngineClients)) for i, ec := range cl.EngineClients { responses[i].Container = ec.ID() diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index fad0366c2b..8369b0dd66 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -790,7 +790,7 @@ func unknownFinalizedBlockHash(t *test.Env) { // Test again using PayloadAttributes, should also return INVALID and no PayloadID r = t.TestEngine.TestEngineForkchoiceUpdatedV1(&forkchoiceStateUnknownFinalizedHash, - &api.PayloadAttributes{ + &typ.PayloadAttributes{ Timestamp: t.CLMock.LatestExecutedPayload.Timestamp + 1, Random: common.Hash{}, SuggestedFeeRecipient: common.Address{}, @@ -831,7 +831,7 @@ func unknownHeadBlockHash(t *test.Env) { // Test again using PayloadAttributes, should also return SYNCING and no PayloadID r = t.TestEngine.TestEngineForkchoiceUpdatedV1(&forkchoiceStateUnknownHeadHash, - &api.PayloadAttributes{ + &typ.PayloadAttributes{ Timestamp: t.CLMock.LatestExecutedPayload.Timestamp + 1, Random: common.Hash{}, SuggestedFeeRecipient: common.Address{}, @@ -922,7 +922,7 @@ func invalidPayloadAttributesGen(syncing bool) func(*test.Env) { SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, } - attr := api.PayloadAttributes{ + attr := typ.PayloadAttributes{ Timestamp: 0, Random: common.Hash{}, SuggestedFeeRecipient: common.Address{}, @@ -962,7 +962,7 @@ func uniquePayloadID(t *test.Env) { fcState := &api.ForkchoiceStateV1{ HeadBlockHash: parentHash, } - payloadAttributes := &api.PayloadAttributes{ + payloadAttributes := &typ.PayloadAttributes{ Timestamp: t.CLMock.LatestHeader.Time + 1, Random: common.Hash{}, SuggestedFeeRecipient: common.Address{}, @@ -1254,7 +1254,7 @@ func invalidPayloadTestCaseGen(payloadField helper.InvalidPayloadBlockField, syn SafeBlockHash: alteredPayload.BlockHash, FinalizedBlockHash: alteredPayload.BlockHash, } - payloadAttrbutes := api.PayloadAttributes{ + payloadAttrbutes := typ.PayloadAttributes{ Timestamp: alteredPayload.Timestamp + 1, Random: common.Hash{}, SuggestedFeeRecipient: common.Address{}, @@ -1583,7 +1583,7 @@ func (spec InvalidMissingAncestorReOrgSpec) GenerateSync() func(*test.Env) { cA = b } else { t.CLMock.ProduceBlocks(int(cAHeight.Int64()), clmock.BlockProcessCallbacks{}) - cA, err = typ.ExecutableDataToBlock(t.CLMock.LatestPayloadBuilt, nil) + cA, err = typ.ExecutableDataToBlock(t.CLMock.LatestPayloadBuilt, nil, nil) if err != nil { t.Fatalf("FAIL (%s): Error converting payload to block: %v", t.TestName, err) } @@ -1651,7 +1651,7 @@ func (spec InvalidMissingAncestorReOrgSpec) GenerateSync() func(*test.Env) { } } - sideBlock, err := typ.ExecutableDataToBlock(*sidePayload, nil) + sideBlock, err := typ.ExecutableDataToBlock(*sidePayload, nil, nil) if err != nil { t.Fatalf("FAIL (%s): Error converting payload to block: %v", t.TestName, err) } @@ -1660,7 +1660,7 @@ func (spec InvalidMissingAncestorReOrgSpec) GenerateSync() func(*test.Env) { if spec.PayloadField == helper.InvalidOmmers { if unclePayload, ok := t.CLMock.ExecutedPayloadHistory[sideBlock.NumberU64()-1]; ok && unclePayload != nil { // Uncle is a PoS payload - uncle, err = typ.ExecutableDataToBlock(*unclePayload, nil) + uncle, err = typ.ExecutableDataToBlock(*unclePayload, nil, nil) if err != nil { t.Fatalf("FAIL (%s): Unable to get uncle block: %v", t.TestName, err) } @@ -2126,7 +2126,7 @@ func reorgPrevValidatedPayloadOnSideChain(t *test.Env) { HeadBlockHash: sidechainPayloads[len(sidechainPayloads)-2].BlockHash, SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - }, &api.PayloadAttributes{ + }, &typ.PayloadAttributes{ Timestamp: t.CLMock.LatestHeader.Time, Random: prevRandao, SuggestedFeeRecipient: common.Address{}, @@ -2540,7 +2540,7 @@ func sidechainReorg(t *test.Env) { rand.Read(alternativePrevRandao[:]) r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&t.CLMock.LatestForkchoice, - &api.PayloadAttributes{ + &typ.PayloadAttributes{ Timestamp: t.CLMock.LatestHeader.Time + 1, Random: alternativePrevRandao, SuggestedFeeRecipient: t.CLMock.NextFeeRecipient, @@ -2784,7 +2784,7 @@ func validPayloadFcUSyncingClient(t *test.Env) { HeadBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, SafeBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, FinalizedBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, - }, &api.PayloadAttributes{ + }, &typ.PayloadAttributes{ Timestamp: t.CLMock.LatestPayloadBuilt.Timestamp + 1, Random: common.Hash{}, SuggestedFeeRecipient: common.Address{}, @@ -2899,7 +2899,7 @@ func payloadBuildAfterNewInvalidPayload(t *test.Env) { { // Get a payload from the invalid payload producer and invalidate it - r := invalidPayloadProducer.TestEngineForkchoiceUpdatedV1(&t.CLMock.LatestForkchoice, &api.PayloadAttributes{ + r := invalidPayloadProducer.TestEngineForkchoiceUpdatedV1(&t.CLMock.LatestForkchoice, &typ.PayloadAttributes{ Timestamp: t.CLMock.LatestHeader.Time + 1, Random: common.Hash{}, SuggestedFeeRecipient: common.Address{}, diff --git a/simulators/ethereum/engine/suites/withdrawals/tests.go b/simulators/ethereum/engine/suites/withdrawals/tests.go index 5269529f10..559ed852df 100644 --- a/simulators/ethereum/engine/suites/withdrawals/tests.go +++ b/simulators/ethereum/engine/suites/withdrawals/tests.go @@ -1178,7 +1178,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { &beacon.ForkchoiceStateV1{ HeadBlockHash: t.CLMock.LatestHeader.Hash(), }, - &beacon.PayloadAttributes{ + &typ.PayloadAttributes{ Timestamp: t.CLMock.LatestHeader.Time + ws.GetBlockTimeIncrements(), Random: common.Hash{}, SuggestedFeeRecipient: common.Address{}, @@ -1194,7 +1194,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { &beacon.ForkchoiceStateV1{ HeadBlockHash: t.CLMock.LatestHeader.Hash(), }, - &beacon.PayloadAttributes{ + &typ.PayloadAttributes{ Timestamp: t.CLMock.LatestHeader.Time + ws.GetBlockTimeIncrements(), Random: common.Hash{}, SuggestedFeeRecipient: common.Address{}, @@ -1269,7 +1269,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { &beacon.ForkchoiceStateV1{ HeadBlockHash: t.CLMock.LatestHeader.Hash(), }, - &beacon.PayloadAttributes{ + &typ.PayloadAttributes{ Timestamp: t.CLMock.LatestHeader.Time + ws.GetBlockTimeIncrements(), Random: common.Hash{}, SuggestedFeeRecipient: common.Address{}, @@ -1632,7 +1632,7 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { } var version int - pAttributes := beacon.PayloadAttributes{ + pAttributes := typ.PayloadAttributes{ Random: t.CLMock.LatestPayloadAttributes.Random, SuggestedFeeRecipient: t.CLMock.LatestPayloadAttributes.SuggestedFeeRecipient, } @@ -1705,7 +1705,7 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { // the sidechain. for i := uint64(0); i < ws.GetSidechainWithdrawalsForkHeight()-ws.WithdrawalsForkHeight; i++ { sidechainWithdrawalsHistory[sidechainHeight+1], sidechainNextIndex = ws.GenerateWithdrawalsForBlock(sidechainNextIndex, sidechainStartAccount) - pAttributes := beacon.PayloadAttributes{ + pAttributes := typ.PayloadAttributes{ Timestamp: sidechain[sidechainHeight].Timestamp + ws.GetSidechainBlockTimeIncrements(), Random: t.CLMock.LatestPayloadAttributes.Random, SuggestedFeeRecipient: t.CLMock.LatestPayloadAttributes.SuggestedFeeRecipient, @@ -2075,7 +2075,7 @@ func (ws *GetPayloadBodiesSpec) Execute(t *test.Env) { &beacon.ForkchoiceStateV1{ HeadBlockHash: t.CLMock.LatestHeader.Hash(), }, - &beacon.PayloadAttributes{ + &typ.PayloadAttributes{ Timestamp: t.CLMock.LatestHeader.Time + ws.GetBlockTimeIncrements(), Withdrawals: nextWithdrawals, }, diff --git a/simulators/ethereum/engine/test/expect.go b/simulators/ethereum/engine/test/expect.go index 5737c4e185..864d30793b 100644 --- a/simulators/ethereum/engine/test/expect.go +++ b/simulators/ethereum/engine/test/expect.go @@ -89,7 +89,7 @@ type ForkchoiceResponseExpectObject struct { ErrorCode int } -func (tec *TestEngineClient) TestEngineForkchoiceUpdatedV1(fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) *ForkchoiceResponseExpectObject { +func (tec *TestEngineClient) TestEngineForkchoiceUpdatedV1(fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) *ForkchoiceResponseExpectObject { ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) defer cancel() resp, err := tec.Engine.ForkchoiceUpdatedV1(ctx, fcState, pAttributes) @@ -105,7 +105,7 @@ func (tec *TestEngineClient) TestEngineForkchoiceUpdatedV1(fcState *api.Forkchoi return ret } -func (tec *TestEngineClient) TestEngineForkchoiceUpdatedV2(fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes) *ForkchoiceResponseExpectObject { +func (tec *TestEngineClient) TestEngineForkchoiceUpdatedV2(fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes) *ForkchoiceResponseExpectObject { ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) defer cancel() resp, err := tec.Engine.ForkchoiceUpdatedV2(ctx, fcState, pAttributes) @@ -121,7 +121,7 @@ func (tec *TestEngineClient) TestEngineForkchoiceUpdatedV2(fcState *api.Forkchoi return ret } -func (tec *TestEngineClient) TestEngineForkchoiceUpdated(fcState *api.ForkchoiceStateV1, pAttributes *api.PayloadAttributes, version int) *ForkchoiceResponseExpectObject { +func (tec *TestEngineClient) TestEngineForkchoiceUpdated(fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes, version int) *ForkchoiceResponseExpectObject { if version == -1 { version = client.LatestForkchoiceUpdatedVersion } diff --git a/simulators/ethereum/engine/types/gen_ed.go b/simulators/ethereum/engine/types/gen_ed.go index 319d31d6d7..b6c72364ba 100644 --- a/simulators/ethereum/engine/types/gen_ed.go +++ b/simulators/ethereum/engine/types/gen_ed.go @@ -17,24 +17,23 @@ var _ = (*executableDataMarshaling)(nil) // MarshalJSON marshals as JSON. func (e ExecutableData) MarshalJSON() ([]byte, error) { type ExecutableData struct { - ParentHash common.Hash `json:"parentHash" gencodec:"required"` - FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` - StateRoot common.Hash `json:"stateRoot" gencodec:"required"` - ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` - LogsBloom hexutil.Bytes `json:"logsBloom" gencodec:"required"` - Random common.Hash `json:"prevRandao" gencodec:"required"` - Number hexutil.Uint64 `json:"blockNumber" gencodec:"required"` - GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"` - GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` - Timestamp hexutil.Uint64 `json:"timestamp" gencodec:"required"` - ExtraData hexutil.Bytes `json:"extraData" gencodec:"required"` - BaseFeePerGas *hexutil.Big `json:"baseFeePerGas" gencodec:"required"` - BlockHash common.Hash `json:"blockHash" gencodec:"required"` - Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` - Withdrawals []*types.Withdrawal `json:"withdrawals"` - BlobGasUsed *hexutil.Uint64 `json:"blobGasUsed,omitempty"` - ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas,omitempty"` - ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot,omitempty"` + ParentHash common.Hash `json:"parentHash" gencodec:"required"` + FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` + StateRoot common.Hash `json:"stateRoot" gencodec:"required"` + ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` + LogsBloom hexutil.Bytes `json:"logsBloom" gencodec:"required"` + Random common.Hash `json:"prevRandao" gencodec:"required"` + Number hexutil.Uint64 `json:"blockNumber" gencodec:"required"` + GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"` + GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` + Timestamp hexutil.Uint64 `json:"timestamp" gencodec:"required"` + ExtraData hexutil.Bytes `json:"extraData" gencodec:"required"` + BaseFeePerGas *hexutil.Big `json:"baseFeePerGas" gencodec:"required"` + BlockHash common.Hash `json:"blockHash" gencodec:"required"` + Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` + Withdrawals []*types.Withdrawal `json:"withdrawals"` + BlobGasUsed *hexutil.Uint64 `json:"blobGasUsed,omitempty"` + ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas,omitempty"` } var enc ExecutableData enc.ParentHash = e.ParentHash @@ -59,31 +58,29 @@ func (e ExecutableData) MarshalJSON() ([]byte, error) { enc.Withdrawals = e.Withdrawals enc.BlobGasUsed = (*hexutil.Uint64)(e.BlobGasUsed) enc.ExcessBlobGas = (*hexutil.Uint64)(e.ExcessBlobGas) - enc.ParentBeaconBlockRoot = e.ParentBeaconBlockRoot return json.Marshal(&enc) } // UnmarshalJSON unmarshals from JSON. func (e *ExecutableData) UnmarshalJSON(input []byte) error { type ExecutableData struct { - ParentHash *common.Hash `json:"parentHash" gencodec:"required"` - FeeRecipient *common.Address `json:"feeRecipient" gencodec:"required"` - StateRoot *common.Hash `json:"stateRoot" gencodec:"required"` - ReceiptsRoot *common.Hash `json:"receiptsRoot" gencodec:"required"` - LogsBloom *hexutil.Bytes `json:"logsBloom" gencodec:"required"` - Random *common.Hash `json:"prevRandao" gencodec:"required"` - Number *hexutil.Uint64 `json:"blockNumber" gencodec:"required"` - GasLimit *hexutil.Uint64 `json:"gasLimit" gencodec:"required"` - GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"` - Timestamp *hexutil.Uint64 `json:"timestamp" gencodec:"required"` - ExtraData *hexutil.Bytes `json:"extraData" gencodec:"required"` - BaseFeePerGas *hexutil.Big `json:"baseFeePerGas" gencodec:"required"` - BlockHash *common.Hash `json:"blockHash" gencodec:"required"` - Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` - Withdrawals []*types.Withdrawal `json:"withdrawals"` - BlobGasUsed *hexutil.Uint64 `json:"blobGasUsed,omitempty"` - ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas,omitempty"` - ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot,omitempty"` + ParentHash *common.Hash `json:"parentHash" gencodec:"required"` + FeeRecipient *common.Address `json:"feeRecipient" gencodec:"required"` + StateRoot *common.Hash `json:"stateRoot" gencodec:"required"` + ReceiptsRoot *common.Hash `json:"receiptsRoot" gencodec:"required"` + LogsBloom *hexutil.Bytes `json:"logsBloom" gencodec:"required"` + Random *common.Hash `json:"prevRandao" gencodec:"required"` + Number *hexutil.Uint64 `json:"blockNumber" gencodec:"required"` + GasLimit *hexutil.Uint64 `json:"gasLimit" gencodec:"required"` + GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"` + Timestamp *hexutil.Uint64 `json:"timestamp" gencodec:"required"` + ExtraData *hexutil.Bytes `json:"extraData" gencodec:"required"` + BaseFeePerGas *hexutil.Big `json:"baseFeePerGas" gencodec:"required"` + BlockHash *common.Hash `json:"blockHash" gencodec:"required"` + Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` + Withdrawals []*types.Withdrawal `json:"withdrawals"` + BlobGasUsed *hexutil.Uint64 `json:"blobGasUsed,omitempty"` + ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas,omitempty"` } var dec ExecutableData if err := json.Unmarshal(input, &dec); err != nil { @@ -157,8 +154,5 @@ func (e *ExecutableData) UnmarshalJSON(input []byte) error { if dec.ExcessBlobGas != nil { e.ExcessBlobGas = (*uint64)(dec.ExcessBlobGas) } - if dec.ParentBeaconBlockRoot != nil { - e.ParentBeaconBlockRoot = dec.ParentBeaconBlockRoot - } return nil } diff --git a/simulators/ethereum/engine/types/types.go b/simulators/ethereum/engine/types/types.go index ac7a1cb41f..d947485b37 100644 --- a/simulators/ethereum/engine/types/types.go +++ b/simulators/ethereum/engine/types/types.go @@ -117,24 +117,23 @@ type payloadAttributesMarshaling struct { // ExecutableData is the data necessary to execute an EL payload. type ExecutableData struct { - ParentHash common.Hash `json:"parentHash" gencodec:"required"` - FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` - StateRoot common.Hash `json:"stateRoot" gencodec:"required"` - ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` - LogsBloom []byte `json:"logsBloom" gencodec:"required"` - Random common.Hash `json:"prevRandao" gencodec:"required"` - Number uint64 `json:"blockNumber" gencodec:"required"` - GasLimit uint64 `json:"gasLimit" gencodec:"required"` - GasUsed uint64 `json:"gasUsed" gencodec:"required"` - Timestamp uint64 `json:"timestamp" gencodec:"required"` - ExtraData []byte `json:"extraData" gencodec:"required"` - BaseFeePerGas *big.Int `json:"baseFeePerGas" gencodec:"required"` - BlockHash common.Hash `json:"blockHash" gencodec:"required"` - Transactions [][]byte `json:"transactions" gencodec:"required"` - Withdrawals []*types.Withdrawal `json:"withdrawals"` - BlobGasUsed *uint64 `json:"blobGasUsed,omitempty"` - ExcessBlobGas *uint64 `json:"excessBlobGas,omitempty"` - ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot,omitempty"` + ParentHash common.Hash `json:"parentHash" gencodec:"required"` + FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` + StateRoot common.Hash `json:"stateRoot" gencodec:"required"` + ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` + LogsBloom []byte `json:"logsBloom" gencodec:"required"` + Random common.Hash `json:"prevRandao" gencodec:"required"` + Number uint64 `json:"blockNumber" gencodec:"required"` + GasLimit uint64 `json:"gasLimit" gencodec:"required"` + GasUsed uint64 `json:"gasUsed" gencodec:"required"` + Timestamp uint64 `json:"timestamp" gencodec:"required"` + ExtraData []byte `json:"extraData" gencodec:"required"` + BaseFeePerGas *big.Int `json:"baseFeePerGas" gencodec:"required"` + BlockHash common.Hash `json:"blockHash" gencodec:"required"` + Transactions [][]byte `json:"transactions" gencodec:"required"` + Withdrawals []*types.Withdrawal `json:"withdrawals"` + BlobGasUsed *uint64 `json:"blobGasUsed,omitempty"` + ExcessBlobGas *uint64 `json:"excessBlobGas,omitempty"` } // JSON type overrides for executableData. @@ -165,9 +164,6 @@ type executionPayloadEnvelopeMarshaling struct { // Convert Execution Payload Types func ToBeaconExecutableData(pl *ExecutableData) (geth_beacon.ExecutableData, error) { - if pl.ParentBeaconBlockRoot != nil { - return geth_beacon.ExecutableData{}, fmt.Errorf("parent geth_beacon block root is not nil is unsupported") - } return geth_beacon.ExecutableData{ ParentHash: pl.ParentHash, FeeRecipient: pl.FeeRecipient, @@ -210,8 +206,8 @@ func FromBeaconExecutableData(ed *geth_beacon.ExecutableData) (ExecutableData, e }, nil } -func ExecutableDataToBlock(ed ExecutableData, versionedHashes []common.Hash) (*types.Block, error) { - if ed.ParentBeaconBlockRoot != nil { +func ExecutableDataToBlock(ed ExecutableData, versionedHashes []common.Hash, beaconRoot *common.Hash) (*types.Block, error) { + if beaconRoot != nil { return nil, fmt.Errorf("parent geth_beacon block root is not nil is unsupported") } geth_ed, err := ToBeaconExecutableData(&ed) From d6fbb55a438affee95d404c6592ad5235adaf4e0 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 28 Jul 2023 00:52:21 +0000 Subject: [PATCH 04/19] simulators/ethereum/engine: add beacon root tests --- .../engine/suites/blobs/helper_test.go | 22 ++++++++++++++++++ .../ethereum/engine/suites/blobs/helpers.go | 9 ++++++++ .../ethereum/engine/suites/blobs/steps.go | 23 +++++++++++++++++++ .../ethereum/engine/suites/blobs/tests.go | 6 ++++- 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 simulators/ethereum/engine/suites/blobs/helper_test.go diff --git a/simulators/ethereum/engine/suites/blobs/helper_test.go b/simulators/ethereum/engine/suites/blobs/helper_test.go new file mode 100644 index 0000000000..55c09f6664 --- /dev/null +++ b/simulators/ethereum/engine/suites/blobs/helper_test.go @@ -0,0 +1,22 @@ +package suite_blobs + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" +) + +func TestBeaconRootStorageIndexes(t *testing.T) { + + expectedTimestampKey := common.HexToHash("0x000000000000000000000000000000000000000000000000000000000000000a") + expectedRootKey := common.HexToHash("0x000000000000000000000000000000000000000000000000000000000001800a") + + gotTimestampKey, gotRootKey := BeaconRootStorageIndexes(0xa) + + if gotTimestampKey != expectedTimestampKey { + t.Fatal("expected timestamp key to be", expectedTimestampKey.Hex(), "got", gotTimestampKey.Hex()) + } + if gotRootKey != expectedRootKey { + t.Fatal("expected root key to be", expectedRootKey.Hex(), "got", gotRootKey.Hex()) + } +} diff --git a/simulators/ethereum/engine/suites/blobs/helpers.go b/simulators/ethereum/engine/suites/blobs/helpers.go index 13963ab797..62ca6992e8 100644 --- a/simulators/ethereum/engine/suites/blobs/helpers.go +++ b/simulators/ethereum/engine/suites/blobs/helpers.go @@ -5,6 +5,7 @@ import ( "context" "encoding/hex" "fmt" + "math/big" "reflect" "sync" @@ -127,3 +128,11 @@ func VerifyTransactionFromNode(ctx context.Context, eth client.Eth, tx typ.Trans return nil } + +func BeaconRootStorageIndexes(timestamp uint64) (common.Hash, common.Hash) { + // Calculate keys + timestampReduced := timestamp % HISTORICAL_ROOTS_MODULUS + timestampExtended := timestampReduced + HISTORICAL_ROOTS_MODULUS + + return common.BigToHash(new(big.Int).SetUint64(timestampReduced)), common.BigToHash(new(big.Int).SetUint64(timestampExtended)) +} diff --git a/simulators/ethereum/engine/suites/blobs/steps.go b/simulators/ethereum/engine/suites/blobs/steps.go index 81b9e51713..36de5db09e 100644 --- a/simulators/ethereum/engine/suites/blobs/steps.go +++ b/simulators/ethereum/engine/suites/blobs/steps.go @@ -253,6 +253,25 @@ func GetBlobDataInPayload(pool *TestBlobTxPool, payload *typ.ExecutableData) ([] return blobTxsInPayload, blobDataInPayload, nil } +func VerifyBeaconRootStorage(ctx context.Context, testEngine *test.TestEngineClient, payload *typ.ExecutableData) error { + // Read the storage keys from the stateful precompile that stores the beacon roots and verify + // that the beacon root is the same as the one in the payload + blockNumber := new(big.Int).SetUint64(payload.Number) + precompileAddress := common.BytesToAddress([]byte{HISTORY_STORAGE_ADDRESS}) + + timestampKey, beaconRootKey := BeaconRootStorageIndexes(payload.Timestamp) + + // Verify the timestamp key + r := testEngine.TestStorageAt(precompileAddress, timestampKey, blockNumber) + r.ExpectBigIntStorageEqual(new(big.Int).SetUint64(payload.Timestamp)) + + // Verify the beacon root key + r = testEngine.TestStorageAt(precompileAddress, beaconRootKey, blockNumber) + parentBeaconBlockRoot := clmock.TimestampToBeaconRoot(payload.Timestamp) + r.ExpectStorageEqual(parentBeaconBlockRoot) + return nil +} + func (step NewPayloads) VerifyPayload(ctx context.Context, forkConfig *globals.ForkConfig, testEngine *test.TestEngineClient, blobTxsInPayload []*typ.TransactionWithBlobData, payload *typ.ExecutableData, previousPayload *typ.ExecutableData) error { var ( parentExcessBlobGas = uint64(0) @@ -297,6 +316,10 @@ func (step NewPayloads) VerifyPayload(ctx context.Context, forkConfig *globals.F return fmt.Errorf("expected %d blobs in transactions, got %d", step.ExpectedIncludedBlobCount, totalBlobCount) } + if err := VerifyBeaconRootStorage(ctx, testEngine, payload); err != nil { + return err + } + } else { if payload.ExcessBlobGas != nil { return fmt.Errorf("payload contains non-nil excessDataGas pre-fork") diff --git a/simulators/ethereum/engine/suites/blobs/tests.go b/simulators/ethereum/engine/suites/blobs/tests.go index 4d67db1c15..fe41545965 100644 --- a/simulators/ethereum/engine/suites/blobs/tests.go +++ b/simulators/ethereum/engine/suites/blobs/tests.go @@ -15,7 +15,7 @@ var ( DATAHASH_START_ADDRESS = big.NewInt(0x100) DATAHASH_ADDRESS_COUNT = 1000 - // Fork specific constants + // EIP 4844 specific constants GAS_PER_BLOB = uint64(0x20000) MIN_DATA_GASPRICE = uint64(1) @@ -29,6 +29,10 @@ var ( BLOB_COMMITMENT_VERSION_KZG = byte(0x01) + // EIP 4788 specific constants + HISTORY_STORAGE_ADDRESS = uint8(0x0B) + HISTORICAL_ROOTS_MODULUS = uint64(98304) + // Engine API errors INVALID_PARAMS_ERROR = pInt(-32602) UNSUPPORTED_FORK_ERROR = pInt(-38005) From d8462da2fd86f6c4d01044f499fccc2fee4268ff Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 28 Jul 2023 15:10:53 +0000 Subject: [PATCH 05/19] simulators/ethereum/engine:use custom geth branch --- simulators/ethereum/engine/go.mod | 2 ++ simulators/ethereum/engine/go.sum | 4 ++-- simulators/ethereum/go.work.sum | 27 ++++++++++++++++++++++----- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index 4f18399ab9..2c5a490570 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -95,3 +95,5 @@ require ( gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect rsc.io/tmplfunc v0.0.3 // indirect ) + +replace github.com/ethereum/go-ethereum => github.com/marioevz/go-ethereum v1.10.14-0.20230728150146-10a170a90571 diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index d5933e220c..8f69a0aea0 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -84,8 +84,6 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.3.0 h1:3Y3hD6l5i0dEYsBL50C+Om644kve3pNqoAcvE26o9zI= github.com/ethereum/c-kzg-4844 v0.3.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= -github.com/ethereum/go-ethereum v1.12.1-0.20230728070838-8f2ae29b8f77 h1:b3uiqqHx+e6Mnfb4cJMsAzS7FmJWpxs+PixCg//t2CY= -github.com/ethereum/go-ethereum v1.12.1-0.20230728070838-8f2ae29b8f77/go.mod h1:zKetLweqBR8ZS+1O9iJWI8DvmmD2NzD19apjEWDCsnw= github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= @@ -235,6 +233,8 @@ github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awS github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/marioevz/go-ethereum v1.10.14-0.20230728150146-10a170a90571 h1:QIP2WTkrzRiYW406yqF5F06f5IBbIyHFh+e3LD8G5no= +github.com/marioevz/go-ethereum v1.10.14-0.20230728150146-10a170a90571/go.mod h1:zKetLweqBR8ZS+1O9iJWI8DvmmD2NzD19apjEWDCsnw= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= diff --git a/simulators/ethereum/go.work.sum b/simulators/ethereum/go.work.sum index 05b4a8aee8..ebc2a90eae 100644 --- a/simulators/ethereum/go.work.sum +++ b/simulators/ethereum/go.work.sum @@ -557,13 +557,18 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/marioevz/go-ethereum v1.10.14-0.20230728150146-10a170a90571 h1:QIP2WTkrzRiYW406yqF5F06f5IBbIyHFh+e3LD8G5no= +github.com/marioevz/go-ethereum v1.10.14-0.20230728150146-10a170a90571/go.mod h1:zKetLweqBR8ZS+1O9iJWI8DvmmD2NzD19apjEWDCsnw= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -590,7 +595,6 @@ github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2 github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= @@ -638,10 +642,13 @@ github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3 github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= +github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= @@ -680,6 +687,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= @@ -708,6 +716,8 @@ github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bd github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= +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/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -723,6 +733,7 @@ github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITn github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -731,7 +742,8 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= +github.com/urfave/cli/v2 v2.24.1 h1:/QYYr7g0EhwXEML8jO+8OYt5trPnLHS0p3mrgExJ5NU= +github.com/urfave/cli/v2 v2.24.1/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -743,6 +755,7 @@ github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= @@ -759,11 +772,12 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= +go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -790,6 +804,7 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -809,7 +824,6 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -846,6 +860,7 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -918,9 +933,11 @@ golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -977,7 +994,6 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= @@ -1044,6 +1060,7 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= From 40ed5fa52053af8ce009c532a10020ec40a88f2a Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 28 Jul 2023 15:43:08 +0000 Subject: [PATCH 06/19] simulators/ethereum/engine: beaconRoot everywhere --- simulators/ethereum/engine/client/engine.go | 4 +- .../engine/client/hive_rpc/hive_rpc.go | 12 +-- .../ethereum/engine/client/node/node.go | 8 +- simulators/ethereum/engine/clmock/clmock.go | 16 ++-- simulators/ethereum/engine/helper/payload.go | 82 +++++++++---------- .../ethereum/engine/suites/blobs/steps.go | 22 ++++- .../ethereum/engine/suites/engine/tests.go | 32 ++++---- .../engine/suites/withdrawals/tests.go | 10 +-- simulators/ethereum/engine/test/expect.go | 4 +- .../ethereum/engine/types/gen_blockparams.go | 10 +-- simulators/ethereum/engine/types/types.go | 4 +- 11 files changed, 107 insertions(+), 97 deletions(-) diff --git a/simulators/ethereum/engine/client/engine.go b/simulators/ethereum/engine/client/engine.go index 26b755eb54..7ef03a988e 100644 --- a/simulators/ethereum/engine/client/engine.go +++ b/simulators/ethereum/engine/client/engine.go @@ -38,10 +38,10 @@ type Engine interface { GetPayloadV2(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, error) GetPayloadV3(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, *typ.BlobsBundle, error) - NewPayload(ctx context.Context, version int, payload interface{}, versionedHashes *[]common.Hash) (api.PayloadStatusV1, error) + NewPayload(ctx context.Context, version int, payload interface{}, versionedHashes *[]common.Hash, beaconRoot *common.Hash) (api.PayloadStatusV1, error) NewPayloadV1(ctx context.Context, payload *typ.ExecutableDataV1) (api.PayloadStatusV1, error) NewPayloadV2(ctx context.Context, payload *typ.ExecutableData) (api.PayloadStatusV1, error) - NewPayloadV3(ctx context.Context, payload *typ.ExecutableData, versionedHashes *[]common.Hash) (api.PayloadStatusV1, error) + NewPayloadV3(ctx context.Context, payload *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash) (api.PayloadStatusV1, error) GetPayloadBodiesByRangeV1(ctx context.Context, start uint64, count uint64) ([]*typ.ExecutionPayloadBodyV1, error) GetPayloadBodiesByHashV1(ctx context.Context, hashes []common.Hash) ([]*typ.ExecutionPayloadBodyV1, error) diff --git a/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go b/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go index d1ec2385a2..b7b0acde01 100644 --- a/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go +++ b/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go @@ -452,13 +452,13 @@ func (ec *HiveRPCEngineClient) GetBlobsBundleV1(ctx context.Context, payloadId * } // New Payload API Call Methods -func (ec *HiveRPCEngineClient) NewPayload(ctx context.Context, version int, payload interface{}, versionedHashes *[]common.Hash) (result api.PayloadStatusV1, err error) { +func (ec *HiveRPCEngineClient) NewPayload(ctx context.Context, version int, payload interface{}, versionedHashes *[]common.Hash, beaconRoot *common.Hash) (result api.PayloadStatusV1, err error) { if err := ec.PrepareDefaultAuthCallToken(); err != nil { return result, err } if version >= 3 { - err = ec.c.CallContext(ctx, &result, fmt.Sprintf("engine_newPayloadV%d", version), payload, versionedHashes) + err = ec.c.CallContext(ctx, &result, fmt.Sprintf("engine_newPayloadV%d", version), payload, versionedHashes, beaconRoot) } else { err = ec.c.CallContext(ctx, &result, fmt.Sprintf("engine_newPayloadV%d", version), payload) } @@ -469,17 +469,17 @@ func (ec *HiveRPCEngineClient) NewPayload(ctx context.Context, version int, payl func (ec *HiveRPCEngineClient) NewPayloadV1(ctx context.Context, payload *typ.ExecutableDataV1) (api.PayloadStatusV1, error) { ed := payload.ToExecutableData() ec.latestPayloadSent = &ed - return ec.NewPayload(ctx, 1, payload, nil) + return ec.NewPayload(ctx, 1, payload, nil, nil) } func (ec *HiveRPCEngineClient) NewPayloadV2(ctx context.Context, payload *typ.ExecutableData) (api.PayloadStatusV1, error) { ec.latestPayloadSent = payload - return ec.NewPayload(ctx, 2, payload, nil) + return ec.NewPayload(ctx, 2, payload, nil, nil) } -func (ec *HiveRPCEngineClient) NewPayloadV3(ctx context.Context, payload *typ.ExecutableData, versionedHashes *[]common.Hash) (api.PayloadStatusV1, error) { +func (ec *HiveRPCEngineClient) NewPayloadV3(ctx context.Context, payload *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash) (api.PayloadStatusV1, error) { ec.latestPayloadSent = payload - return ec.NewPayload(ctx, 3, payload, versionedHashes) + return ec.NewPayload(ctx, 3, payload, versionedHashes, beaconRoot) } // Exchange Transition Configuration API Call Methods diff --git a/simulators/ethereum/engine/client/node/node.go b/simulators/ethereum/engine/client/node/node.go index 7ba64be031..17f7e20429 100644 --- a/simulators/ethereum/engine/client/node/node.go +++ b/simulators/ethereum/engine/client/node/node.go @@ -432,7 +432,7 @@ func (n *GethNode) SetBlock(block *types.Block, parentNumber uint64, parentRoot } // Engine API -func (n *GethNode) NewPayload(ctx context.Context, version int, pl interface{}, vh *[]common.Hash) (beacon.PayloadStatusV1, error) { +func (n *GethNode) NewPayload(ctx context.Context, version int, pl interface{}, vh *[]common.Hash, beaconRoot *common.Hash) (beacon.PayloadStatusV1, error) { switch version { case 1: if c, ok := pl.(*typ.ExecutableDataV1); ok { @@ -448,7 +448,7 @@ func (n *GethNode) NewPayload(ctx context.Context, version int, pl interface{}, } case 3: if c, ok := pl.(*typ.ExecutableData); ok { - return n.NewPayloadV3(ctx, c, vh) + return n.NewPayloadV3(ctx, c, vh, beaconRoot) } else { return beacon.PayloadStatusV1{}, fmt.Errorf("wrong type %T", pl) } @@ -479,13 +479,13 @@ func (n *GethNode) NewPayloadV2(ctx context.Context, pl *typ.ExecutableData) (be return resp, err } -func (n *GethNode) NewPayloadV3(ctx context.Context, pl *typ.ExecutableData, versionedHashes *[]common.Hash) (beacon.PayloadStatusV1, error) { +func (n *GethNode) NewPayloadV3(ctx context.Context, pl *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash) (beacon.PayloadStatusV1, error) { n.latestPayloadSent = pl ed, err := typ.ToBeaconExecutableData(pl) if err != nil { return beacon.PayloadStatusV1{}, err } - resp, err := n.api.NewPayloadV3(ed, versionedHashes) + resp, err := n.api.NewPayloadV3(ed, versionedHashes, beaconRoot) n.latestPayloadStatusReponse = &resp return resp, err } diff --git a/simulators/ethereum/engine/clmock/clmock.go b/simulators/ethereum/engine/clmock/clmock.go index 13004e3f4a..a0178d1fad 100644 --- a/simulators/ethereum/engine/clmock/clmock.go +++ b/simulators/ethereum/engine/clmock/clmock.go @@ -381,14 +381,14 @@ func (cl *CLMocker) SetNextWithdrawals(nextWithdrawals types.Withdrawals) { func TimestampToBeaconRoot(timestamp uint64) common.Hash { // Generates a deterministic hash from the timestamp - beaconBlockRoot := common.Hash{} + beaconRoot := common.Hash{} timestampBytes := make([]byte, 8) binary.BigEndian.PutUint64(timestampBytes[:], timestamp) md := sha256.New() md.Write(timestampBytes) timestampHash := md.Sum(nil) - copy(beaconBlockRoot[:], timestampHash) - return beaconBlockRoot + copy(beaconRoot[:], timestampHash) + return beaconRoot } func (cl *CLMocker) RequestNextPayload() { @@ -408,8 +408,8 @@ func (cl *CLMocker) RequestNextPayload() { if cl.IsCancun(cl.LatestPayloadAttributes.Timestamp) { // Write a deterministic hash based on the block number - beaconBlockRoot := TimestampToBeaconRoot(cl.LatestPayloadAttributes.Timestamp) - cl.LatestPayloadAttributes.ParentBeaconBlockRoot = &beaconBlockRoot + beaconRoot := TimestampToBeaconRoot(cl.LatestPayloadAttributes.Timestamp) + cl.LatestPayloadAttributes.BeaconRoot = &beaconRoot } // Save random value @@ -488,7 +488,7 @@ func (cl *CLMocker) broadcastNextNewPayload() { } } // Broadcast the executePayload to all clients - responses := cl.BroadcastNewPayload(&cl.LatestPayloadBuilt, versionedHashes) + responses := cl.BroadcastNewPayload(&cl.LatestPayloadBuilt, versionedHashes, cl.LatestPayloadAttributes.BeaconRoot) validations := 0 for _, resp := range responses { if resp.Error != nil { @@ -701,7 +701,7 @@ type ExecutePayloadOutcome struct { Error error } -func (cl *CLMocker) BroadcastNewPayload(payload *typ.ExecutableData, versionedHashes *[]common.Hash) []ExecutePayloadOutcome { +func (cl *CLMocker) BroadcastNewPayload(payload *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash) []ExecutePayloadOutcome { responses := make([]ExecutePayloadOutcome, len(cl.EngineClients)) for i, ec := range cl.EngineClients { responses[i].Container = ec.ID() @@ -712,7 +712,7 @@ func (cl *CLMocker) BroadcastNewPayload(payload *typ.ExecutableData, versionedHa err error ) if cl.IsCancun(payload.Timestamp) { - execPayloadResp, err = ec.NewPayloadV3(ctx, payload, versionedHashes) + execPayloadResp, err = ec.NewPayloadV3(ctx, payload, versionedHashes, beaconRoot) } else if cl.IsShanghai(payload.Timestamp) { execPayloadResp, err = ec.NewPayloadV2(ctx, payload) } else { diff --git a/simulators/ethereum/engine/helper/payload.go b/simulators/ethereum/engine/helper/payload.go index 0d6f5126de..45b2c139ae 100644 --- a/simulators/ethereum/engine/helper/payload.go +++ b/simulators/ethereum/engine/helper/payload.go @@ -12,50 +12,49 @@ import ( "github.com/ethereum/go-ethereum/trie" "github.com/ethereum/hive/simulators/ethereum/engine/globals" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" - "github.com/pkg/errors" ) type PayloadCustomizer interface { - CustomizePayload(basePayload *typ.ExecutableData) (*typ.ExecutableData, error) + CustomizePayload(basePayload *typ.ExecutableData) (modifiedPayload *typ.ExecutableData, beaconRoot *common.Hash, err error) } type CustomPayloadData struct { - ParentHash *common.Hash - FeeRecipient *common.Address - StateRoot *common.Hash - ReceiptsRoot *common.Hash - LogsBloom *[]byte - PrevRandao *common.Hash - Number *uint64 - GasLimit *uint64 - GasUsed *uint64 - Timestamp *uint64 - ExtraData *[]byte - BaseFeePerGas *big.Int - BlockHash *common.Hash - Transactions *[][]byte - Withdrawals types.Withdrawals - RemoveWithdrawals bool - BlobGasUsed *uint64 - RemoveBlobGasUsed bool - ExcessBlobGas *uint64 - RemoveExcessBlobGas bool - ParentBeaconBlockRoot *common.Hash - RemoveParentBeaconBlockRoot bool + ParentHash *common.Hash + FeeRecipient *common.Address + StateRoot *common.Hash + ReceiptsRoot *common.Hash + LogsBloom *[]byte + PrevRandao *common.Hash + Number *uint64 + GasLimit *uint64 + GasUsed *uint64 + Timestamp *uint64 + ExtraData *[]byte + BaseFeePerGas *big.Int + BlockHash *common.Hash + Transactions *[][]byte + Withdrawals types.Withdrawals + RemoveWithdrawals bool + BlobGasUsed *uint64 + RemoveBlobGasUsed bool + ExcessBlobGas *uint64 + RemoveExcessBlobGas bool + BeaconRoot *common.Hash + RemoveBeaconRoot bool } var _ PayloadCustomizer = (*CustomPayloadData)(nil) // Construct a customized payload by taking an existing payload as base and mixing it CustomPayloadData // BlockHash is calculated automatically. -func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.ExecutableData) (*typ.ExecutableData, error) { +func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.ExecutableData) (*typ.ExecutableData, *common.Hash, error) { txs := basePayload.Transactions if customData.Transactions != nil { txs = *customData.Transactions } txsHash, err := calcTxsHash(txs) if err != nil { - return nil, err + return nil, nil, err } fmt.Printf("txsHash: %v\n", txsHash) // Start by filling the header with the basePayload information @@ -137,8 +136,10 @@ func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.Executabl } else if basePayload.ExcessBlobGas != nil { customPayloadHeader.ExcessBlobGas = basePayload.ExcessBlobGas } - if customData.ParentBeaconBlockRoot != nil { - return nil, errors.New("ParentBeaconBlockRoot is not supported") + if customData.RemoveBeaconRoot { + customPayloadHeader.BeaconRoot = nil + } else if customData.BeaconRoot != nil { + customPayloadHeader.BeaconRoot = customData.BeaconRoot } // Return the new payload @@ -167,15 +168,15 @@ func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.Executabl } else if basePayload.Withdrawals != nil { result.Withdrawals = basePayload.Withdrawals } - return result, nil + return result, customPayloadHeader.BeaconRoot, nil } -func CustomizePayloadTransactions(basePayload *typ.ExecutableData, customTransactions types.Transactions) (*typ.ExecutableData, error) { +func CustomizePayloadTransactions(basePayload *typ.ExecutableData, customTransactions types.Transactions) (*typ.ExecutableData, *common.Hash, error) { byteTxs := make([][]byte, 0) for _, tx := range customTransactions { bytes, err := tx.MarshalBinary() if err != nil { - return nil, err + return nil, nil, err } byteTxs = append(byteTxs, bytes) } @@ -233,7 +234,7 @@ func (customData *CustomPayloadData) String() string { // This function generates an invalid payload by taking a base payload and modifying the specified field such that it ends up being invalid. // One small consideration is that the payload needs to contain transactions and specially transactions using the PREVRANDAO opcode for all the fields to be compatible with this function. -func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField InvalidPayloadBlockField) (*typ.ExecutableData, error) { +func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField InvalidPayloadBlockField) (*typ.ExecutableData, *common.Hash, error) { var customPayloadMod *CustomPayloadData switch payloadField { @@ -297,11 +298,11 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField Invali InvalidTransactionChainID: if len(basePayload.Transactions) == 0 { - return nil, fmt.Errorf("no transactions available for modification") + return nil, nil, fmt.Errorf("no transactions available for modification") } var baseTx types.Transaction if err := baseTx.UnmarshalBinary(basePayload.Transactions[0]); err != nil { - return nil, err + return nil, nil, err } var customTxData CustomTransactionData switch payloadField { @@ -332,12 +333,12 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField Invali modifiedTx, err := customizeTransaction(&baseTx, globals.VaultKey, &customTxData) if err != nil { - return nil, err + return nil, nil, err } modifiedTxBytes, err := modifiedTx.MarshalBinary() if err != nil { - return nil, err + return nil, nil, err } modifiedTransactions := [][]byte{ modifiedTxBytes, @@ -349,15 +350,10 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField Invali if customPayloadMod == nil { copyPayload := *basePayload - return ©Payload, nil + return ©Payload, nil, nil } - alteredPayload, err := customPayloadMod.CustomizePayload(basePayload) - if err != nil { - return nil, err - } - - return alteredPayload, nil + return customPayloadMod.CustomizePayload(basePayload) } /* diff --git a/simulators/ethereum/engine/suites/blobs/steps.go b/simulators/ethereum/engine/suites/blobs/steps.go index 36de5db09e..0935383842 100644 --- a/simulators/ethereum/engine/suites/blobs/steps.go +++ b/simulators/ethereum/engine/suites/blobs/steps.go @@ -427,6 +427,7 @@ func (step NewPayloads) Execute(t *BlobTestContext) error { var ( payload = &t.CLMock.LatestPayloadBuilt versionedHashes *[]common.Hash = nil + beaconRoot *common.Hash = t.CLMock.LatestPayloadAttributes.BeaconRoot r *test.NewPayloadResponseExpectObject err error ) @@ -447,10 +448,11 @@ func (step NewPayloads) Execute(t *BlobTestContext) error { if step.PayloadCustomizer != nil { // Send a custom new payload - payload, err = step.PayloadCustomizer.CustomizePayload(payload) + payload, beaconRoot, err = step.PayloadCustomizer.CustomizePayload(payload) if err != nil { t.Fatalf("FAIL: Error customizing payload (payload %d/%d): %v", p+1, payloadCount, err) } + } version := step.Version @@ -463,7 +465,7 @@ func (step NewPayloads) Execute(t *BlobTestContext) error { } if version == 3 { - r = t.TestEngine.TestEngineNewPayloadV3(payload, versionedHashes) + r = t.TestEngine.TestEngineNewPayloadV3(payload, versionedHashes, beaconRoot) } else if version == 2 { r = t.TestEngine.TestEngineNewPayloadV2(payload) } else { @@ -604,6 +606,8 @@ type SendModifiedLatestPayload struct { ClientID uint64 // Versioned hashes modification VersionedHashes *VersionedHashes + // Other modifications + PayloadCustomizer helper.PayloadCustomizer // Expected responses on the NewPayload call ExpectedError *int ExpectedStatus test.PayloadStatus @@ -611,7 +615,10 @@ type SendModifiedLatestPayload struct { func (step SendModifiedLatestPayload) Execute(t *BlobTestContext) error { // Get the latest payload - payload := &t.CLMock.LatestPayloadBuilt + var ( + payload = &t.CLMock.LatestPayloadBuilt + beaconRoot = t.CLMock.LatestPayloadAttributes.BeaconRoot + ) if payload == nil { return fmt.Errorf("no payload available") } @@ -620,12 +627,19 @@ func (step SendModifiedLatestPayload) Execute(t *BlobTestContext) error { if err != nil { return fmt.Errorf("error getting modified versioned hashes: %v", err) } + // Modify the payload + if step.PayloadCustomizer != nil { + payload, beaconRoot, err = step.PayloadCustomizer.CustomizePayload(payload) + if err != nil { + return fmt.Errorf("error modifying payload: %v", err) + } + } // Send the payload if step.ClientID >= uint64(len(t.TestEngines)) { return fmt.Errorf("invalid client index %d", step.ClientID) } testEngine := t.TestEngines[step.ClientID] - r := testEngine.TestEngineNewPayloadV3(payload, versionedHashes) + r := testEngine.TestEngineNewPayloadV3(payload, versionedHashes, beaconRoot) if step.ExpectedError != nil { r.ExpectErrorCode(*step.ExpectedError) } else { diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index 8369b0dd66..dd94cfdc6c 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -858,7 +858,7 @@ func inconsistentForkchoiceStateGen(inconsistency string) func(t *test.Env) { if len(alternativePayloads) > 0 { customData.ParentHash = &alternativePayloads[len(alternativePayloads)-1].BlockHash } - alternativePayload, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + alternativePayload, _, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to construct alternative payload: %v", t.TestName, err) } @@ -1109,7 +1109,7 @@ func badHashOnNewPayloadGen(syncing bool, sidechain bool) func(*test.Env) { customizer := &helper.CustomPayloadData{ ParentHash: &alteredPayload.BlockHash, } - alteredPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + alteredPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to modify payload: %v", t.TestName, err) } @@ -1225,7 +1225,7 @@ func invalidPayloadTestCaseGen(payloadField helper.InvalidPayloadBlockField, syn t.Fatalf("FAIL (%s): No transactions in the base payload", t.TestName) } - alteredPayload, err = helper.GenerateInvalidPayload(&t.CLMock.LatestPayloadBuilt, payloadField) + alteredPayload, _, err = helper.GenerateInvalidPayload(&t.CLMock.LatestPayloadBuilt, payloadField) if err != nil { t.Fatalf("FAIL (%s): Unable to modify payload (%v): %v", t.TestName, payloadField, err) } @@ -1348,7 +1348,7 @@ func invalidPayloadTestCaseGen(payloadField helper.InvalidPayloadBlockField, syn customizer := &helper.CustomPayloadData{ ParentHash: &alteredPayload.BlockHash, } - followUpAlteredPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + followUpAlteredPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to modify payload: %v", t.TestName, err) } @@ -1432,12 +1432,12 @@ func invalidMissingAncestorReOrgGen(invalid_index int, payloadField helper.Inval ParentHash: &altChainPayloads[len(altChainPayloads)-1].BlockHash, ExtraData: &([]byte{0x01}), } - sidePayload, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + sidePayload, _, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } if len(altChainPayloads) == invalid_index { - sidePayload, err = helper.GenerateInvalidPayload(sidePayload, payloadField) + sidePayload, _, err = helper.GenerateInvalidPayload(sidePayload, payloadField) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -1640,12 +1640,12 @@ func (spec InvalidMissingAncestorReOrgSpec) GenerateSync() func(*test.Env) { ParentHash: &pHash, ExtraData: &([]byte{0x01}), } - sidePayload, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + sidePayload, _, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } if len(altChainPayloads) == invalidIndex { - sidePayload, err = helper.GenerateInvalidPayload(sidePayload, spec.PayloadField) + sidePayload, _, err = helper.GenerateInvalidPayload(sidePayload, spec.PayloadField) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -2018,13 +2018,13 @@ func blockStatusReorg(t *test.Env) { customizer := &helper.CustomPayloadData{ PrevRandao: &customRandom, } - customizedPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + customizedPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } // Send custom payload and fcU to it - t.CLMock.BroadcastNewPayload(customizedPayload, nil) + t.CLMock.BroadcastNewPayload(customizedPayload, nil, nil) t.CLMock.BroadcastForkchoiceUpdated(&api.ForkchoiceStateV1{ HeadBlockHash: customizedPayload.BlockHash, SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, @@ -2104,7 +2104,7 @@ func reorgPrevValidatedPayloadOnSideChain(t *test.Env) { if len(sidechainPayloads) > 0 { customData.ParentHash = &sidechainPayloads[len(sidechainPayloads)-1].BlockHash } - altPayload, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + altPayload, _, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -2169,7 +2169,7 @@ func safeReorgToSideChain(t *test.Env) { ParentHash: &altParentHash, ExtraData: &([]byte{0x01}), } - altPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + altPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -2232,7 +2232,7 @@ func reorgBackFromSyncing(t *test.Env) { ParentHash: &altParentHash, ExtraData: &([]byte{0x01}), } - altPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + altPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -2445,7 +2445,7 @@ func transactionReorgBlockhash(newNPOnRevert bool) func(t *test.Env) { customizer := &helper.CustomPayloadData{ ExtraData: &([]byte{0x01}), } - sidePayload, err = customizer.CustomizePayload(mainPayload) + sidePayload, _, err = customizer.CustomizePayload(mainPayload) if err != nil { t.Fatalf("Error creating reorg payload %v", err) } @@ -2632,7 +2632,7 @@ func multipleNewCanonicalPayloads(t *test.Env) { customizer := &helper.CustomPayloadData{ PrevRandao: &newPrevRandao, } - newPayload, err := customizer.CustomizePayload(&basePayload) + newPayload, _, err := customizer.CustomizePayload(&basePayload) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload %v: %v", t.TestName, i, err) } @@ -2911,7 +2911,7 @@ func payloadBuildAfterNewInvalidPayload(t *test.Env) { s := invalidPayloadProducer.TestEngineGetPayloadV1(r.Response.PayloadID) s.ExpectNoError() - inv_p, err = helper.GenerateInvalidPayload(&s.Payload, helper.InvalidStateRoot) + inv_p, _, err = helper.GenerateInvalidPayload(&s.Payload, helper.InvalidStateRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to invalidate payload: %v", t.TestName, err) } diff --git a/simulators/ethereum/engine/suites/withdrawals/tests.go b/simulators/ethereum/engine/suites/withdrawals/tests.go index 559ed852df..ba94cc2edc 100644 --- a/simulators/ethereum/engine/suites/withdrawals/tests.go +++ b/simulators/ethereum/engine/suites/withdrawals/tests.go @@ -1217,7 +1217,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { customizer := &helper.CustomPayloadData{ Withdrawals: emptyWithdrawalsList, } - payloadPlusWithdrawals, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + payloadPlusWithdrawals, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("Unable to append withdrawals: %v", err) } @@ -1313,7 +1313,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { customizer := &helper.CustomPayloadData{ RemoveWithdrawals: true, } - nilWithdrawalsPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + nilWithdrawalsPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("Unable to append withdrawals: %v", err) } @@ -1920,7 +1920,7 @@ func (s *MaxInitcodeSizeSpec) Execute(t *test.Env) { // Customize the payload to include a tx with an invalid initcode if invTx, ok := invalidTx.(*types.Transaction); ok { - customPayload, err := helper.CustomizePayloadTransactions(&t.CLMock.LatestPayloadBuilt, types.Transactions{invTx}) + customPayload, _, err := helper.CustomizePayloadTransactions(&t.CLMock.LatestPayloadBuilt, types.Transactions{invTx}) if err != nil { t.Fatalf("FAIL: Unable to customize payload: %v", err) } @@ -2095,7 +2095,7 @@ func (ws *GetPayloadBodiesSpec) Execute(t *test.Env) { customizer := &helper.CustomPayloadData{ Withdrawals: helper.RandomizeWithdrawalsOrder(t.CLMock.LatestExecutedPayload.Withdrawals), } - sidechainCurrent, err := customizer.CustomizePayload(&t.CLMock.LatestExecutedPayload) + sidechainCurrent, _, err := customizer.CustomizePayload(&t.CLMock.LatestExecutedPayload) if err != nil { t.Fatalf("FAIL (%s): Error obtaining custom sidechain payload: %v", t.TestName, err) } @@ -2103,7 +2103,7 @@ func (ws *GetPayloadBodiesSpec) Execute(t *test.Env) { ParentHash: &sidechainCurrent.BlockHash, Withdrawals: helper.RandomizeWithdrawalsOrder(nextCanonicalPayload.Withdrawals), } - sidechainHead, err := customizer.CustomizePayload(nextCanonicalPayload) + sidechainHead, _, err := customizer.CustomizePayload(nextCanonicalPayload) if err != nil { t.Fatalf("FAIL (%s): Error obtaining custom sidechain payload: %v", t.TestName, err) } diff --git a/simulators/ethereum/engine/test/expect.go b/simulators/ethereum/engine/test/expect.go index 864d30793b..a87e2819c9 100644 --- a/simulators/ethereum/engine/test/expect.go +++ b/simulators/ethereum/engine/test/expect.go @@ -251,10 +251,10 @@ func (tec *TestEngineClient) TestEngineNewPayloadV2(payload *typ.ExecutableData) return ret } -func (tec *TestEngineClient) TestEngineNewPayloadV3(payload *typ.ExecutableData, versionedHashes *[]common.Hash) *NewPayloadResponseExpectObject { +func (tec *TestEngineClient) TestEngineNewPayloadV3(payload *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash) *NewPayloadResponseExpectObject { ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) defer cancel() - status, err := tec.Engine.NewPayloadV3(ctx, payload, versionedHashes) + status, err := tec.Engine.NewPayloadV3(ctx, payload, versionedHashes, beaconRoot) ret := &NewPayloadResponseExpectObject{ ExpectEnv: &ExpectEnv{Env: tec.Env}, Payload: payload, diff --git a/simulators/ethereum/engine/types/gen_blockparams.go b/simulators/ethereum/engine/types/gen_blockparams.go index c4a589e583..04be18d016 100644 --- a/simulators/ethereum/engine/types/gen_blockparams.go +++ b/simulators/ethereum/engine/types/gen_blockparams.go @@ -20,14 +20,14 @@ func (p PayloadAttributes) MarshalJSON() ([]byte, error) { Random common.Hash `json:"prevRandao" gencodec:"required"` SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient" gencodec:"required"` Withdrawals []*types.Withdrawal `json:"withdrawals"` - ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` + BeaconRoot *common.Hash `json:"parentBeaconBlockRoot"` } var enc PayloadAttributes enc.Timestamp = hexutil.Uint64(p.Timestamp) enc.Random = p.Random enc.SuggestedFeeRecipient = p.SuggestedFeeRecipient enc.Withdrawals = p.Withdrawals - enc.ParentBeaconBlockRoot = p.ParentBeaconBlockRoot + enc.BeaconRoot = p.BeaconRoot return json.Marshal(&enc) } @@ -38,7 +38,7 @@ func (p *PayloadAttributes) UnmarshalJSON(input []byte) error { Random *common.Hash `json:"prevRandao" gencodec:"required"` SuggestedFeeRecipient *common.Address `json:"suggestedFeeRecipient" gencodec:"required"` Withdrawals []*types.Withdrawal `json:"withdrawals"` - ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` + BeaconRoot *common.Hash `json:"parentBeaconBlockRoot"` } var dec PayloadAttributes if err := json.Unmarshal(input, &dec); err != nil { @@ -59,8 +59,8 @@ func (p *PayloadAttributes) UnmarshalJSON(input []byte) error { if dec.Withdrawals != nil { p.Withdrawals = dec.Withdrawals } - if dec.ParentBeaconBlockRoot != nil { - p.ParentBeaconBlockRoot = dec.ParentBeaconBlockRoot + if dec.BeaconRoot != nil { + p.BeaconRoot = dec.BeaconRoot } return nil } diff --git a/simulators/ethereum/engine/types/types.go b/simulators/ethereum/engine/types/types.go index d947485b37..32ead65658 100644 --- a/simulators/ethereum/engine/types/types.go +++ b/simulators/ethereum/engine/types/types.go @@ -105,7 +105,7 @@ type PayloadAttributes struct { Random common.Hash `json:"prevRandao" gencodec:"required"` SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient" gencodec:"required"` Withdrawals []*types.Withdrawal `json:"withdrawals"` - ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` + BeaconRoot *common.Hash `json:"parentBeaconBlockRoot"` } // JSON type overrides for PayloadAttributes. @@ -214,7 +214,7 @@ func ExecutableDataToBlock(ed ExecutableData, versionedHashes []common.Hash, bea if err != nil { return nil, err } - return geth_beacon.ExecutableDataToBlock(geth_ed, versionedHashes) + return geth_beacon.ExecutableDataToBlock(geth_ed, versionedHashes, beaconRoot) } func BlockToExecutableData(block *types.Block, fees *big.Int) ExecutableData { From c24f868015377b35a5791d74584760978b8a7bd5 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 31 Jul 2023 03:21:32 +0000 Subject: [PATCH 07/19] simulators/ethereum/engine: Add 1 wei to 4788 stateful precompile --- simulators/ethereum/engine/suites/blobs/config.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/simulators/ethereum/engine/suites/blobs/config.go b/simulators/ethereum/engine/suites/blobs/config.go index aeeafef9ce..69f1c6dfb5 100644 --- a/simulators/ethereum/engine/suites/blobs/config.go +++ b/simulators/ethereum/engine/suites/blobs/config.go @@ -92,6 +92,12 @@ func (bs *BlobsBaseSpec) GetGenesis() *core.Genesis { } } + // Add 1 wei to the 4788 stateful precompile so its account is not deleted at the end of + // block execution. + genesis.Alloc[common.BigToAddress(new(big.Int).SetUint64(uint64(HISTORY_STORAGE_ADDRESS)))] = core.GenesisAccount{ + Balance: big.NewInt(1), + } + return genesis } From 50c62d4152a55b21085c03326a3fdc1947f04596 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 31 Jul 2023 21:33:30 +0000 Subject: [PATCH 08/19] simulators/ethereum: go.work.sum --- simulators/ethereum/go.work.sum | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/simulators/ethereum/go.work.sum b/simulators/ethereum/go.work.sum index ebc2a90eae..a6426e19c0 100644 --- a/simulators/ethereum/go.work.sum +++ b/simulators/ethereum/go.work.sum @@ -557,18 +557,13 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marioevz/go-ethereum v1.10.14-0.20230728150146-10a170a90571 h1:QIP2WTkrzRiYW406yqF5F06f5IBbIyHFh+e3LD8G5no= -github.com/marioevz/go-ethereum v1.10.14-0.20230728150146-10a170a90571/go.mod h1:zKetLweqBR8ZS+1O9iJWI8DvmmD2NzD19apjEWDCsnw= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -595,6 +590,7 @@ github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2 github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= @@ -642,13 +638,10 @@ github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3 github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= -github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= @@ -687,7 +680,6 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= @@ -716,8 +708,6 @@ github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bd github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= -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/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -733,7 +723,6 @@ github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITn github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -742,8 +731,6 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/urfave/cli/v2 v2.24.1 h1:/QYYr7g0EhwXEML8jO+8OYt5trPnLHS0p3mrgExJ5NU= -github.com/urfave/cli/v2 v2.24.1/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -755,7 +742,6 @@ github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= @@ -772,12 +758,11 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= -go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -804,7 +789,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -860,7 +844,6 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -933,11 +916,9 @@ golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -1060,7 +1041,6 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= From 96d08771950a4d0a5eb519e90f8048263c20c75b Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 2 Aug 2023 18:04:40 +0000 Subject: [PATCH 09/19] simulators/ethereum/engine: update geth version --- simulators/ethereum/engine/go.mod | 2 +- simulators/ethereum/engine/go.sum | 4 ++-- simulators/ethereum/go.work.sum | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index 2c5a490570..f3e2cf09ce 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -96,4 +96,4 @@ require ( rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/marioevz/go-ethereum v1.10.14-0.20230728150146-10a170a90571 +replace github.com/ethereum/go-ethereum => github.com/marioevz/go-ethereum v1.10.14-0.20230802180057-7bd535142c42 diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index 8f69a0aea0..1905a10ca1 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -233,8 +233,8 @@ github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awS github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/marioevz/go-ethereum v1.10.14-0.20230728150146-10a170a90571 h1:QIP2WTkrzRiYW406yqF5F06f5IBbIyHFh+e3LD8G5no= -github.com/marioevz/go-ethereum v1.10.14-0.20230728150146-10a170a90571/go.mod h1:zKetLweqBR8ZS+1O9iJWI8DvmmD2NzD19apjEWDCsnw= +github.com/marioevz/go-ethereum v1.10.14-0.20230802180057-7bd535142c42 h1:YRJHuf5fXz/YMqsKjF8hRX99k2uZ7GQLQjtTKJKgcQY= +github.com/marioevz/go-ethereum v1.10.14-0.20230802180057-7bd535142c42/go.mod h1:zKetLweqBR8ZS+1O9iJWI8DvmmD2NzD19apjEWDCsnw= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= diff --git a/simulators/ethereum/go.work.sum b/simulators/ethereum/go.work.sum index a6426e19c0..de96ddd891 100644 --- a/simulators/ethereum/go.work.sum +++ b/simulators/ethereum/go.work.sum @@ -557,6 +557,8 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/marioevz/go-ethereum v1.10.14-0.20230802180057-7bd535142c42 h1:YRJHuf5fXz/YMqsKjF8hRX99k2uZ7GQLQjtTKJKgcQY= +github.com/marioevz/go-ethereum v1.10.14-0.20230802180057-7bd535142c42/go.mod h1:zKetLweqBR8ZS+1O9iJWI8DvmmD2NzD19apjEWDCsnw= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= From 421bd79044c1484e3b67ae06156425e161284d3a Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 2 Aug 2023 18:06:54 +0000 Subject: [PATCH 10/19] simulators/ethereum/engine: add beacon root to genesis --- simulators/ethereum/engine/suites/blobs/config.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/simulators/ethereum/engine/suites/blobs/config.go b/simulators/ethereum/engine/suites/blobs/config.go index 69f1c6dfb5..4695f8badf 100644 --- a/simulators/ethereum/engine/suites/blobs/config.go +++ b/simulators/ethereum/engine/suites/blobs/config.go @@ -56,9 +56,9 @@ func (bs *BlobsBaseSpec) GetGenesis() *core.Genesis { genesis.ExtraData = []byte{} if bs.CancunForkHeight == 0 { - genesis.BlobGasUsed = pUint64(0) - genesis.ExcessBlobGas = pUint64(0) - // TODO (DEVNET 8): Add parent beacon block + genesis.BlobGasUsed = new(uint64) + genesis.ExcessBlobGas = new(uint64) + genesis.BeaconRoot = new(common.Hash) } // Add accounts that use the DATAHASH opcode From 8dcdeb2ffadcd2f44e898e7b249d41c78fe0f11f Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 2 Aug 2023 19:49:54 +0000 Subject: [PATCH 11/19] simulators/ethereum/engine: fix clmock method versions usage --- simulators/ethereum/engine/clmock/clmock.go | 68 +++++++------------ .../ethereum/engine/suites/engine/tests.go | 2 +- 2 files changed, 27 insertions(+), 43 deletions(-) diff --git a/simulators/ethereum/engine/clmock/clmock.go b/simulators/ethereum/engine/clmock/clmock.go index a0178d1fad..30afa8a722 100644 --- a/simulators/ethereum/engine/clmock/clmock.go +++ b/simulators/ethereum/engine/clmock/clmock.go @@ -391,6 +391,24 @@ func TimestampToBeaconRoot(timestamp uint64) common.Hash { return beaconRoot } +func (cl *CLMocker) ForkchoiceUpdatedVersion(timestamp uint64) int { + if cl.IsCancun(timestamp) { + return 3 + } else if cl.IsShanghai(timestamp) { + return 2 + } + return 1 +} + +func (cl *CLMocker) NewPayloadVersion(timestamp uint64) int { + if cl.IsCancun(timestamp) { + return 3 + } else if cl.IsShanghai(timestamp) { + return 2 + } + return 1 +} + func (cl *CLMocker) RequestNextPayload() { // Generate a random value for the PrevRandao field nextPrevRandao := common.Hash{} @@ -417,19 +435,8 @@ func (cl *CLMocker) RequestNextPayload() { ctx, cancel := context.WithTimeout(cl.TestContext, globals.RPCTimeout) defer cancel() - var ( - resp api.ForkChoiceResponse - fcUVersion int - err error - ) - if cl.IsCancun(cl.LatestPayloadAttributes.Timestamp) { - fcUVersion = 3 - } else if cl.IsShanghai(cl.LatestPayloadAttributes.Timestamp) { - fcUVersion = 2 - } else { - fcUVersion = 1 - } - resp, err = cl.NextBlockProducer.ForkchoiceUpdated(ctx, fcUVersion, &cl.LatestForkchoice, &cl.LatestPayloadAttributes) + fcUVersion := cl.ForkchoiceUpdatedVersion(cl.LatestPayloadAttributes.Timestamp) + resp, err := cl.NextBlockProducer.ForkchoiceUpdated(ctx, fcUVersion, &cl.LatestForkchoice, &cl.LatestPayloadAttributes) if err != nil { cl.Fatalf("CLMocker: Could not send forkchoiceUpdatedV%d (%v): %v", fcUVersion, cl.NextBlockProducer.ID(), err) } @@ -488,9 +495,9 @@ func (cl *CLMocker) broadcastNextNewPayload() { } } // Broadcast the executePayload to all clients - responses := cl.BroadcastNewPayload(&cl.LatestPayloadBuilt, versionedHashes, cl.LatestPayloadAttributes.BeaconRoot) + version := cl.NewPayloadVersion(cl.LatestPayloadBuilt.Timestamp) validations := 0 - for _, resp := range responses { + for _, resp := range cl.BroadcastNewPayload(&cl.LatestPayloadBuilt, versionedHashes, cl.LatestPayloadAttributes.BeaconRoot, version) { if resp.Error != nil { cl.Logf("CLMocker: BroadcastNewPayload Error (%v): %v\n", resp.Container, resp.Error) } else { @@ -529,10 +536,7 @@ func (cl *CLMocker) broadcastNextNewPayload() { } func (cl *CLMocker) broadcastLatestForkchoice() { - version := 1 - if cl.IsShanghai(cl.LatestExecutedPayload.Timestamp) { - version = 2 - } + version := cl.ForkchoiceUpdatedVersion(cl.LatestExecutedPayload.Timestamp) for _, resp := range cl.BroadcastForkchoiceUpdated(&cl.LatestForkchoice, nil, version) { if resp.Error != nil { cl.Logf("CLMocker: BroadcastForkchoiceUpdated Error (%v): %v\n", resp.Container, resp.Error) @@ -701,25 +705,13 @@ type ExecutePayloadOutcome struct { Error error } -func (cl *CLMocker) BroadcastNewPayload(payload *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash) []ExecutePayloadOutcome { +func (cl *CLMocker) BroadcastNewPayload(payload *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash, version int) []ExecutePayloadOutcome { responses := make([]ExecutePayloadOutcome, len(cl.EngineClients)) for i, ec := range cl.EngineClients { responses[i].Container = ec.ID() ctx, cancel := context.WithTimeout(cl.TestContext, globals.RPCTimeout) defer cancel() - var ( - execPayloadResp api.PayloadStatusV1 - err error - ) - if cl.IsCancun(payload.Timestamp) { - execPayloadResp, err = ec.NewPayloadV3(ctx, payload, versionedHashes, beaconRoot) - } else if cl.IsShanghai(payload.Timestamp) { - execPayloadResp, err = ec.NewPayloadV2(ctx, payload) - } else { - edv1 := &typ.ExecutableDataV1{} - edv1.FromExecutableData(payload) - execPayloadResp, err = ec.NewPayloadV1(ctx, edv1) - } + execPayloadResp, err := ec.NewPayload(ctx, version, payload, versionedHashes, beaconRoot) if err != nil { cl.Errorf("CLMocker: Could not ExecutePayloadV1: %v", err) responses[i].Error = err @@ -745,15 +737,7 @@ func (cl *CLMocker) BroadcastForkchoiceUpdated(fcstate *api.ForkchoiceStateV1, p if cl.IsOptimisticallySyncing() || newPayloadStatus.Status == "VALID" { ctx, cancel := context.WithTimeout(cl.TestContext, globals.RPCTimeout) defer cancel() - var ( - fcUpdatedResp api.ForkChoiceResponse - err error - ) - if version == 2 { - fcUpdatedResp, err = ec.ForkchoiceUpdatedV2(ctx, fcstate, payloadAttr) - } else if version == 1 { - fcUpdatedResp, err = ec.ForkchoiceUpdatedV1(ctx, fcstate, payloadAttr) - } + fcUpdatedResp, err := ec.ForkchoiceUpdated(ctx, version, fcstate, payloadAttr) if err != nil { cl.Errorf("CLMocker: Could not ForkchoiceUpdatedV1: %v", err) responses[i].Error = err diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index dd94cfdc6c..c5d40eadc7 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -2024,7 +2024,7 @@ func blockStatusReorg(t *test.Env) { } // Send custom payload and fcU to it - t.CLMock.BroadcastNewPayload(customizedPayload, nil, nil) + t.CLMock.BroadcastNewPayload(customizedPayload, nil, nil, t.CLMock.NewPayloadVersion(customizedPayload.Timestamp)) t.CLMock.BroadcastForkchoiceUpdated(&api.ForkchoiceStateV1{ HeadBlockHash: customizedPayload.BlockHash, SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, From 0ad850b2629e74f7d960f811f2e9060af7c09948 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 2 Aug 2023 23:59:49 +0000 Subject: [PATCH 12/19] simulators/ethereum/engine: refactor --- simulators/ethereum/engine/clmock/clmock.go | 18 ------------- simulators/ethereum/engine/globals/globals.go | 27 +++++++++++++++++++ .../ethereum/engine/suites/blobs/steps.go | 17 +++--------- .../engine/suites/withdrawals/tests.go | 4 +-- simulators/ethereum/engine/test/expect.go | 10 ++++--- 5 files changed, 39 insertions(+), 37 deletions(-) diff --git a/simulators/ethereum/engine/clmock/clmock.go b/simulators/ethereum/engine/clmock/clmock.go index 30afa8a722..a9cb2e938a 100644 --- a/simulators/ethereum/engine/clmock/clmock.go +++ b/simulators/ethereum/engine/clmock/clmock.go @@ -391,24 +391,6 @@ func TimestampToBeaconRoot(timestamp uint64) common.Hash { return beaconRoot } -func (cl *CLMocker) ForkchoiceUpdatedVersion(timestamp uint64) int { - if cl.IsCancun(timestamp) { - return 3 - } else if cl.IsShanghai(timestamp) { - return 2 - } - return 1 -} - -func (cl *CLMocker) NewPayloadVersion(timestamp uint64) int { - if cl.IsCancun(timestamp) { - return 3 - } else if cl.IsShanghai(timestamp) { - return 2 - } - return 1 -} - func (cl *CLMocker) RequestNextPayload() { // Generate a random value for the PrevRandao field nextPrevRandao := common.Hash{} diff --git a/simulators/ethereum/engine/globals/globals.go b/simulators/ethereum/engine/globals/globals.go index c0e762c0d4..43e07f4a94 100644 --- a/simulators/ethereum/engine/globals/globals.go +++ b/simulators/ethereum/engine/globals/globals.go @@ -157,3 +157,30 @@ func (f *ForkConfig) IsShanghai(blockTimestamp uint64) bool { func (f *ForkConfig) IsCancun(blockTimestamp uint64) bool { return f.CancunTimestamp != nil && new(big.Int).SetUint64(blockTimestamp).Cmp(f.CancunTimestamp) >= 0 } + +func (f *ForkConfig) ForkchoiceUpdatedVersion(timestamp uint64) int { + if f.IsCancun(timestamp) { + return 3 + } else if f.IsShanghai(timestamp) { + return 2 + } + return 1 +} + +func (f *ForkConfig) NewPayloadVersion(timestamp uint64) int { + if f.IsCancun(timestamp) { + return 3 + } else if f.IsShanghai(timestamp) { + return 2 + } + return 1 +} + +func (f *ForkConfig) GetPayloadVersion(timestamp uint64) int { + if f.IsCancun(timestamp) { + return 3 + } else if f.IsShanghai(timestamp) { + return 2 + } + return 1 +} diff --git a/simulators/ethereum/engine/suites/blobs/steps.go b/simulators/ethereum/engine/suites/blobs/steps.go index 0935383842..a5060a0c57 100644 --- a/simulators/ethereum/engine/suites/blobs/steps.go +++ b/simulators/ethereum/engine/suites/blobs/steps.go @@ -129,7 +129,7 @@ type NewPayloads struct { // Extra modifications on NewPayload to potentially generate an invalid payload PayloadCustomizer helper.PayloadCustomizer // Version to use to call NewPayload - Version uint64 + Version int // Expected responses on the NewPayload call ExpectedError *int ExpectedStatus test.PayloadStatus @@ -457,20 +457,9 @@ func (step NewPayloads) Execute(t *BlobTestContext) error { version := step.Version if version == 0 { - if t.Env.ForkConfig.IsCancun(payload.Timestamp) { - version = 3 - } else { - version = 2 - } - } - - if version == 3 { - r = t.TestEngine.TestEngineNewPayloadV3(payload, versionedHashes, beaconRoot) - } else if version == 2 { - r = t.TestEngine.TestEngineNewPayloadV2(payload) - } else { - t.Fatalf("FAIL: Unknown version %d", step.Version) + version = t.Env.ForkConfig.NewPayloadVersion(payload.Timestamp) } + r = t.TestEngine.TestEngineNewPayload(payload, versionedHashes, beaconRoot, version) if step.ExpectedError != nil { r.ExpectErrorCode(*step.ExpectedError) } else { diff --git a/simulators/ethereum/engine/suites/withdrawals/tests.go b/simulators/ethereum/engine/suites/withdrawals/tests.go index ba94cc2edc..d8d54feaf7 100644 --- a/simulators/ethereum/engine/suites/withdrawals/tests.go +++ b/simulators/ethereum/engine/suites/withdrawals/tests.go @@ -1683,7 +1683,7 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { // This block is part of both chains, simply forward it to the secondary client payload = &t.CLMock.LatestPayloadBuilt } - r := secondaryEngineTest.TestEngineNewPayload(payload, version) + r := secondaryEngineTest.TestEngineNewPayload(payload, nil, nil, version) r.ExpectStatus(test.Valid) p := secondaryEngineTest.TestEngineForkchoiceUpdated( &beacon.ForkchoiceStateV1{ @@ -1780,7 +1780,7 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { version = 1 } t.Logf("INFO (%s): Sending sidechain payload %d, hash=%s, parent=%s", t.TestName, payloadNumber, payload.BlockHash, payload.ParentHash) - r := t.TestEngine.TestEngineNewPayload(payload, version) + r := t.TestEngine.TestEngineNewPayload(payload, nil, nil, version) r.ExpectStatusEither(test.Valid, test.Accepted) p := t.TestEngine.TestEngineForkchoiceUpdated( &beacon.ForkchoiceStateV1{ diff --git a/simulators/ethereum/engine/test/expect.go b/simulators/ethereum/engine/test/expect.go index a87e2819c9..83864d6b96 100644 --- a/simulators/ethereum/engine/test/expect.go +++ b/simulators/ethereum/engine/test/expect.go @@ -268,11 +268,15 @@ func (tec *TestEngineClient) TestEngineNewPayloadV3(payload *typ.ExecutableData, return ret } -func (tec *TestEngineClient) TestEngineNewPayload(payload *typ.ExecutableData, version int) *NewPayloadResponseExpectObject { - if version == 2 { +func (tec *TestEngineClient) TestEngineNewPayload(payload *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash, version int) *NewPayloadResponseExpectObject { + if version == 3 { + return tec.TestEngineNewPayloadV3(payload, versionedHashes, beaconRoot) + } else if version == 2 { return tec.TestEngineNewPayloadV2(payload) + } else if version == 1 { + return tec.TestEngineNewPayloadV1(payload) } - return tec.TestEngineNewPayloadV1(payload) + panic(fmt.Sprintf("Unsupported version: %d", version)) } func (exp *NewPayloadResponseExpectObject) PayloadJson() string { From bda0d085c1052233d0be391447e561e901c50917 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 3 Aug 2023 00:46:50 +0000 Subject: [PATCH 13/19] simulators/ethereum/engine: Fix expectations on some tests, and print expectation on output --- .../ethereum/engine/suites/blobs/steps.go | 6 +- .../ethereum/engine/suites/blobs/tests.go | 124 +++++++++++++++++- 2 files changed, 121 insertions(+), 9 deletions(-) diff --git a/simulators/ethereum/engine/suites/blobs/steps.go b/simulators/ethereum/engine/suites/blobs/steps.go index a5060a0c57..a514652466 100644 --- a/simulators/ethereum/engine/suites/blobs/steps.go +++ b/simulators/ethereum/engine/suites/blobs/steps.go @@ -131,8 +131,9 @@ type NewPayloads struct { // Version to use to call NewPayload Version int // Expected responses on the NewPayload call - ExpectedError *int - ExpectedStatus test.PayloadStatus + ExpectedError *int + ExpectationDescription string + ExpectedStatus test.PayloadStatus } type VersionedHashes struct { @@ -460,6 +461,7 @@ func (step NewPayloads) Execute(t *BlobTestContext) error { version = t.Env.ForkConfig.NewPayloadVersion(payload.Timestamp) } r = t.TestEngine.TestEngineNewPayload(payload, versionedHashes, beaconRoot, version) + r.ExpectationDescription = step.ExpectationDescription if step.ExpectedError != nil { r.ExpectErrorCode(*step.ExpectedError) } else { diff --git a/simulators/ethereum/engine/suites/blobs/tests.go b/simulators/ethereum/engine/suites/blobs/tests.go index fe41545965..70137bb341 100644 --- a/simulators/ethereum/engine/suites/blobs/tests.go +++ b/simulators/ethereum/engine/suites/blobs/tests.go @@ -523,12 +523,13 @@ var Tests = []test.SpecInterface{ // NewPayloadV3 Before Cancun, Negative Tests &BlobsBaseSpec{ Spec: test.Spec{ - Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Nil Versioned Hashes", + Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Nil Versioned Hashes, Nil Beacon Root", About: ` Test sending NewPayloadV3 Before Cancun with: - nil ExcessBlobGas - nil BlobGasUsed - nil Versioned Hashes Array + - nil Beacon Root `, }, @@ -542,17 +543,21 @@ var Tests = []test.SpecInterface{ Blobs: nil, }, ExpectedError: INVALID_PARAMS_ERROR, + ExpectationDescription: ` + NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code -32602) + `, }, }, }, &BlobsBaseSpec{ Spec: test.Spec{ - Name: "NewPayloadV3 Before Cancun, Nil ExcessBlobGas, 0x00 BlobGasUsed, Nil Versioned Hashes", + Name: "NewPayloadV3 Before Cancun, Nil ExcessBlobGas, 0x00 BlobGasUsed, Nil Versioned Hashes, Nil Beacon Root", About: ` Test sending NewPayloadV3 Before Cancun with: - nil ExcessBlobGas - 0x00 BlobGasUsed - nil Versioned Hashes Array + - nil Beacon Root `, }, @@ -566,17 +571,21 @@ var Tests = []test.SpecInterface{ BlobGasUsed: pUint64(0), }, ExpectedError: INVALID_PARAMS_ERROR, + ExpectationDescription: ` + NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code -32602) + `, }, }, }, &BlobsBaseSpec{ Spec: test.Spec{ - Name: "NewPayloadV3 Before Cancun, 0x00 ExcessBlobGas, Nil BlobGasUsed, Nil Versioned Hashes", + Name: "NewPayloadV3 Before Cancun, 0x00 ExcessBlobGas, Nil BlobGasUsed, Nil Versioned Hashes, Nil Beacon Root", About: ` Test sending NewPayloadV3 Before Cancun with: - 0x00 ExcessBlobGas - nil BlobGasUsed - nil Versioned Hashes Array + - nil Beacon Root `, }, @@ -590,18 +599,22 @@ var Tests = []test.SpecInterface{ ExcessBlobGas: pUint64(0), }, ExpectedError: INVALID_PARAMS_ERROR, + ExpectationDescription: ` + NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code -32602) + `, }, }, }, &BlobsBaseSpec{ Spec: test.Spec{ - Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Empty Array Versioned Hashes", + Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Empty Array Versioned Hashes, Nil Beacon Root", About: ` Test sending NewPayloadV3 Before Cancun with: - nil ExcessBlobGas - nil BlobGasUsed - Empty Versioned Hashes Array - `, + - nil Beacon Root + `, }, CancunForkHeight: 2, @@ -614,17 +627,49 @@ var Tests = []test.SpecInterface{ Blobs: []helper.BlobID{}, }, ExpectedError: INVALID_PARAMS_ERROR, + ExpectationDescription: ` + NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code -32602) + `, + }, + }, + }, + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Nil Versioned Hashes, Zero Beacon Root", + About: ` + Test sending NewPayloadV3 Before Cancun with: + - nil ExcessBlobGas + - nil BlobGasUsed + - nil Versioned Hashes Array + - Zero Beacon Root + `, + }, + + CancunForkHeight: 2, + + TestSequence: TestSequence{ + NewPayloads{ + ExpectedIncludedBlobCount: 0, + Version: 3, + PayloadCustomizer: &helper.CustomPayloadData{ + BeaconRoot: &(common.Hash{}), + }, + ExpectedError: INVALID_PARAMS_ERROR, + ExpectationDescription: ` + NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code -32602) + `, }, }, }, &BlobsBaseSpec{ Spec: test.Spec{ - Name: "NewPayloadV3 Before Cancun, 0x00 Data Fields, Empty Array Versioned Hashes", + Name: "NewPayloadV3 Before Cancun, 0x00 Data Fields, Empty Array Versioned Hashes, Zero Beacon Root", About: ` Test sending NewPayloadV3 Before Cancun with: - 0x00 ExcessBlobGas - 0x00 BlobGasUsed - Empty Versioned Hashes Array + - Zero Beacon Root `, }, @@ -640,8 +685,12 @@ var Tests = []test.SpecInterface{ PayloadCustomizer: &helper.CustomPayloadData{ ExcessBlobGas: pUint64(0), BlobGasUsed: pUint64(0), + BeaconRoot: &(common.Hash{}), }, ExpectedError: UNSUPPORTED_FORK_ERROR, + ExpectationDescription: ` + NewPayloadV3 before Cancun with no nil fields must return UNSUPPORTED_FORK_ERROR (code -38005) + `, }, }, }, @@ -649,12 +698,13 @@ var Tests = []test.SpecInterface{ // NewPayloadV3 After Cancun, Negative Tests &BlobsBaseSpec{ Spec: test.Spec{ - Name: "NewPayloadV3 After Cancun, Nil ExcessBlobGas, 0x00 BlobGasUsed, Empty Array Versioned Hashes", + Name: "NewPayloadV3 After Cancun, Nil ExcessBlobGas, 0x00 BlobGasUsed, Empty Array Versioned Hashes, Zero Beacon Root", About: ` Test sending NewPayloadV3 After Cancun with: - nil ExcessBlobGas - 0x00 BlobGasUsed - Empty Versioned Hashes Array + - Zero Beacon Root `, }, @@ -668,6 +718,9 @@ var Tests = []test.SpecInterface{ RemoveExcessBlobGas: true, }, ExpectedError: INVALID_PARAMS_ERROR, + ExpectationDescription: ` + NewPayloadV3 after Cancun with nil ExcessBlobGas must return INVALID_PARAMS_ERROR (code -32602) + `, }, }, }, @@ -692,6 +745,36 @@ var Tests = []test.SpecInterface{ RemoveBlobGasUsed: true, }, ExpectedError: INVALID_PARAMS_ERROR, + ExpectationDescription: ` + NewPayloadV3 after Cancun with nil BlobGasUsed must return INVALID_PARAMS_ERROR (code -32602) + `, + }, + }, + }, + &BlobsBaseSpec{ + Spec: test.Spec{ + Name: "NewPayloadV3 After Cancun, 0x00 Blob Fields, Empty Array Versioned Hashes, Nil Beacon Root", + About: ` + Test sending NewPayloadV3 After Cancun with: + - 0x00 ExcessBlobGas + - nil BlobGasUsed + - Empty Versioned Hashes Array + `, + }, + + CancunForkHeight: 1, + + TestSequence: TestSequence{ + NewPayloads{ + ExpectedIncludedBlobCount: 0, + Version: 3, + PayloadCustomizer: &helper.CustomPayloadData{ + RemoveBeaconRoot: true, + }, + ExpectedError: INVALID_PARAMS_ERROR, + ExpectationDescription: ` + NewPayloadV3 after Cancun with nil parentBeaconBlockRoot must return INVALID_PARAMS_ERROR (code -32602) + `, }, }, }, @@ -718,6 +801,9 @@ var Tests = []test.SpecInterface{ Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), }, ExpectedStatus: test.Invalid, + ExpectationDescription: ` + NewPayloadV3 with incorrect list of versioned hashes must return INVALID status + `, }, }, }, @@ -744,6 +830,9 @@ var Tests = []test.SpecInterface{ Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK+1), }, ExpectedStatus: test.Invalid, + ExpectationDescription: ` + NewPayloadV3 with incorrect list of versioned hashes must return INVALID status + `, }, }, }, @@ -768,6 +857,9 @@ var Tests = []test.SpecInterface{ Blobs: helper.GetBlobListByIndex(helper.BlobID(TARGET_BLOBS_PER_BLOCK-1), 0), }, ExpectedStatus: test.Invalid, + ExpectationDescription: ` + NewPayloadV3 with incorrect list of versioned hashes must return INVALID status + `, }, }, }, @@ -792,6 +884,9 @@ var Tests = []test.SpecInterface{ Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), helper.BlobID(TARGET_BLOBS_PER_BLOCK-1)), }, ExpectedStatus: test.Invalid, + ExpectationDescription: ` + NewPayloadV3 with incorrect list of versioned hashes must return INVALID status + `, }, }, }, @@ -816,6 +911,9 @@ var Tests = []test.SpecInterface{ Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), helper.BlobID(TARGET_BLOBS_PER_BLOCK)), }, ExpectedStatus: test.Invalid, + ExpectationDescription: ` + NewPayloadV3 with incorrect hash in list of versioned hashes must return INVALID status + `, }, }, }, @@ -840,6 +938,9 @@ var Tests = []test.SpecInterface{ HashVersions: []byte{BLOB_COMMITMENT_VERSION_KZG, BLOB_COMMITMENT_VERSION_KZG + 1}, }, ExpectedStatus: test.Invalid, + ExpectationDescription: ` + NewPayloadV3 with incorrect version in list of versioned hashes must return INVALID status + `, }, }, }, @@ -864,6 +965,9 @@ var Tests = []test.SpecInterface{ Blobs: nil, }, ExpectedError: INVALID_PARAMS_ERROR, + ExpectationDescription: ` + NewPayloadV3 after Cancun with nil VersionedHashes must return INVALID_PARAMS_ERROR (code -32602) + `, }, }, }, @@ -888,6 +992,9 @@ var Tests = []test.SpecInterface{ Blobs: []helper.BlobID{}, }, ExpectedStatus: test.Invalid, + ExpectationDescription: ` + NewPayloadV3 with incorrect list of versioned hashes must return INVALID status + `, }, }, }, @@ -908,6 +1015,9 @@ var Tests = []test.SpecInterface{ Blobs: []helper.BlobID{0}, }, ExpectedStatus: test.Invalid, + ExpectationDescription: ` + NewPayloadV3 with incorrect list of versioned hashes must return INVALID status + `, }, }, }, From 2a67f32c4f44885409dafac9dd38a45888913328 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 3 Aug 2023 01:04:22 +0000 Subject: [PATCH 14/19] simulators/ethereum/engine: Fix no beacon root on modified payloads --- simulators/ethereum/engine/helper/payload.go | 14 +++++---- .../ethereum/engine/suites/blobs/steps.go | 4 +-- .../ethereum/engine/suites/engine/tests.go | 30 +++++++++---------- .../engine/suites/withdrawals/tests.go | 10 +++---- 4 files changed, 30 insertions(+), 28 deletions(-) diff --git a/simulators/ethereum/engine/helper/payload.go b/simulators/ethereum/engine/helper/payload.go index 45b2c139ae..46d0a5a26e 100644 --- a/simulators/ethereum/engine/helper/payload.go +++ b/simulators/ethereum/engine/helper/payload.go @@ -15,7 +15,7 @@ import ( ) type PayloadCustomizer interface { - CustomizePayload(basePayload *typ.ExecutableData) (modifiedPayload *typ.ExecutableData, beaconRoot *common.Hash, err error) + CustomizePayload(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash) (modifiedPayload *typ.ExecutableData, modifiedBeaconRoot *common.Hash, err error) } type CustomPayloadData struct { @@ -47,7 +47,7 @@ var _ PayloadCustomizer = (*CustomPayloadData)(nil) // Construct a customized payload by taking an existing payload as base and mixing it CustomPayloadData // BlockHash is calculated automatically. -func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.ExecutableData) (*typ.ExecutableData, *common.Hash, error) { +func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash) (*typ.ExecutableData, *common.Hash, error) { txs := basePayload.Transactions if customData.Transactions != nil { txs = *customData.Transactions @@ -140,6 +140,8 @@ func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.Executabl customPayloadHeader.BeaconRoot = nil } else if customData.BeaconRoot != nil { customPayloadHeader.BeaconRoot = customData.BeaconRoot + } else if baseBeaconRoot != nil { + customPayloadHeader.BeaconRoot = baseBeaconRoot } // Return the new payload @@ -171,7 +173,7 @@ func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.Executabl return result, customPayloadHeader.BeaconRoot, nil } -func CustomizePayloadTransactions(basePayload *typ.ExecutableData, customTransactions types.Transactions) (*typ.ExecutableData, *common.Hash, error) { +func CustomizePayloadTransactions(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash, customTransactions types.Transactions) (*typ.ExecutableData, *common.Hash, error) { byteTxs := make([][]byte, 0) for _, tx := range customTransactions { bytes, err := tx.MarshalBinary() @@ -182,7 +184,7 @@ func CustomizePayloadTransactions(basePayload *typ.ExecutableData, customTransac } return (&CustomPayloadData{ Transactions: &byteTxs, - }).CustomizePayload(basePayload) + }).CustomizePayload(basePayload, baseBeaconRoot) } func (customData *CustomPayloadData) String() string { @@ -234,7 +236,7 @@ func (customData *CustomPayloadData) String() string { // This function generates an invalid payload by taking a base payload and modifying the specified field such that it ends up being invalid. // One small consideration is that the payload needs to contain transactions and specially transactions using the PREVRANDAO opcode for all the fields to be compatible with this function. -func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField InvalidPayloadBlockField) (*typ.ExecutableData, *common.Hash, error) { +func GenerateInvalidPayload(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash, payloadField InvalidPayloadBlockField) (*typ.ExecutableData, *common.Hash, error) { var customPayloadMod *CustomPayloadData switch payloadField { @@ -353,7 +355,7 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField Invali return ©Payload, nil, nil } - return customPayloadMod.CustomizePayload(basePayload) + return customPayloadMod.CustomizePayload(basePayload, baseBeaconRoot) } /* diff --git a/simulators/ethereum/engine/suites/blobs/steps.go b/simulators/ethereum/engine/suites/blobs/steps.go index a514652466..6f8e32c3bd 100644 --- a/simulators/ethereum/engine/suites/blobs/steps.go +++ b/simulators/ethereum/engine/suites/blobs/steps.go @@ -449,7 +449,7 @@ func (step NewPayloads) Execute(t *BlobTestContext) error { if step.PayloadCustomizer != nil { // Send a custom new payload - payload, beaconRoot, err = step.PayloadCustomizer.CustomizePayload(payload) + payload, beaconRoot, err = step.PayloadCustomizer.CustomizePayload(payload, beaconRoot) if err != nil { t.Fatalf("FAIL: Error customizing payload (payload %d/%d): %v", p+1, payloadCount, err) } @@ -620,7 +620,7 @@ func (step SendModifiedLatestPayload) Execute(t *BlobTestContext) error { } // Modify the payload if step.PayloadCustomizer != nil { - payload, beaconRoot, err = step.PayloadCustomizer.CustomizePayload(payload) + payload, beaconRoot, err = step.PayloadCustomizer.CustomizePayload(payload, beaconRoot) if err != nil { return fmt.Errorf("error modifying payload: %v", err) } diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index c5d40eadc7..185d729152 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -858,7 +858,7 @@ func inconsistentForkchoiceStateGen(inconsistency string) func(t *test.Env) { if len(alternativePayloads) > 0 { customData.ParentHash = &alternativePayloads[len(alternativePayloads)-1].BlockHash } - alternativePayload, _, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + alternativePayload, _, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to construct alternative payload: %v", t.TestName, err) } @@ -1109,7 +1109,7 @@ func badHashOnNewPayloadGen(syncing bool, sidechain bool) func(*test.Env) { customizer := &helper.CustomPayloadData{ ParentHash: &alteredPayload.BlockHash, } - alteredPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + alteredPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to modify payload: %v", t.TestName, err) } @@ -1225,7 +1225,7 @@ func invalidPayloadTestCaseGen(payloadField helper.InvalidPayloadBlockField, syn t.Fatalf("FAIL (%s): No transactions in the base payload", t.TestName) } - alteredPayload, _, err = helper.GenerateInvalidPayload(&t.CLMock.LatestPayloadBuilt, payloadField) + alteredPayload, _, err = helper.GenerateInvalidPayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot, payloadField) if err != nil { t.Fatalf("FAIL (%s): Unable to modify payload (%v): %v", t.TestName, payloadField, err) } @@ -1348,7 +1348,7 @@ func invalidPayloadTestCaseGen(payloadField helper.InvalidPayloadBlockField, syn customizer := &helper.CustomPayloadData{ ParentHash: &alteredPayload.BlockHash, } - followUpAlteredPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + followUpAlteredPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to modify payload: %v", t.TestName, err) } @@ -1432,12 +1432,12 @@ func invalidMissingAncestorReOrgGen(invalid_index int, payloadField helper.Inval ParentHash: &altChainPayloads[len(altChainPayloads)-1].BlockHash, ExtraData: &([]byte{0x01}), } - sidePayload, _, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + sidePayload, _, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } if len(altChainPayloads) == invalid_index { - sidePayload, _, err = helper.GenerateInvalidPayload(sidePayload, payloadField) + sidePayload, _, err = helper.GenerateInvalidPayload(sidePayload, t.CLMock.LatestPayloadAttributes.BeaconRoot, payloadField) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -1640,12 +1640,12 @@ func (spec InvalidMissingAncestorReOrgSpec) GenerateSync() func(*test.Env) { ParentHash: &pHash, ExtraData: &([]byte{0x01}), } - sidePayload, _, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + sidePayload, _, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } if len(altChainPayloads) == invalidIndex { - sidePayload, _, err = helper.GenerateInvalidPayload(sidePayload, spec.PayloadField) + sidePayload, _, err = helper.GenerateInvalidPayload(sidePayload, t.CLMock.LatestPayloadAttributes.BeaconRoot, spec.PayloadField) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -2018,7 +2018,7 @@ func blockStatusReorg(t *test.Env) { customizer := &helper.CustomPayloadData{ PrevRandao: &customRandom, } - customizedPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + customizedPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -2104,7 +2104,7 @@ func reorgPrevValidatedPayloadOnSideChain(t *test.Env) { if len(sidechainPayloads) > 0 { customData.ParentHash = &sidechainPayloads[len(sidechainPayloads)-1].BlockHash } - altPayload, _, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + altPayload, _, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -2169,7 +2169,7 @@ func safeReorgToSideChain(t *test.Env) { ParentHash: &altParentHash, ExtraData: &([]byte{0x01}), } - altPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + altPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -2232,7 +2232,7 @@ func reorgBackFromSyncing(t *test.Env) { ParentHash: &altParentHash, ExtraData: &([]byte{0x01}), } - altPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + altPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -2445,7 +2445,7 @@ func transactionReorgBlockhash(newNPOnRevert bool) func(t *test.Env) { customizer := &helper.CustomPayloadData{ ExtraData: &([]byte{0x01}), } - sidePayload, _, err = customizer.CustomizePayload(mainPayload) + sidePayload, _, err = customizer.CustomizePayload(mainPayload, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("Error creating reorg payload %v", err) } @@ -2632,7 +2632,7 @@ func multipleNewCanonicalPayloads(t *test.Env) { customizer := &helper.CustomPayloadData{ PrevRandao: &newPrevRandao, } - newPayload, _, err := customizer.CustomizePayload(&basePayload) + newPayload, _, err := customizer.CustomizePayload(&basePayload, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload %v: %v", t.TestName, i, err) } @@ -2911,7 +2911,7 @@ func payloadBuildAfterNewInvalidPayload(t *test.Env) { s := invalidPayloadProducer.TestEngineGetPayloadV1(r.Response.PayloadID) s.ExpectNoError() - inv_p, _, err = helper.GenerateInvalidPayload(&s.Payload, helper.InvalidStateRoot) + inv_p, _, err = helper.GenerateInvalidPayload(&s.Payload, t.CLMock.LatestPayloadAttributes.BeaconRoot, helper.InvalidStateRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to invalidate payload: %v", t.TestName, err) } diff --git a/simulators/ethereum/engine/suites/withdrawals/tests.go b/simulators/ethereum/engine/suites/withdrawals/tests.go index d8d54feaf7..7e3828d5ac 100644 --- a/simulators/ethereum/engine/suites/withdrawals/tests.go +++ b/simulators/ethereum/engine/suites/withdrawals/tests.go @@ -1217,7 +1217,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { customizer := &helper.CustomPayloadData{ Withdrawals: emptyWithdrawalsList, } - payloadPlusWithdrawals, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + payloadPlusWithdrawals, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("Unable to append withdrawals: %v", err) } @@ -1313,7 +1313,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { customizer := &helper.CustomPayloadData{ RemoveWithdrawals: true, } - nilWithdrawalsPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + nilWithdrawalsPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("Unable to append withdrawals: %v", err) } @@ -1920,7 +1920,7 @@ func (s *MaxInitcodeSizeSpec) Execute(t *test.Env) { // Customize the payload to include a tx with an invalid initcode if invTx, ok := invalidTx.(*types.Transaction); ok { - customPayload, _, err := helper.CustomizePayloadTransactions(&t.CLMock.LatestPayloadBuilt, types.Transactions{invTx}) + customPayload, _, err := helper.CustomizePayloadTransactions(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot, types.Transactions{invTx}) if err != nil { t.Fatalf("FAIL: Unable to customize payload: %v", err) } @@ -2095,7 +2095,7 @@ func (ws *GetPayloadBodiesSpec) Execute(t *test.Env) { customizer := &helper.CustomPayloadData{ Withdrawals: helper.RandomizeWithdrawalsOrder(t.CLMock.LatestExecutedPayload.Withdrawals), } - sidechainCurrent, _, err := customizer.CustomizePayload(&t.CLMock.LatestExecutedPayload) + sidechainCurrent, _, err := customizer.CustomizePayload(&t.CLMock.LatestExecutedPayload, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("FAIL (%s): Error obtaining custom sidechain payload: %v", t.TestName, err) } @@ -2103,7 +2103,7 @@ func (ws *GetPayloadBodiesSpec) Execute(t *test.Env) { ParentHash: &sidechainCurrent.BlockHash, Withdrawals: helper.RandomizeWithdrawalsOrder(nextCanonicalPayload.Withdrawals), } - sidechainHead, _, err := customizer.CustomizePayload(nextCanonicalPayload) + sidechainHead, _, err := customizer.CustomizePayload(nextCanonicalPayload, t.CLMock.LatestPayloadAttributes.BeaconRoot) if err != nil { t.Fatalf("FAIL (%s): Error obtaining custom sidechain payload: %v", t.TestName, err) } From b9957b412b715ec7d58c5f17d8b7688960bde8f1 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 3 Aug 2023 17:00:01 +0000 Subject: [PATCH 15/19] simulators/ethereum/engine: Enable blob tx receipts checks --- .../ethereum/engine/suites/blobs/steps.go | 6 +- simulators/ethereum/engine/test/expect.go | 69 +++++++++---------- 2 files changed, 34 insertions(+), 41 deletions(-) diff --git a/simulators/ethereum/engine/suites/blobs/steps.go b/simulators/ethereum/engine/suites/blobs/steps.go index 6f8e32c3bd..071a1e07a4 100644 --- a/simulators/ethereum/engine/suites/blobs/steps.go +++ b/simulators/ethereum/engine/suites/blobs/steps.go @@ -300,7 +300,7 @@ func (step NewPayloads) VerifyPayload(ctx context.Context, forkConfig *globals.F } totalBlobCount := uint64(0) - expectedBlobGasPrice := GetBlobGasPrice(expectedExcessBlobGas) + expectedBlobGasPrice := new(big.Int).SetUint64(GetBlobGasPrice(expectedExcessBlobGas)) for _, tx := range blobTxsInPayload { blobCount := uint64(len(tx.BlobHashes())) @@ -309,8 +309,8 @@ func (step NewPayloads) VerifyPayload(ctx context.Context, forkConfig *globals.F // Retrieve receipt from client r := testEngine.TestTransactionReceipt(tx.Hash()) expectedBlobGasUsed := blobCount * GAS_PER_BLOB - r.ExpectBlobGasUsed(&expectedBlobGasUsed) - r.ExpectBlobGasPrice(&expectedBlobGasPrice) + r.ExpectBlobGasUsed(expectedBlobGasUsed) + r.ExpectBlobGasPrice(expectedBlobGasPrice) } if totalBlobCount != step.ExpectedIncludedBlobCount { diff --git a/simulators/ethereum/engine/test/expect.go b/simulators/ethereum/engine/test/expect.go index 83864d6b96..dffe9bf090 100644 --- a/simulators/ethereum/engine/test/expect.go +++ b/simulators/ethereum/engine/test/expect.go @@ -1006,59 +1006,52 @@ func (tec *TestEngineClient) TestTransactionReceipt(txHash common.Hash) *Transac return ret } -func (exp *TransactionReceiptExpectObject) ExpectError() { - if exp.Error == nil { - exp.Fatalf("FAIL (%s): Expected error on %s: block=%v", exp.TestName, exp.Call, exp.Receipt) +func (tr *TransactionReceiptExpectObject) ExpectError() { + if tr.Error == nil { + tr.Fatalf("FAIL (%s): Expected error on %s: block=%v", tr.TestName, tr.Call, tr.Receipt) } } -func (exp *TransactionReceiptExpectObject) ExpectErrorCode(code int) { - exp.ExpectError() - if exp.ErrorCode != code { - exp.Fatalf("FAIL (%s): Expected error code on %s: want=%d, got=%d", exp.TestName, exp.Call, code, exp.ErrorCode) +func (tr *TransactionReceiptExpectObject) ExpectErrorCode(code int) { + tr.ExpectError() + if tr.ErrorCode != code { + tr.Fatalf("FAIL (%s): Expected error code on %s: want=%d, got=%d", tr.TestName, tr.Call, code, tr.ErrorCode) } } -func (exp *TransactionReceiptExpectObject) ExpectNoError() { - if exp.Error != nil { - exp.Fatalf("FAIL (%s): Unexpected error on %s: %v, expected=", exp.TestName, exp.Call, exp.Error) +func (tr *TransactionReceiptExpectObject) ExpectNoError() { + if tr.Error != nil { + tr.Fatalf("FAIL (%s): Unexpected error on %s: %v, expected=", tr.TestName, tr.Call, tr.Error) } } -func (exp *TransactionReceiptExpectObject) ExpectTransactionHash(expectedHash common.Hash) { - exp.ExpectNoError() - if exp.Receipt.TxHash != expectedHash { - exp.Fatalf("FAIL (%s): Unexpected transaction hash on %s: %v, expected=%v", exp.TestName, exp.Call, exp.Receipt.TxHash, expectedHash) +func (tr *TransactionReceiptExpectObject) ExpectTransactionHash(expectedHash common.Hash) { + tr.ExpectNoError() + if tr.Receipt.TxHash != expectedHash { + tr.Fatalf("FAIL (%s): Unexpected transaction hash on %s: %v, expected=%v", tr.TestName, tr.Call, tr.Receipt.TxHash, expectedHash) } } -func (exp *TransactionReceiptExpectObject) ExpectBlockHash(expectedHash common.Hash) { - exp.ExpectNoError() - if exp.Receipt.BlockHash != expectedHash { - exp.Fatalf("FAIL (%s): Unexpected transaction block hash on %s: %v, blockhash=%v, expected=%v", exp.TestName, exp.Call, exp.Receipt.TxHash, exp.Receipt.BlockHash, expectedHash) +func (tr *TransactionReceiptExpectObject) ExpectBlockHash(expectedHash common.Hash) { + tr.ExpectNoError() + if tr.Receipt.BlockHash != expectedHash { + tr.Fatalf("FAIL (%s): Unexpected transaction block hash on %s: %v, blockhash=%v, expected=%v", tr.TestName, tr.Call, tr.Receipt.TxHash, tr.Receipt.BlockHash, expectedHash) } } -func (exp *TransactionReceiptExpectObject) ExpectBlobGasUsed(expectedBlobGasUsed *uint64) { - exp.ExpectNoError() - /* - TODO: ENABLE! - if (expectedBlobGasUsed == nil || exp.Receipt.BlobGasUsed == nil) && expectedBlobGasUsed != exp.Receipt.BlobGasUsed { - exp.Fatalf("FAIL (%s): Unexpected transaction data gas used on %s: %v, dataGasUsed=%v, expected=%v", exp.TestName, exp.Call, exp.Receipt.TxHash, exp.Receipt.BlobGasUsed, expectedBlobGasUsed) - } else if expectedBlobGasUsed != nil && exp.Receipt.BlobGasUsed != nil && *expectedBlobGasUsed != *exp.Receipt.BlobGasUsed { - exp.Fatalf("FAIL (%s): Unexpected transaction data gas used on %s: %v, dataGasUsed=0x%x, expected=0x%x", exp.TestName, exp.Call, exp.Receipt.TxHash, *exp.Receipt.BlobGasUsed, *expectedBlobGasUsed) - } - */ +func (tr *TransactionReceiptExpectObject) ExpectBlobGasUsed(expectedBlobGasUsed uint64) { + tr.ExpectNoError() + + if expectedBlobGasUsed == tr.Receipt.BlobGasUsed { + tr.Fatalf("FAIL (%s): Unexpected transaction data gas used on %s: %v, dataGasUsed=%d, expected=%d", tr.TestName, tr.Call, tr.Receipt.TxHash, tr.Receipt.BlobGasUsed, expectedBlobGasUsed) + } } -func (exp *TransactionReceiptExpectObject) ExpectBlobGasPrice(expectedBlobGasPrice *uint64) { - exp.ExpectNoError() - /* - TODO: ENABLE! - if (expectedBlobGasPrice == nil || exp.Receipt.BlobGasPrice == nil) && expectedBlobGasPrice != exp.Receipt.BlobGasPrice { - exp.Fatalf("FAIL (%s): Unexpected transaction data gas price on %s: %v, BlobGasPrice=%v, expected=%v", exp.TestName, exp.Call, exp.Receipt.TxHash, exp.Receipt.BlobGasPrice, expectedBlobGasPrice) - } else if expectedBlobGasPrice != nil && exp.Receipt.BlobGasPrice != nil && *expectedBlobGasPrice != *exp.Receipt.BlobGasPrice { - exp.Fatalf("FAIL (%s): Unexpected transaction data gas price on %s: %v, BlobGasPrice=0x%x, expected=0x%x", exp.TestName, exp.Call, exp.Receipt.TxHash, *exp.Receipt.BlobGasPrice, *expectedBlobGasPrice) - } - */ +func (tr *TransactionReceiptExpectObject) ExpectBlobGasPrice(expectedBlobGasPrice *big.Int) { + tr.ExpectNoError() + if (expectedBlobGasPrice == nil || tr.Receipt.BlobGasPrice == nil) && expectedBlobGasPrice != tr.Receipt.BlobGasPrice { + tr.Fatalf("FAIL (%s): Unexpected transaction data gas price on %s: %v, BlobGasPrice=%v, expected=%v", tr.TestName, tr.Call, tr.Receipt.TxHash, tr.Receipt.BlobGasPrice, expectedBlobGasPrice) + } else if expectedBlobGasPrice != nil && tr.Receipt.BlobGasPrice != nil && expectedBlobGasPrice.Cmp(tr.Receipt.BlobGasPrice) != 0 { + tr.Fatalf("FAIL (%s): Unexpected transaction data gas price on %s: %v, BlobGasPrice=0x%x, expected=0x%x", tr.TestName, tr.Call, tr.Receipt.TxHash, *tr.Receipt.BlobGasPrice, *expectedBlobGasPrice) + } } From c7f607379bcf2e54275c84f021a9783d560f3778 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 3 Aug 2023 17:55:40 +0000 Subject: [PATCH 16/19] simulators/ethereum/engine: Test case description improvements --- .../ethereum/engine/suites/blobs/README.md | 6 +- .../ethereum/engine/suites/blobs/steps.go | 6 +- .../ethereum/engine/suites/blobs/tests.go | 174 ++++++++++-------- 3 files changed, 103 insertions(+), 83 deletions(-) diff --git a/simulators/ethereum/engine/suites/blobs/README.md b/simulators/ethereum/engine/suites/blobs/README.md index 9df40b57e5..9ce11310e3 100644 --- a/simulators/ethereum/engine/suites/blobs/README.md +++ b/simulators/ethereum/engine/suites/blobs/README.md @@ -1,5 +1,5 @@ -# Shard Blob Engine API Extension Testing +# Cancun Engine API Testing -This test suite verifies behavior of the Engine API on while using shard blob transaction extension: -https://github.com/ethereum/execution-apis/blob/main/src/engine/experimental/blob-extension.md +This test suite verifies behavior of the Engine API on the transtion to and after the Cancun fork: +https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md diff --git a/simulators/ethereum/engine/suites/blobs/steps.go b/simulators/ethereum/engine/suites/blobs/steps.go index 071a1e07a4..f392718303 100644 --- a/simulators/ethereum/engine/suites/blobs/steps.go +++ b/simulators/ethereum/engine/suites/blobs/steps.go @@ -504,7 +504,7 @@ func (step NewPayloads) Description() string { // A step that sends multiple new blobs to the client type SendBlobTransactions struct { // Number of blob transactions to send before this block's GetPayload request - BlobTransactionSendCount uint64 + TransactionCount uint64 // Blobs per transaction BlobsPerTransaction uint64 // Max Data Gas Cost for every blob transaction @@ -541,7 +541,7 @@ func (step SendBlobTransactions) Execute(t *BlobTestContext) error { } engine = t.Engines[step.ClientIndex] // Send the blob transactions - for bTx := uint64(0); bTx < step.BlobTransactionSendCount; bTx++ { + for bTx := uint64(0); bTx < step.TransactionCount; bTx++ { blobTxCreator := &helper.BlobTransactionCreator{ To: &addr, GasLimit: 100000, @@ -589,7 +589,7 @@ func (step SendBlobTransactions) Execute(t *BlobTestContext) error { } func (step SendBlobTransactions) Description() string { - return fmt.Sprintf("SendBlobTransactions: %d Transactions, %d blobs each, %d max data gas fee", step.BlobTransactionSendCount, step.GetBlobsPerTransaction(), step.BlobTransactionMaxBlobGasCost.Uint64()) + return fmt.Sprintf("SendBlobTransactions: %d Transactions, %d blobs each, %d max data gas fee", step.TransactionCount, step.GetBlobsPerTransaction(), step.BlobTransactionMaxBlobGasCost.Uint64()) } // Send a modified version of the latest payload produced using NewPayloadV3 diff --git a/simulators/ethereum/engine/suites/blobs/tests.go b/simulators/ethereum/engine/suites/blobs/tests.go index 70137bb341..27ad07729c 100644 --- a/simulators/ethereum/engine/suites/blobs/tests.go +++ b/simulators/ethereum/engine/suites/blobs/tests.go @@ -2,6 +2,7 @@ package suite_blobs import ( + "fmt" "math/big" "time" @@ -62,6 +63,18 @@ var Tests = []test.SpecInterface{ Name: "Blob Transactions On Block 1, Shanghai Genesis", About: ` Tests the Cancun fork since Block 1. + + Verifications performed: + - Correct implementation of Engine API changes for Cancun: + - engine_newPayloadV3, engine_forkchoiceUpdatedV3, engine_getPayloadV3 + - Correct implementation of EIP-4844: + - Blob transaction ordering and inclusion + - Blob transaction blob gas cost checks + - Verify Blob bundle on built payload + - Eth RPC changes for Cancun: + - Blob fields in eth_getBlockByNumber + - Beacon root in eth_getBlockByNumber + - Blob fields in transaction receipts from eth_getTransactionReceipt `, }, @@ -75,7 +88,7 @@ var Tests = []test.SpecInterface{ // First, we send a couple of blob transactions on genesis, // with enough data gas cost to make sure they are included in the first block. SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, @@ -90,7 +103,7 @@ var Tests = []test.SpecInterface{ // Try to increase the data gas cost of the blob transactions // by maxing out the number of blobs for the next payloads. SendBlobTransactions{ - BlobTransactionSendCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS/(MAX_BLOBS_PER_BLOCK-TARGET_BLOBS_PER_BLOCK) + 1, + TransactionCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS/(MAX_BLOBS_PER_BLOCK-TARGET_BLOBS_PER_BLOCK) + 1, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, @@ -120,6 +133,9 @@ var Tests = []test.SpecInterface{ Name: "Blob Transactions On Block 1, Cancun Genesis", About: ` Tests the Cancun fork since genesis. + + Verifications performed: + * See Blob Transactions On Block 1, Shanghai Genesis `, }, @@ -131,7 +147,7 @@ var Tests = []test.SpecInterface{ // First, we send a couple of blob transactions on genesis, // with enough data gas cost to make sure they are included in the first block. SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, @@ -146,7 +162,7 @@ var Tests = []test.SpecInterface{ // Try to increase the data gas cost of the blob transactions // by maxing out the number of blobs for the next payloads. SendBlobTransactions{ - BlobTransactionSendCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS/(MAX_BLOBS_PER_BLOCK-TARGET_BLOBS_PER_BLOCK) + 1, + TransactionCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS/(MAX_BLOBS_PER_BLOCK-TARGET_BLOBS_PER_BLOCK) + 1, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, @@ -179,8 +195,8 @@ var Tests = []test.SpecInterface{ Using same account, and an increased nonce from the previously sent transactions, send N blob transactions with 1 blob each. Verify that the payloads are created with the correct ordering: - - The first payloads must include the first N blob transactions. - - The last payloads must include the last single-blob transactions. + - The first payloads must include the first N blob transactions + - The last payloads must include the last single-blob transactions All transactions have sufficient data gas price to be included any of the payloads. `, @@ -192,13 +208,13 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ // First send the MAX_BLOBS_PER_BLOCK-1 blob transactions. SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK - 1, BlobTransactionMaxBlobGasCost: big.NewInt(100), }, // Then send the single-blob transactions SendBlobTransactions{ - BlobTransactionSendCount: MAX_BLOBS_PER_BLOCK + 1, + TransactionCount: MAX_BLOBS_PER_BLOCK + 1, BlobsPerTransaction: 1, BlobTransactionMaxBlobGasCost: big.NewInt(100), }, @@ -227,8 +243,8 @@ var Tests = []test.SpecInterface{ transactions, send a single 2-blob transaction, and send N blob transactions with 1 blob each. Verify that the payloads are created with the correct ordering: - - The first payloads must include the first N blob transactions. - - The last payloads must include the rest of the transactions. + - The first payloads must include the first N blob transactions + - The last payloads must include the rest of the transactions All transactions have sufficient data gas price to be included any of the payloads. `, @@ -240,21 +256,21 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ // First send the MAX_BLOBS_PER_BLOCK-1 blob transactions. SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK - 1, BlobTransactionMaxBlobGasCost: big.NewInt(100), }, // Then send the dual-blob transaction SendBlobTransactions{ - BlobTransactionSendCount: 1, + TransactionCount: 1, BlobsPerTransaction: 2, BlobTransactionMaxBlobGasCost: big.NewInt(100), }, // Then send the single-blob transactions SendBlobTransactions{ - BlobTransactionSendCount: MAX_BLOBS_PER_BLOCK - 2, + TransactionCount: MAX_BLOBS_PER_BLOCK - 2, BlobsPerTransaction: 1, BlobTransactionMaxBlobGasCost: big.NewInt(100), }, @@ -295,14 +311,14 @@ var Tests = []test.SpecInterface{ // First send the MAX_BLOBS_PER_BLOCK-1 blob transactions from // account A. SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK - 1, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 0, }, // Then send the single-blob transactions from account B SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: 1, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 1, @@ -355,7 +371,7 @@ var Tests = []test.SpecInterface{ // First send the MAX_BLOBS_PER_BLOCK-1 blob transactions from // account A, to client A. SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK - 1, BlobTransactionMaxBlobGasCost: big.NewInt(120), AccountIndex: 0, @@ -364,7 +380,7 @@ var Tests = []test.SpecInterface{ // Then send the single-blob transactions from account B, to client // B. SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: 1, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 1, @@ -397,27 +413,27 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ // Send multiple blob transactions with the same nonce. SendBlobTransactions{ // Blob ID 0 - BlobTransactionSendCount: 1, + TransactionCount: 1, BlobTransactionMaxBlobGasCost: big.NewInt(1), BlobTransactionGasFeeCap: big.NewInt(1e9), BlobTransactionGasTipCap: big.NewInt(1e9), }, SendBlobTransactions{ // Blob ID 1 - BlobTransactionSendCount: 1, + TransactionCount: 1, BlobTransactionMaxBlobGasCost: big.NewInt(1e2), BlobTransactionGasFeeCap: big.NewInt(1e10), BlobTransactionGasTipCap: big.NewInt(1e10), ReplaceTransactions: true, }, SendBlobTransactions{ // Blob ID 2 - BlobTransactionSendCount: 1, + TransactionCount: 1, BlobTransactionMaxBlobGasCost: big.NewInt(1e3), BlobTransactionGasFeeCap: big.NewInt(1e11), BlobTransactionGasTipCap: big.NewInt(1e11), ReplaceTransactions: true, }, SendBlobTransactions{ // Blob ID 3 - BlobTransactionSendCount: 1, + TransactionCount: 1, BlobTransactionMaxBlobGasCost: big.NewInt(1e4), BlobTransactionGasFeeCap: big.NewInt(1e12), BlobTransactionGasTipCap: big.NewInt(1e12), @@ -439,6 +455,8 @@ var Tests = []test.SpecInterface{ Name: "Parallel Blob Transactions", About: ` Test sending multiple blob transactions in parallel from different accounts. + + Verify that a payload is created with the maximum number of blobs. `, }, @@ -450,61 +468,61 @@ var Tests = []test.SpecInterface{ ParallelSteps{ Steps: []TestStep{ SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 0, }, SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 1, }, SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 2, }, SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 3, }, SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 4, }, SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 5, }, SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 6, }, SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 7, }, SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 8, }, SendBlobTransactions{ - BlobTransactionSendCount: 5, + TransactionCount: 5, BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 9, @@ -530,6 +548,8 @@ var Tests = []test.SpecInterface{ - nil BlobGasUsed - nil Versioned Hashes Array - nil Beacon Root + + Verify that client returns INVALID_PARAMS_ERROR `, }, @@ -543,9 +563,9 @@ var Tests = []test.SpecInterface{ Blobs: nil, }, ExpectedError: INVALID_PARAMS_ERROR, - ExpectationDescription: ` - NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code -32602) - `, + ExpectationDescription: fmt.Sprintf(` + NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) + `, INVALID_PARAMS_ERROR), }, }, }, @@ -571,9 +591,9 @@ var Tests = []test.SpecInterface{ BlobGasUsed: pUint64(0), }, ExpectedError: INVALID_PARAMS_ERROR, - ExpectationDescription: ` - NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code -32602) - `, + ExpectationDescription: fmt.Sprintf(` + NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) + `, INVALID_PARAMS_ERROR), }, }, }, @@ -599,9 +619,9 @@ var Tests = []test.SpecInterface{ ExcessBlobGas: pUint64(0), }, ExpectedError: INVALID_PARAMS_ERROR, - ExpectationDescription: ` - NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code -32602) - `, + ExpectationDescription: fmt.Sprintf(` + NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) + `, INVALID_PARAMS_ERROR), }, }, }, @@ -627,9 +647,9 @@ var Tests = []test.SpecInterface{ Blobs: []helper.BlobID{}, }, ExpectedError: INVALID_PARAMS_ERROR, - ExpectationDescription: ` - NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code -32602) - `, + ExpectationDescription: fmt.Sprintf(` + NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) + `, INVALID_PARAMS_ERROR), }, }, }, @@ -655,9 +675,9 @@ var Tests = []test.SpecInterface{ BeaconRoot: &(common.Hash{}), }, ExpectedError: INVALID_PARAMS_ERROR, - ExpectationDescription: ` - NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code -32602) - `, + ExpectationDescription: fmt.Sprintf(` + NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) + `, INVALID_PARAMS_ERROR), }, }, }, @@ -688,9 +708,9 @@ var Tests = []test.SpecInterface{ BeaconRoot: &(common.Hash{}), }, ExpectedError: UNSUPPORTED_FORK_ERROR, - ExpectationDescription: ` - NewPayloadV3 before Cancun with no nil fields must return UNSUPPORTED_FORK_ERROR (code -38005) - `, + ExpectationDescription: fmt.Sprintf(` + NewPayloadV3 before Cancun with no nil fields must return UNSUPPORTED_FORK_ERROR (code %d) + `, UNSUPPORTED_FORK_ERROR), }, }, }, @@ -718,9 +738,9 @@ var Tests = []test.SpecInterface{ RemoveExcessBlobGas: true, }, ExpectedError: INVALID_PARAMS_ERROR, - ExpectationDescription: ` - NewPayloadV3 after Cancun with nil ExcessBlobGas must return INVALID_PARAMS_ERROR (code -32602) - `, + ExpectationDescription: fmt.Sprintf(` + NewPayloadV3 after Cancun with nil ExcessBlobGas must return INVALID_PARAMS_ERROR (code %d) + `, INVALID_PARAMS_ERROR), }, }, }, @@ -745,9 +765,9 @@ var Tests = []test.SpecInterface{ RemoveBlobGasUsed: true, }, ExpectedError: INVALID_PARAMS_ERROR, - ExpectationDescription: ` - NewPayloadV3 after Cancun with nil BlobGasUsed must return INVALID_PARAMS_ERROR (code -32602) - `, + ExpectationDescription: fmt.Sprintf(` + NewPayloadV3 after Cancun with nil BlobGasUsed must return INVALID_PARAMS_ERROR (code %d) + `, INVALID_PARAMS_ERROR), }, }, }, @@ -772,9 +792,9 @@ var Tests = []test.SpecInterface{ RemoveBeaconRoot: true, }, ExpectedError: INVALID_PARAMS_ERROR, - ExpectationDescription: ` - NewPayloadV3 after Cancun with nil parentBeaconBlockRoot must return INVALID_PARAMS_ERROR (code -32602) - `, + ExpectationDescription: fmt.Sprintf(` + NewPayloadV3 after Cancun with nil parentBeaconBlockRoot must return INVALID_PARAMS_ERROR (code %d) + `, INVALID_PARAMS_ERROR), }, }, }, @@ -791,7 +811,7 @@ var Tests = []test.SpecInterface{ }, TestSequence: TestSequence{ SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -820,7 +840,7 @@ var Tests = []test.SpecInterface{ // mempool but was not included in the payload. TestSequence: TestSequence{ SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -847,7 +867,7 @@ var Tests = []test.SpecInterface{ }, TestSequence: TestSequence{ SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -874,7 +894,7 @@ var Tests = []test.SpecInterface{ }, TestSequence: TestSequence{ SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -901,7 +921,7 @@ var Tests = []test.SpecInterface{ }, TestSequence: TestSequence{ SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -927,7 +947,7 @@ var Tests = []test.SpecInterface{ }, TestSequence: TestSequence{ SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -955,7 +975,7 @@ var Tests = []test.SpecInterface{ }, TestSequence: TestSequence{ SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -982,7 +1002,7 @@ var Tests = []test.SpecInterface{ }, TestSequence: TestSequence{ SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -1035,7 +1055,7 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -1071,7 +1091,7 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -1105,7 +1125,7 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -1138,7 +1158,7 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -1172,7 +1192,7 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -1205,7 +1225,7 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -1240,7 +1260,7 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -1274,7 +1294,7 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - BlobTransactionSendCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ @@ -1328,7 +1348,7 @@ var Tests = []test.SpecInterface{ }, // BlobGasUsed, ExcessBlobGas Negative Tests - // Most cases are contained in https://github.com/ethereum/execution-spec-tests/tree/main/tests/eips/eip4844 + // Most cases are contained in https://github.com/ethereum/execution-spec-tests/tree/main/tests/cancun/eip4844_blobs // and can be executed using `pyspec` simulator. &BlobsBaseSpec{ @@ -1370,7 +1390,7 @@ var Tests = []test.SpecInterface{ Spec: test.Spec{ Name: "Request Blob Pooled Transactions", About: ` - Requests blob pooled transactions and verify correct coding. + Requests blob pooled transactions and verify correct encoding. `, }, TestSequence: TestSequence{ @@ -1380,7 +1400,7 @@ var Tests = []test.SpecInterface{ }, // Send multiple transactions with multiple blobs each SendBlobTransactions{ - BlobTransactionSendCount: 1, + TransactionCount: 1, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, DevP2PRequestPooledTransactionHash{ From 4cf5b9df937b79b990eb431ba6374298ca428642 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 3 Aug 2023 18:07:48 +0000 Subject: [PATCH 17/19] simulators/ethereum/engine: Fix blob gas used check --- simulators/ethereum/engine/test/expect.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/simulators/ethereum/engine/test/expect.go b/simulators/ethereum/engine/test/expect.go index dffe9bf090..3131713644 100644 --- a/simulators/ethereum/engine/test/expect.go +++ b/simulators/ethereum/engine/test/expect.go @@ -1042,16 +1042,16 @@ func (tr *TransactionReceiptExpectObject) ExpectBlockHash(expectedHash common.Ha func (tr *TransactionReceiptExpectObject) ExpectBlobGasUsed(expectedBlobGasUsed uint64) { tr.ExpectNoError() - if expectedBlobGasUsed == tr.Receipt.BlobGasUsed { - tr.Fatalf("FAIL (%s): Unexpected transaction data gas used on %s: %v, dataGasUsed=%d, expected=%d", tr.TestName, tr.Call, tr.Receipt.TxHash, tr.Receipt.BlobGasUsed, expectedBlobGasUsed) + if expectedBlobGasUsed != tr.Receipt.BlobGasUsed { + tr.Fatalf("FAIL (%s): Unexpected transaction blob gas used on %s: %v, blobGasUsed=%d, expected=%d", tr.TestName, tr.Call, tr.Receipt.TxHash, tr.Receipt.BlobGasUsed, expectedBlobGasUsed) } } func (tr *TransactionReceiptExpectObject) ExpectBlobGasPrice(expectedBlobGasPrice *big.Int) { tr.ExpectNoError() if (expectedBlobGasPrice == nil || tr.Receipt.BlobGasPrice == nil) && expectedBlobGasPrice != tr.Receipt.BlobGasPrice { - tr.Fatalf("FAIL (%s): Unexpected transaction data gas price on %s: %v, BlobGasPrice=%v, expected=%v", tr.TestName, tr.Call, tr.Receipt.TxHash, tr.Receipt.BlobGasPrice, expectedBlobGasPrice) + tr.Fatalf("FAIL (%s): Unexpected transaction blob gas price on %s: %v, BlobGasPrice=%v, expected=%v", tr.TestName, tr.Call, tr.Receipt.TxHash, tr.Receipt.BlobGasPrice, expectedBlobGasPrice) } else if expectedBlobGasPrice != nil && tr.Receipt.BlobGasPrice != nil && expectedBlobGasPrice.Cmp(tr.Receipt.BlobGasPrice) != 0 { - tr.Fatalf("FAIL (%s): Unexpected transaction data gas price on %s: %v, BlobGasPrice=0x%x, expected=0x%x", tr.TestName, tr.Call, tr.Receipt.TxHash, *tr.Receipt.BlobGasPrice, *expectedBlobGasPrice) + tr.Fatalf("FAIL (%s): Unexpected transaction blob gas price on %s: %v, BlobGasPrice=0x%x, expected=0x%x", tr.TestName, tr.Call, tr.Receipt.TxHash, *tr.Receipt.BlobGasPrice, *expectedBlobGasPrice) } } From 5e4e424963f29c4ff0d6396dc0d03eafd999926f Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 3 Aug 2023 18:23:32 +0000 Subject: [PATCH 18/19] simulators/ethereum/engine: Blob -> Cancun --- simulators/ethereum/engine/main.go | 12 +-- .../engine/suites/{blobs => cancun}/README.md | 0 .../engine/suites/{blobs => cancun}/config.go | 18 ++-- .../suites/{blobs => cancun}/helper_test.go | 2 +- .../suites/{blobs => cancun}/helpers.go | 2 +- .../engine/suites/{blobs => cancun}/steps.go | 18 ++-- .../engine/suites/{blobs => cancun}/tests.go | 93 +++++++++---------- 7 files changed, 71 insertions(+), 74 deletions(-) rename simulators/ethereum/engine/suites/{blobs => cancun}/README.md (100%) rename simulators/ethereum/engine/suites/{blobs => cancun}/config.go (84%) rename simulators/ethereum/engine/suites/{blobs => cancun}/helper_test.go (96%) rename simulators/ethereum/engine/suites/{blobs => cancun}/helpers.go (99%) rename simulators/ethereum/engine/suites/{blobs => cancun}/steps.go (97%) rename simulators/ethereum/engine/suites/{blobs => cancun}/tests.go (97%) diff --git a/simulators/ethereum/engine/main.go b/simulators/ethereum/engine/main.go index 75d782b13c..1af733828f 100644 --- a/simulators/ethereum/engine/main.go +++ b/simulators/ethereum/engine/main.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/hive/simulators/ethereum/engine/test" suite_auth "github.com/ethereum/hive/simulators/ethereum/engine/suites/auth" - suite_blobs "github.com/ethereum/hive/simulators/ethereum/engine/suites/blobs" + suite_cancun "github.com/ethereum/hive/simulators/ethereum/engine/suites/cancun" suite_engine "github.com/ethereum/hive/simulators/ethereum/engine/suites/engine" suite_ex_cap "github.com/ethereum/hive/simulators/ethereum/engine/suites/exchange_capabilities" suite_withdrawals "github.com/ethereum/hive/simulators/ethereum/engine/suites/withdrawals" @@ -45,10 +45,10 @@ func main() { Description: ` Test Engine API withdrawals, pre/post Shanghai.`[1:], } - blobs = hivesim.Suite{ - Name: "engine-blobs", + cancun = hivesim.Suite{ + Name: "engine-cancun", Description: ` - Test Engine API Blobs.`[1:], + Test Engine API on Cancun.`[1:], } ) @@ -59,7 +59,7 @@ func main() { addTestsToSuite(simulator, &excap, suite_ex_cap.Tests, "full") //suite_sync.AddSyncTestsToSuite(simulator, &sync, suite_sync.Tests) addTestsToSuite(simulator, &withdrawals, suite_withdrawals.Tests, "full") - addTestsToSuite(simulator, &blobs, suite_blobs.Tests, "full") + addTestsToSuite(simulator, &cancun, suite_cancun.Tests, "full") // Mark suites for execution hivesim.MustRunSuite(simulator, engine) @@ -67,7 +67,7 @@ func main() { hivesim.MustRunSuite(simulator, excap) hivesim.MustRunSuite(simulator, sync) hivesim.MustRunSuite(simulator, withdrawals) - hivesim.MustRunSuite(simulator, blobs) + hivesim.MustRunSuite(simulator, cancun) } func specToInterface(src []test.Spec) []test.SpecInterface { diff --git a/simulators/ethereum/engine/suites/blobs/README.md b/simulators/ethereum/engine/suites/cancun/README.md similarity index 100% rename from simulators/ethereum/engine/suites/blobs/README.md rename to simulators/ethereum/engine/suites/cancun/README.md diff --git a/simulators/ethereum/engine/suites/blobs/config.go b/simulators/ethereum/engine/suites/cancun/config.go similarity index 84% rename from simulators/ethereum/engine/suites/blobs/config.go rename to simulators/ethereum/engine/suites/cancun/config.go index 4695f8badf..c626d9020a 100644 --- a/simulators/ethereum/engine/suites/blobs/config.go +++ b/simulators/ethereum/engine/suites/cancun/config.go @@ -1,4 +1,4 @@ -package suite_blobs +package suite_cancun import ( "math/big" @@ -10,18 +10,18 @@ import ( ) // Timestamp delta between genesis and the withdrawals fork -func (bs *BlobsBaseSpec) GetCancunGenesisTimeDelta() uint64 { +func (bs *CancunBaseSpec) GetCancunGenesisTimeDelta() uint64 { return bs.CancunForkHeight * bs.GetBlockTimeIncrements() } // Calculates Shanghai fork timestamp given the amount of blocks that need to be // produced beforehand. -func (bs *BlobsBaseSpec) GetCancunForkTime() uint64 { +func (bs *CancunBaseSpec) GetCancunForkTime() uint64 { return uint64(globals.GenesisTimestamp) + bs.GetCancunGenesisTimeDelta() } // Generates the fork config, including cancun fork timestamp. -func (bs *BlobsBaseSpec) GetForkConfig() globals.ForkConfig { +func (bs *CancunBaseSpec) GetForkConfig() globals.ForkConfig { return globals.ForkConfig{ ShanghaiTimestamp: big.NewInt(0), // No test starts before Shanghai CancunTimestamp: new(big.Int).SetUint64(bs.GetCancunForkTime()), @@ -29,24 +29,24 @@ func (bs *BlobsBaseSpec) GetForkConfig() globals.ForkConfig { } // Get the per-block timestamp increments configured for this test -func (bs *BlobsBaseSpec) GetBlockTimeIncrements() uint64 { +func (bs *CancunBaseSpec) GetBlockTimeIncrements() uint64 { return 1 } // Timestamp delta between genesis and the withdrawals fork -func (bs *BlobsBaseSpec) GetBlobsGenesisTimeDelta() uint64 { +func (bs *CancunBaseSpec) GetBlobsGenesisTimeDelta() uint64 { return bs.CancunForkHeight * bs.GetBlockTimeIncrements() } // Calculates Shanghai fork timestamp given the amount of blocks that need to be // produced beforehand. -func (bs *BlobsBaseSpec) GetBlobsForkTime() uint64 { +func (bs *CancunBaseSpec) GetBlobsForkTime() uint64 { return uint64(globals.GenesisTimestamp) + bs.GetBlobsGenesisTimeDelta() } // Append the accounts we are going to withdraw to, which should also include // bytecode for testing purposes. -func (bs *BlobsBaseSpec) GetGenesis() *core.Genesis { +func (bs *CancunBaseSpec) GetGenesis() *core.Genesis { genesis := bs.Spec.GetGenesis() // Remove PoW altogether @@ -103,6 +103,6 @@ func (bs *BlobsBaseSpec) GetGenesis() *core.Genesis { // Changes the CL Mocker default time increments of 1 to the value specified // in the test spec. -func (bs *BlobsBaseSpec) ConfigureCLMock(cl *clmock.CLMocker) { +func (bs *CancunBaseSpec) ConfigureCLMock(cl *clmock.CLMocker) { cl.BlockTimestampIncrement = big.NewInt(int64(bs.GetBlockTimeIncrements())) } diff --git a/simulators/ethereum/engine/suites/blobs/helper_test.go b/simulators/ethereum/engine/suites/cancun/helper_test.go similarity index 96% rename from simulators/ethereum/engine/suites/blobs/helper_test.go rename to simulators/ethereum/engine/suites/cancun/helper_test.go index 55c09f6664..d978faa508 100644 --- a/simulators/ethereum/engine/suites/blobs/helper_test.go +++ b/simulators/ethereum/engine/suites/cancun/helper_test.go @@ -1,4 +1,4 @@ -package suite_blobs +package suite_cancun import ( "testing" diff --git a/simulators/ethereum/engine/suites/blobs/helpers.go b/simulators/ethereum/engine/suites/cancun/helpers.go similarity index 99% rename from simulators/ethereum/engine/suites/blobs/helpers.go rename to simulators/ethereum/engine/suites/cancun/helpers.go index 62ca6992e8..a19a76487b 100644 --- a/simulators/ethereum/engine/suites/blobs/helpers.go +++ b/simulators/ethereum/engine/suites/cancun/helpers.go @@ -1,4 +1,4 @@ -package suite_blobs +package suite_cancun import ( "bytes" diff --git a/simulators/ethereum/engine/suites/blobs/steps.go b/simulators/ethereum/engine/suites/cancun/steps.go similarity index 97% rename from simulators/ethereum/engine/suites/blobs/steps.go rename to simulators/ethereum/engine/suites/cancun/steps.go index f392718303..66085b8f9a 100644 --- a/simulators/ethereum/engine/suites/blobs/steps.go +++ b/simulators/ethereum/engine/suites/cancun/steps.go @@ -1,4 +1,4 @@ -package suite_blobs +package suite_cancun import ( "bytes" @@ -20,7 +20,7 @@ import ( "github.com/pkg/errors" ) -type BlobTestContext struct { +type CancunTestContext struct { *test.Env *TestBlobTxPool } @@ -28,7 +28,7 @@ type BlobTestContext struct { // Interface to represent a single step in a test vector type TestStep interface { // Executes the step - Execute(testCtx *BlobTestContext) error + Execute(testCtx *CancunTestContext) error Description() string } @@ -39,7 +39,7 @@ type ParallelSteps struct { Steps []TestStep } -func (step ParallelSteps) Execute(t *BlobTestContext) error { +func (step ParallelSteps) Execute(t *CancunTestContext) error { // Run the steps in parallel wg := sync.WaitGroup{} errs := make(chan error, len(step.Steps)) @@ -85,7 +85,7 @@ func (step LaunchClients) GetClientCount() uint64 { return clientCount } -func (step LaunchClients) Execute(t *BlobTestContext) error { +func (step LaunchClients) Execute(t *CancunTestContext) error { // Launch a new client var ( client client.EngineClient @@ -384,7 +384,7 @@ func (step NewPayloads) VerifyBlobBundle(blobDataInPayload []*BlobWrapData, payl return nil } -func (step NewPayloads) Execute(t *BlobTestContext) error { +func (step NewPayloads) Execute(t *CancunTestContext) error { // Create a new payload // Produce the payload payloadCount := step.GetPayloadCount() @@ -531,7 +531,7 @@ func (step SendBlobTransactions) GetBlobsPerTransaction() uint64 { return blobCountPerTx } -func (step SendBlobTransactions) Execute(t *BlobTestContext) error { +func (step SendBlobTransactions) Execute(t *CancunTestContext) error { // Send a blob transaction addr := common.BigToAddress(DATAHASH_START_ADDRESS) blobCountPerTx := step.GetBlobsPerTransaction() @@ -604,7 +604,7 @@ type SendModifiedLatestPayload struct { ExpectedStatus test.PayloadStatus } -func (step SendModifiedLatestPayload) Execute(t *BlobTestContext) error { +func (step SendModifiedLatestPayload) Execute(t *CancunTestContext) error { // Get the latest payload var ( payload = &t.CLMock.LatestPayloadBuilt @@ -658,7 +658,7 @@ type DevP2PRequestPooledTransactionHash struct { WaitForNewPooledTransaction bool } -func (step DevP2PRequestPooledTransactionHash) Execute(t *BlobTestContext) error { +func (step DevP2PRequestPooledTransactionHash) Execute(t *CancunTestContext) error { // Get client index's enode if step.ClientIndex >= uint64(len(t.TestEngines)) { return fmt.Errorf("invalid client index %d", step.ClientIndex) diff --git a/simulators/ethereum/engine/suites/blobs/tests.go b/simulators/ethereum/engine/suites/cancun/tests.go similarity index 97% rename from simulators/ethereum/engine/suites/blobs/tests.go rename to simulators/ethereum/engine/suites/cancun/tests.go index 27ad07729c..7e06a5841c 100644 --- a/simulators/ethereum/engine/suites/blobs/tests.go +++ b/simulators/ethereum/engine/suites/cancun/tests.go @@ -1,5 +1,5 @@ -// # Test suite for blob tests -package suite_blobs +// # Test suite for cancun tests +package suite_cancun import ( "fmt" @@ -53,11 +53,11 @@ func pInt(v int) *int { } // Execution specification reference: -// https://github.com/ethereum/execution-apis/blob/main/src/engine/specification.md +// https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md // List of all blob tests var Tests = []test.SpecInterface{ - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "Blob Transactions On Block 1, Shanghai Genesis", @@ -127,7 +127,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "Blob Transactions On Block 1, Cancun Genesis", @@ -185,7 +185,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "Blob Transaction Ordering, Single Account", @@ -232,7 +232,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "Blob Transaction Ordering, Single Account 2", @@ -289,7 +289,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "Blob Transaction Ordering, Multiple Accounts", @@ -332,7 +332,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "Blob Transaction Ordering, Multiple Clients", @@ -397,7 +397,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "Replace Blob Transactions", @@ -449,7 +449,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "Parallel Blob Transactions", @@ -539,7 +539,7 @@ var Tests = []test.SpecInterface{ }, // NewPayloadV3 Before Cancun, Negative Tests - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Nil Versioned Hashes, Nil Beacon Root", About: ` @@ -569,7 +569,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Before Cancun, Nil ExcessBlobGas, 0x00 BlobGasUsed, Nil Versioned Hashes, Nil Beacon Root", About: ` @@ -597,7 +597,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Before Cancun, 0x00 ExcessBlobGas, Nil BlobGasUsed, Nil Versioned Hashes, Nil Beacon Root", About: ` @@ -625,7 +625,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Empty Array Versioned Hashes, Nil Beacon Root", About: ` @@ -653,7 +653,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Nil Versioned Hashes, Zero Beacon Root", About: ` @@ -681,7 +681,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Before Cancun, 0x00 Data Fields, Empty Array Versioned Hashes, Zero Beacon Root", About: ` @@ -716,7 +716,7 @@ var Tests = []test.SpecInterface{ }, // NewPayloadV3 After Cancun, Negative Tests - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 After Cancun, Nil ExcessBlobGas, 0x00 BlobGasUsed, Empty Array Versioned Hashes, Zero Beacon Root", About: ` @@ -744,7 +744,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 After Cancun, 0x00 ExcessBlobGas, Nil BlobGasUsed, Empty Array Versioned Hashes", About: ` @@ -771,7 +771,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 After Cancun, 0x00 Blob Fields, Empty Array Versioned Hashes, Nil Beacon Root", About: ` @@ -800,7 +800,7 @@ var Tests = []test.SpecInterface{ }, // Test versioned hashes in Engine API NewPayloadV3 - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Missing Hash", @@ -827,7 +827,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Extra Hash", @@ -857,7 +857,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Out of Order", About: ` @@ -884,7 +884,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Repeated Hash", About: ` @@ -911,7 +911,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Incorrect Hash", About: ` @@ -937,7 +937,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Incorrect Version", About: ` @@ -965,7 +965,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Nil Hashes", About: ` @@ -992,7 +992,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Empty Hashes", About: ` @@ -1019,7 +1019,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Non-Empty Hashes", About: ` @@ -1043,7 +1043,7 @@ var Tests = []test.SpecInterface{ }, // Test versioned hashes in Engine API NewPayloadV3 on syncing clients - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Missing Hash (Syncing)", @@ -1077,7 +1077,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Extra Hash (Syncing)", @@ -1114,7 +1114,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Out of Order (Syncing)", About: ` @@ -1147,7 +1147,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Repeated Hash (Syncing)", About: ` @@ -1181,7 +1181,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Incorrect Hash (Syncing)", About: ` @@ -1214,7 +1214,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Incorrect Version (Syncing)", About: ` @@ -1249,7 +1249,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Nil Hashes (Syncing)", About: ` @@ -1283,7 +1283,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Empty Hashes (Syncing)", About: ` @@ -1317,7 +1317,7 @@ var Tests = []test.SpecInterface{ }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "NewPayloadV3 Versioned Hashes, Non-Empty Hashes (Syncing)", About: ` @@ -1350,7 +1350,7 @@ var Tests = []test.SpecInterface{ // BlobGasUsed, ExcessBlobGas Negative Tests // Most cases are contained in https://github.com/ethereum/execution-spec-tests/tree/main/tests/cancun/eip4844_blobs // and can be executed using `pyspec` simulator. - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "Incorrect BlobGasUsed: Non-Zero on Zero Blobs", @@ -1367,7 +1367,7 @@ var Tests = []test.SpecInterface{ }, }, }, - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "Incorrect BlobGasUsed: GAS_PER_BLOB on Zero Blobs", @@ -1386,7 +1386,7 @@ var Tests = []test.SpecInterface{ }, // DevP2P tests - &BlobsBaseSpec{ + &CancunBaseSpec{ Spec: test.Spec{ Name: "Request Blob Pooled Transactions", About: ` @@ -1412,11 +1412,8 @@ var Tests = []test.SpecInterface{ }, } -// Blobs base spec -// This struct contains the base spec for all blob tests. It contains the -// timestamp increments per block, the withdrawals fork height, and the list of -// payloads to produce during the test. -type BlobsBaseSpec struct { +// Contains the base spec for all cancun tests. +type CancunBaseSpec struct { test.Spec TimeIncrements uint64 // Timestamp increments per block throughout the test GetPayloadDelay uint64 // Delay between FcU and GetPayload calls @@ -1425,11 +1422,11 @@ type BlobsBaseSpec struct { } // Base test case execution procedure for blobs tests. -func (bs *BlobsBaseSpec) Execute(t *test.Env) { +func (bs *CancunBaseSpec) Execute(t *test.Env) { t.CLMock.WaitForTTD() - blobTestCtx := &BlobTestContext{ + blobTestCtx := &CancunTestContext{ Env: t, TestBlobTxPool: new(TestBlobTxPool), } From a429a3c0b09766f94cfda27784b6e3705a98bbe4 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 3 Aug 2023 18:41:03 +0000 Subject: [PATCH 19/19] simulators/ethereum: Fixes for pyspec sim --- simulators/ethereum/go.work.sum | 4 ++-- simulators/ethereum/pyspec/gen_bh.go | 20 ++++++++++---------- simulators/ethereum/pyspec/runner.go | 7 ++++--- simulators/ethereum/pyspec/types.go | 8 ++++---- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/simulators/ethereum/go.work.sum b/simulators/ethereum/go.work.sum index de96ddd891..94462c43fe 100644 --- a/simulators/ethereum/go.work.sum +++ b/simulators/ethereum/go.work.sum @@ -557,8 +557,6 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marioevz/go-ethereum v1.10.14-0.20230802180057-7bd535142c42 h1:YRJHuf5fXz/YMqsKjF8hRX99k2uZ7GQLQjtTKJKgcQY= -github.com/marioevz/go-ethereum v1.10.14-0.20230802180057-7bd535142c42/go.mod h1:zKetLweqBR8ZS+1O9iJWI8DvmmD2NzD19apjEWDCsnw= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= @@ -810,6 +808,7 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -977,6 +976,7 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= diff --git a/simulators/ethereum/pyspec/gen_bh.go b/simulators/ethereum/pyspec/gen_bh.go index 69523018fa..245fcadad4 100644 --- a/simulators/ethereum/pyspec/gen_bh.go +++ b/simulators/ethereum/pyspec/gen_bh.go @@ -38,8 +38,8 @@ func (b blockHeader) MarshalJSON() ([]byte, error) { BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` Hash common.Hash `json:"hash"` WithdrawalsRoot common.Hash `json:"withdrawalsRoot"` - DataGasUsed *math.HexOrDecimal64 `json:"dataGasUsed"` - ExcessDataGas *math.HexOrDecimal64 `json:"excessDataGas"` + BlobGasUsed *math.HexOrDecimal64 `json:"dataGasUsed"` + ExcessBlobGas *math.HexOrDecimal64 `json:"excessDataGas"` } var enc blockHeader enc.ParentHash = b.ParentHash @@ -63,8 +63,8 @@ func (b blockHeader) MarshalJSON() ([]byte, error) { enc.BaseFee = (*math.HexOrDecimal256)(b.BaseFee) enc.Hash = b.Hash enc.WithdrawalsRoot = b.WithdrawalsRoot - enc.DataGasUsed = (*math.HexOrDecimal64)(b.DataGasUsed) - enc.ExcessDataGas = (*math.HexOrDecimal64)(b.ExcessDataGas) + enc.BlobGasUsed = (*math.HexOrDecimal64)(b.BlobGasUsed) + enc.ExcessBlobGas = (*math.HexOrDecimal64)(b.ExcessBlobGas) return json.Marshal(&enc) } @@ -92,8 +92,8 @@ func (b *blockHeader) UnmarshalJSON(input []byte) error { BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` Hash *common.Hash `json:"hash"` WithdrawalsRoot *common.Hash `json:"withdrawalsRoot"` - DataGasUsed *math.HexOrDecimal64 `json:"dataGasUsed"` - ExcessDataGas *math.HexOrDecimal64 `json:"excessDataGas"` + BlobGasUsed *math.HexOrDecimal64 `json:"dataGasUsed"` + ExcessBlobGas *math.HexOrDecimal64 `json:"excessDataGas"` } var dec blockHeader if err := json.Unmarshal(input, &dec); err != nil { @@ -162,11 +162,11 @@ func (b *blockHeader) UnmarshalJSON(input []byte) error { if dec.WithdrawalsRoot != nil { b.WithdrawalsRoot = *dec.WithdrawalsRoot } - if dec.DataGasUsed != nil { - b.DataGasUsed = (*uint64)(dec.DataGasUsed) + if dec.BlobGasUsed != nil { + b.BlobGasUsed = (*uint64)(dec.BlobGasUsed) } - if dec.ExcessDataGas != nil { - b.ExcessDataGas = (*uint64)(dec.ExcessDataGas) + if dec.ExcessBlobGas != nil { + b.ExcessBlobGas = (*uint64)(dec.ExcessBlobGas) } return nil } diff --git a/simulators/ethereum/pyspec/runner.go b/simulators/ethereum/pyspec/runner.go index 49c8b963d4..e8fbb71985 100644 --- a/simulators/ethereum/pyspec/runner.go +++ b/simulators/ethereum/pyspec/runner.go @@ -133,7 +133,8 @@ func (tc *testcase) run(t *hivesim.T) { context.Background(), int(engineNewPayload.Version), engineNewPayload.Payload, - engineNewPayload.BlobVersionedHashes, + &engineNewPayload.BlobVersionedHashes, + nil, // TODO: Fix in pyspec PR ) if plErr != nil { if plException == plErr.Error() { @@ -269,8 +270,8 @@ func extractGenesis(fixture fixtureJSON) *core.Genesis { Mixhash: fixture.Genesis.MixHash, Nonce: fixture.Genesis.Nonce.Uint64(), BaseFee: fixture.Genesis.BaseFee, - DataGasUsed: fixture.Genesis.DataGasUsed, - ExcessDataGas: fixture.Genesis.ExcessDataGas, + BlobGasUsed: fixture.Genesis.BlobGasUsed, + ExcessBlobGas: fixture.Genesis.ExcessBlobGas, Alloc: fixture.Pre, } return genesis diff --git a/simulators/ethereum/pyspec/types.go b/simulators/ethereum/pyspec/types.go index 416bf96c54..94a5ea5a80 100644 --- a/simulators/ethereum/pyspec/types.go +++ b/simulators/ethereum/pyspec/types.go @@ -84,8 +84,8 @@ type blockHeader struct { BaseFee *big.Int `json:"baseFeePerGas"` Hash common.Hash `json:"hash"` WithdrawalsRoot common.Hash `json:"withdrawalsRoot"` - DataGasUsed *uint64 `json:"dataGasUsed"` - ExcessDataGas *uint64 `json:"excessDataGas"` + BlobGasUsed *uint64 `json:"dataGasUsed"` + ExcessBlobGas *uint64 `json:"excessDataGas"` } type blockHeaderUnmarshaling struct { @@ -96,8 +96,8 @@ type blockHeaderUnmarshaling struct { Timestamp *math.HexOrDecimal256 `json:"timestamp"` ExtraData hexutil.Bytes `json:"extraData"` BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` - DataGasUsed *math.HexOrDecimal64 `json:"dataGasUsed"` - ExcessDataGas *math.HexOrDecimal64 `json:"excessDataGas"` + BlobGasUsed *math.HexOrDecimal64 `json:"dataGasUsed"` + ExcessBlobGas *math.HexOrDecimal64 `json:"excessDataGas"` } type transaction struct {