diff --git a/cmd/devp2p/internal/ethtest/suite.go b/cmd/devp2p/internal/ethtest/suite.go index 320ffeeee9..3e9e73d41e 100644 --- a/cmd/devp2p/internal/ethtest/suite.go +++ b/cmd/devp2p/internal/ethtest/suite.go @@ -17,13 +17,9 @@ package ethtest import ( - "context" "crypto/rand" - "fmt" "math/big" "reflect" - "sync" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/misc/eip4844" @@ -85,8 +81,6 @@ func (s *Suite) EthTests() []utesting.Test { {Name: "InvalidTxs", Fn: s.TestInvalidTxs}, {Name: "NewPooledTxs", Fn: s.TestNewPooledTxs}, {Name: "BlobViolations", Fn: s.TestBlobViolations}, - {Name: "TestBlobTxWithoutSidecar", Fn: s.TestBlobTxWithoutSidecar}, - {Name: "TestBlobTxWithMismatchedSidecar", Fn: s.TestBlobTxWithMismatchedSidecar}, } } @@ -877,194 +871,3 @@ func (s *Suite) TestBlobViolations(t *utesting.T) { conn.Close() } } - -// mangleSidecar returns a copy of the given blob transaction where the sidecar -// data has been modified to produce a different commitment hash. -func mangleSidecar(tx *types.Transaction) *types.Transaction { - sidecar := tx.BlobTxSidecar() - copy := types.BlobTxSidecar{ - Blobs: append([]kzg4844.Blob{}, sidecar.Blobs...), - Commitments: append([]kzg4844.Commitment{}, sidecar.Commitments...), - Proofs: append([]kzg4844.Proof{}, sidecar.Proofs...), - } - // zero the first commitment to alter the sidecar hash - copy.Commitments[0] = kzg4844.Commitment{} - return tx.WithBlobTxSidecar(©) -} - -func (s *Suite) TestBlobTxWithoutSidecar(t *utesting.T) { - t.Log(`This test checks that a blob transaction first advertised/transmitted without blobs will result in the sending peer being disconnected, and the full transaction should be successfully retrieved from another peer.`) - tx := s.makeBlobTxs(1, 2, 42)[0] - badTx := tx.WithoutBlobTxSidecar() - s.testBadBlobTx(t, tx, badTx) -} - -func (s *Suite) TestBlobTxWithMismatchedSidecar(t *utesting.T) { - t.Log(`This test checks that a blob transaction first advertised/transmitted without blobs, whose commitment don't correspond to the blob_versioned_hashes in the transaction, will result in the sending peer being disconnected, and the full transaction should be successfully retrieved from another peer.`) - tx := s.makeBlobTxs(1, 2, 43)[0] - badTx := mangleSidecar(tx) - s.testBadBlobTx(t, tx, badTx) -} - -// readUntil reads eth protocol messages until a message of the target type is -// received. It returns an error if there is a disconnect, or if the context -// is cancelled before a message of the desired type can be read. -func readUntil[T any](ctx context.Context, conn *Conn) (*T, error) { - for { - select { - case <-ctx.Done(): - return nil, context.Canceled - default: - } - received, err := conn.ReadEth() - if err != nil { - if err == errDisc { - return nil, errDisc - } - continue - } - - switch res := received.(type) { - case *T: - return res, nil - } - } -} - -// readUntilDisconnect reads eth protocol messages until the peer disconnects. -// It returns whether the peer disconnects in the next 100ms. -func readUntilDisconnect(conn *Conn) (disconnected bool) { - ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) - defer cancel() - _, err := readUntil[struct{}](ctx, conn) - return err == errDisc -} - -func (s *Suite) testBadBlobTx(t *utesting.T, tx *types.Transaction, badTx *types.Transaction) { - stage1, stage2, stage3 := new(sync.WaitGroup), new(sync.WaitGroup), new(sync.WaitGroup) - stage1.Add(1) - stage2.Add(1) - stage3.Add(1) - - errc := make(chan error) - - badPeer := func() { - // announce the correct hash from the bad peer. - // when the transaction is first requested before transmitting it from the bad peer, - // trigger step 2: connection and announcement by good peers - - conn, err := s.dial() - if err != nil { - errc <- fmt.Errorf("dial fail: %v", err) - return - } - defer conn.Close() - - if err := conn.peer(s.chain, nil); err != nil { - errc <- fmt.Errorf("bad peer: peering failed: %v", err) - return - } - - ann := eth.NewPooledTransactionHashesPacket{ - Types: []byte{types.BlobTxType}, - Sizes: []uint32{uint32(badTx.Size())}, - Hashes: []common.Hash{badTx.Hash()}, - } - - if err := conn.Write(ethProto, eth.NewPooledTransactionHashesMsg, ann); err != nil { - errc <- fmt.Errorf("sending announcement failed: %v", err) - return - } - - req, err := readUntil[eth.GetPooledTransactionsPacket](context.Background(), conn) - if err != nil { - errc <- fmt.Errorf("failed to read GetPooledTransactions message: %v", err) - return - } - - stage1.Done() - stage2.Wait() - - // the good peer is connected, and has announced the tx. - // proceed to send the incorrect one from the bad peer. - - resp := eth.PooledTransactionsPacket{RequestId: req.RequestId, PooledTransactionsResponse: eth.PooledTransactionsResponse(types.Transactions{badTx})} - if err := conn.Write(ethProto, eth.PooledTransactionsMsg, resp); err != nil { - errc <- fmt.Errorf("writing pooled tx response failed: %v", err) - return - } - if !readUntilDisconnect(conn) { - errc <- fmt.Errorf("expected bad peer to be disconnected") - return - } - stage3.Done() - } - - goodPeer := func() { - stage1.Wait() - - conn, err := s.dial() - if err != nil { - errc <- fmt.Errorf("dial fail: %v", err) - return - } - defer conn.Close() - - if err := conn.peer(s.chain, nil); err != nil { - errc <- fmt.Errorf("peering failed: %v", err) - return - } - - ann := eth.NewPooledTransactionHashesPacket{ - Types: []byte{types.BlobTxType}, - Sizes: []uint32{uint32(tx.Size())}, - Hashes: []common.Hash{tx.Hash()}, - } - - if err := conn.Write(ethProto, eth.NewPooledTransactionHashesMsg, ann); err != nil { - errc <- fmt.Errorf("sending announcement failed: %v", err) - return - } - - // wait until the bad peer has transmitted the incorrect transaction - stage2.Done() - stage3.Wait() - - // the bad peer has transmitted the bad tx, and been disconnected. - // transmit the same tx but with correct sidecar from the good peer. - - var req *eth.GetPooledTransactionsPacket - req, err = readUntil[eth.GetPooledTransactionsPacket](context.Background(), conn) - if err != nil { - errc <- fmt.Errorf("reading pooled tx request failed: %v", err) - return - } - - if req.GetPooledTransactionsRequest[0] != tx.Hash() { - errc <- fmt.Errorf("requested unknown tx hash") - return - } - - resp := eth.PooledTransactionsPacket{RequestId: req.RequestId, PooledTransactionsResponse: eth.PooledTransactionsResponse(types.Transactions{tx})} - if err := conn.Write(ethProto, eth.PooledTransactionsMsg, resp); err != nil { - errc <- fmt.Errorf("writing pooled tx response failed: %v", err) - return - } - if readUntilDisconnect(conn) { - errc <- fmt.Errorf("unexpected disconnect") - return - } - close(errc) - } - - if err := s.engine.sendForkchoiceUpdated(); err != nil { - t.Fatalf("send fcu failed: %v", err) - } - - go goodPeer() - go badPeer() - err := <-errc - if err != nil { - t.Fatalf("%v", err) - } -} diff --git a/cmd/evm/main.go b/cmd/evm/main.go index d32a8f67cc..6e894435ed 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -128,14 +128,6 @@ var ( Hidden: true, Category: traceCategory, } - refTestFlag = &cli.StringFlag{ - Name: "test", - Usage: "Path to EOF validation reference test.", - } - hexFlag = &cli.StringFlag{ - Name: "hex", - Usage: "single container data parse and validation", - } ) // Command definitions. diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index 91e945ed4a..8fa150d9f2 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -42,6 +42,7 @@ import ( "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/internal/debug" "github.com/ethereum/go-ethereum/internal/era" + "github.com/ethereum/go-ethereum/internal/flags" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" ) @@ -230,7 +231,7 @@ func initGenesis(ctx *cli.Context) error { var overrides core.ChainOverrides if ctx.IsSet(utils.OverridePrague.Name) { v := ctx.Uint64(utils.OverridePrague.Name) - overrides.OverridePrague = &v + overrides.OverridePrague = new(big.Int).SetUint64(v) } if ctx.IsSet(utils.OverrideVerkle.Name) { v := ctx.Int64(utils.OverrideVerkle.Name) diff --git a/cmd/geth/config.go b/cmd/geth/config.go index f7b3149fe7..6d1265752c 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -206,7 +206,7 @@ func makeFullNode(ctx *cli.Context) (*node.Node, ethapi.Backend) { stack, cfg := makeConfigNode(ctx) if ctx.IsSet(utils.OverridePrague.Name) { v := ctx.Uint64(utils.OverridePrague.Name) - cfg.Eth.OverridePrague = &v + cfg.Eth.OverridePrague = new(big.Int).SetUint64(v) } if ctx.IsSet(utils.OverrideVerkle.Name) { v := ctx.Int64(utils.OverrideVerkle.Name) diff --git a/go.mod b/go.mod index 3340c5c23a..f9bf7ccb69 100644 --- a/go.mod +++ b/go.mod @@ -269,6 +269,7 @@ require ( go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect go.opentelemetry.io/otel/metric v1.27.0 // indirect go.uber.org/atomic v1.9.0 // indirect + go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/oauth2 v0.20.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect diff --git a/go.sum b/go.sum index e1ad2da299..28492c5f0a 100644 --- a/go.sum +++ b/go.sum @@ -2934,6 +2934,8 @@ go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= diff --git a/internal/cli/server/server.go b/internal/cli/server/server.go index 33b89e2b57..8e845689fe 100644 --- a/internal/cli/server/server.go +++ b/internal/cli/server/server.go @@ -231,7 +231,7 @@ func NewServer(config *Config, opts ...serverOption) (*Server, error) { return nil, fmt.Errorf("signer missing: %v", err) } - cli.Authorize(eb, wallet.SignData) + cli.Authorize(eb) authorized = true } @@ -315,7 +315,7 @@ func (s *Server) Stop() { func (s *Server) setupMetrics(config *TelemetryConfig, serviceName string) error { // Check the global metrics if they're matching with the provided config - if metrics.Enabled != config.Enabled { + if metrics.Enabled() != config.Enabled { log.Warn( "Metric misconfiguration, some of them might not be visible", "metrics", metrics.Enabled, @@ -325,9 +325,11 @@ func (s *Server) setupMetrics(config *TelemetryConfig, serviceName string) error } // Update the values anyways (for services which don't need immediate attention) - metrics.Enabled = config.Enabled + if config.Enabled { + metrics.Enable() + } - if !metrics.Enabled { + if !metrics.Enabled() { // metrics are disabled, do not set up any sink return nil } diff --git a/internal/ethapi/api_test.go b/internal/ethapi/api_test.go index b7e559cac6..a3aab0a3cf 100644 --- a/internal/ethapi/api_test.go +++ b/internal/ethapi/api_test.go @@ -698,6 +698,11 @@ func (b testBackend) GetBorBlockReceipt(ctx context.Context, hash common.Hash) ( func (b testBackend) NewMatcherBackend() filtermaps.MatcherBackend { panic("implement me") } + +func (b testBackend) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription { + panic("implement me") +} + func TestEstimateGas(t *testing.T) { t.Parallel() // Initialize test accounts diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index 5fbf2a630c..783fce9f2c 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -94,6 +94,7 @@ type Backend interface { GetLogs(ctx context.Context, blockHash common.Hash, number uint64) ([][]*types.Log, error) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription + SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription // Bor related APIs SubscribeStateSyncEvent(ch chan<- core.StateSyncEvent) event.Subscription diff --git a/internal/ethapi/simulate.go b/internal/ethapi/simulate.go index e19b759259..e0caf6539d 100644 --- a/internal/ethapi/simulate.go +++ b/internal/ethapi/simulate.go @@ -81,7 +81,7 @@ type simBlockResult struct { } func (r *simBlockResult) MarshalJSON() ([]byte, error) { - blockData := RPCMarshalBlock(r.Block, true, r.fullTx, r.chainConfig) + blockData := RPCMarshalBlock(r.Block, true, r.fullTx, r.chainConfig, nil) blockData["calls"] = r.Calls return json.Marshal(blockData) } @@ -108,6 +108,10 @@ func (m *simChainHeadReader) CurrentHeader() *types.Header { return m.Backend.CurrentHeader() } +func (m *simChainHeadReader) GetTd(hash common.Hash, number uint64) *big.Int { + return nil +} + func (m *simChainHeadReader) GetHeader(hash common.Hash, number uint64) *types.Header { header, err := m.Backend.HeaderByNumber(m.Context, rpc.BlockNumber(number)) if err != nil || header == nil { diff --git a/internal/ethapi/transaction_args_test.go b/internal/ethapi/transaction_args_test.go index a66f03ac40..870f69237d 100644 --- a/internal/ethapi/transaction_args_test.go +++ b/internal/ethapi/transaction_args_test.go @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/filtermaps" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" @@ -465,3 +466,11 @@ func (b *backendMock) PurgeWhitelistedMilestone() {} func (b backendMock) PeerStats() interface{} { return nil } + +func (b backendMock) NewMatcherBackend() filtermaps.MatcherBackend { + panic("implement me") +} + +func (b backendMock) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription { + panic("implement me") +}