@ -19,6 +19,7 @@ package blsync
import (
import (
"github.com/ethereum/go-ethereum/beacon/light/request"
"github.com/ethereum/go-ethereum/beacon/light/request"
"github.com/ethereum/go-ethereum/beacon/light/sync"
"github.com/ethereum/go-ethereum/beacon/light/sync"
"github.com/ethereum/go-ethereum/beacon/params"
"github.com/ethereum/go-ethereum/beacon/types"
"github.com/ethereum/go-ethereum/beacon/types"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/lru"
"github.com/ethereum/go-ethereum/common/lru"
@ -117,15 +118,31 @@ func (s *beaconBlockSync) updateEventFeed() {
if ! ok {
if ! ok {
return
return
}
}
finality , ok := s . headTracker . ValidatedFinality ( ) //TODO fetch directly if subscription does not deliver
if ! ok || head . Header . Epoch ( ) != finality . Attested . Header . Epoch ( ) {
return
}
validatedHead := head . Header . Hash ( )
validatedHead := head . Header . Hash ( )
headBlock , ok := s . recentBlocks . Get ( validatedHead )
headBlock , ok := s . recentBlocks . Get ( validatedHead )
if ! ok {
if ! ok {
return
return
}
}
var finalizedHash common . Hash
if finality , ok := s . headTracker . ValidatedFinality ( ) ; ok {
he := head . Header . Epoch ( )
fe := finality . Attested . Header . Epoch ( )
switch {
case he == fe :
finalizedHash = finality . Finalized . PayloadHeader . BlockHash ( )
case he < fe :
return
case he == fe + 1 :
parent , ok := s . recentBlocks . Get ( head . Header . ParentRoot )
if ! ok || parent . Slot ( ) / params . EpochLength == fe {
return // head is at first slot of next epoch, wait for finality update
//TODO: try to fetch finality update directly if subscription does not deliver
}
}
}
headInfo := blockHeadInfo ( headBlock )
headInfo := blockHeadInfo ( headBlock )
if headInfo == s . lastHeadInfo {
if headInfo == s . lastHeadInfo {
return
return
@ -141,6 +158,6 @@ func (s *beaconBlockSync) updateEventFeed() {
s . chainHeadFeed . Send ( types . ChainHeadEvent {
s . chainHeadFeed . Send ( types . ChainHeadEvent {
BeaconHead : head . Header ,
BeaconHead : head . Header ,
Block : execBlock ,
Block : execBlock ,
Finalized : finality . Finali zed . PayloadHeader . Block Hash( ) ,
Finalized : finalizedHash ,
} )
} )
}
}