--- tags: deposit, activation, exit, sync, workflow --- # Отдельная обработка финализации ## Intro 1. функционал реализуем в `/beacon-chain/blockchain/dag_finalization.go` 2. запускаем отдельной рутиной в **сервисе blockchain**. --- ## `beacon-chain/blockchain/head.go:178` > 1. на save/update head мы добавляем в очередь информацию которую хотим отправить в gwat (возможно тольк хеш стейта, номер блока хз) переносим логику финализации в `dag_finalization`, ````go if !s.isSync() { cp := headState.CurrentJustifiedCheckpoint() cpState, err := s.cfg.StateGen.StateByRoot(ctx, bytesutil.ToBytes32(cp.Root)) ... cpFin := gwatCommon.HashArrayFromBytes(cpState.Eth1Data().Finalization) headFin := gwatCommon.HashArrayFromBytes(headState.Eth1Data().Finalization) skip := headFin.IsEqualTo(cpFin) if !skip { baseSpine, finalizing, err := s.collectFinalizationParams(ctx, headBlock, headState) ... lfSpine, err := s.cfg.ExecutionEngineCaller.ExecutionDagFinalize(ctx, finalizing, &baseSpine) fSeq := append(gwatCommon.HashArray{baseSpine}, finalizing...) ... for _, h := range fSeq { finalizedSeq = append(finalizedSeq, h) if h == *lfSpine { break } } ... } } ```` а вместо ее отправляем в канал `ch_head_update` в `dag_finalization` следующие данные: ``` ctx, headBlock, headState ``` в соотв. с вызовом `s.collectFinalizationParams(ctx, headBlock, headState)` >и это тоже переносим в `dag_finalization` ```go func (s *Service) collectFinalizationParams(...) (...){...} ``` ## `/beacon-chain/blockchain/dag_finalization.go` > 2. в отдельной горутине мы вытаскиваем значения из ~~очереди~~ канала, обрабатываем, добавляем новые и отправляем в gwat (то есть синхронизируем) При инициализпции сервиса `beacon-chain/blockchain` запускакм рутину с луп-хандлером канала `ch_head_update`, которая выполняет живат-финализацию, обрабатывает ошибки, отслеживает состояние gwat, etc. > 4. таким образом save/update head у нас не ломается и продолжает нормально работать > 5. нужно очень обдумать горутину с очередью, для начала Для минимальной работы перенесим текущую логику в рутину, и это обеспечит нам полноценную работу. Дальнейшие доработки можем делать уже походу. ## Доработки > 3. gwat хранит у себя последний бикон рут стейт или блок, чтобы старые сообщение откидать, а если идет разрыв, то сообщить об этом бикон, чтобы он отправил недостающую информацию. мы можем на очереди сделать 2 запроса в gwat, дай мне текущий свой статус, а тебе пришлю изменения с того момента Возможно еще слот в связке с рут-стейта ## TODO 6. таки на создания блока, мы должны брать блок не с head как исходный, а найти, который нам подходит по кандидатам, то есть пройтись назад (но это уже когда консенсус будем переделывать) 7. хед синхронизацию отключаем, все делаем через горутину и очередь `beacon-chain/blockchain/service.go` ````go type Service struct { } ````