From 0501ca4a6f6b18a1b348b6b5cdfb807be292ffd5 Mon Sep 17 00:00:00 2001 From: martintomazic Date: Tue, 1 Nov 2022 11:15:38 +0100 Subject: [PATCH] DAL: Refactor dal rpc endpoints encodings to bytes It is important we are not returning or receiving data encoded as string when working with general/abstract payload. The reason for it is that there are many bytes sequences that do not correspong to the valid UTF-8 string which is used for encoding strings in JSON. --- src/bin_dal_node/RPC_server.ml | 3 +-- src/lib_dal_node/dal_node_client.mli | 2 +- src/lib_dal_node_services/services.ml | 4 ++-- tezt/lib_tezos/rollup.ml | 15 +++++++++++--- tezt/tests/dal.ml | 30 +++++++++------------------ 5 files changed, 26 insertions(+), 28 deletions(-) diff --git a/src/bin_dal_node/RPC_server.ml b/src/bin_dal_node/RPC_server.ml index c913a33bc7d4..ce6bff0f3e18 100644 --- a/src/bin_dal_node/RPC_server.ml +++ b/src/bin_dal_node/RPC_server.ml @@ -32,7 +32,6 @@ open Tezos_dal_node_services let handle_split_slot ctxt fill slot = let open Lwt_result_syntax in let*? {dal_parameters; dal_constants; _} = Node_context.get_ready ctxt in - let slot = String.to_bytes slot in let slot = if fill then Slot_manager.Utils.fill_x00 dal_parameters.Cryptobox.slot_size slot @@ -59,7 +58,7 @@ let handle_slot ctxt (_, commitment) trim () = commitment in let slot = if trim then Slot_manager.Utils.trim_x00 slot else slot in - return (String.of_bytes slot) + return slot let handle_stored_slot_headers ctxt (_, block_hash) () () = let open Lwt_result_syntax in diff --git a/src/lib_dal_node/dal_node_client.mli b/src/lib_dal_node/dal_node_client.mli index 26c019f4697e..ae69e9265394 100644 --- a/src/lib_dal_node/dal_node_client.mli +++ b/src/lib_dal_node/dal_node_client.mli @@ -42,7 +42,7 @@ class unix_cctxt : val make_unix_cctxt : addr:string -> port:int -> cctxt val get_slot : - #cctxt -> ?trim_slot:bool -> Cryptobox.Commitment.t -> string tzresult Lwt.t + #cctxt -> ?trim_slot:bool -> Cryptobox.Commitment.t -> bytes tzresult Lwt.t val get_shard : #cctxt -> Cryptobox.Commitment.t -> int -> Cryptobox.shard tzresult Lwt.t diff --git a/src/lib_dal_node_services/services.ml b/src/lib_dal_node_services/services.ml index a1d8ddf28cc1..b137dcc89d8e 100644 --- a/src/lib_dal_node_services/services.ml +++ b/src/lib_dal_node_services/services.ml @@ -34,7 +34,7 @@ let split_slot () = RPC_service.post_service ~description:"Split and store a slot" ~query:split_query - ~input:Data_encoding.string + ~input:Data_encoding.bytes ~output:Data_encoding.string (* see [Slot_manager.Slot_header.to_b58check] *) RPC_path.(open_root / "slot" / "split") @@ -49,7 +49,7 @@ let slot () = RPC_service.get_service ~description:"Show content of a slot" ~query:slot_query - ~output:Data_encoding.string + ~output:Data_encoding.bytes RPC_path.(open_root / "slot" / "content" /: Cryptobox.Commitment.rpc_arg) let slot_pages () = diff --git a/tezt/lib_tezos/rollup.ml b/tezt/lib_tezos/rollup.ml index 0812760c51bf..47882229ee75 100644 --- a/tezt/lib_tezos/rollup.ml +++ b/tezt/lib_tezos/rollup.ml @@ -540,11 +540,20 @@ module Dal = struct ~get_host:Dal_node.rpc_host ~get_port:Dal_node.rpc_port + (** [encode_bytes_for_json raw] encodes arbitrary byte sequence as hex string for JSON *) + let encode_bytes_to_hex_string raw = + "\"" ^ match Hex.of_string raw with `Hex s -> s ^ "\"" + + let decode_hex_string_to_bytes s = Hex.to_string (`Hex s) + + let get_bytes_from_json_string_node json = + JSON.as_string json |> decode_hex_string_to_bytes + let split_slot slot = let slot = JSON.parse ~origin:"dal_node_split_slot_rpc" - (Format.sprintf "\"%s\"" slot) + (encode_bytes_to_hex_string slot) in let data = JSON.unannotate slot in make @@ -559,11 +568,11 @@ module Dal = struct GET ["slot"; "content"; slot_header] ~query_string:[("trim", "")] - JSON.as_string + get_bytes_from_json_string_node let slot_pages slot_header = make GET ["slot"; "pages"; slot_header] (fun pages -> - pages |> JSON.as_list |> List.map JSON.as_string) + pages |> JSON.as_list |> List.map get_bytes_from_json_string_node) let stored_slot_headers block_hash = make GET ["stored_slot_headers"; block_hash] @@ fun json -> diff --git a/tezt/tests/dal.ml b/tezt/tests/dal.ml index bd8b8516654b..1e7bc2085522 100644 --- a/tezt/tests/dal.ml +++ b/tezt/tests/dal.ml @@ -498,6 +498,8 @@ let init_dal_node protocol = let* () = Dal_node.run dal_node in return (node, client, dal_node) +let split_slot node slot = RPC.call node (Rollup.Dal.RPC.split_slot slot) + let test_dal_node_slot_management = Protocol.register_test ~__FILE__ @@ -506,10 +508,8 @@ let test_dal_node_slot_management = ~supports:Protocol.(From_protocol (Protocol.number Alpha)) @@ fun protocol -> let* _node, _client, dal_node = init_dal_node protocol in - let slot_content = "test" in - let* slot_header = - RPC.call dal_node (Rollup.Dal.RPC.split_slot slot_content) - in + let slot_content = "test with invalid UTF-8 byte sequence \xFA" in + let* slot_header = split_slot dal_node slot_content in let* received_slot_content = RPC.call dal_node (Rollup.Dal.RPC.slot_content slot_header) in @@ -522,7 +522,7 @@ let test_dal_node_slot_management = return () let publish_and_store_slot node client dal_node source index content = - let* slot_header = RPC.call dal_node (Rollup.Dal.RPC.split_slot content) in + let* slot_header = split_slot dal_node content in let commitment = Tezos_crypto_dal.Cryptobox.Commitment.of_b58check_opt slot_header |> mandatory "The b58check-encoded slot header is not valid" @@ -635,12 +635,8 @@ let test_dal_node_test_slots_propagation = let* () = Dal_node.run dal_node2 in let* () = Dal_node.run dal_node3 in let* () = Dal_node.run dal_node4 in - let* slot_header1 = - RPC.call dal_node1 (Rollup.Dal.RPC.split_slot "content1") - in - let* slot_header2 = - RPC.call dal_node2 (Rollup.Dal.RPC.split_slot "content2") - in + let* slot_header1 = split_slot dal_node1 "content1" in + let* slot_header2 = split_slot dal_node2 "content2" in Lwt.join [ wait_for_stored_slot dal_node3 slot_header1; @@ -714,17 +710,11 @@ let rollup_node_stores_dal_slots ?expand_test _protocol dal_node sc_rollup_node (* 1. Send three slots to dal node and obtain corresponding headers. *) let slot_contents_0 = " 10 " in - let* commitment_0 = - RPC.call dal_node (Rollup.Dal.RPC.split_slot slot_contents_0) - in + let* commitment_0 = split_slot dal_node slot_contents_0 in let slot_contents_1 = " 200 " in - let* commitment_1 = - RPC.call dal_node (Rollup.Dal.RPC.split_slot slot_contents_1) - in + let* commitment_1 = split_slot dal_node slot_contents_1 in let slot_contents_2 = " 400 " in - let* commitment_2 = - RPC.call dal_node (Rollup.Dal.RPC.split_slot slot_contents_2) - in + let* commitment_2 = split_slot dal_node slot_contents_2 in (* 2. Run rollup node for an originated rollup. *) let* genesis_info = RPC.Client.call ~hooks client -- GitLab