diff --git a/clients/besu/besu.sh b/clients/besu/besu.sh
index 0a260cf4c2..37a38caa0d 100644
--- a/clients/besu/besu.sh
+++ b/clients/besu/besu.sh
@@ -49,7 +49,7 @@ set -e
besu=/opt/besu/bin/besu
# See https://github.com/hyperledger/besu/issues/1464
-export BESU_OPTS="-Dsecp256k1.randomize=false"
+export BESU_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 -Dsecp256k1.randomize=false"
# Configure logging.
LOG=info
diff --git a/internal/libdocker/container.go b/internal/libdocker/container.go
index ef723b8428..e789d914f7 100644
--- a/internal/libdocker/container.go
+++ b/internal/libdocker/container.go
@@ -84,6 +84,9 @@ func (b *ContainerBackend) CreateContainer(ctx context.Context, imageName string
Image: imageName,
Env: vars,
},
+ HostConfig: &docker.HostConfig{
+ PublishAllPorts: true,
+ },
}
if opt.Input != nil {
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..319d31d6d7
--- /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,omitempty"`
+ ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas,omitempty"`
+ ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot,omitempty"`
+ }
+ 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,omitempty"`
+ ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas,omitempty"`
+ ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot,omitempty"`
+ }
+ 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..ac7a1cb41f
--- /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,omitempty"`
+ ExcessBlobGas *uint64 `json:"excessBlobGas,omitempty"`
+ ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot,omitempty"`
+}
+
+// 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=