---
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 {
}
````