diff --git a/cmd/evm/blockrunner.go b/cmd/evm/blockrunner.go
new file mode 100644
index 000000000000..ffd76b8fb0c9
--- /dev/null
+++ b/cmd/evm/blockrunner.go
@@ -0,0 +1,61 @@
+// Copyright 2023 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 main
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "os"
+
+ "github.com/ethereum/go-ethereum/log"
+ "github.com/ethereum/go-ethereum/tests"
+ "github.com/urfave/cli/v2"
+)
+
+var blockTestCommand = &cli.Command{
+ Action: blockTestCmd,
+ Name: "blocktest",
+ Usage: "executes the given blockchain tests",
+ ArgsUsage: "",
+}
+
+func blockTestCmd(ctx *cli.Context) error {
+ if len(ctx.Args().First()) == 0 {
+ return errors.New("path-to-test argument required")
+ }
+ // Configure the go-ethereum logger
+ glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(false)))
+ glogger.Verbosity(log.Lvl(ctx.Int(VerbosityFlag.Name)))
+ log.Root().SetHandler(glogger)
+
+ // Load the test content from the input file
+ src, err := os.ReadFile(ctx.Args().First())
+ if err != nil {
+ return err
+ }
+ var tests map[string]tests.BlockTest
+ if err = json.Unmarshal(src, &tests); err != nil {
+ return err
+ }
+ for i, test := range tests {
+ if err := test.Run(false); err != nil {
+ return fmt.Errorf("test %v: %w", i, err)
+ }
+ }
+ return nil
+}
diff --git a/cmd/evm/main.go b/cmd/evm/main.go
index 5f9e75f48c6f..4afb60820f8b 100644
--- a/cmd/evm/main.go
+++ b/cmd/evm/main.go
@@ -217,6 +217,7 @@ func init() {
compileCommand,
disasmCommand,
runCommand,
+ blockTestCommand,
stateTestCommand,
stateTransitionCommand,
transactionCommand,