From 73045e87cfa797a81176bc4c8f4af6c67d9d7806 Mon Sep 17 00:00:00 2001 From: Mathias Bourgoin Date: Wed, 6 Mar 2024 14:24:19 +0100 Subject: [PATCH 1/3] Proto_plugin/RPC: Add is_forbidden RPC for delegates --- src/proto_alpha/lib_plugin/RPC.ml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/proto_alpha/lib_plugin/RPC.ml b/src/proto_alpha/lib_plugin/RPC.ml index 8e75cd9e5d4a..25328eb92e51 100644 --- a/src/proto_alpha/lib_plugin/RPC.ml +++ b/src/proto_alpha/lib_plugin/RPC.ml @@ -4122,6 +4122,15 @@ module Staking = struct ~query:RPC_query.empty ~output:stakers_encoding RPC_path.(path / "stakers") + + let is_forbidden = + RPC_service.get_service + ~description: + "Returns true if the delegate is forbidden to participate in \ + consensus." + ~query:RPC_query.empty + ~output:Data_encoding.bool + RPC_path.(path / "is_forbidden") end let contract_stake ctxt ~delegator_contract ~delegate = @@ -4149,7 +4158,13 @@ module Staking = struct if result then return_unit else Environment.Error_monad.tzfail (Delegate_services.Not_registered pkh) + let check_is_forbidden ctxt pkh = + let open Lwt_result_syntax in + return @@ Delegate.is_forbidden_delegate ctxt pkh + let register () = + Registration.register1 ~chunked:false S.is_forbidden (fun ctxt pkh () () -> + check_is_forbidden ctxt pkh) ; Registration.register1 ~chunked:true S.stakers (fun ctxt pkh () () -> let open Lwt_result_syntax in let* () = check_delegate_registered ctxt pkh in -- GitLab From 7d9599c52c08c12ff68a639349f0ac223ec27b91 Mon Sep 17 00:00:00 2001 From: Mathias Bourgoin Date: Wed, 6 Mar 2024 14:50:46 +0100 Subject: [PATCH 2/3] test/adaptive_issuance: check double baker is forbidden right after denunciation --- tezt/lib_tezos/RPC.ml | 16 ++++++++++++++++ tezt/lib_tezos/RPC.mli | 7 +++++++ tezt/tests/adaptive_issuance.ml | 15 +++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/tezt/lib_tezos/RPC.ml b/tezt/lib_tezos/RPC.ml index 994df27dbcb5..0c0d19647452 100644 --- a/tezt/lib_tezos/RPC.ml +++ b/tezt/lib_tezos/RPC.ml @@ -1285,6 +1285,22 @@ let get_chain_block_context_delegate_stakers ?(chain = "main") ?(block = "head") ["chains"; chain; "blocks"; block; "context"; "delegates"; pkh; "stakers"] Fun.id +let get_chain_block_context_delegate_is_forbidden ?(chain = "main") + ?(block = "head") pkh = + make + GET + [ + "chains"; + chain; + "blocks"; + block; + "context"; + "delegates"; + pkh; + "is_forbidden"; + ] + JSON.as_bool + let get_chain_block_context_delegate_total_delegated_stake ?(chain = "main") ?(block = "head") pkh = make diff --git a/tezt/lib_tezos/RPC.mli b/tezt/lib_tezos/RPC.mli index 299fc9e167ed..2ef52111f3c3 100644 --- a/tezt/lib_tezos/RPC.mli +++ b/tezt/lib_tezos/RPC.mli @@ -1077,6 +1077,13 @@ val get_chain_block_context_delegate_delegated_contracts : val get_chain_block_context_delegate_stakers : ?chain:string -> ?block:string -> string -> JSON.t t +(** RPC: [GET /chains//blocks//context/delegates//is_forbidden] + + [chain] defaults to ["main"]. + [block] defaults to ["head"]. *) +val get_chain_block_context_delegate_is_forbidden : + ?chain:string -> ?block:string -> string -> bool t + (** RPC: [GET /chains//blocks//context/delegates//total_delegated_stake] [chain] defaults to ["main"]. diff --git a/tezt/tests/adaptive_issuance.ml b/tezt/tests/adaptive_issuance.ml index 0f5e2ef93df7..55180da7d0d3 100644 --- a/tezt/tests/adaptive_issuance.ml +++ b/tezt/tests/adaptive_issuance.ml @@ -1045,6 +1045,13 @@ let test_staking = let* _ = Node.wait_for_level node_2 (common_ancestor + node_2_branch_size) in + (* Bootstrap2 has not yet been denounced, check it is not forbidden *) + let* is_forbidden = + Client.RPC.call client_2 + @@ RPC.get_chain_block_context_delegate_is_forbidden + Constant.bootstrap2.public_key_hash + in + assert (not is_forbidden) ; log_step 16 "Run Node 3, bake one block and wait for the accuser to be ready." ; let* node_3 = Node.init [Synchronisation_threshold 0; Private_mode] in let* client_3 = Client.init ~endpoint:(Node node_3) () in @@ -1088,6 +1095,14 @@ let test_staking = else Test.fail "Double baking evidence was not found" in + (* Bootstrap2 has been denounced, check it is not forbidden *) + let* is_forbidden = + Client.RPC.call client_1 + @@ RPC.get_chain_block_context_delegate_is_forbidden + Constant.bootstrap2.public_key_hash + in + assert is_forbidden ; + (* Bake a cycle to wait for the slashing *) let* () = Helpers.bake_n_cycles -- GitLab From 5fddc2ba4db07626bcdb68fca0dee5e052acaa97 Mon Sep 17 00:00:00 2001 From: Mathias Bourgoin Date: Wed, 6 Mar 2024 15:22:24 +0100 Subject: [PATCH 3/3] changes: add new is_forbidden RPC --- CHANGES.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ff5e09b75308..e1f7110c42ce 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -78,6 +78,10 @@ Node ``{"acl":"ban"}``, ``{"acl":"open"}`` (for both unban and untrust) or ``{"acl":"trust"}`` instead. (MR :gl:`!12289`) +- Introduced a new RPC ``GET + /chains/main/blocks//context/delegates//is_forbidden``, to check + if a delegate is forbidden after being denounced for misbehaving. (MR :gl:`!12341`) + Client ------ -- GitLab