---
# System prepended metadata

title: Отдельная обработка финализации
tags: [' activation', ' workflow', ' sync', deposit, ' exit']

---

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

}
````

