From 770a0e78396d66dc0b15a267891ed69be1414f52 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 3 Jun 2015 13:14:06 +0200 Subject: [PATCH] wip --- cmd/geth/admin.go | 68 +++++++++++++++++++++++++++++++++++++++-- core/block_processor.go | 6 ---- core/chain_manager.go | 5 +-- 3 files changed, 69 insertions(+), 10 deletions(-) diff --git a/cmd/geth/admin.go b/cmd/geth/admin.go index 01de97ac2..13d10de32 100644 --- a/cmd/geth/admin.go +++ b/cmd/geth/admin.go @@ -78,6 +78,12 @@ func (js *jsre) adminBindings() { miner.Set("stopAutoDAG", js.stopAutoDAG) miner.Set("makeDAG", js.makeDAG) + admin.Set("txPool", struct{}{}) + t, _ = admin.Get("txPool") + txPool := t.Object() + txPool.Set("pending", js.allPendingTransactions) + txPool.Set("queued", js.allQueuedTransactions) + admin.Set("debug", struct{}{}) t, _ = admin.Get("debug") debug := t.Object() @@ -89,6 +95,7 @@ func (js *jsre) adminBindings() { debug.Set("setHead", js.setHead) debug.Set("processBlock", js.debugBlock) debug.Set("seedhash", js.seedHash) + debug.Set("insertBlock", js.insertBlockRlp) // undocumented temporary debug.Set("waitForBlocks", js.waitForBlocks) } @@ -140,6 +147,32 @@ func (js *jsre) seedHash(call otto.FunctionCall) otto.Value { return otto.UndefinedValue() } +func (js *jsre) allPendingTransactions(call otto.FunctionCall) otto.Value { + txs := js.ethereum.TxPool().GetTransactions() + + ltxs := make([]*tx, len(txs)) + for i, tx := range txs { + // no need to check err + ltxs[i] = newTx(tx) + } + + v, _ := call.Otto.ToValue(ltxs) + return v +} + +func (js *jsre) allQueuedTransactions(call otto.FunctionCall) otto.Value { + txs := js.ethereum.TxPool().GetQueuedTransactions() + + ltxs := make([]*tx, len(txs)) + for i, tx := range txs { + // no need to check err + ltxs[i] = newTx(tx) + } + + v, _ := call.Otto.ToValue(ltxs) + return v +} + func (js *jsre) pendingTransactions(call otto.FunctionCall) otto.Value { txs := js.ethereum.TxPool().GetTransactions() @@ -237,16 +270,47 @@ func (js *jsre) debugBlock(call otto.FunctionCall) otto.Value { return otto.UndefinedValue() } + tstart := time.Now() + old := vm.Debug vm.Debug = true _, err = js.ethereum.BlockProcessor().RetryProcess(block) if err != nil { fmt.Println(err) + r, _ := call.Otto.ToValue(map[string]interface{}{"success": false, "time": time.Since(tstart).Seconds()}) + return r } vm.Debug = old - fmt.Println("ok") - return otto.UndefinedValue() + r, _ := call.Otto.ToValue(map[string]interface{}{"success": true, "time": time.Since(tstart).Seconds()}) + return r +} + +func (js *jsre) insertBlockRlp(call otto.FunctionCall) otto.Value { + tstart := time.Now() + + var block types.Block + if call.Argument(0).IsString() { + blockRlp, _ := call.Argument(0).ToString() + err := rlp.DecodeBytes(common.Hex2Bytes(blockRlp), &block) + if err != nil { + fmt.Println(err) + return otto.UndefinedValue() + } + } + + old := vm.Debug + vm.Debug = true + _, err := js.ethereum.BlockProcessor().RetryProcess(&block) + if err != nil { + fmt.Println(err) + r, _ := call.Otto.ToValue(map[string]interface{}{"success": false, "time": time.Since(tstart).Seconds()}) + return r + } + vm.Debug = old + + r, _ := call.Otto.ToValue(map[string]interface{}{"success": true, "time": time.Since(tstart).Seconds()}) + return r } func (js *jsre) setHead(call otto.FunctionCall) otto.Value { diff --git a/core/block_processor.go b/core/block_processor.go index a3ad383d0..9a013b280 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -178,7 +178,6 @@ func (sm *BlockProcessor) Process(block *types.Block) (logs state.Logs, err erro return nil, ParentError(header.ParentHash) } parent := sm.bc.GetBlock(header.ParentHash) - return sm.processWithParent(block, parent) } @@ -254,14 +253,9 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st return nil, err } - // Calculate the td for this block - //td = CalculateTD(block, parent) // Sync the current block's state to the database state.Sync() - // Remove transactions from the pool - sm.txpool.RemoveTransactions(block.Transactions()) - // This puts transactions in a extra db for rpc for i, tx := range block.Transactions() { putTx(sm.extraDb, tx, block, uint64(i)) diff --git a/core/chain_manager.go b/core/chain_manager.go index 927055103..d58c0d504 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -560,6 +560,7 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { defer close(nonceQuit) for i, block := range chain { + bstart := time.Now() // Wait for block i's nonce to be verified before processing // its state transition. for nonceChecked[i] { @@ -642,11 +643,11 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { queueEvent.canonicalCount++ if glog.V(logger.Debug) { - glog.Infof("[%v] inserted block #%d (%d TXs %d UNCs) (%x...)\n", time.Now().UnixNano(), block.Number(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4]) + glog.Infof("[%v] inserted block #%d (%d TXs %d UNCs) (%x...). Took %v\n", time.Now().UnixNano(), block.Number(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4], time.Since(bstart)) } } else { if glog.V(logger.Detail) { - glog.Infof("inserted forked block #%d (TD=%v) (%d TXs %d UNCs) (%x...)\n", block.Number(), block.Difficulty(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4]) + glog.Infof("inserted forked block #%d (TD=%v) (%d TXs %d UNCs) (%x...). Took %v\n", block.Number(), block.Difficulty(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4], time.Since(bstart)) } queue[i] = ChainSideEvent{block, logs}