浏览代码

Skip mining on transactions that don't meet the min accepted gas price

obscuren 11 年之前
父节点
当前提交
8dbca75d85
共有 3 个文件被更改,包括 32 次插入26 次删除
  1. 12 16
      core/block_manager.go
  2. 4 4
      core/transaction_pool.go
  3. 16 6
      miner/miner.go

+ 12 - 16
core/block_manager.go

@@ -231,7 +231,7 @@ func (sm *BlockManager) ProcessWithParent(block, parent *types.Block) (td *big.I
 		return
 	}
 
-	_, err = sm.TransitionState(state, parent, block)
+	receipts, err := sm.TransitionState(state, parent, block)
 	if err != nil {
 		return
 	}
@@ -242,26 +242,22 @@ func (sm *BlockManager) ProcessWithParent(block, parent *types.Block) (td *big.I
 		return
 	}
 
-	/*
-		receiptSha := types.DeriveSha(receipts)
-		if bytes.Compare(receiptSha, block.ReceiptSha) != 0 {
-			err = fmt.Errorf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha)
-			return
-		}
-	*/
+	receiptSha := types.DeriveSha(receipts)
+	if bytes.Compare(receiptSha, block.ReceiptSha) != 0 {
+		err = fmt.Errorf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha)
+		return
+	}
 
 	if err = sm.AccumelateRewards(state, block, parent); err != nil {
 		return
 	}
 
-	/*
-		//block.receipts = receipts // although this isn't necessary it be in the future
-		rbloom := types.CreateBloom(receipts)
-		if bytes.Compare(rbloom, block.LogsBloom) != 0 {
-			err = fmt.Errorf("unable to replicate block's bloom=%x", rbloom)
-			return
-		}
-	*/
+	//block.receipts = receipts // although this isn't necessary it be in the future
+	rbloom := types.CreateBloom(receipts)
+	if bytes.Compare(rbloom, block.LogsBloom) != 0 {
+		err = fmt.Errorf("unable to replicate block's bloom=%x", rbloom)
+		return
+	}
 
 	state.Update(ethutil.Big0)
 

+ 4 - 4
core/transaction_pool.go

@@ -115,10 +115,6 @@ func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error {
 		return fmt.Errorf("tx.v != (28 || 27)")
 	}
 
-	if tx.GasPrice.Cmp(MinGasPrice) < 0 {
-		return fmt.Errorf("Gas price to low. Require %v > Got %v", MinGasPrice, tx.GasPrice)
-	}
-
 	// Get the sender
 	sender := pool.Ethereum.BlockManager().CurrentState().GetAccount(tx.Sender())
 
@@ -169,6 +165,10 @@ func (self *TxPool) Add(tx *types.Transaction) error {
 	return nil
 }
 
+func (self *TxPool) Size() int {
+	return self.pool.Len()
+}
+
 func (pool *TxPool) CurrentTransactions() []*types.Transaction {
 	pool.mutex.Lock()
 	defer pool.mutex.Unlock()

+ 16 - 6
miner/miner.go

@@ -228,23 +228,33 @@ func (self *Miner) mine() {
 
 func (self *Miner) finiliseTxs() types.Transactions {
 	// Sort the transactions by nonce in case of odd network propagation
-	var txs types.Transactions
+	actualSize := len(self.localTxs) // See copy below
+	txs := make(types.Transactions, actualSize+self.eth.TxPool().Size())
 
 	state := self.eth.BlockManager().TransState()
 	// XXX This has to change. Coinbase is, for new, same as key.
 	key := self.eth.KeyManager()
-	for _, ltx := range self.localTxs {
+	for i, ltx := range self.localTxs {
 		tx := types.NewTransactionMessage(ltx.To, ethutil.Big(ltx.Value), ethutil.Big(ltx.Gas), ethutil.Big(ltx.GasPrice), ltx.Data)
 		tx.Nonce = state.GetNonce(self.Coinbase)
 		state.SetNonce(self.Coinbase, tx.Nonce+1)
 
 		tx.Sign(key.PrivateKey())
 
-		txs = append(txs, tx)
+		txs[i] = tx
 	}
 
-	txs = append(txs, self.eth.TxPool().CurrentTransactions()...)
-	sort.Sort(types.TxByNonce{txs})
+	// Faster than append
+	for _, tx := range self.eth.TxPool().CurrentTransactions() {
+		if tx.GasPrice.Cmp(self.MinAcceptedGasPrice) >= 0 {
+			txs[actualSize] = tx
+			actualSize++
+		}
+	}
+
+	newTransactions := make(types.Transactions, actualSize)
+	copy(newTransactions, txs[:actualSize])
+	sort.Sort(types.TxByNonce{newTransactions})
 
-	return txs
+	return newTransactions
 }