diff --git a/CHANGES.rst b/CHANGES.rst index 0b205648ea1b6b65bfcaabb74ac8016cf1466e2d..387059c03211f40574ee60563b2b2e16e383fc71 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -138,6 +138,15 @@ Smart Rollup node - Fix potential issue with store with SQLite < 3.35. (MR :gl:`!15631`) +- Paginate RPC for durable storage subkeys + ``/global/block//durable/wasm_2_0_0/subkeys?key=&offset=&length=``, + with new query parameters ``offset`` and ``length``. (MR :gl:`!15625`) + +- New RPC to retrieve values under a key in the durable storage + ``/global/block//durable/wasm_2_0_0/values?key=&offset=&length=``. + (MR :gl:`!15627`) + + Smart Rollup WASM Debugger -------------------------- diff --git a/src/lib_smart_rollup_node/rpc_server.ml b/src/lib_smart_rollup_node/rpc_server.ml index 910bb84d4999df7cebd737eeaadf86693260fcf0..75bb005108c42432dc211e341bd4c49d61b3e92e 100644 --- a/src/lib_smart_rollup_node/rpc_server.ml +++ b/src/lib_smart_rollup_node/rpc_server.ml @@ -48,6 +48,7 @@ module Acl = struct parse [ "GET /global/block/*/durable/wasm_2_0_0/subkeys"; + "GET /global/block/*/durable/wasm_2_0_0/values"; "/local/batcher/**"; "/admin/**"; "/stats/**"; diff --git a/src/proto_018_Proxford/lib_sc_rollup_layer2/sc_rollup_services.ml b/src/proto_018_Proxford/lib_sc_rollup_layer2/sc_rollup_services.ml index 06e2622363db19018eb940c4c419c49c9c1c65e5..f492d11531b6e2a7dd1ec5f0c42e8e5ded061c8b 100644 --- a/src/proto_018_Proxford/lib_sc_rollup_layer2/sc_rollup_services.ml +++ b/src/proto_018_Proxford/lib_sc_rollup_layer2/sc_rollup_services.ml @@ -333,6 +333,15 @@ module Block = struct ~output:Data_encoding.(list string) (path / "durable" / Sc_rollup.Kind.to_string pvm_kind / "subkeys") + let durable_state_values (pvm_kind : Sc_rollup.Kind.t) = + Tezos_rpc.Service.get_service + ~description: + "Retrieve values directly under a given key from PVM durable storage. \ + PVM state is taken with respect to the specified block level." + ~query:Query.key_query + ~output:Data_encoding.(list (obj2 (req "key" string) (req "value" bytes))) + (path / "durable" / Sc_rollup.Kind.to_string pvm_kind / "values") + let status = Tezos_rpc.Service.get_service ~description:"PVM status at block" diff --git a/src/proto_018_Proxford/lib_sc_rollup_node/wasm_2_0_0_rpc.ml b/src/proto_018_Proxford/lib_sc_rollup_node/wasm_2_0_0_rpc.ml index fe4d530eb9d65b9d233cc824fc44298b7dc055cf..6f735fe764f6843107cc73285b4bd2791a9e42b8 100644 --- a/src/proto_018_Proxford/lib_sc_rollup_node/wasm_2_0_0_rpc.ml +++ b/src/proto_018_Proxford/lib_sc_rollup_node/wasm_2_0_0_rpc.ml @@ -68,13 +68,32 @@ struct let*! leng = Durable_state.value_length (of_node_pvmstate state) key in return leng ) ; + ( Block_directory.register0 + (Sc_rollup_services.Block.durable_state_subkeys Kind.Wasm_2_0_0) + @@ fun (node_ctxt, block) {key} () -> + let open Lwt_result_syntax in + let* state = get_state node_ctxt block in + let*! subkeys = Durable_state.list (of_node_pvmstate state) key in + return subkeys ) ; + Block_directory.register0 - (Sc_rollup_services.Block.durable_state_subkeys Kind.Wasm_2_0_0) + (Sc_rollup_services.Block.durable_state_values Kind.Wasm_2_0_0) @@ fun (node_ctxt, block) {key} () -> let open Lwt_result_syntax in let* state = get_state node_ctxt block in - let*! subkeys = Durable_state.list (of_node_pvmstate state) key in - return subkeys + let tree = of_node_pvmstate state in + let*! subkeys = Durable_state.list tree key in + let*! bindings = + List.filter_map_s + (fun subkey -> + let open Lwt_syntax in + let+ value = + Durable_state.lookup tree (String.concat "/" [key; subkey]) + in + match value with None -> None | Some value -> Some (subkey, value)) + subkeys + in + return bindings let build_sub_directory node_ctxt = register () ; diff --git a/src/proto_019_PtParisB/lib_sc_rollup_layer2/sc_rollup_services.ml b/src/proto_019_PtParisB/lib_sc_rollup_layer2/sc_rollup_services.ml index d982430b7806fd66c8b561e9ad8879f22bb5a287..47a39eee9b618f29585f4d0e59bc4699d342841d 100644 --- a/src/proto_019_PtParisB/lib_sc_rollup_layer2/sc_rollup_services.ml +++ b/src/proto_019_PtParisB/lib_sc_rollup_layer2/sc_rollup_services.ml @@ -374,6 +374,15 @@ module Block = struct ~output:Data_encoding.(list string) (path / "durable" / Sc_rollup.Kind.to_string pvm_kind / "subkeys") + let durable_state_values (pvm_kind : Sc_rollup.Kind.t) = + Tezos_rpc.Service.get_service + ~description: + "Retrieve values directly under a given key from PVM durable storage. \ + PVM state is taken with respect to the specified block level." + ~query:Query.key_query + ~output:Data_encoding.(list (obj2 (req "key" string) (req "value" bytes))) + (path / "durable" / Sc_rollup.Kind.to_string pvm_kind / "values") + let status = Tezos_rpc.Service.get_service ~description:"PVM status at block" diff --git a/src/proto_019_PtParisB/lib_sc_rollup_node/wasm_2_0_0_rpc.ml b/src/proto_019_PtParisB/lib_sc_rollup_node/wasm_2_0_0_rpc.ml index fe4d530eb9d65b9d233cc824fc44298b7dc055cf..6f735fe764f6843107cc73285b4bd2791a9e42b8 100644 --- a/src/proto_019_PtParisB/lib_sc_rollup_node/wasm_2_0_0_rpc.ml +++ b/src/proto_019_PtParisB/lib_sc_rollup_node/wasm_2_0_0_rpc.ml @@ -68,13 +68,32 @@ struct let*! leng = Durable_state.value_length (of_node_pvmstate state) key in return leng ) ; + ( Block_directory.register0 + (Sc_rollup_services.Block.durable_state_subkeys Kind.Wasm_2_0_0) + @@ fun (node_ctxt, block) {key} () -> + let open Lwt_result_syntax in + let* state = get_state node_ctxt block in + let*! subkeys = Durable_state.list (of_node_pvmstate state) key in + return subkeys ) ; + Block_directory.register0 - (Sc_rollup_services.Block.durable_state_subkeys Kind.Wasm_2_0_0) + (Sc_rollup_services.Block.durable_state_values Kind.Wasm_2_0_0) @@ fun (node_ctxt, block) {key} () -> let open Lwt_result_syntax in let* state = get_state node_ctxt block in - let*! subkeys = Durable_state.list (of_node_pvmstate state) key in - return subkeys + let tree = of_node_pvmstate state in + let*! subkeys = Durable_state.list tree key in + let*! bindings = + List.filter_map_s + (fun subkey -> + let open Lwt_syntax in + let+ value = + Durable_state.lookup tree (String.concat "/" [key; subkey]) + in + match value with None -> None | Some value -> Some (subkey, value)) + subkeys + in + return bindings let build_sub_directory node_ctxt = register () ; diff --git a/src/proto_020_PsParisC/lib_sc_rollup_layer2/sc_rollup_services.ml b/src/proto_020_PsParisC/lib_sc_rollup_layer2/sc_rollup_services.ml index d982430b7806fd66c8b561e9ad8879f22bb5a287..47a39eee9b618f29585f4d0e59bc4699d342841d 100644 --- a/src/proto_020_PsParisC/lib_sc_rollup_layer2/sc_rollup_services.ml +++ b/src/proto_020_PsParisC/lib_sc_rollup_layer2/sc_rollup_services.ml @@ -374,6 +374,15 @@ module Block = struct ~output:Data_encoding.(list string) (path / "durable" / Sc_rollup.Kind.to_string pvm_kind / "subkeys") + let durable_state_values (pvm_kind : Sc_rollup.Kind.t) = + Tezos_rpc.Service.get_service + ~description: + "Retrieve values directly under a given key from PVM durable storage. \ + PVM state is taken with respect to the specified block level." + ~query:Query.key_query + ~output:Data_encoding.(list (obj2 (req "key" string) (req "value" bytes))) + (path / "durable" / Sc_rollup.Kind.to_string pvm_kind / "values") + let status = Tezos_rpc.Service.get_service ~description:"PVM status at block" diff --git a/src/proto_020_PsParisC/lib_sc_rollup_node/wasm_2_0_0_rpc.ml b/src/proto_020_PsParisC/lib_sc_rollup_node/wasm_2_0_0_rpc.ml index fe4d530eb9d65b9d233cc824fc44298b7dc055cf..6f735fe764f6843107cc73285b4bd2791a9e42b8 100644 --- a/src/proto_020_PsParisC/lib_sc_rollup_node/wasm_2_0_0_rpc.ml +++ b/src/proto_020_PsParisC/lib_sc_rollup_node/wasm_2_0_0_rpc.ml @@ -68,13 +68,32 @@ struct let*! leng = Durable_state.value_length (of_node_pvmstate state) key in return leng ) ; + ( Block_directory.register0 + (Sc_rollup_services.Block.durable_state_subkeys Kind.Wasm_2_0_0) + @@ fun (node_ctxt, block) {key} () -> + let open Lwt_result_syntax in + let* state = get_state node_ctxt block in + let*! subkeys = Durable_state.list (of_node_pvmstate state) key in + return subkeys ) ; + Block_directory.register0 - (Sc_rollup_services.Block.durable_state_subkeys Kind.Wasm_2_0_0) + (Sc_rollup_services.Block.durable_state_values Kind.Wasm_2_0_0) @@ fun (node_ctxt, block) {key} () -> let open Lwt_result_syntax in let* state = get_state node_ctxt block in - let*! subkeys = Durable_state.list (of_node_pvmstate state) key in - return subkeys + let tree = of_node_pvmstate state in + let*! subkeys = Durable_state.list tree key in + let*! bindings = + List.filter_map_s + (fun subkey -> + let open Lwt_syntax in + let+ value = + Durable_state.lookup tree (String.concat "/" [key; subkey]) + in + match value with None -> None | Some value -> Some (subkey, value)) + subkeys + in + return bindings let build_sub_directory node_ctxt = register () ; diff --git a/src/proto_021_PsQuebec/lib_sc_rollup_layer2/sc_rollup_services.ml b/src/proto_021_PsQuebec/lib_sc_rollup_layer2/sc_rollup_services.ml index 06e2622363db19018eb940c4c419c49c9c1c65e5..f492d11531b6e2a7dd1ec5f0c42e8e5ded061c8b 100644 --- a/src/proto_021_PsQuebec/lib_sc_rollup_layer2/sc_rollup_services.ml +++ b/src/proto_021_PsQuebec/lib_sc_rollup_layer2/sc_rollup_services.ml @@ -333,6 +333,15 @@ module Block = struct ~output:Data_encoding.(list string) (path / "durable" / Sc_rollup.Kind.to_string pvm_kind / "subkeys") + let durable_state_values (pvm_kind : Sc_rollup.Kind.t) = + Tezos_rpc.Service.get_service + ~description: + "Retrieve values directly under a given key from PVM durable storage. \ + PVM state is taken with respect to the specified block level." + ~query:Query.key_query + ~output:Data_encoding.(list (obj2 (req "key" string) (req "value" bytes))) + (path / "durable" / Sc_rollup.Kind.to_string pvm_kind / "values") + let status = Tezos_rpc.Service.get_service ~description:"PVM status at block" diff --git a/src/proto_021_PsQuebec/lib_sc_rollup_node/wasm_2_0_0_rpc.ml b/src/proto_021_PsQuebec/lib_sc_rollup_node/wasm_2_0_0_rpc.ml index fe4d530eb9d65b9d233cc824fc44298b7dc055cf..6f735fe764f6843107cc73285b4bd2791a9e42b8 100644 --- a/src/proto_021_PsQuebec/lib_sc_rollup_node/wasm_2_0_0_rpc.ml +++ b/src/proto_021_PsQuebec/lib_sc_rollup_node/wasm_2_0_0_rpc.ml @@ -68,13 +68,32 @@ struct let*! leng = Durable_state.value_length (of_node_pvmstate state) key in return leng ) ; + ( Block_directory.register0 + (Sc_rollup_services.Block.durable_state_subkeys Kind.Wasm_2_0_0) + @@ fun (node_ctxt, block) {key} () -> + let open Lwt_result_syntax in + let* state = get_state node_ctxt block in + let*! subkeys = Durable_state.list (of_node_pvmstate state) key in + return subkeys ) ; + Block_directory.register0 - (Sc_rollup_services.Block.durable_state_subkeys Kind.Wasm_2_0_0) + (Sc_rollup_services.Block.durable_state_values Kind.Wasm_2_0_0) @@ fun (node_ctxt, block) {key} () -> let open Lwt_result_syntax in let* state = get_state node_ctxt block in - let*! subkeys = Durable_state.list (of_node_pvmstate state) key in - return subkeys + let tree = of_node_pvmstate state in + let*! subkeys = Durable_state.list tree key in + let*! bindings = + List.filter_map_s + (fun subkey -> + let open Lwt_syntax in + let+ value = + Durable_state.lookup tree (String.concat "/" [key; subkey]) + in + match value with None -> None | Some value -> Some (subkey, value)) + subkeys + in + return bindings let build_sub_directory node_ctxt = register () ; diff --git a/src/proto_alpha/lib_sc_rollup_layer2/sc_rollup_services.ml b/src/proto_alpha/lib_sc_rollup_layer2/sc_rollup_services.ml index 06e2622363db19018eb940c4c419c49c9c1c65e5..f492d11531b6e2a7dd1ec5f0c42e8e5ded061c8b 100644 --- a/src/proto_alpha/lib_sc_rollup_layer2/sc_rollup_services.ml +++ b/src/proto_alpha/lib_sc_rollup_layer2/sc_rollup_services.ml @@ -333,6 +333,15 @@ module Block = struct ~output:Data_encoding.(list string) (path / "durable" / Sc_rollup.Kind.to_string pvm_kind / "subkeys") + let durable_state_values (pvm_kind : Sc_rollup.Kind.t) = + Tezos_rpc.Service.get_service + ~description: + "Retrieve values directly under a given key from PVM durable storage. \ + PVM state is taken with respect to the specified block level." + ~query:Query.key_query + ~output:Data_encoding.(list (obj2 (req "key" string) (req "value" bytes))) + (path / "durable" / Sc_rollup.Kind.to_string pvm_kind / "values") + let status = Tezos_rpc.Service.get_service ~description:"PVM status at block" diff --git a/src/proto_alpha/lib_sc_rollup_node/wasm_2_0_0_rpc.ml b/src/proto_alpha/lib_sc_rollup_node/wasm_2_0_0_rpc.ml index fe4d530eb9d65b9d233cc824fc44298b7dc055cf..6f735fe764f6843107cc73285b4bd2791a9e42b8 100644 --- a/src/proto_alpha/lib_sc_rollup_node/wasm_2_0_0_rpc.ml +++ b/src/proto_alpha/lib_sc_rollup_node/wasm_2_0_0_rpc.ml @@ -68,13 +68,32 @@ struct let*! leng = Durable_state.value_length (of_node_pvmstate state) key in return leng ) ; + ( Block_directory.register0 + (Sc_rollup_services.Block.durable_state_subkeys Kind.Wasm_2_0_0) + @@ fun (node_ctxt, block) {key} () -> + let open Lwt_result_syntax in + let* state = get_state node_ctxt block in + let*! subkeys = Durable_state.list (of_node_pvmstate state) key in + return subkeys ) ; + Block_directory.register0 - (Sc_rollup_services.Block.durable_state_subkeys Kind.Wasm_2_0_0) + (Sc_rollup_services.Block.durable_state_values Kind.Wasm_2_0_0) @@ fun (node_ctxt, block) {key} () -> let open Lwt_result_syntax in let* state = get_state node_ctxt block in - let*! subkeys = Durable_state.list (of_node_pvmstate state) key in - return subkeys + let tree = of_node_pvmstate state in + let*! subkeys = Durable_state.list tree key in + let*! bindings = + List.filter_map_s + (fun subkey -> + let open Lwt_syntax in + let+ value = + Durable_state.lookup tree (String.concat "/" [key; subkey]) + in + match value with None -> None | Some value -> Some (subkey, value)) + subkeys + in + return bindings let build_sub_directory node_ctxt = register () ; diff --git a/tezt/lib_tezos/sc_rollup_rpc.ml b/tezt/lib_tezos/sc_rollup_rpc.ml index 1d14fa9bdd854493317b2563911afe20608616ce..05cd2f9bbce56658f7ad6fa79413d63e44092edc 100644 --- a/tezt/lib_tezos/sc_rollup_rpc.ml +++ b/tezt/lib_tezos/sc_rollup_rpc.ml @@ -223,19 +223,31 @@ type 'output_type durable_state_operation = | Value : string option durable_state_operation | Length : int64 option durable_state_operation | Subkeys : string list durable_state_operation + | Values : (string * string) list durable_state_operation let string_of_durable_state_operation (type a) (x : a durable_state_operation) = - match x with Value -> "value" | Length -> "length" | Subkeys -> "subkeys" + match x with + | Value -> "value" + | Length -> "length" + | Subkeys -> "subkeys" + | Values -> "values" let get_global_block_durable_state_value ?(block = "head") ~pvm_kind ~operation ~key () = let op = string_of_durable_state_operation operation in let f : type k. k durable_state_operation -> JSON.t -> k = fun operation -> + let open JSON in match operation with - | Value -> JSON.as_string_opt - | Length -> JSON.as_int64_opt - | Subkeys -> fun json -> List.map JSON.as_string (JSON.as_list json) + | Value -> as_string_opt + | Length -> as_int64_opt + | Subkeys -> fun json -> List.map as_string (as_list json) + | Values -> + fun json -> + List.map + (fun json -> + (json |-> "key" |> as_string, json |-> "value" |> as_string)) + (as_list json) in make ~query_string:[("key", String.trim key)] diff --git a/tezt/lib_tezos/sc_rollup_rpc.mli b/tezt/lib_tezos/sc_rollup_rpc.mli index 8b83bdc3b68e5deb4b3ee6cb54f436c6d199cf3d..8d19a4526bb2400fc3db699712ee9d9490bede45 100644 --- a/tezt/lib_tezos/sc_rollup_rpc.mli +++ b/tezt/lib_tezos/sc_rollup_rpc.mli @@ -156,6 +156,7 @@ type 'output_type durable_state_operation = | Value : string option durable_state_operation | Length : int64 option durable_state_operation | Subkeys : string list durable_state_operation + | Values : (string * string) list durable_state_operation (** RPC: [GET global/block//durable//] gets the corresponding durable PVM state information (depending on [operation]) mapped to [key] for the [block] diff --git a/tezt/tests/expected/sc_rollup.ml/Alpha- wasm_2_0_0 - RPC API should work and be stable.out b/tezt/tests/expected/sc_rollup.ml/Alpha- wasm_2_0_0 - RPC API should work and be stable.out index 34a33b04c469b3d054b9b6a95066f9aef2679943..63d4f4ea4b78aa4bf8adff2ea5472d38d9e7e234 100644 --- a/tezt/tests/expected/sc_rollup.ml/Alpha- wasm_2_0_0 - RPC API should work and be stable.out +++ b/tezt/tests/expected/sc_rollup.ml/Alpha- wasm_2_0_0 - RPC API should work and be stable.out @@ -253,6 +253,10 @@ GET http://[HOST]:[PORT]/global/block/head/durable/wasm_2_0_0/subkeys?key=/reado 200 OK ["boot.wasm","env"] +GET http://[HOST]:[PORT]/global/block/head/durable/wasm_2_0_0/values?key=/numbers +200 OK +[{"key":"number02","value":"02"},{"key":"number24","value":"18"},{"key":"number01","value":"01"},{"key":"number12","value":"0c"},{"key":"number04","value":"04"},{"key":"number00","value":"00"},{"key":"number03","value":"03"},{"key":"number10","value":"0a"},{"key":"number21","value":"15"},{"key":"number14","value":"0e"},{"key":"number15","value":"0f"},{"key":"number20","value":"14"},{"key":"number05","value":"05"},{"key":"number25","value":"19"},{"key":"number26","value":"1a"},{"key":"number16","value":"10"},{"key":"number29","value":"1d"},{"key":"number06","value":"06"},{"key":"number23","value":"17"},{"key":"number13","value":"0d"},{"key":"number09","value":"09"},{"key":"number08","value":"08"},{"key":"number27","value":"1b"},{"key":"number19","value":"13"},{"key":"number22","value":"16"},{"key":"number07","value":"07"},{"key":"number18","value":"12"},{"key":"number11","value":"0b"},{"key":"number28","value":"1c"},{"key":"number17","value":"11"}] + GET http://[HOST]:[PORT]/global/block/head/status 200 OK "Waiting for input message" diff --git a/tezt/tests/expected/sc_rollup.ml/Parisc- wasm_2_0_0 - RPC API should work and be stable.out b/tezt/tests/expected/sc_rollup.ml/Parisc- wasm_2_0_0 - RPC API should work and be stable.out index ad76087db2e852fe3ffc37f6901d11164f2de176..22ccb74c39d6e81ba80c0bfc4116e738a91e964e 100644 --- a/tezt/tests/expected/sc_rollup.ml/Parisc- wasm_2_0_0 - RPC API should work and be stable.out +++ b/tezt/tests/expected/sc_rollup.ml/Parisc- wasm_2_0_0 - RPC API should work and be stable.out @@ -253,6 +253,10 @@ GET http://[HOST]:[PORT]/global/block/head/durable/wasm_2_0_0/subkeys?key=/reado 200 OK ["boot.wasm","env"] +GET http://[HOST]:[PORT]/global/block/head/durable/wasm_2_0_0/values?key=/numbers +200 OK +[{"key":"number02","value":"02"},{"key":"number24","value":"18"},{"key":"number01","value":"01"},{"key":"number12","value":"0c"},{"key":"number04","value":"04"},{"key":"number00","value":"00"},{"key":"number03","value":"03"},{"key":"number10","value":"0a"},{"key":"number21","value":"15"},{"key":"number14","value":"0e"},{"key":"number15","value":"0f"},{"key":"number20","value":"14"},{"key":"number05","value":"05"},{"key":"number25","value":"19"},{"key":"number26","value":"1a"},{"key":"number16","value":"10"},{"key":"number29","value":"1d"},{"key":"number06","value":"06"},{"key":"number23","value":"17"},{"key":"number13","value":"0d"},{"key":"number09","value":"09"},{"key":"number08","value":"08"},{"key":"number27","value":"1b"},{"key":"number19","value":"13"},{"key":"number22","value":"16"},{"key":"number07","value":"07"},{"key":"number18","value":"12"},{"key":"number11","value":"0b"},{"key":"number28","value":"1c"},{"key":"number17","value":"11"}] + GET http://[HOST]:[PORT]/global/block/head/status 200 OK "Waiting for input message" diff --git a/tezt/tests/expected/sc_rollup.ml/Quebec- wasm_2_0_0 - RPC API should work and be stable.out b/tezt/tests/expected/sc_rollup.ml/Quebec- wasm_2_0_0 - RPC API should work and be stable.out index 34a33b04c469b3d054b9b6a95066f9aef2679943..63d4f4ea4b78aa4bf8adff2ea5472d38d9e7e234 100644 --- a/tezt/tests/expected/sc_rollup.ml/Quebec- wasm_2_0_0 - RPC API should work and be stable.out +++ b/tezt/tests/expected/sc_rollup.ml/Quebec- wasm_2_0_0 - RPC API should work and be stable.out @@ -253,6 +253,10 @@ GET http://[HOST]:[PORT]/global/block/head/durable/wasm_2_0_0/subkeys?key=/reado 200 OK ["boot.wasm","env"] +GET http://[HOST]:[PORT]/global/block/head/durable/wasm_2_0_0/values?key=/numbers +200 OK +[{"key":"number02","value":"02"},{"key":"number24","value":"18"},{"key":"number01","value":"01"},{"key":"number12","value":"0c"},{"key":"number04","value":"04"},{"key":"number00","value":"00"},{"key":"number03","value":"03"},{"key":"number10","value":"0a"},{"key":"number21","value":"15"},{"key":"number14","value":"0e"},{"key":"number15","value":"0f"},{"key":"number20","value":"14"},{"key":"number05","value":"05"},{"key":"number25","value":"19"},{"key":"number26","value":"1a"},{"key":"number16","value":"10"},{"key":"number29","value":"1d"},{"key":"number06","value":"06"},{"key":"number23","value":"17"},{"key":"number13","value":"0d"},{"key":"number09","value":"09"},{"key":"number08","value":"08"},{"key":"number27","value":"1b"},{"key":"number19","value":"13"},{"key":"number22","value":"16"},{"key":"number07","value":"07"},{"key":"number18","value":"12"},{"key":"number11","value":"0b"},{"key":"number28","value":"1c"},{"key":"number17","value":"11"}] + GET http://[HOST]:[PORT]/global/block/head/status 200 OK "Waiting for input message" diff --git a/tezt/tests/sc_rollup.ml b/tezt/tests/sc_rollup.ml index 437d63de7e185205f02a6863e33f169fb26f2464..ef9acba3ab26c2d1b19e4c6c039797d680ec90df 100644 --- a/tezt/tests/sc_rollup.ml +++ b/tezt/tests/sc_rollup.ml @@ -4700,8 +4700,46 @@ let test_rpcs ~kind in Check.((kernel_subkeys = ["boot.wasm"; "env"]) (list string)) ~error_msg:"The key's subkeys are %L but should be %R" ; - return () - | "riscv" -> return () + + Log.info "Add elements in the durable storage" ; + (* Stop the rollup node. *) + let* () = Sc_rollup_node.terminate sc_rollup_node in + + let elements = + List.init 30 (fun i -> + (Format.sprintf "number%02d" i, Format.sprintf "%02x" i)) + in + let* () = + Lwt_list.iter_s + (fun (key, value) -> + Sc_rollup_node.patch_durable_storage + sc_rollup_node + ~key:("/numbers/" ^ key) + ~value) + elements + in + let* () = + Sc_rollup_node.run ~event_level:`Debug sc_rollup_node sc_rollup [] + in + + let* number_values = + Sc_rollup_node.RPC.call sc_rollup_node ~rpc_hooks + @@ Sc_rollup_rpc.get_global_block_durable_state_value + ~pvm_kind:kind + ~operation:Sc_rollup_rpc.Values + ~key:"/numbers" + () + in + let number_values = + List.fast_sort + (fun (k1, _) (k2, _) -> String.compare k1 k2) + number_values + in + Check.((number_values = elements) (list (tuple2 string string))) + ~error_msg:"/numbers has %L but should contain values for %R" ; + + unit + | "riscv" -> unit | _ -> failwith "incorrect kind" in let* _status =