diff --git a/CHANGES.rst b/CHANGES.rst index 02ad0ee57954d8e541fdd4f397aaf15c6172547b..2523d32a16cfe109ec226ee1c5a43abe9001c1c4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -234,6 +234,10 @@ DAL node Protocol ~~~~~~~~ +- Add a new RPC ``GET + /chains//blocks//helpers/total_baking_power`` to retrieve the + total baking power for the current cycle. (MR :gl:`!17553`) + Miscellaneous ------------- diff --git a/src/proto_alpha/lib_plugin/RPC.ml b/src/proto_alpha/lib_plugin/RPC.ml index a7322084585a407279bc7d004ccff341beaf7559..3a46a5d55e4e2b1ead274819c056e8dfcf4c687b 100644 --- a/src/proto_alpha/lib_plugin/RPC.ml +++ b/src/proto_alpha/lib_plugin/RPC.ml @@ -4118,6 +4118,13 @@ module S = struct ~query:RPC_query.empty ~output:int32 RPC_path.(path / "consecutive_round_zero") + + let total_baking_power = + RPC_service.get_service + ~description:"Returns the total baking power for the current cycle" + ~query:RPC_query.empty + ~output:Data_encoding.int64 + RPC_path.(path / "total_baking_power") end type Environment.Error_monad.error += Negative_level_offset @@ -4175,7 +4182,11 @@ let register () = Registration.register0 ~chunked:false S.consecutive_round_zero - (fun ctxt () () -> Consecutive_round_zero.get ctxt) + (fun ctxt () () -> Consecutive_round_zero.get ctxt) ; + Registration.register0 ~chunked:false S.total_baking_power (fun ctxt () () -> + Stake_distribution.For_RPC.total_baking_power + ctxt + (Level.current ctxt).cycle) let current_level ctxt ?(offset = 0l) block = RPC_context.make_call0 S.current_level ctxt block {offset} () diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 23c066b2adffe0f8cd1845cc50df28e8be0f6ff1..cc9d5f7e476abaa2812bad99ef14cb052dea5ccf 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -5159,6 +5159,8 @@ module Stake_distribution : sig module For_RPC : sig val delegate_current_baking_power : context -> Signature.public_key_hash -> int64 tzresult Lwt.t + + val total_baking_power : context -> Cycle.t -> int64 tzresult Lwt.t end module Internal_for_tests : sig diff --git a/src/proto_alpha/lib_protocol/delegate_sampler.ml b/src/proto_alpha/lib_protocol/delegate_sampler.ml index c1bbd6fe150bf659f99c873c6c73a9b880d0cb85..32e4fa07c4ebd3e440253ba7066f78021b1dc867 100644 --- a/src/proto_alpha/lib_protocol/delegate_sampler.ml +++ b/src/proto_alpha/lib_protocol/delegate_sampler.ml @@ -271,4 +271,9 @@ module For_RPC = struct Delegate_staking_parameters.of_delegate ctxt delegate in Lwt.return @@ Stake_context.baking_weight ctxt staking_parameters stake + + let total_baking_power ctxt cycle = + let open Lwt_result_syntax in + let+ total_active_stake = Stake_storage.get_total_active_stake ctxt cycle in + Stake_repr.staking_weight total_active_stake end diff --git a/src/proto_alpha/lib_protocol/delegate_sampler.mli b/src/proto_alpha/lib_protocol/delegate_sampler.mli index e69a05b55769cf3262268f0cd46e2f459e61144c..1afecee5c0eb8b81dda5a8818fbb47462985c062 100644 --- a/src/proto_alpha/lib_protocol/delegate_sampler.mli +++ b/src/proto_alpha/lib_protocol/delegate_sampler.mli @@ -87,4 +87,6 @@ module For_RPC : sig stake. *) val delegate_current_baking_power : Raw_context.t -> Signature.public_key_hash -> int64 tzresult Lwt.t + + val total_baking_power : Raw_context.t -> Cycle_repr.t -> int64 tzresult Lwt.t end diff --git a/tezt/lib_tezos/RPC.ml b/tezt/lib_tezos/RPC.ml index e41353c59a950254c4907519bd46663462188b88..c467331107b9aafd439e1da8970cc95b0fecc6d2 100644 --- a/tezt/lib_tezos/RPC.ml +++ b/tezt/lib_tezos/RPC.ml @@ -889,6 +889,13 @@ let get_chain_block_helper_levels_in_current_cycle ?(chain = "main") ["chains"; chain; "blocks"; block; "helpers"; "levels_in_current_cycle"] Fun.id +let get_chain_block_helper_total_baking_power ?(chain = "main") + ?(block = "head") () = + make + GET + ["chains"; chain; "blocks"; block; "helpers"; "total_baking_power"] + Fun.id + let post_bls_aggregate_signatures sigs = let data = `A (List.map (fun sig_ -> `String sig_) sigs) in make ~data:(Data data) POST ["bls"; "aggregate_signatures"] JSON.as_string diff --git a/tezt/lib_tezos/RPC.mli b/tezt/lib_tezos/RPC.mli index 8687761285609034b0e57ea4f4d84b711e3ff87d..5327c954b6a07879770a63163e70eecaad3bcc38 100644 --- a/tezt/lib_tezos/RPC.mli +++ b/tezt/lib_tezos/RPC.mli @@ -804,6 +804,13 @@ val get_chain_block_helper_validators : val get_chain_block_helper_levels_in_current_cycle : ?chain:string -> ?block:string -> unit -> JSON.t t +(** RPC: [GET /chains//blocks//helpers/total_baking_power] + + [chain] defaults to ["main"]. + [block] defaults to ["head"]. *) +val get_chain_block_helper_total_baking_power : + ?chain:string -> ?block:string -> unit -> JSON.t t + (** RPC: [POST /bls/aggregate_signatures] *) val post_bls_aggregate_signatures : string list -> string t diff --git a/tezt/tests/RPC_test.ml b/tezt/tests/RPC_test.ml index 1bbc6abd2dd1d23242b7d4a65afe8d5d80b2c17d..320a41d920da69881b891f7cec531e06c72de102 100644 --- a/tezt/tests/RPC_test.ml +++ b/tezt/tests/RPC_test.ml @@ -697,7 +697,7 @@ let test_votes _test_mode_tag _protocol ?endpoint client = unit (* Test the various other RPCs. *) -let test_misc_protocol _test_mode_tag _protocol ?endpoint client = +let test_misc_protocol _test_mode_tag protocol ?endpoint client = let* _ = Client.RPC.call ?endpoint ~hooks client @@ RPC.get_chain_block_context_constants () @@ -737,6 +737,15 @@ let test_misc_protocol _test_mode_tag _protocol ?endpoint client = Client.RPC.call ?endpoint ~hooks client @@ RPC.get_chain_block_helper_levels_in_current_cycle () in + let* () = + if Protocol.(number protocol >= 023) then + let* _ = + Client.RPC.call ?endpoint ~hooks client + @@ RPC.get_chain_block_helper_total_baking_power () + in + unit + else unit + in unit let mempool_hooks = diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode client) RPC regression tests- misc_protocol.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode client) RPC regression tests- misc_protocol.out index ed0d9f193cf1558d34437307ec07b59f8d5bffa5..2ce8eb239bdea01c50c5fc0de066d2fb0957a243 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode client) RPC regression tests- misc_protocol.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode client) RPC regression tests- misc_protocol.out @@ -142,3 +142,6 @@ ./octez-client rpc get /chains/main/blocks/head/helpers/levels_in_current_cycle { "first": 1, "last": 8 } + +./octez-client rpc get /chains/main/blocks/head/helpers/total_baking_power +"20000000000000" diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode light) RPC regression tests- misc_protocol.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode light) RPC regression tests- misc_protocol.out index 157e7a80f45f1db88431dcf8c7e1e37dc8813947..8fbf7b8219edb9c706389a6696f778c83c482e7c 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode light) RPC regression tests- misc_protocol.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode light) RPC regression tests- misc_protocol.out @@ -142,3 +142,6 @@ ./octez-client --mode light rpc get /chains/main/blocks/head/helpers/levels_in_current_cycle { "first": 1, "last": 8 } + +./octez-client --mode light rpc get /chains/main/blocks/head/helpers/total_baking_power +"20000000000000" diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy) RPC regression tests- misc_protocol.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy) RPC regression tests- misc_protocol.out index e86b498a64d87f0c2a19f63fe8d8d6552065d86f..6f309d10e18c073117b64509ebd59e9cdcadb209 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy) RPC regression tests- misc_protocol.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy) RPC regression tests- misc_protocol.out @@ -142,3 +142,6 @@ ./octez-client --mode proxy rpc get /chains/main/blocks/head/helpers/levels_in_current_cycle { "first": 1, "last": 8 } + +./octez-client --mode proxy rpc get /chains/main/blocks/head/helpers/total_baking_power +"20000000000000"