diff --git a/eth/backend.go b/eth/backend.go index 52ec40f5ae..a5a9a186cf 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -411,6 +411,10 @@ func (s *Ethereum) SetEtherbase(etherbase common.Address) { // is already running, this method adjust the number of threads allowed to use // and updates the minimum price required by the transaction pool. func (s *Ethereum) StartMining(threads int) error { + // Reject mining request if the node is not synced. + if atomic.LoadUint32(&s.protocolManager.synced) == 0 { + return errors.New("node is not synced") + } // Update the thread count within the consensus engine type threaded interface { SetThreads(threads int) @@ -444,10 +448,6 @@ func (s *Ethereum) StartMining(threads int) error { } clique.Authorize(eb, wallet.SignData) } - // If mining is started, we can disable the transaction rejection mechanism - // introduced to speed sync times. - atomic.StoreUint32(&s.protocolManager.acceptTxs, 1) - go s.miner.Start(eb) } return nil @@ -480,7 +480,7 @@ func (s *Ethereum) IsListening() bool { return true } // Always func (s *Ethereum) EthVersion() int { return int(s.protocolManager.SubProtocols[0].Version) } func (s *Ethereum) NetVersion() uint64 { return s.networkID } func (s *Ethereum) Downloader() *downloader.Downloader { return s.protocolManager.downloader } -func (s *Ethereum) Synced() bool { return atomic.LoadUint32(&s.protocolManager.acceptTxs) == 1 } +func (s *Ethereum) Synced() bool { return atomic.LoadUint32(&s.protocolManager.synced) == 1 } func (s *Ethereum) ArchiveMode() bool { return s.config.NoPruning } // Protocols implements node.Service, returning all the currently configured diff --git a/eth/handler.go b/eth/handler.go index 58add2eafc..3aa7e65b68 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -69,8 +69,8 @@ func errResp(code errCode, format string, v ...interface{}) error { type ProtocolManager struct { networkID uint64 - 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) + 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) checkpointNumber uint64 // Block number for the sync progress validator to cross reference checkpointHash common.Hash // Block hash for the sync progress validator to cross reference @@ -207,7 +207,7 @@ func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, ne } n, err := manager.blockchain.InsertChain(blocks) if err == nil { - atomic.StoreUint32(&manager.acceptTxs, 1) // Mark initial sync done on any fetcher import + atomic.StoreUint32(&manager.synced, 1) // Mark initial sync done on any fetcher import } return n, err } @@ -706,7 +706,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.acceptTxs) == 0 { + if atomic.LoadUint32(&pm.synced) == 0 { break } // Transactions can be processed, parse all of them and deliver to the pool diff --git a/eth/protocol_test.go b/eth/protocol_test.go index e817d673a6..4abf905520 100644 --- a/eth/protocol_test.go +++ b/eth/protocol_test.go @@ -99,7 +99,7 @@ func TestRecvTransactions63(t *testing.T) { testRecvTransactions(t, 63) } func testRecvTransactions(t *testing.T, protocol int) { txAdded := make(chan []*types.Transaction) pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, txAdded) - pm.acceptTxs = 1 // mark synced to accept transactions + pm.synced = 1 // mark synced to accept transactions p, _ := newTestPeer("peer", protocol, pm, true) defer pm.Stop() defer p.close() diff --git a/eth/sync.go b/eth/sync.go index e303ef8d4e..897bc223dd 100644 --- a/eth/sync.go +++ b/eth/sync.go @@ -209,7 +209,7 @@ func (pm *ProtocolManager) synchronise(peer *peer) { // Checkpoint passed, sanity check the timestamp to have a fallback mechanism // for non-checkpointed (number = 0) private networks. if head.Time() >= uint64(time.Now().AddDate(0, -1, 0).Unix()) { - atomic.StoreUint32(&pm.acceptTxs, 1) + atomic.StoreUint32(&pm.synced, 1) } } if head.NumberU64() > 0 {