Source file sc_rollup_commitment_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
128
129
130
131
132
133
134
135
136
137
138
139
open Sc_rollup_errors
module Store = Storage.Sc_rollup
module Commitment = Sc_rollup_commitment_repr
module Commitment_hash = Commitment.Hash
let get_commitment_opt_unsafe ctxt rollup commitment =
let open Lwt_result_syntax in
let* ctxt, res = Store.Commitments.find (ctxt, rollup) commitment in
return (res, ctxt)
let get_commitment_unsafe ctxt rollup commitment =
let open Lwt_result_syntax in
let* res, ctxt = get_commitment_opt_unsafe ctxt rollup commitment in
match res with
| None -> tzfail (Sc_rollup_unknown_commitment commitment)
| Some commitment -> return (commitment, ctxt)
let last_cemented_commitment ctxt rollup =
let open Lwt_result_syntax in
let* ctxt, res = Store.Last_cemented_commitment.find ctxt rollup in
match res with
| None -> tzfail (Sc_rollup_does_not_exist rollup)
| Some lcc -> return (lcc, ctxt)
let get_commitment ctxt rollup commitment =
let open Lwt_result_syntax in
let* _lcc, ctxt = last_cemented_commitment ctxt rollup in
get_commitment_unsafe ctxt rollup commitment
let last_cemented_commitment_hash_with_level ctxt rollup =
let open Lwt_result_syntax in
let* commitment_hash, ctxt = last_cemented_commitment ctxt rollup in
let+ {inbox_level; _}, ctxt =
get_commitment_unsafe ctxt rollup commitment_hash
in
(commitment_hash, inbox_level, ctxt)
let set_commitment_added ctxt rollup node new_value =
let open Lwt_result_syntax in
let* ctxt, res = Store.Commitment_added.find (ctxt, rollup) node in
match res with
| Some old_value ->
return (0, old_value, ctxt)
| None ->
let* ctxt, size_diff, _was_bound =
Store.Commitment_added.add (ctxt, rollup) node new_value
in
return (size_diff, new_value, ctxt)
let get_predecessor_opt_unsafe ctxt rollup node =
let open Lwt_result_syntax in
let* commitment, ctxt = get_commitment_opt_unsafe ctxt rollup node in
return (Option.map (fun (c : Commitment.t) -> c.predecessor) commitment, ctxt)
let check_if_commitments_are_related ctxt rollup ~descendant ~ancestor =
let open Lwt_result_syntax in
let rec aux ctxt current_commitment_hash =
if Commitment_hash.(current_commitment_hash = ancestor) then
return (true, ctxt)
else
let* predecessor_commitment_opt, ctxt =
get_predecessor_opt_unsafe ctxt rollup current_commitment_hash
in
match predecessor_commitment_opt with
| None -> return (false, ctxt)
| Some cch -> (aux [@ocaml.tailcall]) ctxt cch
in
aux ctxt descendant
let hash ctxt commitment =
let open Result_syntax in
let* ctxt =
Raw_context.consume_gas
ctxt
Sc_rollup_costs.Constants.cost_serialize_commitment
in
let commitment_bytes_opt =
Data_encoding.Binary.to_bytes_opt
Sc_rollup_commitment_repr.encoding
commitment
in
let* commitment_bytes =
Option.to_result
~none:(trace_of_error Sc_rollup_bad_commitment_serialization)
commitment_bytes_opt
in
let bytes_len = Bytes.length commitment_bytes in
let* ctxt =
Raw_context.consume_gas ctxt (Sc_rollup_costs.cost_hash_bytes ~bytes_len)
in
return (ctxt, Sc_rollup_commitment_repr.Hash.hash_bytes [commitment_bytes])
module Internal_for_tests = struct
let get_cemented_commitments_with_levels ctxt rollup =
let open Lwt_result_syntax in
let rec aux ctxt commitments_with_levels commitment_hash =
let* commitment_opt, ctxt =
get_commitment_opt_unsafe ctxt rollup commitment_hash
in
match commitment_opt with
| None -> return (commitments_with_levels, ctxt)
| Some {predecessor; inbox_level; _} ->
(aux [@ocaml.tailcall])
ctxt
((commitment_hash, inbox_level) :: commitments_with_levels)
predecessor
in
let* lcc_hash, ctxt = last_cemented_commitment ctxt rollup in
let+ commitments_with_levels, ctxt = aux ctxt [] lcc_hash in
(commitments_with_levels, ctxt)
end