Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions common/types.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package common

import (
"fmt"
"math/big"
"math/rand"
"reflect"
Expand Down Expand Up @@ -95,3 +96,13 @@ func (a *Address) Set(other Address) {
a[i] = v
}
}

// PP Pretty Prints a byte slice in the following format:
// hex(value[:4])...(hex[len(value)-4:])
func PP(value []byte) string {
if len(value) <= 8 {
return Bytes2Hex(value)
}

return fmt.Sprintf("%x...%x", value[:4], value[len(value)-4])
}
12 changes: 2 additions & 10 deletions core/chain_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"fmt"
"io"
"math/big"
"os"
"runtime"
"sync"
"sync/atomic"
Expand Down Expand Up @@ -235,15 +234,8 @@ func (bc *ChainManager) setLastState() {
if block != nil {
bc.currentBlock = block
bc.lastBlockHash = block.Hash()
} else { // TODO CLEAN THIS UP TMP CODE
block = bc.GetBlockByNumber(400000)
if block == nil {
fmt.Println("Fatal. LastBlock not found. Report this issue")
os.Exit(1)
}
bc.currentBlock = block
bc.lastBlockHash = block.Hash()
bc.insert(block)
} else {
glog.Fatalf("Fatal. LastBlock not found. Please run removedb and resync")
}
} else {
bc.Reset()
Expand Down
34 changes: 30 additions & 4 deletions core/transaction_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ var (
// Transaction Pool Errors
ErrInvalidSender = errors.New("Invalid sender")
ErrNonce = errors.New("Nonce too low")
ErrCheap = errors.New("Gas price too low for acceptance")
ErrBalance = errors.New("Insufficient balance")
ErrNonExistentAccount = errors.New("Account does not exist or account balance too low")
ErrInsufficientFunds = errors.New("Insufficient funds for gas * price + value")
Expand All @@ -27,6 +28,10 @@ var (
ErrNegativeValue = errors.New("Negative value")
)

const (
maxQueued = 200 // max limit of queued txs per address
)

type stateFn func() *state.StateDB

// TxPool contains all currently known transactions. Transactions
Expand All @@ -41,6 +46,7 @@ type TxPool struct {
currentState stateFn // The state function which will allow us to do some pre checkes
pendingState *state.ManagedState
gasLimit func() *big.Int // The current gas limit function callback
minGasPrice *big.Int
eventMux *event.TypeMux
events event.Subscription

Expand All @@ -57,8 +63,9 @@ func NewTxPool(eventMux *event.TypeMux, currentStateFn stateFn, gasLimitFn func(
eventMux: eventMux,
currentState: currentStateFn,
gasLimit: gasLimitFn,
minGasPrice: new(big.Int),
pendingState: state.ManageState(currentStateFn()),
events: eventMux.Subscribe(ChainEvent{}),
events: eventMux.Subscribe(ChainEvent{}, GasPriceChanged{}),
}
go pool.eventLoop()

Expand All @@ -69,10 +76,15 @@ func (pool *TxPool) eventLoop() {
// Track chain events. When a chain events occurs (new chain canon block)
// we need to know the new state. The new state will help us determine
// the nonces in the managed state
for _ = range pool.events.Chan() {
for ev := range pool.events.Chan() {
pool.mu.Lock()

pool.resetState()
switch ev := ev.(type) {
case ChainEvent:
pool.resetState()
case GasPriceChanged:
pool.minGasPrice = ev.Price
}

pool.mu.Unlock()
}
Expand Down Expand Up @@ -124,6 +136,11 @@ func (pool *TxPool) validateTx(tx *types.Transaction) error {
err error
)

// Drop transactions under our own minimal accepted gas price
if pool.minGasPrice.Cmp(tx.GasPrice()) > 0 {
return ErrCheap
}

// Validate the transaction sender and it's sig. Throw
// if the from fields is invalid.
if from, err = tx.From(); err != nil {
Expand Down Expand Up @@ -335,7 +352,16 @@ func (pool *TxPool) checkQueue() {
// Find the next consecutive nonce range starting at the
// current account nonce.
sort.Sort(addq)
for _, e := range addq {
for i, e := range addq {
// start deleting the transactions from the queue if they exceed the limit
if i > maxQueued {
if glog.V(logger.Debug) {
glog.Infof("Queued tx limit exceeded for %s. Tx %s removed\n", common.PP(address[:]), common.PP(e.hash[:]))
}
delete(pool.queue[address], e.hash)
continue
}

if e.AccountNonce > guessedNonce {
break
}
Expand Down
1 change: 1 addition & 0 deletions eth/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,7 @@ func New(config *Config) (*Ethereum, error) {
}
eth.downloader = downloader.New(eth.EventMux(), eth.chainManager.HasBlock, eth.chainManager.GetBlock)
eth.txPool = core.NewTxPool(eth.EventMux(), eth.chainManager.State, eth.chainManager.GasLimit)

eth.blockProcessor = core.NewBlockProcessor(stateDb, extraDb, eth.pow, eth.chainManager, eth.EventMux())
eth.chainManager.SetProcessor(eth.blockProcessor)
eth.miner = miner.New(eth, eth.EventMux(), eth.pow)
Expand Down
2 changes: 1 addition & 1 deletion miner/miner.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ func (m *Miner) SetGasPrice(price *big.Int) {
return
}

m.worker.gasPrice = price
m.worker.setGasPrice(price)
}

func (self *Miner) Start(coinbase common.Address, threads int) {
Expand Down
7 changes: 5 additions & 2 deletions miner/worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"sort"
"sync"
"sync/atomic"
"time"

"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/common"
Expand Down Expand Up @@ -374,6 +375,8 @@ func (self *worker) commitNewWork() {
self.currentMu.Lock()
defer self.currentMu.Unlock()

tstart := time.Now()

previous := self.current
self.makeCurrent()
current := self.current
Expand Down Expand Up @@ -409,7 +412,7 @@ func (self *worker) commitNewWork() {

// We only care about logging if we're actually mining
if atomic.LoadInt32(&self.mining) == 1 {
glog.V(logger.Info).Infof("commit new work on block %v with %d txs & %d uncles\n", current.block.Number(), current.tcount, len(uncles))
glog.V(logger.Info).Infof("commit new work on block %v with %d txs & %d uncles. Took %v\n", current.block.Number(), current.tcount, len(uncles), time.Since(tstart))
self.logLocalMinedBlocks(previous)
}

Expand Down Expand Up @@ -437,7 +440,6 @@ func (self *worker) commitUncle(uncle *types.Header) error {
// Error not unique
return core.UncleError("Uncle not unique")
}
self.current.uncles.Add(uncle.Hash())

if !self.current.ancestors.Has(uncle.ParentHash) {
return core.UncleError(fmt.Sprintf("Uncle's parent unknown (%x)", uncle.ParentHash[0:4]))
Expand All @@ -446,6 +448,7 @@ func (self *worker) commitUncle(uncle *types.Header) error {
if self.current.family.Has(uncle.Hash()) {
return core.UncleError(fmt.Sprintf("Uncle already in family (%x)", uncle.Hash()))
}
self.current.uncles.Add(uncle.Hash())

return nil
}
Expand Down
9 changes: 8 additions & 1 deletion rpc/api/eth.go
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,14 @@ func (self *ethApi) SendTransaction(req *shared.Request) (interface{}, error) {
nonce = args.Nonce.String()
}

v, err := self.xeth.Transact(args.From, args.To, nonce, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data)
var gas, price string
if args.Gas != nil {
gas = args.Gas.String()
}
if args.GasPrice != nil {
price = args.GasPrice.String()
}
v, err := self.xeth.Transact(args.From, args.To, nonce, args.Value.String(), gas, price, args.Data)
if err != nil {
return nil, err
}
Expand Down
8 changes: 2 additions & 6 deletions rpc/api/eth_args.go
Original file line number Diff line number Diff line change
Expand Up @@ -333,19 +333,15 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) {
args.Value = num

num = nil
if ext.Gas == nil {
num = big.NewInt(0)
} else {
if ext.Gas != nil {
if num, err = numString(ext.Gas); err != nil {
return err
}
}
args.Gas = num

num = nil
if ext.GasPrice == nil {
num = big.NewInt(0)
} else {
if ext.GasPrice != nil {
if num, err = numString(ext.GasPrice); err != nil {
return err
}
Expand Down