From ecf74868a9965fbb57e2a7e1cfb8c0ef5813ad20 Mon Sep 17 00:00:00 2001 From: Nicolas Ayache Date: Wed, 31 Aug 2022 15:51:54 +0200 Subject: [PATCH 1/7] Proto: expose paid_storage_space. --- src/proto_alpha/lib_protocol/alpha_context.mli | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 2816cf47d67b..9dcf7e00be34 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -1763,6 +1763,8 @@ module Contract : sig val used_storage_space : context -> t -> Z.t tzresult Lwt.t + val paid_storage_space : context -> t -> Z.t tzresult Lwt.t + val increment_counter : context -> public_key_hash -> context tzresult Lwt.t val check_counter_increment : -- GitLab From 079a8e0d19cd4728279fdc4af3a4229e88f5708c Mon Sep 17 00:00:00 2001 From: Nicolas Ayache Date: Wed, 31 Aug 2022 15:58:26 +0200 Subject: [PATCH 2/7] Plugin/RPC: add and use a helper function for originated contracts. Doesn't pass CI (code to format, but I find it easier to review like this). [skip ci] --- src/proto_alpha/lib_plugin/RPC.ml | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/proto_alpha/lib_plugin/RPC.ml b/src/proto_alpha/lib_plugin/RPC.ml index b748185caee0..590a6485f34b 100644 --- a/src/proto_alpha/lib_plugin/RPC.ml +++ b/src/proto_alpha/lib_plugin/RPC.ml @@ -1668,15 +1668,19 @@ module Contract = struct RPC_path.(path /: Contract.rpc_arg / "script" / "normalized") end + let get_contract contract f = + match contract with + | Contract.Implicit _ -> return_none + | Contract.Originated contract -> f contract + let register () = (* Patched RPC: get_storage *) Registration.register1 ~chunked:true S.get_storage_normalized (fun ctxt contract () unparsing_mode -> - match contract with - | Implicit _ -> return_none - | Originated contract -> ( + get_contract contract + @@ fun contract -> Contract.get_script ctxt contract >>=? fun (ctxt, script) -> match script with | None -> return_none @@ -1692,15 +1696,14 @@ module Contract = struct -> unparse_data ctxt unparsing_mode storage_type storage >|=? fun (storage, _ctxt) -> - Some (Micheline.strip_locations storage))) ; + Some (Micheline.strip_locations storage)) ; (* Patched RPC: get_script *) Registration.register1 ~chunked:true S.get_script_normalized (fun ctxt contract () (unparsing_mode, normalize_types) -> - match contract with - | Implicit _ -> return_none - | Originated contract -> ( + get_contract contract + @@ fun contract -> Contract.get_script ctxt contract >>=? fun (ctxt, script) -> match script with | None -> return_none @@ -1713,7 +1716,7 @@ module Contract = struct unparsing_mode ~normalize_types script - >>=? fun (script, _ctxt) -> return_some script)) + >>=? fun (script, _ctxt) -> return_some script) let get_storage_normalized ctxt block ~contract ~unparsing_mode = RPC_context.make_call1 -- GitLab From ea584132c59d2348ff56f7677707fc14493b3ca3 Mon Sep 17 00:00:00 2001 From: Nicolas Ayache Date: Wed, 31 Aug 2022 22:27:32 +0200 Subject: [PATCH 3/7] Plugin/RPC: format code. With `make fmt-ocaml`. And that's all. --- src/proto_alpha/lib_plugin/RPC.ml | 63 +++++++++++++++---------------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/src/proto_alpha/lib_plugin/RPC.ml b/src/proto_alpha/lib_plugin/RPC.ml index 590a6485f34b..ed5f4fdbf336 100644 --- a/src/proto_alpha/lib_plugin/RPC.ml +++ b/src/proto_alpha/lib_plugin/RPC.ml @@ -1679,44 +1679,41 @@ module Contract = struct ~chunked:true S.get_storage_normalized (fun ctxt contract () unparsing_mode -> - get_contract contract - @@ fun contract -> - Contract.get_script ctxt contract >>=? fun (ctxt, script) -> - match script with - | None -> return_none - | Some script -> - let ctxt = Gas.set_unlimited ctxt in - let open Script_ir_translator in - parse_script - ctxt - ~elab_conf:(elab_conf ~legacy:true ()) - ~allow_forged_in_storage:true - script - >>=? fun (Ex_script (Script {storage; storage_type; _}), ctxt) - -> - unparse_data ctxt unparsing_mode storage_type storage - >|=? fun (storage, _ctxt) -> - Some (Micheline.strip_locations storage)) ; + get_contract contract @@ fun contract -> + Contract.get_script ctxt contract >>=? fun (ctxt, script) -> + match script with + | None -> return_none + | Some script -> + let ctxt = Gas.set_unlimited ctxt in + let open Script_ir_translator in + parse_script + ctxt + ~elab_conf:(elab_conf ~legacy:true ()) + ~allow_forged_in_storage:true + script + >>=? fun (Ex_script (Script {storage; storage_type; _}), ctxt) -> + unparse_data ctxt unparsing_mode storage_type storage + >|=? fun (storage, _ctxt) -> + Some (Micheline.strip_locations storage)) ; (* Patched RPC: get_script *) Registration.register1 ~chunked:true S.get_script_normalized (fun ctxt contract () (unparsing_mode, normalize_types) -> - get_contract contract - @@ fun contract -> - Contract.get_script ctxt contract >>=? fun (ctxt, script) -> - match script with - | None -> return_none - | Some script -> - let ctxt = Gas.set_unlimited ctxt in - Script_ir_translator.parse_and_unparse_script_unaccounted - ctxt - ~legacy:true - ~allow_forged_in_storage:true - unparsing_mode - ~normalize_types - script - >>=? fun (script, _ctxt) -> return_some script) + get_contract contract @@ fun contract -> + Contract.get_script ctxt contract >>=? fun (ctxt, script) -> + match script with + | None -> return_none + | Some script -> + let ctxt = Gas.set_unlimited ctxt in + Script_ir_translator.parse_and_unparse_script_unaccounted + ctxt + ~legacy:true + ~allow_forged_in_storage:true + unparsing_mode + ~normalize_types + script + >>=? fun (script, _ctxt) -> return_some script) let get_storage_normalized ctxt block ~contract ~unparsing_mode = RPC_context.make_call1 -- GitLab From 90befb3fc2431e0d6767dcd3009b83cc1f993b2c Mon Sep 17 00:00:00 2001 From: Nicolas Ayache Date: Wed, 31 Aug 2022 16:08:39 +0200 Subject: [PATCH 4/7] Plugin/RPC: add used/paid storage space services. --- src/proto_alpha/lib_plugin/RPC.ml | 48 ++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/proto_alpha/lib_plugin/RPC.ml b/src/proto_alpha/lib_plugin/RPC.ml index ed5f4fdbf336..bf0c8e836267 100644 --- a/src/proto_alpha/lib_plugin/RPC.ml +++ b/src/proto_alpha/lib_plugin/RPC.ml @@ -1666,6 +1666,22 @@ module Contract = struct ~query:RPC_query.empty ~output:(option Script.encoding) RPC_path.(path /: Contract.rpc_arg / "script" / "normalized") + + let get_used_storage_space = + let open Data_encoding in + RPC_service.get_service + ~description:"Access the used storage space of the contract." + ~query:RPC_query.empty + ~output:(option z) + RPC_path.(path /: Contract.rpc_arg / "storage" / "used_space") + + let get_paid_storage_space = + let open Data_encoding in + RPC_service.get_service + ~description:"Access the paid storage space of the contract." + ~query:RPC_query.empty + ~output:(option z) + RPC_path.(path /: Contract.rpc_arg / "storage" / "paid_space") end let get_contract contract f = @@ -1713,7 +1729,19 @@ module Contract = struct unparsing_mode ~normalize_types script - >>=? fun (script, _ctxt) -> return_some script) + >>=? fun (script, _ctxt) -> return_some script) ; + Registration.register1 + ~chunked:false + S.get_used_storage_space + (fun ctxt contract () () -> + get_contract contract @@ fun _ -> + Contract.used_storage_space ctxt contract >>=? return_some) ; + Registration.register1 + ~chunked:false + S.get_paid_storage_space + (fun ctxt contract () () -> + get_contract contract @@ fun _ -> + Contract.paid_storage_space ctxt contract >>=? return_some) let get_storage_normalized ctxt block ~contract ~unparsing_mode = RPC_context.make_call1 @@ -1733,6 +1761,24 @@ module Contract = struct (Contract.Originated contract) () (unparsing_mode, normalize_types) + + let get_used_storage_space ctxt block ~contract = + RPC_context.make_call1 + S.get_used_storage_space + ctxt + block + (Contract.Originated contract) + () + () + + let get_paid_storage_space ctxt block ~contract = + RPC_context.make_call1 + S.get_paid_storage_space + ctxt + block + (Contract.Originated contract) + () + () end module Big_map = struct -- GitLab From f578aa0835baf8bec8014c57a035aa916d80e8cb Mon Sep 17 00:00:00 2001 From: Nicolas Ayache Date: Wed, 31 Aug 2022 16:14:15 +0200 Subject: [PATCH 5/7] Client: add used/paid storage space functions. Actually calling the RPCs. We'll then use these new functions to create client commands. --- .../lib_client/client_proto_context.ml | 6 ++++++ .../lib_client/client_proto_context.mli | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/proto_alpha/lib_client/client_proto_context.ml b/src/proto_alpha/lib_client/client_proto_context.ml index 5c3d6e0a74d3..1ea268a04551 100644 --- a/src/proto_alpha/lib_client/client_proto_context.ml +++ b/src/proto_alpha/lib_client/client_proto_context.ml @@ -40,6 +40,12 @@ let get_storage (rpc : #rpc_context) ~chain ~block ~unparsing_mode contract = ~unparsing_mode ~contract +let get_used_storage_space (rpc : #rpc_context) ~chain ~block contract = + Plugin.RPC.Contract.get_used_storage_space rpc (chain, block) ~contract + +let get_paid_storage_space (rpc : #rpc_context) ~chain ~block contract = + Plugin.RPC.Contract.get_paid_storage_space rpc (chain, block) ~contract + let get_big_map_value (rpc : #rpc_context) ~chain ~block ~unparsing_mode id key = Plugin.RPC.Big_map.big_map_get_normalized diff --git a/src/proto_alpha/lib_client/client_proto_context.mli b/src/proto_alpha/lib_client/client_proto_context.mli index 2b5f73c969f4..8176311498d7 100644 --- a/src/proto_alpha/lib_client/client_proto_context.mli +++ b/src/proto_alpha/lib_client/client_proto_context.mli @@ -42,6 +42,22 @@ val get_storage : Contract_hash.t -> Script.expr option tzresult Lwt.t +(** Calls {!Tezos_protocol_plugin_alpha.Plugin.RPC.Contract.get_used_storage_space}. *) +val get_used_storage_space : + #Protocol_client_context.rpc_context -> + chain:Shell_services.chain -> + block:Shell_services.block -> + Contract_hash.t -> + Z.t option tzresult Lwt.t + +(** Calls {!Tezos_protocol_plugin_alpha.Plugin.RPC.Contract.get_paid_storage_space}. *) +val get_paid_storage_space : + #Protocol_client_context.rpc_context -> + chain:Shell_services.chain -> + block:Shell_services.block -> + Contract_hash.t -> + Z.t option tzresult Lwt.t + (** Calls {!Tezos_protocol_alpha.Protocol.Contract_services.contract_big_map_get_opt}. *) val get_contract_big_map_value : #Protocol_client_context.rpc_context -> -- GitLab From 29b4bdec06a59db626830629dcd6dd4acf3efcba Mon Sep 17 00:00:00 2001 From: Nicolas Ayache Date: Fri, 26 Aug 2022 15:22:41 +0200 Subject: [PATCH 6/7] Client: add used/paid storage space commands. --- .../client_proto_context_commands.ml | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/proto_alpha/lib_client_commands/client_proto_context_commands.ml b/src/proto_alpha/lib_client_commands/client_proto_context_commands.ml index 4e0ffd003e0e..bdec8cb1db2f 100644 --- a/src/proto_alpha/lib_client_commands/client_proto_context_commands.ml +++ b/src/proto_alpha/lib_client_commands/client_proto_context_commands.ml @@ -245,6 +245,48 @@ let commands_ro () = cctxt#answer "%a" Michelson_v1_printer.print_expr_unwrapped storage in return_unit); + command + ~group + ~desc:"Get the used storage space of a contract." + no_options + (prefixes ["get"; "contract"; "used"; "storage"; "space"; "for"] + @@ OriginatedContractAlias.destination_param + ~name:"src" + ~desc:"source contract" + @@ stop) + (fun () contract (cctxt : Protocol_client_context.full) -> + let open Lwt_result_syntax in + let* used_space = + get_used_storage_space + cctxt + ~chain:cctxt#chain + ~block:cctxt#block + contract + in + check_smart_contract cctxt used_space @@ fun used_space -> + let*! () = cctxt#answer "%a" Z.pp_print used_space in + return_unit); + command + ~group + ~desc:"Get the paid storage space of a contract." + no_options + (prefixes ["get"; "contract"; "paid"; "storage"; "space"; "for"] + @@ OriginatedContractAlias.destination_param + ~name:"src" + ~desc:"source contract" + @@ stop) + (fun () contract (cctxt : Protocol_client_context.full) -> + let open Lwt_result_syntax in + let* paid_space = + get_paid_storage_space + cctxt + ~chain:cctxt#chain + ~block:cctxt#block + contract + in + check_smart_contract cctxt paid_space @@ fun paid_space -> + let*! () = cctxt#answer "%a" Z.pp_print paid_space in + return_unit); command ~group ~desc: -- GitLab From 48ef378c46d3ee020ddb14e03553949938feeca9 Mon Sep 17 00:00:00 2001 From: Nicolas Ayache Date: Wed, 31 Aug 2022 23:03:32 +0200 Subject: [PATCH 7/7] Changelog: add entries. --- CHANGES.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 5c8ce5abacc5..41a3f2f65d61 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -67,6 +67,14 @@ Client guaranteed to be included in the order they are received from the operations source. +- Added commands to get the used and paid storage spaces of contracts: + ``tezos-client get used storage space for `` and + ``tezos-client get paid storage space for ``. + +- Added RPCs to get the used and paid storage spaces of contracts: + ``GET /chains//blocks//context/contracts//storage/used_space`` + and ``GET /chains//blocks//context/contracts//storage/paid_space``. + Baker ----- -- GitLab