From c7c434eb4f24dc683af11c05878c8a9ec0f05ca3 Mon Sep 17 00:00:00 2001 From: Nicolas Ayache Date: Thu, 7 Jul 2022 15:18:01 +0200 Subject: [PATCH 1/3] Proto: add a dummy keys_unaccounted to high-level carbonated map functors. It will be filled with a correct definition later. --- src/proto_alpha/lib_protocol/storage.ml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/proto_alpha/lib_protocol/storage.ml b/src/proto_alpha/lib_protocol/storage.ml index 68b2e06da760..bb0b10f15c8f 100644 --- a/src/proto_alpha/lib_protocol/storage.ml +++ b/src/proto_alpha/lib_protocol/storage.ml @@ -312,6 +312,8 @@ module Contract = struct let add ctxt contract value = consume_serialize_gas ctxt value >>?= fun ctxt -> I.add ctxt contract value + + let _keys_unaccounted _ctxt = assert false end module Code = Make_carbonated_map_expr (struct @@ -535,6 +537,8 @@ module Big_map = struct | None -> ok (ctxt, None) | Some value -> consume_deserialize_gas ctxt value >|? fun ctxt -> (ctxt, value_opt) + + let _keys_unaccounted _ctxt = assert false end end -- GitLab From 9988091d0d193285b954d24afbbb807f9a714f4d Mon Sep 17 00:00:00 2001 From: Nicolas Ayache Date: Thu, 7 Jul 2022 14:57:51 +0200 Subject: [PATCH 2/3] Proto: add Make_carbonated_map.keys_unaccounted. --- src/proto_alpha/lib_protocol/storage_functors.ml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/proto_alpha/lib_protocol/storage_functors.ml b/src/proto_alpha/lib_protocol/storage_functors.ml index c1d958612b36..0e9519470f14 100644 --- a/src/proto_alpha/lib_protocol/storage_functors.ml +++ b/src/proto_alpha/lib_protocol/storage_functors.ml @@ -1073,6 +1073,18 @@ module Make_indexed_subcontext (C : Raw_context.T) (I : INDEX) : let add_or_remove s i v = match v with None -> remove s i | Some v -> add s i v + let mem_unaccounted s i = Raw_context.mem (pack s i) data_name + + let fold_keys_unaccounted s ~order ~init ~f = + fold_keys s ~order ~init ~f:(fun i acc -> + mem_unaccounted s i >>= function + | false -> Lwt.return acc + | true -> f i acc) + + let _keys_unaccounted s = + fold_keys_unaccounted s ~order:`Sorted ~init:[] ~f:(fun p acc -> + Lwt.return (p :: acc)) + let () = let open Storage_description in let unpack = unpack I.args in -- GitLab From 499e2ac38be3bd1dc28192194e5b822f014e60f1 Mon Sep 17 00:00:00 2001 From: Nicolas Ayache Date: Thu, 7 Jul 2022 15:06:24 +0200 Subject: [PATCH 3/3] Proto: expose and use Make_carbonated_map.keys_unaccounted. --- src/proto_alpha/lib_protocol/storage.ml | 4 ++-- src/proto_alpha/lib_protocol/storage_functors.ml | 2 +- src/proto_alpha/lib_protocol/storage_sigs.ml | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/proto_alpha/lib_protocol/storage.ml b/src/proto_alpha/lib_protocol/storage.ml index bb0b10f15c8f..1d36525c5beb 100644 --- a/src/proto_alpha/lib_protocol/storage.ml +++ b/src/proto_alpha/lib_protocol/storage.ml @@ -313,7 +313,7 @@ module Contract = struct consume_serialize_gas ctxt value >>?= fun ctxt -> I.add ctxt contract value - let _keys_unaccounted _ctxt = assert false + let keys_unaccounted = I.keys_unaccounted end module Code = Make_carbonated_map_expr (struct @@ -538,7 +538,7 @@ module Big_map = struct | Some value -> consume_deserialize_gas ctxt value >|? fun ctxt -> (ctxt, value_opt) - let _keys_unaccounted _ctxt = assert false + let keys_unaccounted = I.keys_unaccounted end end diff --git a/src/proto_alpha/lib_protocol/storage_functors.ml b/src/proto_alpha/lib_protocol/storage_functors.ml index 0e9519470f14..b07dcbe31d9e 100644 --- a/src/proto_alpha/lib_protocol/storage_functors.ml +++ b/src/proto_alpha/lib_protocol/storage_functors.ml @@ -1081,7 +1081,7 @@ module Make_indexed_subcontext (C : Raw_context.T) (I : INDEX) : | false -> Lwt.return acc | true -> f i acc) - let _keys_unaccounted s = + let keys_unaccounted s = fold_keys_unaccounted s ~order:`Sorted ~init:[] ~f:(fun p acc -> Lwt.return (p :: acc)) diff --git a/src/proto_alpha/lib_protocol/storage_sigs.ml b/src/proto_alpha/lib_protocol/storage_sigs.ml index f1db042a94f1..d6c0a2886083 100644 --- a/src/proto_alpha/lib_protocol/storage_sigs.ml +++ b/src/proto_alpha/lib_protocol/storage_sigs.ml @@ -209,6 +209,10 @@ module type Non_iterable_indexed_carbonated_data_storage = sig Returns the freed size, and a boolean indicating if a value was already associated to this key. *) val remove : context -> key -> (Raw_context.t * int * bool) tzresult Lwt.t + + (** Returns the list of all storage bucket keys. + Not carbonated (i.e. gas is not consumed); use with care. *) + val keys_unaccounted : context -> key list Lwt.t end module type Non_iterable_indexed_carbonated_data_storage_with_values = sig -- GitLab