| 
									
										
										
										
											2014-11-10 01:17:31 +01:00
										 |  |  | /* | 
					
						
							|  |  |  | 	This file is part of go-ethereum | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	go-ethereum is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | 	it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | 	the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | 	(at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	go-ethereum is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | 	but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | 	GNU General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	You should have received a copy of the GNU Lesser General Public License | 
					
						
							|  |  |  | 	along with go-ethereum.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @authors | 
					
						
							|  |  |  |  * 	Jeffrey Wilcke <i@jev.io> | 
					
						
							|  |  |  |  * @date 2014 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | package miner | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	"math/big" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 	"sort" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-14 18:10:48 +00:00
										 |  |  | 	"github.com/ethereum/go-ethereum/eth" | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethutil" | 
					
						
							| 
									
										
										
										
											2014-12-10 16:45:16 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/pow" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/pow/ezp" | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/state" | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-04 10:28:02 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/core/types" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/event" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | type LocalTx struct { | 
					
						
							|  |  |  | 	To       []byte `json:"to"` | 
					
						
							|  |  |  | 	Data     []byte `json:"data"` | 
					
						
							|  |  |  | 	Gas      string `json:"gas"` | 
					
						
							|  |  |  | 	GasPrice string `json:"gasPrice"` | 
					
						
							|  |  |  | 	Value    string `json:"value"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-18 16:58:22 +01:00
										 |  |  | func (self *LocalTx) Sign(key []byte) *types.Transaction { | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | var minerlogger = logger.NewLogger("MINER") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Miner struct { | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	eth    *eth.Ethereum | 
					
						
							|  |  |  | 	events event.Subscription | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-23 13:48:44 +01:00
										 |  |  | 	uncles    []*types.Header | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	localTxs  map[int]*LocalTx | 
					
						
							|  |  |  | 	localTxId int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-10 16:45:16 +01:00
										 |  |  | 	pow       pow.PoW | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	quitCh    chan struct{} | 
					
						
							|  |  |  | 	powQuitCh chan struct{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Coinbase []byte | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	mining bool | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	MinAcceptedGasPrice *big.Int | 
					
						
							| 
									
										
										
										
											2015-01-06 00:19:07 +01:00
										 |  |  | 	Extra               string | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func New(coinbase []byte, eth *eth.Ethereum) *Miner { | 
					
						
							|  |  |  | 	return &Miner{ | 
					
						
							|  |  |  | 		eth:                 eth, | 
					
						
							|  |  |  | 		powQuitCh:           make(chan struct{}), | 
					
						
							| 
									
										
										
										
											2014-12-10 16:45:16 +01:00
										 |  |  | 		pow:                 ezp.New(), | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 		mining:              false, | 
					
						
							|  |  |  | 		localTxs:            make(map[int]*LocalTx), | 
					
						
							|  |  |  | 		MinAcceptedGasPrice: big.NewInt(10000000000000), | 
					
						
							|  |  |  | 		Coinbase:            coinbase, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-10 16:45:16 +01:00
										 |  |  | func (self *Miner) GetPow() pow.PoW { | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 	return self.pow | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | func (self *Miner) AddLocalTx(tx *LocalTx) int { | 
					
						
							|  |  |  | 	minerlogger.Infof("Added local tx (%x %v / %v)\n", tx.To[0:4], tx.GasPrice, tx.Value) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	self.localTxId++ | 
					
						
							|  |  |  | 	self.localTxs[self.localTxId] = tx | 
					
						
							|  |  |  | 	self.eth.EventMux().Post(tx) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return self.localTxId | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *Miner) RemoveLocalTx(id int) { | 
					
						
							|  |  |  | 	if tx := self.localTxs[id]; tx != nil { | 
					
						
							|  |  |  | 		minerlogger.Infof("Removed local tx (%x %v / %v)\n", tx.To[0:4], tx.GasPrice, tx.Value) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	self.eth.EventMux().Post(&LocalTx{}) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	delete(self.localTxs, id) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | func (self *Miner) Start() { | 
					
						
							|  |  |  | 	if self.mining { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	minerlogger.Infoln("Starting mining operations") | 
					
						
							|  |  |  | 	self.mining = true | 
					
						
							|  |  |  | 	self.quitCh = make(chan struct{}) | 
					
						
							|  |  |  | 	self.powQuitCh = make(chan struct{}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mux := self.eth.EventMux() | 
					
						
							| 
									
										
										
										
											2014-12-04 10:28:02 +01:00
										 |  |  | 	self.events = mux.Subscribe(core.NewBlockEvent{}, core.TxPreEvent{}, &LocalTx{}) | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	go self.update() | 
					
						
							|  |  |  | 	go self.mine() | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | func (self *Miner) Stop() { | 
					
						
							|  |  |  | 	if !self.mining { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	self.mining = false | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	minerlogger.Infoln("Stopping mining operations") | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	self.events.Unsubscribe() | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	close(self.quitCh) | 
					
						
							|  |  |  | 	close(self.powQuitCh) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | func (self *Miner) Mining() bool { | 
					
						
							|  |  |  | 	return self.mining | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | func (self *Miner) update() { | 
					
						
							|  |  |  | out: | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 	for { | 
					
						
							|  |  |  | 		select { | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 		case event := <-self.events.Chan(): | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 			switch event := event.(type) { | 
					
						
							| 
									
										
										
										
											2014-12-04 10:28:02 +01:00
										 |  |  | 			case core.NewBlockEvent: | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 				block := event.Block | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 				if self.eth.ChainManager().HasBlock(block.Hash()) { | 
					
						
							|  |  |  | 					self.reset() | 
					
						
							|  |  |  | 					self.eth.TxPool().RemoveSet(block.Transactions()) | 
					
						
							|  |  |  | 					go self.mine() | 
					
						
							|  |  |  | 				} else if true { | 
					
						
							|  |  |  | 					// do uncle stuff | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-12-04 10:28:02 +01:00
										 |  |  | 			case core.TxPreEvent, *LocalTx: | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 				self.reset() | 
					
						
							|  |  |  | 				go self.mine() | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 		case <-self.quitCh: | 
					
						
							|  |  |  | 			break out | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | func (self *Miner) reset() { | 
					
						
							|  |  |  | 	close(self.powQuitCh) | 
					
						
							|  |  |  | 	self.powQuitCh = make(chan struct{}) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | func (self *Miner) mine() { | 
					
						
							|  |  |  | 	var ( | 
					
						
							| 
									
										
										
										
											2015-01-05 00:18:44 +01:00
										 |  |  | 		blockProcessor = self.eth.BlockProcessor() | 
					
						
							|  |  |  | 		chainMan       = self.eth.ChainManager() | 
					
						
							|  |  |  | 		block          = chainMan.NewBlock(self.Coinbase) | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | 		state          = state.New(block.Root(), self.eth.Db()) | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	) | 
					
						
							| 
									
										
										
										
											2015-01-06 00:19:07 +01:00
										 |  |  | 	block.Header().Extra = self.Extra | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Apply uncles | 
					
						
							| 
									
										
										
										
											2015-02-04 18:26:23 -08:00
										 |  |  | 	block.SetUncles(self.uncles) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-23 13:48:44 +01:00
										 |  |  | 	parent := chainMan.GetBlock(block.ParentHash()) | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | 	coinbase := state.GetOrNewStateObject(block.Coinbase()) | 
					
						
							| 
									
										
										
										
											2014-12-23 13:48:44 +01:00
										 |  |  | 	coinbase.SetGasPool(core.CalcGasLimit(parent, block)) | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	transactions := self.finiliseTxs() | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Accumulate all valid transactions and apply them to the new state | 
					
						
							|  |  |  | 	// Error may be ignored. It's not important during mining | 
					
						
							| 
									
										
										
										
											2015-01-05 00:18:44 +01:00
										 |  |  | 	receipts, txs, _, erroneous, err := blockProcessor.ApplyTransactions(coinbase, state, block, transactions, true) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		minerlogger.Debugln(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	self.eth.TxPool().RemoveSet(erroneous) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	block.SetTransactions(txs) | 
					
						
							|  |  |  | 	block.SetReceipts(receipts) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Accumulate the rewards included for this block | 
					
						
							| 
									
										
										
										
											2015-02-03 23:09:39 +01:00
										 |  |  | 	blockProcessor.AccumulateRewards(state, block, parent) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-30 13:18:19 +01:00
										 |  |  | 	state.Update(ethutil.Big0) | 
					
						
							|  |  |  | 	block.SetRoot(state.Root()) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	minerlogger.Infof("Mining on block. Includes %v transactions", len(transactions)) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Find a valid nonce | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	nonce := self.pow.Search(block, self.powQuitCh) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 	if nonce != nil { | 
					
						
							| 
									
										
										
										
											2014-12-23 13:48:44 +01:00
										 |  |  | 		block.Header().Nonce = nonce | 
					
						
							| 
									
										
										
										
											2014-12-02 11:52:56 +01:00
										 |  |  | 		err := chainMan.InsertChain(types.Blocks{block}) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			minerlogger.Infoln(err) | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2014-12-14 18:10:48 +00:00
										 |  |  | 			self.eth.EventMux().Post(core.NewMinedBlockEvent{block}) | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			minerlogger.Infof("🔨  Mined block %x\n", block.Hash()) | 
					
						
							|  |  |  | 			minerlogger.Infoln(block) | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 		go self.mine() | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-18 16:58:22 +01:00
										 |  |  | func (self *Miner) finiliseTxs() types.Transactions { | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	// Sort the transactions by nonce in case of odd network propagation | 
					
						
							| 
									
										
										
										
											2014-12-04 23:54:07 +01:00
										 |  |  | 	actualSize := len(self.localTxs) // See copy below | 
					
						
							|  |  |  | 	txs := make(types.Transactions, actualSize+self.eth.TxPool().Size()) | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-10 19:59:12 +01:00
										 |  |  | 	state := self.eth.ChainManager().TransState() | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	// XXX This has to change. Coinbase is, for new, same as key. | 
					
						
							|  |  |  | 	key := self.eth.KeyManager() | 
					
						
							| 
									
										
										
										
											2014-12-04 23:54:07 +01:00
										 |  |  | 	for i, ltx := range self.localTxs { | 
					
						
							| 
									
										
										
										
											2014-11-18 16:58:22 +01:00
										 |  |  | 		tx := types.NewTransactionMessage(ltx.To, ethutil.Big(ltx.Value), ethutil.Big(ltx.Gas), ethutil.Big(ltx.GasPrice), ltx.Data) | 
					
						
							| 
									
										
										
										
											2014-12-18 15:18:13 +01:00
										 |  |  | 		tx.SetNonce(state.GetNonce(self.Coinbase)) | 
					
						
							|  |  |  | 		state.SetNonce(self.Coinbase, tx.Nonce()+1) | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		tx.Sign(key.PrivateKey()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-04 23:54:07 +01:00
										 |  |  | 		txs[i] = tx | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-04 23:54:07 +01:00
										 |  |  | 	// Faster than append | 
					
						
							| 
									
										
										
										
											2014-12-14 18:10:48 +00:00
										 |  |  | 	for _, tx := range self.eth.TxPool().GetTransactions() { | 
					
						
							| 
									
										
										
										
											2014-12-18 15:18:13 +01:00
										 |  |  | 		if tx.GasPrice().Cmp(self.MinAcceptedGasPrice) >= 0 { | 
					
						
							| 
									
										
										
										
											2014-12-04 23:54:07 +01:00
										 |  |  | 			txs[actualSize] = tx | 
					
						
							|  |  |  | 			actualSize++ | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	newTransactions := make(types.Transactions, actualSize) | 
					
						
							|  |  |  | 	copy(newTransactions, txs[:actualSize]) | 
					
						
							|  |  |  | 	sort.Sort(types.TxByNonce{newTransactions}) | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-04 23:54:07 +01:00
										 |  |  | 	return newTransactions | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | } |