From 35f271b264b8e4a0449eff325fb75a78299cf9a6 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Mon, 3 Aug 2015 21:57:09 +0200 Subject: miner, core: sort txs by price, nonce --- core/types/transaction.go | 19 +++++++++++++++++++ miner/worker.go | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/core/types/transaction.go b/core/types/transaction.go index 85b4c6119..28a7e02b3 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -289,3 +289,22 @@ type TxByNonce struct{ Transactions } func (s TxByNonce) Less(i, j int) bool { return s.Transactions[i].data.AccountNonce < s.Transactions[j].data.AccountNonce } + +type TxByPrice struct{ Transactions } + +func (s TxByPrice) Less(i, j int) bool { + return s.Transactions[i].data.Price.Cmp(s.Transactions[j].data.Price) > 0 +} + +type TxByPriceAndNonce struct{ Transactions } + +func (s TxByPriceAndNonce) Less(i, j int) bool { + // we can ignore the error here. Sorting shouldn't care about validness + ifrom, _ := s.Transactions[i].From() + jfrom, _ := s.Transactions[j].From() + // favour nonce if they are from the same recipient + if ifrom == jfrom { + return s.Transactions[i].data.AccountNonce < s.Transactions[j].data.AccountNonce + } + return s.Transactions[i].data.Price.Cmp(s.Transactions[j].data.Price) > 0 +} diff --git a/miner/worker.go b/miner/worker.go index 269219ba0..535ce5144 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -457,9 +457,42 @@ func (self *worker) commitNewWork() { self.makeCurrent(parent, header) work := self.current - // commit transactions for this run. + /* //approach 1 transactions := self.eth.TxPool().GetTransactions() sort.Sort(types.TxByNonce{transactions}) + */ + + //approach 2 + transactions := self.eth.TxPool().GetTransactions() + sort.Sort(types.TxByPriceAndNonce{transactions}) + + /* // approach 3 + // commit transactions for this run. + txPerOwner := make(map[common.Address]types.Transactions) + // Sort transactions by owner + for _, tx := range self.eth.TxPool().GetTransactions() { + from, _ := tx.From() // we can ignore the sender error + txPerOwner[from] = append(txPerOwner[from], tx) + } + var ( + singleTxOwner types.Transactions + multiTxOwner types.Transactions + ) + // Categorise transactions by + // 1. 1 owner tx per block + // 2. multi txs owner per block + for _, txs := range txPerOwner { + if len(txs) == 1 { + singleTxOwner = append(singleTxOwner, txs[0]) + } else { + multiTxOwner = append(multiTxOwner, txs...) + } + } + sort.Sort(types.TxByPrice{singleTxOwner}) + sort.Sort(types.TxByNonce{multiTxOwner}) + transactions := append(singleTxOwner, multiTxOwner...) + */ + work.coinbase.SetGasLimit(header.GasLimit) work.commitTransactions(transactions, self.gasPrice, self.proc) self.eth.TxPool().RemoveTransactions(work.lowGasTxs) -- cgit v1.2.3