Alpha/Vote: add RPCs to read voting state

Co-authored-by: Jun FURUSE <jun.furuse@dailambda.jp>
Co-authored-by: Marco Stronati <marco@stronati.org>
This commit is contained in:
Marco Stronati 2018-11-16 15:07:08 +01:00 committed by Pierre Boutillier
parent c981391128
commit f1614414cc
No known key found for this signature in database
GPG Key ID: C2F73508B56A193C
8 changed files with 223 additions and 1 deletions

View File

@ -73,6 +73,7 @@
"Contract_services", "Contract_services",
"Delegate_services", "Delegate_services",
"Helpers_services", "Helpers_services",
"Voting_services",
"Alpha_services", "Alpha_services",
"Main" "Main"

View File

@ -736,12 +736,15 @@ module Vote : sig
context -> int32 Protocol_hash.Map.t Lwt.t context -> int32 Protocol_hash.Map.t Lwt.t
val clear_proposals: context -> context Lwt.t val clear_proposals: context -> context Lwt.t
val listings_encoding : (Signature.Public_key_hash.t * int32) list Data_encoding.t
val freeze_listings: context -> context tzresult Lwt.t val freeze_listings: context -> context tzresult Lwt.t
val clear_listings: context -> context tzresult Lwt.t val clear_listings: context -> context tzresult Lwt.t
val listing_size: context -> int32 tzresult Lwt.t val listing_size: context -> int32 tzresult Lwt.t
val in_listings: context -> public_key_hash -> bool Lwt.t val in_listings: context -> public_key_hash -> bool Lwt.t
val get_listings : context -> (public_key_hash * int32) list Lwt.t
type ballot = Yay | Nay | Pass type ballot = Yay | Nay | Pass
val ballot_encoding : ballot Data_encoding.t
type ballots = { type ballots = {
yay: int32 ; yay: int32 ;
@ -749,9 +752,12 @@ module Vote : sig
pass: int32 ; pass: int32 ;
} }
val ballots_encoding : ballots Data_encoding.t
val record_ballot: val record_ballot:
context -> public_key_hash -> ballot -> context Lwt.t context -> public_key_hash -> ballot -> context Lwt.t
val get_ballots: context -> ballots tzresult Lwt.t val get_ballots: context -> ballots tzresult Lwt.t
val get_ballot_list: context -> (Signature.Public_key_hash.t * ballot) list Lwt.t
val clear_ballots: context -> context Lwt.t val clear_ballots: context -> context Lwt.t
val get_current_period_kind: val get_current_period_kind:

View File

@ -116,10 +116,12 @@ module Delegate = Delegate_services
module Helpers = Helpers_services module Helpers = Helpers_services
module Forge = Helpers_services.Forge module Forge = Helpers_services.Forge
module Parse = Helpers_services.Parse module Parse = Helpers_services.Parse
module Voting = Voting_services
let register () = let register () =
Contract.register () ; Contract.register () ;
Constants.register () ; Constants.register () ;
Delegate.register () ; Delegate.register () ;
Helpers.register () ; Helpers.register () ;
Nonce.register () Nonce.register () ;
Voting.register ()

View File

@ -50,5 +50,6 @@ module Delegate = Delegate_services
module Helpers = Helpers_services module Helpers = Helpers_services
module Forge = Helpers_services.Forge module Forge = Helpers_services.Forge
module Parse = Helpers_services.Parse module Parse = Helpers_services.Parse
module Voting = Voting_services
val register: unit -> unit val register: unit -> unit

View File

