From b28f0556f8ad5d7c7ebf815d33d2e46073273b9f Mon Sep 17 00:00:00 2001 From: sierra19XX <15652887+sierra19XX@users.noreply.github.com> Date: Mon, 2 Nov 2020 12:07:30 +0000 Subject: [PATCH] integrate rng for winner tickets --- libraries/app/database_api.cpp | 29 +---------------- .../app/include/graphene/app/database_api.hpp | 2 +- libraries/chain/db_getter.cpp | 32 +++++++++++++++++++ .../chain/include/graphene/chain/database.hpp | 1 + libraries/chain/nft_lottery_object.cpp | 5 +-- 5 files changed, 38 insertions(+), 31 deletions(-) diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp index 412fc35f..4ad8e593 100644 --- a/libraries/app/database_api.cpp +++ b/libraries/app/database_api.cpp @@ -3200,34 +3200,7 @@ vector database_api::get_random_number_ex(uint64_t minimum, uint64_t m vector database_api_impl::get_random_number_ex(uint64_t minimum, uint64_t maximum, uint64_t selections, bool duplicates) const { - FC_ASSERT( selections <= 100000 ); - if (duplicates == false) { - FC_ASSERT( maximum - minimum >= selections ); - } - - vector v; - v.reserve(selections); - - if (duplicates) { - for (uint64_t i = 0; i < selections; i++) { - int64_t rnd = _db.get_random_bits(maximum - minimum) + minimum; - v.push_back(rnd); - } - } else { - vector tmpv; - tmpv.reserve(selections); - for (uint64_t i = minimum; i < maximum; i++) { - tmpv.push_back(i); - } - - for (uint64_t i = 0; (i < selections) && (tmpv.size() > 0); i++) { - uint64_t idx = _db.get_random_bits(tmpv.size()); - v.push_back(tmpv.at(idx)); - tmpv.erase(tmpv.begin() + idx); - } - } - - return v; + return _db.get_random_numbers(minimum, maximum, selections, duplicates); } uint64_t database_api::get_random_number(uint64_t bound) const diff --git a/libraries/app/include/graphene/app/database_api.hpp b/libraries/app/include/graphene/app/database_api.hpp index d6ea3940..5b275f3f 100644 --- a/libraries/app/include/graphene/app/database_api.hpp +++ b/libraries/app/include/graphene/app/database_api.hpp @@ -934,7 +934,7 @@ class database_api // ACCOUNT ROLE // ////////////////// vector get_account_roles_by_owner(account_id_type owner) const; -private: + ///////////////////////////// // Random number generator // ///////////////////////////// diff --git a/libraries/chain/db_getter.cpp b/libraries/chain/db_getter.cpp index 24c3cc4d..cb7e1bc0 100644 --- a/libraries/chain/db_getter.cpp +++ b/libraries/chain/db_getter.cpp @@ -315,4 +315,36 @@ bool database::is_son_active( son_id_type son_id ) return (it_son != active_son_ids.end()); } +vector database::get_random_numbers(uint64_t minimum, uint64_t maximum, uint64_t selections, bool duplicates) +{ + FC_ASSERT( selections <= 100000 ); + if (duplicates == false) { + FC_ASSERT( maximum - minimum >= selections ); + } + + vector v; + v.reserve(selections); + + if (duplicates) { + for (uint64_t i = 0; i < selections; i++) { + int64_t rnd = get_random_bits(maximum - minimum) + minimum; + v.push_back(rnd); + } + } else { + vector tmpv; + tmpv.reserve(selections); + for (uint64_t i = minimum; i < maximum; i++) { + tmpv.push_back(i); + } + + for (uint64_t i = 0; (i < selections) && (tmpv.size() > 0); i++) { + uint64_t idx = get_random_bits(tmpv.size()); + v.push_back(tmpv.at(idx)); + tmpv.erase(tmpv.begin() + idx); + } + } + + return v; +} + } } diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index 5d236dbb..e8f1dbf5 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -325,6 +325,7 @@ namespace graphene { namespace chain { uint32_t last_non_undoable_block_num() const; vector get_account_custom_authorities(account_id_type account, const operation& op)const; + vector get_random_numbers(uint64_t minimum, uint64_t maximum, uint64_t selections, bool duplicates); //////////////////// db_init.cpp //////////////////// void initialize_evaluators(); diff --git a/libraries/chain/nft_lottery_object.cpp b/libraries/chain/nft_lottery_object.cpp index facb6dea..f5e9f674 100644 --- a/libraries/chain/nft_lottery_object.cpp +++ b/libraries/chain/nft_lottery_object.cpp @@ -89,7 +89,8 @@ namespace graphene structurized_participants.emplace(holder, vector()); } uint64_t jackpot = get_lottery_jackpot(db).amount.value; - auto winner_numbers = db.get_winner_numbers(id, holders.size(), lottery_options.winning_tickets.size()); + auto selections = lottery_options.winning_tickets.size() <= holders.size() ? lottery_options.winning_tickets.size() : holders.size(); + auto winner_numbers = db.get_random_numbers(0, holders.size(), selections, false); auto &tickets(lottery_options.winning_tickets); @@ -167,4 +168,4 @@ namespace graphene db.apply_operation(eval, end_op); } } // namespace chain -} // namespace graphene \ No newline at end of file +} // namespace graphene