aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey Wilcke <geffobscura@gmail.com>2015-08-04 03:57:09 +0800
committerJeffrey Wilcke <geffobscura@gmail.com>2015-08-05 23:44:19 +0800
commit35f271b264b8e4a0449eff325fb75a78299cf9a6 (patch)
tree750fe404c14b6f5e8ef03a07cf3357787c6c9683
parentf12e0161ca7ed2bc5034a7b4904e1b5032e41fe7 (diff)
downloadgo-tangerine-35f271b264b8e4a0449eff325fb75a78299cf9a6.tar.gz
go-tangerine-35f271b264b8e4a0449eff325fb75a78299cf9a6.tar.zst
go-tangerine-35f271b264b8e4a0449eff325fb75a78299cf9a6.zip
miner, core: sort txs by price, nonce
-rw-r--r--core/types/transaction.go19
-rw-r--r--miner/worker.go35
2 files changed, 53 insertions, 1 deletions
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)