// New creates a new Ether APIs instance, connects with it to the Ethereum network // via an embedded Geth instance and attaches an RPC in-process endpoint to it. func New(datadir string, network geth.EthereumNetwork, address common.Address) (*EtherAPIs, error) { // Create a Geth instance and boot it up client, err := geth.New(datadir, network) if err != nil { return nil, err } if err := client.Start(); err != nil { return nil, err } // Retrieve the underlying ethereum service and attach global RPC interface var ethereum *eth.Ethereum if err := client.Stack().Service(ðereum); err != nil { return nil, err } api, err := client.Attach() if err != nil { return nil, err } // Assemble an interface around the consensus contract contract, err := contract.New(ethereum.ChainDb(), ethereum.EventMux(), ethereum.BlockChain(), ethereum.Miner().PendingState) if err != nil { return nil, err } // Assemble and return the Ether APIs instance return &EtherAPIs{ client: client, ethereum: ethereum, eventmux: client.Stack().EventMux(), rpcapi: api, contract: contract, }, nil }
func TestBlockChain(t *testing.T) { tmp, repl, node := testJEthRE(t) defer node.Stop() defer os.RemoveAll(tmp) // get current block dump before export/import. val, err := repl.re.Run("JSON.stringify(debug.dumpBlock(eth.blockNumber))") if err != nil { t.Errorf("expected no error, got %v", err) } beforeExport := val.String() // do the export extmp, err := ioutil.TempDir("", "geth-test-export") if err != nil { t.Fatal(err) } defer os.RemoveAll(extmp) tmpfile := filepath.Join(extmp, "export.chain") tmpfileq := strconv.Quote(tmpfile) var ethereum *eth.Ethereum node.Service(ðereum) ethereum.BlockChain().Reset() checkEvalJSON(t, repl, `admin.exportChain(`+tmpfileq+`)`, `true`) if _, err := os.Stat(tmpfile); err != nil { t.Fatal(err) } // check import, verify that dumpBlock gives the same result. checkEvalJSON(t, repl, `admin.importChain(`+tmpfileq+`)`, `true`) checkEvalJSON(t, repl, `debug.dumpBlock(eth.blockNumber)`, beforeExport) }
func processTxs(repl *testjethre, t *testing.T, expTxc int) bool { var txc int64 var err error for i := 0; i < 50; i++ { txc, err = pendingTransactions(repl, t) if err != nil { t.Errorf("unexpected error checking pending transactions: %v", err) return false } if expTxc < int(txc) { t.Errorf("too many pending transactions: expected %v, got %v", expTxc, txc) return false } else if expTxc == int(txc) { break } time.Sleep(100 * time.Millisecond) } if int(txc) != expTxc { t.Errorf("incorrect number of pending transactions, expected %v, got %v", expTxc, txc) return false } var ethereum *eth.Ethereum repl.stack.Service(ðereum) err = ethereum.StartMining(runtime.NumCPU(), "") if err != nil { t.Errorf("unexpected error mining: %v", err) return false } defer ethereum.StopMining() timer := time.NewTimer(100 * time.Second) blockNr := ethereum.BlockChain().CurrentBlock().Number() height := new(big.Int).Add(blockNr, big.NewInt(1)) repl.wait <- height select { case <-timer.C: // if times out make sure the xeth loop does not block go func() { select { case repl.wait <- nil: case <-repl.wait: } }() case <-repl.wait: } txc, err = pendingTransactions(repl, t) if err != nil { t.Errorf("unexpected error checking pending transactions: %v", err) return false } if txc != 0 { t.Errorf("%d trasactions were not mined", txc) return false } return true }
// RunTest executes the specified test against an already pre-configured protocol // stack to ensure basic checks pass before running RPC tests. func RunTest(stack *node.Node, test *tests.BlockTest) error { var ethereum *eth.Ethereum stack.Service(ðereum) blockchain := ethereum.BlockChain() // Process the blocks and verify the imported headers blocks, err := test.TryBlocksInsert(blockchain) if err != nil { return err } if err := test.ValidateImportedHeaders(blockchain, blocks); err != nil { return err } // Retrieve the assembled state and validate it stateDb, err := blockchain.State() if err != nil { return err } if err := test.ValidatePostState(stateDb); err != nil { return err } return nil }