github.com/jimmyx0x/go-ethereum@v1.10.28/cmd/evm/main.go (about)

     1  // Copyright 2014 The go-ethereum Authors
     2  // This file is part of go-ethereum.
     3  //
     4  // go-ethereum is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // go-ethereum is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU General Public License
    15  // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  // evm executes EVM code snippets.
    18  package main
    19  
    20  import (
    21  	"fmt"
    22  	"math/big"
    23  	"os"
    24  
    25  	"github.com/ethereum/go-ethereum/cmd/evm/internal/t8ntool"
    26  	"github.com/ethereum/go-ethereum/internal/flags"
    27  	"github.com/urfave/cli/v2"
    28  )
    29  
    30  var (
    31  	DebugFlag = &cli.BoolFlag{
    32  		Name:  "debug",
    33  		Usage: "output full trace logs",
    34  	}
    35  	MemProfileFlag = &cli.StringFlag{
    36  		Name:  "memprofile",
    37  		Usage: "creates a memory profile at the given path",
    38  	}
    39  	CPUProfileFlag = &cli.StringFlag{
    40  		Name:  "cpuprofile",
    41  		Usage: "creates a CPU profile at the given path",
    42  	}
    43  	StatDumpFlag = &cli.BoolFlag{
    44  		Name:  "statdump",
    45  		Usage: "displays stack and heap memory information",
    46  	}
    47  	CodeFlag = &cli.StringFlag{
    48  		Name:  "code",
    49  		Usage: "EVM code",
    50  	}
    51  	CodeFileFlag = &cli.StringFlag{
    52  		Name:  "codefile",
    53  		Usage: "File containing EVM code. If '-' is specified, code is read from stdin ",
    54  	}
    55  	GasFlag = &cli.Uint64Flag{
    56  		Name:  "gas",
    57  		Usage: "gas limit for the evm",
    58  		Value: 10000000000,
    59  	}
    60  	PriceFlag = &flags.BigFlag{
    61  		Name:  "price",
    62  		Usage: "price set for the evm",
    63  		Value: new(big.Int),
    64  	}
    65  	ValueFlag = &flags.BigFlag{
    66  		Name:  "value",
    67  		Usage: "value set for the evm",
    68  		Value: new(big.Int),
    69  	}
    70  	DumpFlag = &cli.BoolFlag{
    71  		Name:  "dump",
    72  		Usage: "dumps the state after the run",
    73  	}
    74  	InputFlag = &cli.StringFlag{
    75  		Name:  "input",
    76  		Usage: "input for the EVM",
    77  	}
    78  	InputFileFlag = &cli.StringFlag{
    79  		Name:  "inputfile",
    80  		Usage: "file containing input for the EVM",
    81  	}
    82  	VerbosityFlag = &cli.IntFlag{
    83  		Name:  "verbosity",
    84  		Usage: "sets the verbosity level",
    85  	}
    86  	BenchFlag = &cli.BoolFlag{
    87  		Name:  "bench",
    88  		Usage: "benchmark the execution",
    89  	}
    90  	CreateFlag = &cli.BoolFlag{
    91  		Name:  "create",
    92  		Usage: "indicates the action should be create rather than call",
    93  	}
    94  	GenesisFlag = &cli.StringFlag{
    95  		Name:  "prestate",
    96  		Usage: "JSON file with prestate (genesis) config",
    97  	}
    98  	MachineFlag = &cli.BoolFlag{
    99  		Name:  "json",
   100  		Usage: "output trace logs in machine readable format (json)",
   101  	}
   102  	SenderFlag = &cli.StringFlag{
   103  		Name:  "sender",
   104  		Usage: "The transaction origin",
   105  	}
   106  	ReceiverFlag = &cli.StringFlag{
   107  		Name:  "receiver",
   108  		Usage: "The transaction receiver (execution context)",
   109  	}
   110  	DisableMemoryFlag = &cli.BoolFlag{
   111  		Name:  "nomemory",
   112  		Value: true,
   113  		Usage: "disable memory output",
   114  	}
   115  	DisableStackFlag = &cli.BoolFlag{
   116  		Name:  "nostack",
   117  		Usage: "disable stack output",
   118  	}
   119  	DisableStorageFlag = &cli.BoolFlag{
   120  		Name:  "nostorage",
   121  		Usage: "disable storage output",
   122  	}
   123  	DisableReturnDataFlag = &cli.BoolFlag{
   124  		Name:  "noreturndata",
   125  		Value: true,
   126  		Usage: "enable return data output",
   127  	}
   128  )
   129  
   130  var stateTransitionCommand = &cli.Command{
   131  	Name:    "transition",
   132  	Aliases: []string{"t8n"},
   133  	Usage:   "executes a full state transition",
   134  	Action:  t8ntool.Transition,
   135  	Flags: []cli.Flag{
   136  		t8ntool.TraceFlag,
   137  		t8ntool.TraceDisableMemoryFlag,
   138  		t8ntool.TraceEnableMemoryFlag,
   139  		t8ntool.TraceDisableStackFlag,
   140  		t8ntool.TraceDisableReturnDataFlag,
   141  		t8ntool.TraceEnableReturnDataFlag,
   142  		t8ntool.OutputBasedir,
   143  		t8ntool.OutputAllocFlag,
   144  		t8ntool.OutputResultFlag,
   145  		t8ntool.OutputBodyFlag,
   146  		t8ntool.InputAllocFlag,
   147  		t8ntool.InputEnvFlag,
   148  		t8ntool.InputTxsFlag,
   149  		t8ntool.ForknameFlag,
   150  		t8ntool.ChainIDFlag,
   151  		t8ntool.RewardFlag,
   152  		t8ntool.VerbosityFlag,
   153  	},
   154  }
   155  
   156  var transactionCommand = &cli.Command{
   157  	Name:    "transaction",
   158  	Aliases: []string{"t9n"},
   159  	Usage:   "performs transaction validation",
   160  	Action:  t8ntool.Transaction,
   161  	Flags: []cli.Flag{
   162  		t8ntool.InputTxsFlag,
   163  		t8ntool.ChainIDFlag,
   164  		t8ntool.ForknameFlag,
   165  		t8ntool.VerbosityFlag,
   166  	},
   167  }
   168  
   169  var blockBuilderCommand = &cli.Command{
   170  	Name:    "block-builder",
   171  	Aliases: []string{"b11r"},
   172  	Usage:   "builds a block",
   173  	Action:  t8ntool.BuildBlock,
   174  	Flags: []cli.Flag{
   175  		t8ntool.OutputBasedir,
   176  		t8ntool.OutputBlockFlag,
   177  		t8ntool.InputHeaderFlag,
   178  		t8ntool.InputOmmersFlag,
   179  		t8ntool.InputTxsRlpFlag,
   180  		t8ntool.SealCliqueFlag,
   181  		t8ntool.SealEthashFlag,
   182  		t8ntool.SealEthashDirFlag,
   183  		t8ntool.SealEthashModeFlag,
   184  		t8ntool.VerbosityFlag,
   185  	},
   186  }
   187  
   188  var app = flags.NewApp("the evm command line interface")
   189  
   190  func init() {
   191  	app.Flags = []cli.Flag{
   192  		BenchFlag,
   193  		CreateFlag,
   194  		DebugFlag,
   195  		VerbosityFlag,
   196  		CodeFlag,
   197  		CodeFileFlag,
   198  		GasFlag,
   199  		PriceFlag,
   200  		ValueFlag,
   201  		DumpFlag,
   202  		InputFlag,
   203  		InputFileFlag,
   204  		MemProfileFlag,
   205  		CPUProfileFlag,
   206  		StatDumpFlag,
   207  		GenesisFlag,
   208  		MachineFlag,
   209  		SenderFlag,
   210  		ReceiverFlag,
   211  		DisableMemoryFlag,
   212  		DisableStackFlag,
   213  		DisableStorageFlag,
   214  		DisableReturnDataFlag,
   215  	}
   216  	app.Commands = []*cli.Command{
   217  		compileCommand,
   218  		disasmCommand,
   219  		runCommand,
   220  		stateTestCommand,
   221  		stateTransitionCommand,
   222  		transactionCommand,
   223  		blockBuilderCommand,
   224  	}
   225  }
   226  
   227  func main() {
   228  	if err := app.Run(os.Args); err != nil {
   229  		code := 1
   230  		if ec, ok := err.(*t8ntool.NumberedError); ok {
   231  			code = ec.ExitCode()
   232  		}
   233  		fmt.Fprintln(os.Stderr, err)
   234  		os.Exit(code)
   235  	}
   236  }