@ -45,6 +45,16 @@ type ballots = {
pass: int32 ; pass: int32 ;
} }
let ballots_encoding =
let open Data_encoding in
conv
(fun { yay ; nay ; pass } -> ( yay , nay , pass ))
(fun ( yay , nay , pass ) -> { yay ; nay ; pass })
@@ obj3
(req "yay" int32)
(req "nay" int32)
(req "pass" int32)
let record_ballot = Storage.Vote.Ballots.init_set let record_ballot = Storage.Vote.Ballots.init_set
let get_ballots ctxt = let get_ballots ctxt =
@ -61,8 +71,15 @@ let get_ballots ctxt =
end) end)
~init:(ok { yay = 0l ; nay = 0l; pass = 0l }) ~init:(ok { yay = 0l ; nay = 0l; pass = 0l })
let get_ballot_list = Storage.Vote.Ballots.bindings
let clear_ballots = Storage.Vote.Ballots.clear let clear_ballots = Storage.Vote.Ballots.clear
let listings_encoding =
Data_encoding.(list (obj2
(req "pkh" Signature.Public_key_hash.encoding)
(req "rolls" int32)))
let freeze_listings ctxt = let freeze_listings ctxt =
Roll_storage.fold ctxt (ctxt, 0l) Roll_storage.fold ctxt (ctxt, 0l)
~f:(fun _roll delegate (ctxt, total) -> ~f:(fun _roll delegate (ctxt, total) ->
@ -81,6 +98,7 @@ let freeze_listings ctxt =
let listing_size = Storage.Vote.Listings_size.get let listing_size = Storage.Vote.Listings_size.get
let in_listings = Storage.Vote.Listings.mem let in_listings = Storage.Vote.Listings.mem
let get_listings = Storage.Vote.Listings.bindings
let clear_listings ctxt = let clear_listings ctxt =
Storage.Vote.Listings.clear ctxt >>= fun ctxt -> Storage.Vote.Listings.clear ctxt >>= fun ctxt ->

View File

@ -38,18 +38,25 @@ type ballots = {
pass: int32 ; pass: int32 ;
} }
val ballots_encoding : ballots Data_encoding.t
val record_ballot: val record_ballot:
Raw_context.t -> Signature.Public_key_hash.t -> Vote_repr.ballot -> Raw_context.t -> Signature.Public_key_hash.t -> Vote_repr.ballot ->
Raw_context.t Lwt.t Raw_context.t Lwt.t
val get_ballots: Raw_context.t -> ballots tzresult Lwt.t val get_ballots: Raw_context.t -> ballots tzresult Lwt.t
val get_ballot_list :
Raw_context.t -> (Signature.Public_key_hash.t * Vote_repr.ballot) list Lwt.t
val clear_ballots: Raw_context.t -> Raw_context.t Lwt.t val clear_ballots: Raw_context.t -> Raw_context.t Lwt.t
val listings_encoding : (Signature.Public_key_hash.t * int32) list Data_encoding.t
val freeze_listings: Raw_context.t -> Raw_context.t tzresult Lwt.t val freeze_listings: Raw_context.t -> Raw_context.t tzresult Lwt.t
val clear_listings: Raw_context.t -> Raw_context.t tzresult Lwt.t val clear_listings: Raw_context.t -> Raw_context.t tzresult Lwt.t
val listing_size: Raw_context.t -> int32 tzresult Lwt.t val listing_size: Raw_context.t -> int32 tzresult Lwt.t
val in_listings: val in_listings:
Raw_context.t -> Signature.Public_key_hash.t -> bool Lwt.t Raw_context.t -> Signature.Public_key_hash.t -> bool Lwt.t
val get_listings : Raw_context.t -> (Signature.Public_key_hash.t * int32) list Lwt.t
val get_current_quorum: Raw_context.t -> int32 tzresult Lwt.t val get_current_quorum: Raw_context.t -> int32 tzresult Lwt.t
val set_current_quorum: Raw_context.t -> int32 -> Raw_context.t tzresult Lwt.t val set_current_quorum: Raw_context.t -> int32 -> Raw_context.t tzresult Lwt.t

View File

@ -0,0 +1,138 @@
(*****************************************************************************)
(* *)
(* Open Source License *)
(* Copyright (c) 2018 Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* Permission is hereby granted, free of charge, to any person obtaining a *)
(* copy of this software and associated documentation files (the "Software"),*)
(* to deal in the Software without restriction, including without limitation *)
(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)
(* and/or sell copies of the Software, and to permit persons to whom the *)
(* Software is furnished to do so, subject to the following conditions: *)
(* *)
(* The above copyright notice and this permission notice shall be included *)
(* in all copies or substantial portions of the Software. *)
(* *)
(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)
(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)
(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)
(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)
(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)
(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)
(* DEALINGS IN THE SOFTWARE. *)
(* *)
(*****************************************************************************)
open Alpha_context
module S = struct
let path = RPC_path.(open_root / "votes")
let ballots =
RPC_service.get_service
~description:"Sum of ballots casted so far during a voting period."
~query: RPC_query.empty
~output: Vote.ballots_encoding
RPC_path.(path / "ballots")
let ballot_list =
RPC_service.get_service
~description:"Ballots casted so far during a voting period."
~query: RPC_query.empty
~output: Data_encoding.(list (obj2
(req "pkh" Signature.Public_key_hash.encoding)
(req "ballot" Vote.ballot_encoding)))
RPC_path.(path / "ballot_list")
let current_period_kind =
RPC_service.get_service
~description:"Current period kind."
~query: RPC_query.empty
~output: Voting_period.kind_encoding
RPC_path.(path / "current_period_kind")
let current_quorum =
RPC_service.get_service
~description:"Current expected quorum."
~query: RPC_query.empty
~output: Data_encoding.int32
RPC_path.(path / "current_quorum")
let listings =
RPC_service.get_service
~description:"List of delegates with their voting weight, in number of rolls."
~query: RPC_query.empty
~output: Vote.listings_encoding
RPC_path.(path / "listings")
let proposals =
RPC_service.get_service
~description:"List of proposals with number of supporters."
~query: RPC_query.empty
~output: (Protocol_hash.Map.encoding Data_encoding.int32)
RPC_path.(path / "proposals")
let current_proposal =
RPC_service.get_service
~description:"Current proposal under evaluation."
~query: RPC_query.empty
~output: (Data_encoding.option Protocol_hash.encoding)
RPC_path.(path / "current_proposal")
end
let register () =
let open Services_registration in
register0 S.ballots begin fun ctxt () () ->
Vote.get_ballots ctxt
end;
register0 S.ballot_list begin fun ctxt () () ->
Vote.get_ballot_list ctxt >|= ok
end;
register0 S.current_period_kind begin fun ctxt () () ->
Vote.get_current_period_kind ctxt
end;
register0 S.current_quorum begin fun ctxt () () ->
Vote.get_current_quorum ctxt
end;
register0 S.proposals begin fun ctxt () () ->
Vote.get_proposals ctxt >|= ok
end;
register0 S.listings begin fun ctxt () () ->
Vote.get_listings ctxt >|= ok
end;
register0 S.current_proposal begin fun ctxt () () ->
(* this would be better implemented using get_option in get_current_proposal *)
Vote.get_current_proposal ctxt >>= function
| Ok p -> return (Some p)
| Error [Raw_context.Storage_error (Missing_key _)] -> return None
| (Error _ as e) -> Lwt.return e
end
let ballots ctxt block =
RPC_context.make_call0 S.ballots ctxt block () ()
let ballot_list ctxt block =
RPC_context.make_call0 S.ballot_list ctxt block () ()
let current_period_kind ctxt block =
RPC_context.make_call0 S.current_period_kind ctxt block () ()
let current_quorum ctxt block =
RPC_context.make_call0 S.current_quorum ctxt block () ()
let listings ctxt block =
RPC_context.make_call0 S.listings ctxt block () ()
let proposals ctxt block =
RPC_context.make_call0 S.proposals ctxt block () ()
let current_proposal ctxt block =
RPC_context.make_call0 S.current_proposal ctxt block () ()

View File

@ -0,0 +1,49 @@
(*****************************************************************************)
(* *)
(* Open Source License *)
(* Copyright (c) 2018 Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* Permission is hereby granted, free of charge, to any person obtaining a *)
(* copy of this software and associated documentation files (the "Software"),*)
(* to deal in the Software without restriction, including without limitation *)
(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)
(* and/or sell copies of the Software, and to permit persons to whom the *)
(* Software is furnished to do so, subject to the following conditions: *)
(* *)
(* The above copyright notice and this permission notice shall be included *)
(* in all copies or substantial portions of the Software. *)
(* *)
(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)
(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)
(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)
(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)
(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)
(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)
(* DEALINGS IN THE SOFTWARE. *)
(* *)
(*****************************************************************************)
open Alpha_context
val ballots :
'a #RPC_context.simple -> 'a -> Vote.ballots shell_tzresult Lwt.t
val ballot_list :
'a #RPC_context.simple -> 'a -> (Signature.Public_key_hash.t * Vote.ballot) list shell_tzresult Lwt.t
val current_period_kind :
'a #RPC_context.simple -> 'a -> Voting_period.kind shell_tzresult Lwt.t
val current_quorum :
'a #RPC_context.simple -> 'a -> Int32.t shell_tzresult Lwt.t
val listings :
'a #RPC_context.simple -> 'a -> (Signature.Public_key_hash.t * int32) list shell_tzresult Lwt.t
val proposals :
'a #RPC_context.simple -> 'a -> Int32.t Protocol_hash.Map.t shell_tzresult Lwt.t
val current_proposal :
'a #RPC_context.simple -> 'a -> Protocol_hash.t option shell_tzresult Lwt.t
val register : unit -> unit