func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, error) { cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx) cfg.NewDB = func(path string) (common.Database, error) { return ethdb.NewMemDatabase() } cfg.MaxPeers = 0 // disable network cfg.Shh = false // disable whisper cfg.NAT = nil // disable port mapping ethereum, err := eth.New(cfg) if err != nil { return nil, err } // if err := ethereum.Start(); err != nil { // return nil, err // } // import the genesis block ethereum.ResetWithGenesisBlock(test.Genesis) // import pre accounts statedb, err := test.InsertPreState(ethereum) if err != nil { return ethereum, fmt.Errorf("InsertPreState: %v", err) } if err := test.TryBlocksInsert(ethereum.ChainManager()); err != nil { return ethereum, fmt.Errorf("Block Test load error: %v", err) } if err := test.ValidatePostState(statedb); err != nil { return ethereum, fmt.Errorf("post state validation failed: %v", err) } return ethereum, nil }
func console(ctx *cli.Context) { utils.CheckLegalese(ctx.GlobalString(utils.DataDirFlag.Name)) cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v", err) } client := comms.NewInProcClient(codec.JSON) startEth(ctx, ethereum) repl := newJSRE( ethereum, ctx.GlobalString(utils.JSpathFlag.Name), ctx.GlobalString(utils.RPCCORSDomainFlag.Name), client, true, nil, ) if ctx.GlobalString(utils.ExecFlag.Name) != "" { repl.batch(ctx.GlobalString(utils.ExecFlag.Name)) } else { repl.welcome() repl.interactive() } ethereum.Stop() ethereum.WaitForShutdown() }
func NewEthereumApplication(ctx *cli.Context) *EthereumApplication { cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v", err) } stateDB, err := ethereum.BlockChain().State() if err != nil { utils.Fatalf("%v", err) } ethApp := &EthereumApplication{ ethereum: ethereum, stateDB: stateDB, client: client.NewClientURI(fmt.Sprintf("http://%s", ctx.String(TendermintCoreHostFlag.Name))), } // NOTE: RPC/IPC should only be enabled on local nodes if !ctx.GlobalBool(utils.IPCDisabledFlag.Name) { if err := ethApp.StartIPC(ctx); err != nil { utils.Fatalf("%v", err) } } if ctx.GlobalBool(utils.RPCEnabledFlag.Name) { if err := ethApp.StartRPC(ctx); err != nil { utils.Fatalf("%v", err) } } return ethApp }
func importchain(ctx *cli.Context) { if len(ctx.Args()) != 1 { utils.Fatalf("This command requires an argument.") } cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx) cfg.SkipBcVersionCheck = true ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v\n", err) } chainmgr := ethereum.ChainManager() start := time.Now() err = utils.ImportChain(chainmgr, ctx.Args().First()) if err != nil { utils.Fatalf("Import error: %v\n", err) } // force database flush ethereum.BlockDb().Close() ethereum.StateDb().Close() ethereum.ExtraDb().Close() fmt.Printf("Import done in %v", time.Since(start)) return }
func execJSFiles(ctx *cli.Context) { utils.CheckLegalese(ctx.GlobalString(utils.DataDirFlag.Name)) cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v", err) } client := comms.NewInProcClient(codec.JSON) startEth(ctx, ethereum) repl := newJSRE( ethereum, ctx.GlobalString(utils.JSpathFlag.Name), ctx.GlobalString(utils.RPCCORSDomainFlag.Name), client, false, nil, ) for _, file := range ctx.Args() { repl.exec(file) } ethereum.Stop() ethereum.WaitForShutdown() }
func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, error) { cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx) db, _ := ethdb.NewMemDatabase() cfg.NewDB = func(path string) (ethdb.Database, error) { return db, nil } cfg.MaxPeers = 0 // disable network cfg.Shh = false // disable whisper cfg.NAT = nil // disable port mapping ethereum, err := eth.New(cfg) if err != nil { return nil, err } // import the genesis block ethereum.ResetWithGenesisBlock(test.Genesis) // import pre accounts _, err = test.InsertPreState(db, cfg.AccountManager) if err != nil { return ethereum, fmt.Errorf("InsertPreState: %v", err) } cm := ethereum.BlockChain() validBlocks, err := test.TryBlocksInsert(cm) if err != nil { return ethereum, fmt.Errorf("Block Test load error: %v", err) } newDB, err := cm.State() if err != nil { return ethereum, fmt.Errorf("Block Test get state error: %v", err) } if err := test.ValidatePostState(newDB); err != nil { return ethereum, fmt.Errorf("post state validation failed: %v", err) } return ethereum, test.ValidateImportedHeaders(cm, validBlocks) }
func blockRecovery(ctx *cli.Context) { utils.CheckLegalese(ctx.GlobalString(utils.DataDirFlag.Name)) arg := ctx.Args().First() if len(ctx.Args()) < 1 && len(arg) > 0 { glog.Fatal("recover requires block number or hash") } cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) utils.CheckLegalese(cfg.DataDir) blockDb, err := ethdb.NewLDBDatabase(filepath.Join(cfg.DataDir, "blockchain"), cfg.DatabaseCache) if err != nil { glog.Fatalln("could not open db:", err) } var block *types.Block if arg[0] == '#' { block = core.GetBlockByNumber(blockDb, common.String2Big(arg[1:]).Uint64()) } else { block = core.GetBlockByHash(blockDb, common.HexToHash(arg)) } if block == nil { glog.Fatalln("block not found. Recovery failed") } err = core.WriteHead(blockDb, block) if err != nil { glog.Fatalln("block write err", err) } glog.Infof("Recovery succesful. New HEAD %x\n", block.Hash()) }
func run(ctx *cli.Context) { cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v", err) } startEth(ctx, ethereum) // this blocks the thread ethereum.WaitForShutdown() }
func upgradeDb(ctx *cli.Context) { fmt.Println("Upgrade blockchain DB") cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx) cfg.SkipBcVersionCheck = true ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v\n", err) } v, _ := ethereum.BlockDb().Get([]byte("BlockchainVersion")) bcVersion := int(common.NewValue(v).Uint()) if bcVersion == 0 { bcVersion = core.BlockChainVersion } filename := fmt.Sprintf("blockchain_%d_%s.chain", bcVersion, time.Now().Format("2006-01-02_15:04:05")) exportFile := path.Join(ctx.GlobalString(utils.DataDirFlag.Name), filename) err = utils.ExportChain(ethereum.ChainManager(), exportFile) if err != nil { utils.Fatalf("Unable to export chain for reimport %s\n", err) } ethereum.BlockDb().Close() ethereum.StateDb().Close() ethereum.ExtraDb().Close() os.RemoveAll(path.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain")) ethereum, err = eth.New(cfg) if err != nil { utils.Fatalf("%v\n", err) } ethereum.BlockDb().Put([]byte("BlockchainVersion"), common.NewValue(core.BlockChainVersion).Bytes()) err = utils.ImportChain(ethereum.ChainManager(), exportFile) if err != nil { utils.Fatalf("Import error %v (a backup is made in %s, use the import command to import it)\n", err, exportFile) } // force database flush ethereum.BlockDb().Close() ethereum.StateDb().Close() ethereum.ExtraDb().Close() os.Remove(exportFile) fmt.Println("Import finished") }
func run(ctx *cli.Context) { utils.CheckLegalese(ctx.GlobalString(utils.DataDirFlag.Name)) cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v", err) } startEth(ctx, ethereum) // this blocks the thread ethereum.WaitForShutdown() }
func run(ctx *cli.Context) { utils.CheckLegalese(utils.MustDataDir(ctx)) cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) cfg.ExtraData = makeExtra(ctx) ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v", err) } startEth(ctx, ethereum) // this blocks the thread ethereum.WaitForShutdown() }
func execJSFiles(ctx *cli.Context) { cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v", err) } startEth(ctx, ethereum) repl := newJSRE(ethereum, ctx.String(utils.JSpathFlag.Name), false, ctx.GlobalString(utils.RPCCORSDomainFlag.Name)) for _, file := range ctx.Args() { repl.exec(file) } ethereum.Stop() ethereum.WaitForShutdown() }
func run(ctx *cli.Context) { importer := NewImporter(ctx) utils.HandleInterrupt() cfg := utils.MakeEthConfig("EthChainParser", Version, ctx) ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v", err) } utils.StartEthereum(ethereum) if ctx.GlobalBool(utils.RPCEnabledFlag.Name) { utils.StartRPC(ethereum, ctx) } events := ethereum.EventMux().Subscribe( core.ChainEvent{}, core.TxPreEvent{}, ) defer events.Unsubscribe() for { select { case ev, isopen := <-events.Chan(): if !isopen { return } switch ev := ev.(type) { case core.ChainEvent: importer.importBlock(ev.Block) case core.TxPreEvent: // Not dealing with incoming txes for now //importer.importTx(ev.Tx) } } } ethereum.WaitForShutdown() logger.Flush() fmt.Printf("Shutting down\n") }
func exportchain(ctx *cli.Context) { if len(ctx.Args()) != 1 { utils.Fatalf("This command requires an argument.") } cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) cfg.SkipBcVersionCheck = true ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v\n", err) } chainmgr := ethereum.ChainManager() start := time.Now() err = utils.ExportChain(chainmgr, ctx.Args().First()) if err != nil { utils.Fatalf("Export error: %v\n", err) } fmt.Printf("Export done in %v", time.Since(start)) return }
func console(ctx *cli.Context) { utils.CheckLegalese(ctx.GlobalString(utils.DataDirFlag.Name)) // Wrap the standard output with a colorified stream (windows) if isatty.IsTerminal(os.Stdout.Fd()) { if pr, pw, err := os.Pipe(); err == nil { go io.Copy(colorable.NewColorableStdout(), pr) os.Stdout = pw } } cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v", err) } client := comms.NewInProcClient(codec.JSON) startEth(ctx, ethereum) repl := newJSRE( ethereum, ctx.GlobalString(utils.JSpathFlag.Name), ctx.GlobalString(utils.RPCCORSDomainFlag.Name), client, true, nil, ) if ctx.GlobalString(utils.ExecFlag.Name) != "" { repl.batch(ctx.GlobalString(utils.ExecFlag.Name)) } else { repl.welcome() repl.interactive() } ethereum.Stop() ethereum.WaitForShutdown() }
func console(ctx *cli.Context) { // Wrap the standard output with a colorified stream (windows) if isatty.IsTerminal(os.Stdout.Fd()) { if pr, pw, err := os.Pipe(); err == nil { go io.Copy(colorable.NewColorableStdout(), pr) os.Stdout = pw } } cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v", err) } startEth(ctx, ethereum) repl := newJSRE(ethereum, ctx.String(utils.JSpathFlag.Name), true, ctx.GlobalString(utils.RPCCORSDomainFlag.Name)) repl.interactive() ethereum.Stop() ethereum.WaitForShutdown() }
func run(ctx *cli.Context) { tstart := time.Now() // TODO: show qml popup instead of exiting if initialization fails. cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) cfg.Shh = true ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v", err) } utils.StartRPC(ethereum, ctx) go utils.StartEthereum(ethereum) fmt.Println("initializing eth stack took", time.Since(tstart)) // Open the window qml.Run(func() error { webengine.Initialize() gui := NewWindow(ethereum) utils.RegisterInterrupt(func(os.Signal) { gui.Stop() }) // gui blocks the main thread gui.Start(ctx.GlobalString(assetPathFlag.Name), ctx.GlobalString(utils.JSpathFlag.Name)) return nil }) }