diff --git a/cmd/geth/admin.go b/cmd/geth/admin.go index 17d711297..b0cb7507a 100644 --- a/cmd/geth/admin.go +++ b/cmd/geth/admin.go @@ -275,10 +275,19 @@ func (js *jsre) verbosity(call otto.FunctionCall) otto.Value { } func (js *jsre) startMining(call otto.FunctionCall) otto.Value { - threads, err := call.Argument(0).ToInteger() - if err != nil { - fmt.Println(err) - return otto.FalseValue() + var ( + threads int64 + err error + ) + + if len(call.ArgumentList) > 0 { + threads, err = call.Argument(0).ToInteger() + if err != nil { + fmt.Println(err) + return otto.FalseValue() + } + } else { + threads = 4 } err = js.ethereum.StartMining(int(threads)) diff --git a/miner/worker.go b/miner/worker.go index d801a9839..8698bb90d 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -21,21 +21,41 @@ import ( var jsonlogger = logger.NewJsonLogger() +// Work holds the current work +type Work struct { + Number uint64 + Nonce uint64 + MixDigest []byte + SeedHash []byte +} + +// Agent can register themself with the worker +type Agent interface { + Work() chan<- *types.Block + SetReturnCh(chan<- *types.Block) + Stop() + Start() + GetHashRate() int64 +} + +// environment is the workers current environment and holds +// all of the current state information type environment struct { - totalUsedGas *big.Int - state *state.StateDB - coinbase *state.StateObject - block *types.Block - family *set.Set - uncles *set.Set - remove *set.Set - tcount int + totalUsedGas *big.Int // total gas usage in the cycle + state *state.StateDB // apply state changes here + coinbase *state.StateObject // the miner's account + block *types.Block // the new block + family *set.Set // family set (used for checking uncles) + uncles *set.Set // uncle set + remove *set.Set // tx which will be removed + tcount int // tx count in cycle ignoredTransactors *set.Set lowGasTransactors *set.Set ownedAccounts *set.Set lowGasTxs types.Transactions } +// env returns a new environment for the current cycle func env(block *types.Block, eth core.Backend) *environment { state := state.New(block.Root(), eth.StateDb()) env := &environment{ @@ -50,21 +70,7 @@ func env(block *types.Block, eth core.Backend) *environment { return env } -type Work struct { - Number uint64 - Nonce uint64 - MixDigest []byte - SeedHash []byte -} - -type Agent interface { - Work() chan<- *types.Block - SetReturnCh(chan<- *types.Block) - Stop() - Start() - GetHashRate() int64 -} - +// worker is the main object which takes care of applying messages to the new state type worker struct { mu sync.Mutex @@ -375,8 +381,8 @@ func (self *worker) commitTransactions(transactions types.Transactions) { // We can skip err. It has already been validated in the tx pool from, _ := tx.From() - // check if it falls within margin - if tx.GasPrice().Cmp(self.gasPrice) < 0 { + // Check if it falls within margin. Txs from owned accounts are always processed. + if tx.GasPrice().Cmp(self.gasPrice) < 0 && !current.ownedAccounts.Has(from) { // ignore the transaction and transactor. We ignore the transactor // because nonce will fail after ignoring this transaction so there's // no point