Merge pull request #19500 from karalabe/cht-txpool-open-limit
eth: enforce chain above CHT before accepting txs into the pool
This commit is contained in:
		@@ -181,13 +181,30 @@ func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, ne
 | 
				
			|||||||
		return blockchain.CurrentBlock().NumberU64()
 | 
							return blockchain.CurrentBlock().NumberU64()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	inserter := func(blocks types.Blocks) (int, error) {
 | 
						inserter := func(blocks types.Blocks) (int, error) {
 | 
				
			||||||
		// If fast sync is running, deny importing weird blocks
 | 
							// If sync hasn't reached the checkpoint yet, deny importing weird blocks.
 | 
				
			||||||
		if atomic.LoadUint32(&manager.fastSync) == 1 {
 | 
							//
 | 
				
			||||||
			log.Warn("Discarded bad propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash())
 | 
							// Ideally we would also compare the head block's timestamp and similarly reject
 | 
				
			||||||
 | 
							// the propagated block if the head is too old. Unfortunately there is a corner
 | 
				
			||||||
 | 
							// case when starting new networks, where the genesis might be ancient (0 unix)
 | 
				
			||||||
 | 
							// which would prevent full nodes from accepting it.
 | 
				
			||||||
 | 
							if manager.blockchain.CurrentBlock().NumberU64() < manager.checkpointNumber {
 | 
				
			||||||
 | 
								log.Warn("Unsynced yet, discarded propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash())
 | 
				
			||||||
			return 0, nil
 | 
								return 0, nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		atomic.StoreUint32(&manager.acceptTxs, 1) // Mark initial sync done on any fetcher import
 | 
							// If fast sync is running, deny importing weird blocks. This is a problematic
 | 
				
			||||||
		return manager.blockchain.InsertChain(blocks)
 | 
							// clause when starting up a new network, because fast-syncing miners might not
 | 
				
			||||||
 | 
							// accept each others' blocks until a restart. Unfortunately we haven't figured
 | 
				
			||||||
 | 
							// out a way yet where nodes can decide unilaterally whether the network is new
 | 
				
			||||||
 | 
							// or not. This should be fixed if we figure out a solution.
 | 
				
			||||||
 | 
							if atomic.LoadUint32(&manager.fastSync) == 1 {
 | 
				
			||||||
 | 
								log.Warn("Fast syncing, discarded propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash())
 | 
				
			||||||
 | 
								return 0, nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							n, err := manager.blockchain.InsertChain(blocks)
 | 
				
			||||||
 | 
							if err == nil {
 | 
				
			||||||
 | 
								atomic.StoreUint32(&manager.acceptTxs, 1) // Mark initial sync done on any fetcher import
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return n, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	manager.fetcher = fetcher.New(blockchain.GetBlockByHash, validator, manager.BroadcastBlock, heighter, inserter, manager.removePeer)
 | 
						manager.fetcher = fetcher.New(blockchain.GetBlockByHash, validator, manager.BroadcastBlock, heighter, inserter, manager.removePeer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								eth/sync.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								eth/sync.go
									
									
									
									
									
								
							@@ -202,8 +202,17 @@ func (pm *ProtocolManager) synchronise(peer *peer) {
 | 
				
			|||||||
		log.Info("Fast sync complete, auto disabling")
 | 
							log.Info("Fast sync complete, auto disabling")
 | 
				
			||||||
		atomic.StoreUint32(&pm.fastSync, 0)
 | 
							atomic.StoreUint32(&pm.fastSync, 0)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	atomic.StoreUint32(&pm.acceptTxs, 1) // Mark initial sync done
 | 
						// If we've successfully finished a sync cycle and passed any required checkpoint,
 | 
				
			||||||
	if head := pm.blockchain.CurrentBlock(); head.NumberU64() > 0 {
 | 
						// enable accepting transactions from the network.
 | 
				
			||||||
 | 
						head := pm.blockchain.CurrentBlock()
 | 
				
			||||||
 | 
						if head.NumberU64() >= pm.checkpointNumber {
 | 
				
			||||||
 | 
							// 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)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if head.NumberU64() > 0 {
 | 
				
			||||||
		// We've completed a sync cycle, notify all peers of new state. This path is
 | 
							// 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
 | 
							// essential in star-topology networks where a gateway node needs to notify
 | 
				
			||||||
		// all its out-of-date peers of the availability of a new block. This failure
 | 
							// all its out-of-date peers of the availability of a new block. This failure
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user