eth: accept transactions when starting CPU mining (#13882)
This commit is contained in:
		
				
					committed by
					
						 Felix Lange
						Felix Lange
					
				
			
			
				
	
			
			
			
						parent
						
							f32b72ca5d
						
					
				
				
					commit
					bfe5eb7f8c
				
			| @@ -301,7 +301,7 @@ func startNode(ctx *cli.Context, stack *node.Node) { | ||||
| 				th.SetThreads(threads) | ||||
| 			} | ||||
| 		} | ||||
| 		if err := ethereum.StartMining(); err != nil { | ||||
| 		if err := ethereum.StartMining(true); err != nil { | ||||
| 			utils.Fatalf("Failed to start mining: %v", err) | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
| @@ -103,7 +103,7 @@ func (api *PublicMinerAPI) SubmitWork(nonce types.BlockNonce, solution, digest c | ||||
| // result[2], 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty | ||||
| func (api *PublicMinerAPI) GetWork() ([3]string, error) { | ||||
| 	if !api.e.IsMining() { | ||||
| 		if err := api.e.StartMining(); err != nil { | ||||
| 		if err := api.e.StartMining(false); err != nil { | ||||
| 			return [3]string{}, err | ||||
| 		} | ||||
| 	} | ||||
| @@ -153,7 +153,7 @@ func (api *PrivateMinerAPI) Start(threads *int) error { | ||||
| 	} | ||||
| 	// Start the miner and return | ||||
| 	if !api.e.IsMining() { | ||||
| 		return api.e.StartMining() | ||||
| 		return api.e.StartMining(true) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
| @@ -22,6 +22,7 @@ import ( | ||||
| 	"math/big" | ||||
| 	"regexp" | ||||
| 	"sync" | ||||
| 	"sync/atomic" | ||||
|  | ||||
| 	"github.com/ethereum/go-ethereum/accounts" | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| @@ -326,12 +327,19 @@ func (self *Ethereum) SetEtherbase(etherbase common.Address) { | ||||
| 	self.miner.SetEtherbase(etherbase) | ||||
| } | ||||
|  | ||||
| func (s *Ethereum) StartMining() error { | ||||
| func (s *Ethereum) StartMining(local bool) error { | ||||
| 	eb, err := s.Etherbase() | ||||
| 	if err != nil { | ||||
| 		log.Error("Cannot start mining without etherbase", "err", err) | ||||
| 		return fmt.Errorf("etherbase missing: %v", err) | ||||
| 	} | ||||
| 	if local { | ||||
| 		// If local (CPU) mining is started, we can disable the transaction rejection | ||||
| 		// mechanism introduced to speed sync times. CPU mining on mainnet is ludicrous | ||||
| 		// so noone will ever hit this path, whereas marking sync done on CPU mining | ||||
| 		// will ensure that private networks work in single miner mode too. | ||||
| 		atomic.StoreUint32(&s.protocolManager.acceptTxs, 1) | ||||
| 	} | ||||
| 	go s.miner.Start(eb) | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
| @@ -62,8 +62,8 @@ func errResp(code errCode, format string, v ...interface{}) error { | ||||
| type ProtocolManager struct { | ||||
| 	networkId int | ||||
|  | ||||
| 	fastSync uint32 // Flag whether fast sync is enabled (gets disabled if we already have blocks) | ||||
| 	synced   uint32 // Flag whether we're considered synchronised (enables transaction processing) | ||||
| 	fastSync  uint32 // Flag whether fast sync is enabled (gets disabled if we already have blocks) | ||||
| 	acceptTxs uint32 // Flag whether we're considered synchronised (enables transaction processing) | ||||
|  | ||||
| 	txpool      txPool | ||||
| 	blockchain  *core.BlockChain | ||||
| @@ -171,7 +171,7 @@ func NewProtocolManager(config *params.ChainConfig, fastSync bool, networkId int | ||||
| 		return blockchain.CurrentBlock().NumberU64() | ||||
| 	} | ||||
| 	inserter := func(blocks types.Blocks) (int, error) { | ||||
| 		atomic.StoreUint32(&manager.synced, 1) // Mark initial sync done on any fetcher import | ||||
| 		atomic.StoreUint32(&manager.acceptTxs, 1) // Mark initial sync done on any fetcher import | ||||
| 		return manager.blockchain.InsertChain(blocks) | ||||
| 	} | ||||
| 	manager.fetcher = fetcher.New(blockchain.GetBlockByHash, validator, manager.BroadcastBlock, heighter, inserter, manager.removePeer) | ||||
| @@ -643,7 +643,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { | ||||
|  | ||||
| 	case msg.Code == TxMsg: | ||||
| 		// Transactions arrived, make sure we have a valid and fresh chain to handle them | ||||
| 		if atomic.LoadUint32(&pm.synced) == 0 { | ||||
| 		if atomic.LoadUint32(&pm.acceptTxs) == 0 { | ||||
| 			break | ||||
| 		} | ||||
| 		// Transactions can be processed, parse all of them and deliver to the pool | ||||
|   | ||||
| @@ -94,7 +94,7 @@ func TestRecvTransactions63(t *testing.T) { testRecvTransactions(t, 63) } | ||||
| func testRecvTransactions(t *testing.T, protocol int) { | ||||
| 	txAdded := make(chan []*types.Transaction) | ||||
| 	pm := newTestProtocolManagerMust(t, false, 0, nil, txAdded) | ||||
| 	pm.synced = 1 // mark synced to accept transactions | ||||
| 	pm.acceptTxs = 1 // mark synced to accept transactions | ||||
| 	p, _ := newTestPeer("peer", protocol, pm, true) | ||||
| 	defer pm.Stop() | ||||
| 	defer p.close() | ||||
|   | ||||
| @@ -188,7 +188,7 @@ func (pm *ProtocolManager) synchronise(peer *peer) { | ||||
| 	if err := pm.downloader.Synchronise(peer.id, pHead, pTd, mode); err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	atomic.StoreUint32(&pm.synced, 1) // Mark initial sync done | ||||
| 	atomic.StoreUint32(&pm.acceptTxs, 1) // Mark initial sync done | ||||
| 	if head := pm.blockchain.CurrentBlock(); head.NumberU64() > 0 { | ||||
| 		// We've completed a sync cycle, notify all peers of new state. This path is | ||||
| 		// essential in star-topology networks where a gateway node needs to notify | ||||
|   | ||||
		Reference in New Issue
	
	Block a user