From 248c94f36a8cb8c877987b67feb97578d3f80036 Mon Sep 17 00:00:00 2001 From: Rodi-Can Bozman Date: Wed, 16 Nov 2022 13:00:40 +0100 Subject: [PATCH 1/3] Proto, Scoru: RPC to retrieve stakers per commitment (uncarbonated) --- src/proto_alpha/lib_plugin/RPC.ml | 28 +++++++++++++++++++ src/proto_alpha/lib_protocol/alpha_context.ml | 6 ++++ .../lib_protocol/alpha_context.mli | 5 ++++ 3 files changed, 39 insertions(+) diff --git a/src/proto_alpha/lib_plugin/RPC.ml b/src/proto_alpha/lib_plugin/RPC.ml index f2a3fa113c1a..1d891980a23f 100644 --- a/src/proto_alpha/lib_plugin/RPC.ml +++ b/src/proto_alpha/lib_plugin/RPC.ml @@ -2057,6 +2057,23 @@ module Sc_rollup = struct ~output RPC_path.(path_sc_rollup / "game") + let stakers_commitments = + let output = + Sc_rollup.( + Data_encoding.( + list + (obj2 + (req "staker" Staker.encoding) + (req "commitment" Commitment.Hash.encoding)))) + in + RPC_service.get_service + ~description: + "List of stakers for a given rollup, associated to the commitments \ + they are staked on" + ~query:RPC_query.empty + ~output + RPC_path.(path_sc_rollup / "stakers_commitments") + let conflicts = let query = let open RPC_query in @@ -2236,6 +2253,13 @@ module Sc_rollup = struct in return game) + let register_stakers_commitments () = + Registration.register1 + ~chunked:false + S.stakers_commitments + (fun context rollup () () -> + Sc_rollup.Storage.stakers_commitments_uncarbonated context rollup) + let register_conflicts () = Registration.register1 ~chunked:false @@ -2296,6 +2320,7 @@ module Sc_rollup = struct register_commitment () ; register_root () ; register_ongoing_refutation_game () ; + register_stakers_commitments () ; register_conflicts () ; register_timeout () ; register_timeout_reached () ; @@ -2339,6 +2364,9 @@ module Sc_rollup = struct sc_rollup_address staker + let stakers_commitments ctxt rollup = + RPC_context.make_call1 S.stakers_commitments ctxt rollup + let conflicts ctxt block sc_rollup_address staker = RPC_context.make_call1 S.conflicts ctxt block sc_rollup_address staker diff --git a/src/proto_alpha/lib_protocol/alpha_context.ml b/src/proto_alpha/lib_protocol/alpha_context.ml index 7ec9e5fee31b..af1cc487e5e2 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.ml +++ b/src/proto_alpha/lib_protocol/alpha_context.ml @@ -86,6 +86,12 @@ module Sc_rollup = struct include Sc_rollup_stake_storage end + module Storage = struct + let stakers_commitments_uncarbonated context rollup = + Storage.Sc_rollup.stakers context rollup + >>=? fun (_ctxt, stakers_commitments) -> return stakers_commitments + end + module Refutation_storage = Sc_rollup_refutation_storage include Sc_rollup_storage include Sc_rollups diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 16601ad6e240..b478a200abec 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -3734,6 +3734,11 @@ module Sc_rollup : sig context -> rollup -> (Hash.t * Raw_level.t * context) tzresult Lwt.t end + module Storage : sig + val stakers_commitments_uncarbonated : + context -> t -> (Staker.t * Commitment.Hash.t) list tzresult Lwt.t + end + val originate : context -> kind:Kind.t -> -- GitLab From 1a7a859a2bd85dcdd5d4001db799e20d7d7a6e9a Mon Sep 17 00:00:00 2001 From: Rodi-Can Bozman Date: Thu, 17 Nov 2022 12:01:29 +0100 Subject: [PATCH 2/3] Tezt, Scoru: expose get_chain_block_context_sc_rollup_stakers_per_commitment --- tezt/lib_tezos/RPC.ml | 17 +++++++++++++++++ tezt/lib_tezos/RPC.mli | 4 ++++ 2 files changed, 21 insertions(+) diff --git a/tezt/lib_tezos/RPC.ml b/tezt/lib_tezos/RPC.ml index 2c2c1020b3b2..e2493db65eb0 100644 --- a/tezt/lib_tezos/RPC.ml +++ b/tezt/lib_tezos/RPC.ml @@ -791,6 +791,23 @@ let get_chain_block_context_sc_rollups_sc_rollup_boot_sector ?(chain = "main") ] Fun.id +let get_chain_block_context_sc_rollups_sc_rollup_stakers_commitments + ?(chain = "main") ?(block = "head") sc_rollup = + make + GET + [ + "chains"; + chain; + "blocks"; + block; + "context"; + "sc_rollups"; + "sc_rollup"; + sc_rollup; + "stakers_commitments"; + ] + Fun.id + let get_chain_block_context_sc_rollups_sc_rollup_last_cemented_commitment_hash_with_level ?(chain = "main") ?(block = "head") sc_rollup = make diff --git a/tezt/lib_tezos/RPC.mli b/tezt/lib_tezos/RPC.mli index cf194851ac92..572e5dab538e 100644 --- a/tezt/lib_tezos/RPC.mli +++ b/tezt/lib_tezos/RPC.mli @@ -770,6 +770,10 @@ val get_chain_block_context_sc_rollups_sc_rollup_genesis_info : val get_chain_block_context_sc_rollups_sc_rollup_boot_sector : ?chain:string -> ?block:string -> string -> JSON.t t +(** RPC: [GET chains//blocks//context/sc_rollups/sc_rollup//stakers_commitments] *) +val get_chain_block_context_sc_rollups_sc_rollup_stakers_commitments : + ?chain:string -> ?block:string -> string -> JSON.t t + (** RPC: [GET chains//blocks//context/sc_rollups/sc_rollup//get_last_cemented_commitment_hash_with_level] *) val get_chain_block_context_sc_rollups_sc_rollup_last_cemented_commitment_hash_with_level : ?chain:string -> ?block:string -> string -> JSON.t t -- GitLab From daec3d4d59f99f5a2b1d4abc6474743cd77075f7 Mon Sep 17 00:00:00 2001 From: Rodi-Can Bozman Date: Thu, 17 Nov 2022 14:37:37 +0100 Subject: [PATCH 3/3] Tezt, Scoru: check if stakers per commitment are correctly retrieved --- tezt/tests/sc_rollup.ml | 100 ++++++++++++++++++++++++++++++++++------ 1 file changed, 86 insertions(+), 14 deletions(-) diff --git a/tezt/tests/sc_rollup.ml b/tezt/tests/sc_rollup.ml index c9cd10ef44d1..8099efaf2173 100644 --- a/tezt/tests/sc_rollup.ml +++ b/tezt/tests/sc_rollup.ml @@ -280,6 +280,21 @@ let number_of_ticks (_hash, (commitment : Sc_rollup_client.commitment), _level) = commitment.number_of_ticks +let stakers_commitments ~sc_rollup client = + let* json = + RPC.Client.call client + @@ RPC.get_chain_block_context_sc_rollups_sc_rollup_stakers_commitments + sc_rollup + in + let stakers_commitments = + List.map (fun json_sc -> + let staker = JSON.(json_sc |-> "staker" |> as_string) in + let commitment = JSON.(json_sc |-> "commitment" |> as_string) in + (staker, commitment)) + @@ JSON.as_list json + in + return stakers_commitments + let last_cemented_commitment_hash_with_level ~sc_rollup client = let* json = RPC.Client.call client @@ -461,6 +476,76 @@ let test_rollup_get_genesis_info ~kind = ~error_msg:"expected value %L, got %R") ; unit +(* Retrieve stakers and their commitments + -------------------------------------- + + We manage to properly retrieve stakers with the associated commitments they + are staked on. +*) + +let publish_dummy_commitment ?(number_of_ticks = 1) ~inbox_level ~predecessor + ~sc_rollup ~src client = + let commitment : Sc_rollup_client.commitment = + { + compressed_state = Constant.sc_rollup_compressed_state; + inbox_level; + predecessor; + number_of_ticks; + } + in + let*! () = publish_commitment ~src ~commitment client sc_rollup in + let* () = Client.bake_for_and_wait client in + get_staked_on_commitment ~sc_rollup ~staker:src client + +let test_stakers_commitments ~kind = + test_l1_scenario + { + variant = None; + tags = ["stakers"; "commitments"]; + description = "retrieve stakers with associated commitments"; + } + ~kind + @@ fun sc_rollup _tezos_node tezos_client -> + let* inbox_level = Client.level tezos_client in + let staker_1 = Constant.bootstrap1.public_key_hash in + let staker_2 = Constant.bootstrap2.public_key_hash in + let* predecessor, _ = + last_cemented_commitment_hash_with_level ~sc_rollup tezos_client + in + let* {commitment_period_in_blocks; _} = + get_sc_rollup_constants tezos_client + in + let* commitment_1 = + publish_dummy_commitment + ~inbox_level:(inbox_level + commitment_period_in_blocks) + ~predecessor + ~sc_rollup + ~src:staker_1 + tezos_client + in + let* commitment_2 = + publish_dummy_commitment + ~inbox_level:(inbox_level + (2 * commitment_period_in_blocks)) + ~predecessor:commitment_1 + ~sc_rollup + ~src:staker_2 + tezos_client + in + let* stakers_commitments = stakers_commitments ~sc_rollup tezos_client in + let check staker_commitment_1 staker_commitment_2 = + Check.( + (staker_commitment_1 = staker_commitment_2) + (tuple2 string string) + ~error_msg:"expected value %L, got %R") + in + List.iteri + (fun i staker_commitment -> + if i = 0 then check staker_commitment (staker_1, commitment_1) + else if i = 1 then check staker_commitment (staker_2, commitment_2) + else ()) + stakers_commitments ; + unit + (* Pushing message in the inbox ---------------------------- @@ -2233,20 +2318,6 @@ let test_rollup_client_list_keys ~kind = ~error_msg:"Expecting\n%L\ngot\n%R\nas keys from the client.") ; unit -let publish_dummy_commitment ?(number_of_ticks = 1) ~inbox_level ~predecessor - ~sc_rollup ~src client = - let commitment : Sc_rollup_client.commitment = - { - compressed_state = Constant.sc_rollup_compressed_state; - inbox_level; - predecessor; - number_of_ticks; - } - in - let*! () = publish_commitment ~src ~commitment client sc_rollup in - let* () = Client.bake_for_and_wait client in - get_staked_on_commitment ~sc_rollup ~staker:src client - let test_consecutive_commitments _rollup_node _rollup_client sc_rollup _tezos_node tezos_client = let* inbox_level = Client.level tezos_client in @@ -3159,6 +3230,7 @@ let register ~kind ~protocols = test_origination ~kind protocols ; test_rollup_node_running ~kind protocols ; test_rollup_get_genesis_info ~kind protocols ; + test_stakers_commitments ~kind protocols ; test_rollup_inbox_size ~kind protocols ; test_rollup_inbox_of_rollup_node ~kind -- GitLab