Source file dal_slot_storage.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
let ctxt level = Storage.Dal.Slot.Headers.find ctxt level
let ctxt =
Storage.Dal.Slot.Headers.add
ctxt
(Raw_context.current_level ctxt).level
(Raw_context.Dal.candidates ctxt)
let ~is_slot_attested =
let open Dal_slot_repr in
let fold_attested_slots (, attestation) slot =
if is_slot_attested slot then
( slot :: rev_attested_slot_headers,
Dal_attestation_repr.commit attestation slot.Header.id.index )
else (rev_attested_slot_headers, attestation)
in
let , bitset =
List.fold_left
fold_attested_slots
([], Dal_attestation_repr.empty)
seen_slot_headers
in
(List.rev rev_attested_slot_headers, bitset)
let ctxt =
let open Lwt_result_syntax in
let+ slots_history = Storage.Dal.Slot.History.find ctxt in
match slots_history with
| None -> Dal_slot_repr.History.genesis
| Some slots_history -> slots_history
let update_skip_list ctxt ~ ~level_attested
~number_of_slots =
let open Lwt_result_syntax in
let* slots_history = get_slot_headers_history ctxt in
let*? slots_history =
Dal_slot_repr.History.add_confirmed_slot_headers_no_cache
~number_of_slots
slots_history
level_attested
confirmed_slot_headers
in
let*! ctxt = Storage.Dal.Slot.History.add ctxt slots_history in
return ctxt
let ctxt ~number_of_slots =
let open Lwt_result_syntax in
let {Level_repr.level = raw_level; _} = Raw_context.current_level ctxt in
let Constants_parametric_repr.{dal; _} = Raw_context.constants ctxt in
match Raw_level_repr.(sub raw_level dal.attestation_lag) with
| None -> return (ctxt, Dal_attestation_repr.empty)
| Some level_attested ->
let* seen_slots = find_slot_headers ctxt level_attested in
let*! ctxt = Storage.Dal.Slot.Headers.remove ctxt level_attested in
let* ctxt, attestation, =
match seen_slots with
| None -> return (ctxt, Dal_attestation_repr.empty, [])
| Some seen_slots ->
let , attestation =
let is_slot_attested slot =
Raw_context.Dal.is_slot_index_attested
ctxt
slot.Dal_slot_repr.Header.id.index
in
compute_attested_slot_headers ~is_slot_attested seen_slots
in
return (ctxt, attestation, attested_slot_headers)
in
let* ctxt =
update_skip_list
ctxt
~confirmed_slot_headers
~level_attested
~number_of_slots
in
return (ctxt, attestation)