Source file already_denounced_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
let already_denounced_aux ctxt delegate (level : Level_repr.t) round kind =
let open Lwt_result_syntax in
let* denounced_opt =
Storage.Already_denounced.find
(ctxt, level.cycle)
((level.level, round), delegate)
in
match (denounced_opt, (kind : Misbehaviour_repr.kind)) with
| None, _ -> return_false
| Some denounced, Double_preattesting ->
return denounced.for_double_preattesting
| Some denounced, Double_attesting -> return denounced.for_double_attesting
| Some denounced, Double_baking -> return denounced.for_double_baking
let already_denounced ctxt delegate level round kind =
let open Lwt_result_syntax in
let* answer = already_denounced_aux ctxt delegate level round kind in
if answer || Round_repr.(round = zero) then return answer
else
let* first_level = Storage.Tenderbake.First_level_of_protocol.get ctxt in
if Raw_level_repr.(level.level >= first_level) then return answer
else
already_denounced_aux ctxt delegate level Round_repr.zero kind
let add_denunciation ctxt delegate (level : Level_repr.t) round kind =
let open Lwt_result_syntax in
let* denounced_opt =
Storage.Already_denounced.find
(ctxt, level.cycle)
((level.level, round), delegate)
in
let denounced =
Option.value denounced_opt ~default:Storage.default_denounced
in
let already_denounced =
match kind with
| Misbehaviour_repr.Double_baking -> denounced.for_double_baking
| Double_attesting -> denounced.for_double_attesting
| Double_preattesting -> denounced.for_double_preattesting
in
let*! ctxt =
if already_denounced then Lwt.return ctxt
else
Storage.Already_denounced.add
(ctxt, level.cycle)
((level.level, round), delegate)
(match kind with
| Double_baking -> {denounced with for_double_baking = true}
| Double_attesting -> {denounced with for_double_attesting = true}
| Double_preattesting -> {denounced with for_double_preattesting = true})
in
return (ctxt, already_denounced)
let clear_outdated_cycle ctxt ~new_cycle =
match Cycle_repr.(sub new_cycle Constants_repr.max_slashing_period) with
| None -> Lwt.return ctxt
| Some outdated_cycle -> Storage.Already_denounced.clear (ctxt, outdated_cycle)