From 70e94c9416662841b5746505617507910a211f99 Mon Sep 17 00:00:00 2001 From: Albin Coquereau Date: Mon, 5 Jun 2023 14:37:52 +0200 Subject: [PATCH 1/5] lib_shell: improve rpc versioning for pending_operations rpc --- src/lib_mockup/local_services.ml | 4 +- src/lib_shell/prevalidator.ml | 4 +- src/lib_shell/prevalidator_internal.ml | 4 +- src/lib_shell_services/block_services.ml | 61 ++++++++----------- src/lib_shell_services/block_services.mli | 10 ++- .../test/mockup_simulator/faked_services.ml | 6 +- .../test/mockup_simulator/faked_services.ml | 6 +- .../test/mockup_simulator/faked_services.ml | 6 +- 8 files changed, 40 insertions(+), 61 deletions(-) diff --git a/src/lib_mockup/local_services.ml b/src/lib_mockup/local_services.ml index 928eb3248067..052aa0d0b7bd 100644 --- a/src/lib_mockup/local_services.ml +++ b/src/lib_mockup/local_services.ml @@ -383,9 +383,7 @@ module Make (E : MENV) = struct match pending_operations with | Error errs -> Tezos_rpc.Answer.fail errs | Ok pending_operations -> - E.Block_services.Mempool.pending_operations_version_dispatcher - ~version:params#version - pending_operations) + Tezos_rpc.Answer.return (params#version, pending_operations)) let shell_header () = Directory.prefix diff --git a/src/lib_shell/prevalidator.ml b/src/lib_shell/prevalidator.ml index dd236c46793f..a422c4b9abca 100644 --- a/src/lib_shell/prevalidator.ml +++ b/src/lib_shell/prevalidator.ml @@ -150,9 +150,7 @@ let empty_rpc_directory : unit Tezos_rpc.Directory.t = unprocessed = Operation_hash.Map.empty; } in - Block_services.Empty.Mempool.pending_operations_version_dispatcher - ~version:params#version - pending_operations) + Tezos_rpc.Answer.return (params#version, pending_operations)) let rpc_directory : t option Tezos_rpc.Directory.t = Tezos_rpc.Directory.register_dynamic_directory diff --git a/src/lib_shell/prevalidator_internal.ml b/src/lib_shell/prevalidator_internal.ml index cf79f8887d1c..57f8bbc67ef5 100644 --- a/src/lib_shell/prevalidator_internal.ml +++ b/src/lib_shell/prevalidator_internal.ml @@ -1071,9 +1071,7 @@ module Make unprocessed; } in - Proto_services.Mempool.pending_operations_version_dispatcher - ~version:params#version - pending_operations) ; + Tezos_rpc.Answer.return (params#version, pending_operations)) ; dir := Tezos_rpc.Directory.register !dir diff --git a/src/lib_shell_services/block_services.ml b/src/lib_shell_services/block_services.ml index 00c0dfe5c085..ed0197c59596 100644 --- a/src/lib_shell_services/block_services.ml +++ b/src/lib_shell_services/block_services.ml @@ -1156,8 +1156,24 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct (* This encoding should be always the one by default. *) let encoding = version_1_encoding - (* If you change this value, also change [encoding]. *) - let default_pending_operations_version = 1 + type version = Version_0 | Version_1 + + let string_of_version = function Version_0 -> "0" | Version_1 -> "1" + + let version_of_string = function + | "0" -> Ok Version_0 + | "1" -> Ok Version_1 + | _ -> Error "Cannot parse version (supported versions \"0\" and \"1\")" + + let default_pending_operations_version = Version_1 + + let version_arg = + let open Tezos_rpc.Arg in + make + ~name:"version" + ~destruct:version_of_string + ~construct:string_of_version + () let pending_query = let open Tezos_rpc.Query in @@ -1188,7 +1204,7 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct end) |+ field "version" - Tezos_rpc.Arg.int + version_arg default_pending_operations_version (fun t -> t#version) |+ field @@ -1229,12 +1245,6 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct (fun t -> t#validation_passes) |> seal - (* If you update this datatype, please update also [supported_version]. *) - type t_with_version = Version_0 of t | Version_1 of t - - (* This value should be consistent with [t_with_version]. *) - let supported_version = [0; 1] - let pending_operations_encoding = union [ @@ -1243,30 +1253,19 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct (Tag 1) version_1_encoding (function - | Version_1 pending_operations -> Some pending_operations - | Version_0 _ -> None) - (fun pending_operations -> Version_1 pending_operations); + | Version_1, pending_operations -> Some pending_operations + | Version_0, _ -> None) + (fun pending_operations -> (Version_1, pending_operations)); case ~title:"old_encoding_pending_operations" Json_only version_0_encoding (function - | Version_0 pending_operations -> Some pending_operations - | Version_1 _ -> None) - (fun pending_operations -> Version_0 pending_operations); + | Version_0, pending_operations -> Some pending_operations + | Version_1, _ -> None) + (fun pending_operations -> (Version_0, pending_operations)); ] - let pending_operations_version_dispatcher ~version pending_operations = - if version = 0 then - Tezos_rpc.Answer.return (Version_0 pending_operations) - else if version = 1 then - Tezos_rpc.Answer.return (Version_1 pending_operations) - else - Tezos_rpc.Answer.fail - (Tezos_rpc.Error.bad_version - ~given:version - ~supported:supported_version) - let pending_operations path = Tezos_rpc.Service.get_service ~description:"List the prevalidated operations." @@ -1683,12 +1682,7 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct unprocessed : Next_proto.operation Operation_hash.Map.t; } - type t_with_version = S.Mempool.t_with_version = - | Version_0 of t - | Version_1 of t - - let pending_operations_version_dispatcher = - S.Mempool.pending_operations_version_dispatcher + type version = S.Mempool.version = Version_0 | Version_1 let pending_operations ctxt ?(chain = `Main) ?(version = S.Mempool.default_pending_operations_version) @@ -1718,8 +1712,7 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct () in match v with - | Version_1 pending_operations | Version_0 pending_operations -> - return pending_operations + | (Version_1 | Version_0), pending_operations -> return pending_operations let ban_operation ctxt ?(chain = `Main) op_hash = let s = S.Mempool.ban_operation (mempool_path chain_path) in diff --git a/src/lib_shell_services/block_services.mli b/src/lib_shell_services/block_services.mli index 7e42ae7de9ef..fe23ba99a71e 100644 --- a/src/lib_shell_services/block_services.mli +++ b/src/lib_shell_services/block_services.mli @@ -406,10 +406,8 @@ module Make (Proto : PROTO) (Next_proto : PROTO) : sig unprocessed : Next_proto.operation Operation_hash.Map.t; } - type t_with_version + type version = Version_0 | Version_1 - val pending_operations_version_dispatcher : - version:int -> t -> t_with_version Tezos_rpc.Answer.t Lwt.t (** Call RPC GET /chains/[chain]/mempool/pending_operations @@ -423,7 +421,7 @@ module Make (Proto : PROTO) (Next_proto : PROTO) : sig val pending_operations : #simple -> ?chain:chain -> - ?version:int -> + ?version:version -> ?applied:bool -> ?branch_delayed:bool -> ?branch_refused:bool -> @@ -728,7 +726,7 @@ module Make (Proto : PROTO) (Next_proto : PROTO) : sig ( [`GET], 'a, 'b, - < version : int + < version : Mempool.version ; applied : bool ; branch_delayed : bool ; branch_refused : bool @@ -736,7 +734,7 @@ module Make (Proto : PROTO) (Next_proto : PROTO) : sig ; outdated : bool ; validation_passes : int list >, unit, - Mempool.t_with_version ) + Mempool.version * Mempool.t ) Tezos_rpc.Service.t (** Define RPC POST /chains/[chain]/mempool/ban_operation *) diff --git a/src/proto_016_PtMumbai/lib_delegate/test/mockup_simulator/faked_services.ml b/src/proto_016_PtMumbai/lib_delegate/test/mockup_simulator/faked_services.ml index b2770d9bdd69..9f460b758f89 100644 --- a/src/proto_016_PtMumbai/lib_delegate/test/mockup_simulator/faked_services.ml +++ b/src/proto_016_PtMumbai/lib_delegate/test/mockup_simulator/faked_services.ml @@ -268,11 +268,9 @@ module Make (Hooks : Mocked_services_hooks) = struct Directory.empty (Mockup.M.Block_services.S.Mempool.pending_operations @@ Block_services.mempool_path Block_services.chain_path) - (fun ((), _chain) _params () -> + (fun ((), _chain) params () -> Hooks.pending_operations () >>= fun mempool -> - Mockup.M.Block_services.Mempool.pending_operations_version_dispatcher - ~version:1 - mempool) + Tezos_rpc.Answer.return (params#version, mempool)) let monitor_operations = Directory.gen_register diff --git a/src/proto_017_PtNairob/lib_delegate/test/mockup_simulator/faked_services.ml b/src/proto_017_PtNairob/lib_delegate/test/mockup_simulator/faked_services.ml index e99d009738bf..30712519636e 100644 --- a/src/proto_017_PtNairob/lib_delegate/test/mockup_simulator/faked_services.ml +++ b/src/proto_017_PtNairob/lib_delegate/test/mockup_simulator/faked_services.ml @@ -257,11 +257,9 @@ module Make (Hooks : Mocked_services_hooks) = struct Directory.empty (Mockup.M.Block_services.S.Mempool.pending_operations @@ Block_services.mempool_path Block_services.chain_path) - (fun ((), _chain) _params () -> + (fun ((), _chain) params () -> Hooks.pending_operations () >>= fun mempool -> - Mockup.M.Block_services.Mempool.pending_operations_version_dispatcher - ~version:1 - mempool) + Tezos_rpc.Answer.return (params#version, mempool)) let monitor_operations = Directory.gen_register diff --git a/src/proto_alpha/lib_delegate/test/mockup_simulator/faked_services.ml b/src/proto_alpha/lib_delegate/test/mockup_simulator/faked_services.ml index e99d009738bf..30712519636e 100644 --- a/src/proto_alpha/lib_delegate/test/mockup_simulator/faked_services.ml +++ b/src/proto_alpha/lib_delegate/test/mockup_simulator/faked_services.ml @@ -257,11 +257,9 @@ module Make (Hooks : Mocked_services_hooks) = struct Directory.empty (Mockup.M.Block_services.S.Mempool.pending_operations @@ Block_services.mempool_path Block_services.chain_path) - (fun ((), _chain) _params () -> + (fun ((), _chain) params () -> Hooks.pending_operations () >>= fun mempool -> - Mockup.M.Block_services.Mempool.pending_operations_version_dispatcher - ~version:1 - mempool) + Tezos_rpc.Answer.return (params#version, mempool)) let monitor_operations = Directory.gen_register -- GitLab From 6ec2054a82826ee2997a44743230bf5bef77f2ad Mon Sep 17 00:00:00 2001 From: Albin Coquereau Date: Fri, 2 Jun 2023 15:33:33 +0200 Subject: [PATCH 2/5] lib_shell_services: allow pending_operations to output attestation kind --- src/lib_shell_services/block_services.ml | 86 +++++++++++++++++------ src/lib_shell_services/block_services.mli | 3 +- 2 files changed, 67 insertions(+), 22 deletions(-) diff --git a/src/lib_shell_services/block_services.ml b/src/lib_shell_services/block_services.ml index ed0197c59596..b45d2d02f0df 100644 --- a/src/lib_shell_services/block_services.ml +++ b/src/lib_shell_services/block_services.ml @@ -482,7 +482,7 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct (dynamic_size (list operation_list_quota_encoding)))) Proto.block_header_metadata_encoding) - let next_operation_encoding = + let next_operation_encoding_with_legacy_attestation_name = let open Data_encoding in def "next_operation" @@ conv @@ -496,6 +496,18 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct Next_proto .operation_data_encoding_with_legacy_attestation_name))) + let next_operation_encoding = + let open Data_encoding in + def "next_operation" + @@ conv + (fun Next_proto.{shell; protocol_data} -> ((), (shell, protocol_data))) + (fun ((), (shell, protocol_data)) -> {shell; protocol_data}) + (merge_objs + (obj1 (req "protocol" (constant next_protocol_hash))) + (merge_objs + (dynamic_size Operation.shell_header_encoding) + (dynamic_size Next_proto.operation_data_encoding))) + type operation_receipt = | Empty | Too_large @@ -856,7 +868,10 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct (dynamic_size Next_proto.block_header_data_encoding)))) (req "operations" - (list (dynamic_size (list next_operation_encoding))))) + (list + (dynamic_size + (list + next_operation_encoding_with_legacy_attestation_name))))) let block_query = let open Tezos_rpc.Query in @@ -887,7 +902,7 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct the given block and return the result of each operation \ application." ~query:Tezos_rpc.Query.empty - ~input:(list next_operation_encoding) + ~input:(list next_operation_encoding_with_legacy_attestation_name) ~output: (list (dynamic_size @@ -1054,32 +1069,42 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct "refused" (Operation_hash.Map.encoding (merge_objs - (dynamic_size next_operation_encoding) + (dynamic_size + next_operation_encoding_with_legacy_attestation_name) (obj1 (req "error" Tezos_rpc.Error.encoding))))) (req "outdated" (Operation_hash.Map.encoding (merge_objs - (dynamic_size next_operation_encoding) + (dynamic_size + next_operation_encoding_with_legacy_attestation_name) (obj1 (req "error" Tezos_rpc.Error.encoding))))) (req "branch_refused" (Operation_hash.Map.encoding (merge_objs - (dynamic_size next_operation_encoding) + (dynamic_size + next_operation_encoding_with_legacy_attestation_name) (obj1 (req "error" Tezos_rpc.Error.encoding))))) (req "branch_delayed" (Operation_hash.Map.encoding (merge_objs - (dynamic_size next_operation_encoding) + (dynamic_size + next_operation_encoding_with_legacy_attestation_name) (obj1 (req "error" Tezos_rpc.Error.encoding))))) (req "unprocessed" (Operation_hash.Map.encoding - (dynamic_size next_operation_encoding)))) - - let version_1_encoding = + (dynamic_size + next_operation_encoding_with_legacy_attestation_name)))) + + let version_1_encoding ~use_legacy_name = + let next_operation_encoding = + if use_legacy_name then + next_operation_encoding_with_legacy_attestation_name + else next_operation_encoding + in let operations_with_error_encoding kind = req kind @@ -1136,8 +1161,10 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct (obj1 (req "hash" Operation_hash.encoding)) Operation.shell_header_encoding) (dynamic_size - Next_proto - .operation_data_encoding_with_legacy_attestation_name))))) + (if use_legacy_name then + Next_proto + .operation_data_encoding_with_legacy_attestation_name + else Next_proto.operation_data_encoding)))))) (operations_with_error_encoding "refused") (operations_with_error_encoding "outdated") (operations_with_error_encoding "branch_refused") @@ -1153,17 +1180,27 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct (obj1 (req "hash" Operation_hash.encoding)) next_operation_encoding))))) + let version_2_encoding = version_1_encoding ~use_legacy_name:false + + let version_1_encoding = version_1_encoding ~use_legacy_name:true + (* This encoding should be always the one by default. *) let encoding = version_1_encoding - type version = Version_0 | Version_1 + type version = Version_0 | Version_1 | Version_2 - let string_of_version = function Version_0 -> "0" | Version_1 -> "1" + let string_of_version = function + | Version_0 -> "0" + | Version_1 -> "1" + | Version_2 -> "2" let version_of_string = function | "0" -> Ok Version_0 | "1" -> Ok Version_1 - | _ -> Error "Cannot parse version (supported versions \"0\" and \"1\")" + | "2" -> Ok Version_2 + | _ -> + Error + "Cannot parse version (supported versions \"0\", \"1\" and \"2\")" let default_pending_operations_version = Version_1 @@ -1248,13 +1285,21 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct let pending_operations_encoding = union [ + case + ~title:"new_encoding_pending_operations_with_attestation" + (Tag 2) + version_2_encoding + (function + | Version_2, pending_operations -> Some pending_operations + | (Version_0 | Version_1), _ -> None) + (fun pending_operations -> (Version_2, pending_operations)); case ~title:"new_encoding_pending_operations" (Tag 1) version_1_encoding (function | Version_1, pending_operations -> Some pending_operations - | Version_0, _ -> None) + | (Version_0 | Version_2), _ -> None) (fun pending_operations -> (Version_1, pending_operations)); case ~title:"old_encoding_pending_operations" @@ -1262,7 +1307,7 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct version_0_encoding (function | Version_0, pending_operations -> Some pending_operations - | Version_1, _ -> None) + | (Version_1 | Version_2), _ -> None) (fun pending_operations -> (Version_0, pending_operations)); ] @@ -1372,7 +1417,7 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct merge_objs (merge_objs (obj1 (req "hash" Operation_hash.encoding)) - next_operation_encoding) + next_operation_encoding_with_legacy_attestation_name) (obj1 (dft "error" Tezos_rpc.Error.opt_encoding None)) let monitor_operations path = @@ -1682,7 +1727,7 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct unprocessed : Next_proto.operation Operation_hash.Map.t; } - type version = S.Mempool.version = Version_0 | Version_1 + type version = S.Mempool.version = Version_0 | Version_1 | Version_2 let pending_operations ctxt ?(chain = `Main) ?(version = S.Mempool.default_pending_operations_version) @@ -1712,7 +1757,8 @@ module Make (Proto : PROTO) (Next_proto : PROTO) = struct () in match v with - | (Version_1 | Version_0), pending_operations -> return pending_operations + | (Version_2 | Version_1 | Version_0), pending_operations -> + return pending_operations let ban_operation ctxt ?(chain = `Main) op_hash = let s = S.Mempool.ban_operation (mempool_path chain_path) in diff --git a/src/lib_shell_services/block_services.mli b/src/lib_shell_services/block_services.mli index fe23ba99a71e..f6cf9ef2f7c1 100644 --- a/src/lib_shell_services/block_services.mli +++ b/src/lib_shell_services/block_services.mli @@ -406,8 +406,7 @@ module Make (Proto : PROTO) (Next_proto : PROTO) : sig unprocessed : Next_proto.operation Operation_hash.Map.t; } - type version = Version_0 | Version_1 - + type version = Version_0 | Version_1 | Version_2 (** Call RPC GET /chains/[chain]/mempool/pending_operations -- GitLab From 92fc95b155a192239b1c46c1c7042b8dddda76bd Mon Sep 17 00:00:00 2001 From: Albin Coquereau Date: Fri, 2 Jun 2023 15:20:39 +0200 Subject: [PATCH 3/5] tezt/tests: add pending_operations tests for consensus operations --- tezt/tests/rpc_versioning_attestation.ml | 49 +++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/tezt/tests/rpc_versioning_attestation.ml b/tezt/tests/rpc_versioning_attestation.ml index 5bfafdf0384a..8bd7a7c8e008 100644 --- a/tezt/tests/rpc_versioning_attestation.ml +++ b/tezt/tests/rpc_versioning_attestation.ml @@ -405,6 +405,53 @@ module Parse = struct test_parse_double_preconsensus_evidence protocols end +module Mempool = struct + let test_pending_operations_consensus kind protocol = + let* _node, client = Client.init_with_protocol ~protocol `Client () in + let signer = Constant.bootstrap1 in + + let* consensus_op = + create_consensus_op ~use_legacy_name:true ~signer ~kind client + in + let* (`OpHash _) = + Operation.inject ~force:true ~request:`Inject consensus_op client + in + + let check_mempool ~use_legacy_name = + let* mempool_json = + RPC.Client.call client + @@ RPC.get_chain_mempool_pending_operations + ~version:(if use_legacy_name then "1" else "2") + () + in + return + (check_kind + JSON.(mempool_json |-> "refused" |> as_list |> List.hd) + (Operation.Consensus.kind_to_string kind use_legacy_name)) + in + let* () = check_mempool ~use_legacy_name:true in + check_mempool ~use_legacy_name:false + + let test_pending_consensus = + register_test + ~title:"Pending consensus operations" + ~additionnal_tags:["mempool"; "pending"; "operations"; "consensus"] + @@ fun protocol -> + test_pending_operations_consensus Operation.Attestation protocol + + let test_pending_preconsensus = + register_test + ~title:"Pending pre-consensus operations" + ~additionnal_tags:["mempool"; "pending"; "operations"; "consensus"; "pre"] + @@ fun protocol -> + test_pending_operations_consensus Operation.Preattestation protocol + + let register ~protocols = + test_pending_consensus protocols ; + test_pending_preconsensus protocols +end + let register ~protocols = Forge.register ~protocols ; - Parse.register ~protocols + Parse.register ~protocols ; + Mempool.register ~protocols -- GitLab From d56f229a0f2c4b18a9c6857ac72c9dc8f3e60362 Mon Sep 17 00:00:00 2001 From: Albin Coquereau Date: Fri, 2 Jun 2023 15:45:15 +0200 Subject: [PATCH 4/5] tezt/tests: add pending_operations tests for double consensus evidence operation --- tezt/tests/rpc_versioning_attestation.ml | 63 +++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/tezt/tests/rpc_versioning_attestation.ml b/tezt/tests/rpc_versioning_attestation.ml index 8bd7a7c8e008..b7b60dcf1455 100644 --- a/tezt/tests/rpc_versioning_attestation.ml +++ b/tezt/tests/rpc_versioning_attestation.ml @@ -446,9 +446,70 @@ module Mempool = struct @@ fun protocol -> test_pending_operations_consensus Operation.Preattestation protocol + let test_pending_operations_double_consensus_evidence double_evidence_kind + protocol = + let* _node, client = Client.init_with_protocol ~protocol `Client () in + + let* consensus_op = + create_double_consensus_evidence + ~use_legacy_name:true + ~double_evidence_kind + client + in + let* (`OpHash _) = + Operation.inject ~force:true ~request:`Inject consensus_op client + in + + let check_mempool ~use_legacy_name = + let* mempool_json = + RPC.Client.call client + @@ RPC.get_chain_mempool_pending_operations + ~version:(if use_legacy_name then "1" else "2") + () + in + return + (check_kind + JSON.(mempool_json |-> "refused" |> as_list |> List.hd) + (Operation.Anonymous.kind_to_string + double_evidence_kind + use_legacy_name)) + in + let* () = check_mempool ~use_legacy_name:true in + check_mempool ~use_legacy_name:false + + let test_pending_double_consensus_evidence = + register_test + ~title:"Pending double consensus evidence operations" + ~additionnal_tags: + ["mempool"; "pending"; "operations"; "double"; "consensus"; "evidence"] + @@ fun protocol -> + test_pending_operations_double_consensus_evidence + Operation.Anonymous.Double_attestation_evidence + protocol + + let test_pending_double_preconsensus_evidence = + register_test + ~title:"Pending double pre-consensus evidence operations" + ~additionnal_tags: + [ + "mempool"; + "pending"; + "operations"; + "double"; + "consensus"; + "pre"; + "evidence"; + ] + @@ fun protocol -> + test_pending_operations_double_consensus_evidence + Operation.Anonymous.Double_preattestation_evidence + protocol + let register ~protocols = test_pending_consensus protocols ; - test_pending_preconsensus protocols + test_pending_preconsensus protocols ; + test_pending_double_consensus_evidence protocols ; + test_pending_double_preconsensus_evidence protocols end let register ~protocols = -- GitLab From 3258d5370adb4f218ec5f892df76a1da4eba0194 Mon Sep 17 00:00:00 2001 From: Albin Coquereau Date: Fri, 2 Jun 2023 15:49:41 +0200 Subject: [PATCH 5/5] changes: add entry for new version parameter of mempool/pending_operations RPC --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 0a7d9926eb05..670a43f9270f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -88,6 +88,12 @@ Node ``preattestation``, ``double_attestation_evidence`` and ``double_preattestation_evidence`` kinds in the JSON result. (MR :gl:`!8840`) +- Added version ``2`` to RPC ``POST ../mempool/pending_operations``. It can be + used by calling the RPC with the parameter ``?version=2`` (default version is + still ``1``). Version ``2`` allows the RPC to output ``attestation``, + ``preattestation``, ``double_attestation_evidence`` and + ``double_preattestation_evidence`` kinds in the JSON result. (MR :gl:`!8960`) + Client ------ - Adding client commands to generate, open and verify a time-lock. -- GitLab