-
Notifications
You must be signed in to change notification settings - Fork 20.5k
Closed
Labels
Description
go-ethereum/eth/handler_eth.go
Lines 84 to 138 in d213cb0
// handleBlockAnnounces is invoked from a peer's message handler when it transmits a | |
// batch of block announcements for the local node to process. | |
func (h *ethHandler) handleBlockAnnounces(peer *eth.Peer, hashes []common.Hash, numbers []uint64) error { | |
// Drop all incoming block announces from the p2p network if | |
// the chain already entered the pos stage and disconnect the | |
// remote peer. | |
if h.merger.PoSFinalized() { | |
// TODO (MariusVanDerWijden) drop non-updated peers after the merge | |
return nil | |
// return errors.New("unexpected block announces") | |
} | |
// Schedule all the unknown hashes for retrieval | |
var ( | |
unknownHashes = make([]common.Hash, 0, len(hashes)) | |
unknownNumbers = make([]uint64, 0, len(numbers)) | |
) | |
for i := 0; i < len(hashes); i++ { | |
if !h.chain.HasBlock(hashes[i], numbers[i]) { | |
unknownHashes = append(unknownHashes, hashes[i]) | |
unknownNumbers = append(unknownNumbers, numbers[i]) | |
} | |
} | |
for i := 0; i < len(unknownHashes); i++ { | |
h.blockFetcher.Notify(peer.ID(), unknownHashes[i], unknownNumbers[i], time.Now(), peer.RequestOneHeader, peer.RequestBodies) | |
} | |
return nil | |
} | |
// handleBlockBroadcast is invoked from a peer's message handler when it transmits a | |
// block broadcast for the local node to process. | |
func (h *ethHandler) handleBlockBroadcast(peer *eth.Peer, block *types.Block, td *big.Int) error { | |
// Drop all incoming block announces from the p2p network if | |
// the chain already entered the pos stage and disconnect the | |
// remote peer. | |
if h.merger.PoSFinalized() { | |
// TODO (MariusVanDerWijden) drop non-updated peers after the merge | |
return nil | |
// return errors.New("unexpected block announces") | |
} | |
// Schedule the block for import | |
h.blockFetcher.Enqueue(peer.ID(), block) | |
// Assuming the block is importable by the peer, but possibly not yet done so, | |
// calculate the head hash and TD that the peer truly must have. | |
var ( | |
trueHead = block.ParentHash() | |
trueTD = new(big.Int).Sub(td, block.Difficulty()) | |
) | |
// Update the peer's total difficulty if better than the previous | |
if _, td := peer.Head(); trueTD.Cmp(td) > 0 { | |
peer.SetHead(trueHead, trueTD) | |
h.chainSync.handlePeerEvent(peer) | |
} | |
return nil | |
} |
Just reminder.