Source file level_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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
open Level_repr
let from_raw c l =
let cycle_eras = Raw_context.cycle_eras c in
Level_repr.level_from_raw ~cycle_eras l
let from_raw_with_offset c ~offset l : Level_repr.t tzresult =
let cycle_eras = Raw_context.cycle_eras c in
Level_repr.level_from_raw_with_offset ~cycle_eras ~offset l
let root c = Raw_context.cycle_eras c |> Level_repr.root_level
let succ c (l : Level_repr.t) = from_raw c (Raw_level_repr.succ l.level)
let pred c (l : Level_repr.t) =
match Raw_level_repr.pred l.Level_repr.level with
| None -> None
| Some l -> Some (from_raw c l)
let add c (l : Level_repr.t) n = from_raw c (Raw_level_repr.add l.level n)
let sub c (l : Level_repr.t) n =
match Raw_level_repr.sub l.level n with
| None -> None
| Some raw_level ->
let cycle_eras = Raw_context.cycle_eras c in
let root_level = Level_repr.root_level cycle_eras in
if Raw_level_repr.(raw_level >= root_level.level) then
Some (from_raw c raw_level)
else None
let current ctxt = Raw_context.current_level ctxt
let previous ctxt =
let l = current ctxt in
match pred ctxt l with
| None -> assert false
| Some p -> p
let first_level_in_cycle ctxt cycle =
let cycle_eras = Raw_context.cycle_eras ctxt in
Level_repr.first_level_in_cycle_from_eras ~cycle_eras cycle
let last_level_in_cycle ctxt c =
match pred ctxt (first_level_in_cycle ctxt (Cycle_repr.succ c)) with
| None -> assert false
| Some x -> x
let levels_in_cycle ctxt cycle =
let first = first_level_in_cycle ctxt cycle in
let rec loop (n : Level_repr.t) acc =
if Cycle_repr.(n.cycle = first.cycle) then loop (succ ctxt n) (n :: acc)
else acc
in
loop first []
let levels_in_current_cycle ctxt ?(offset = 0l) () =
let current_cycle = Cycle_repr.to_int32 (current ctxt).cycle in
let cycle = Int32.add current_cycle offset in
if Compare.Int32.(cycle < 0l) then []
else
let cycle = Cycle_repr.of_int32_exn cycle in
levels_in_cycle ctxt cycle
let levels_with_commitments_in_cycle ctxt c =
let first = first_level_in_cycle ctxt c in
let rec loop (n : Level_repr.t) acc =
if Cycle_repr.(n.cycle = first.cycle) then
if n.expected_commitment then loop (succ ctxt n) (n :: acc)
else loop (succ ctxt n) acc
else acc
in
loop first []
let last_allowed_fork_level c =
let level = Raw_context.current_level c in
let preserved_cycles = Constants_storage.preserved_cycles c in
match Cycle_repr.sub level.cycle preserved_cycles with
| None -> Raw_level_repr.root
| Some cycle -> (first_level_in_cycle c cycle).level
let last_of_a_cycle ctxt level =
let cycle_eras = Raw_context.cycle_eras ctxt in
Level_repr.last_of_cycle ~cycle_eras level
let dawn_of_a_new_cycle ctxt =
let level = current ctxt in
if last_of_a_cycle ctxt level then Some level.cycle else None
let may_snapshot_stake_distribution ctxt =
let level = current ctxt in
let blocks_per_stake_snapshot =
Constants_storage.blocks_per_stake_snapshot ctxt
in
Compare.Int32.equal
(Int32.rem level.cycle_position blocks_per_stake_snapshot)
(Int32.pred blocks_per_stake_snapshot)
let may_compute_randao ctxt =
let level = current ctxt in
let nonce_reveal_cutoff = Constants_storage.nonce_revelation_threshold ctxt in
Compare.Int32.equal level.cycle_position nonce_reveal_cutoff