From d7c80b4b6a8468e9f5c37ee8288be57927828bb4 Mon Sep 17 00:00:00 2001 From: kstdl Date: Fri, 3 Nov 2017 17:52:41 +0300 Subject: [PATCH] fix rng and get_winner_numbers implemented --- .gitignore | 2 + libraries/app/application.cpp | 34 +++++++-------- libraries/chain/db_block.cpp | 23 +++++------ libraries/chain/db_getter.cpp | 41 +++++++++++++++++++ libraries/chain/db_init.cpp | 2 +- libraries/chain/db_maint.cpp | 4 +- .../chain/include/graphene/chain/database.hpp | 3 +- .../graphene/chain/vesting_balance_object.hpp | 8 +++- libraries/chain/witness_evaluator.cpp | 7 ++-- .../generate_genesis/generate_genesis.cpp | 2 +- .../generate_uia_sharedrop_genesis.cpp | 2 +- libraries/wallet/wallet.cpp | 9 ++-- tests/common/database_fixture.cpp | 10 +++-- 13 files changed, 99 insertions(+), 48 deletions(-) diff --git a/.gitignore b/.gitignore index 7e477b3d..ce999043 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,8 @@ compile_commands.json moc_* *.moc hardfork.hpp +build_xc +data libraries/utilities/git_revision.cpp diff --git a/libraries/app/application.cpp b/libraries/app/application.cpp index bba2f525..348e5f47 100644 --- a/libraries/app/application.cpp +++ b/libraries/app/application.cpp @@ -163,23 +163,23 @@ namespace detail { { // t.me/peerplays #seednodes vector seeds = { - "seed.ppy.blckchnd.com:6112", // blckchnd - "ppy.esteem.ws:7777", // good-karma - "peerplays.bitcoiner.me:9777", // bitcoiner - "peerplays.roelandp.nl:9777", // roelandp - "78.46.95.153:7777", // theprophet0 - "ppyseed.bacchist.me:42420", // bacchist-witness - "5.9.18.213:18828", // pfunk - "31.171.244.121:7777", // taconator - "seed.peerplaysdb.com:9777", // jesta - "ppy-seed.xeldal.com:19777", // xeldal - "peerplays-seed.altcap.io:61388", // winner.winner.chicken.dinner - "seed.peerplaysnodes.com:9777", // wackou - "peerplays-seed.privex.io:7777", // someguy123/privex - "51.15.78.16:9777", // agoric.systems - "212.71.253.163:9777", // xtar - "51.15.35.96:9777", // lafona - "anyx.ca:9777" // anyx + // "seed.ppy.blckchnd.com:6112", // blckchnd + // "ppy.esteem.ws:7777", // good-karma + // "peerplays.bitcoiner.me:9777", // bitcoiner + // "peerplays.roelandp.nl:9777", // roelandp + // "78.46.95.153:7777", // theprophet0 + // "ppyseed.bacchist.me:42420", // bacchist-witness + // "5.9.18.213:18828", // pfunk + // "31.171.244.121:7777", // taconator + // "seed.peerplaysdb.com:9777", // jesta + // "ppy-seed.xeldal.com:19777", // xeldal + // "peerplays-seed.altcap.io:61388", // winner.winner.chicken.dinner + // "seed.peerplaysnodes.com:9777", // wackou + // "peerplays-seed.privex.io:7777", // someguy123/privex + // "51.15.78.16:9777", // agoric.systems + // "212.71.253.163:9777", // xtar + // "51.15.35.96:9777", // lafona + // "anyx.ca:9777" // anyx }; for( const string& endpoint_string : seeds ) { diff --git a/libraries/chain/db_block.cpp b/libraries/chain/db_block.cpp index 59c5f0cf..27c4276a 100644 --- a/libraries/chain/db_block.cpp +++ b/libraries/chain/db_block.cpp @@ -395,16 +395,15 @@ signed_block database::_generate_block( pending_block.timestamp = when; pending_block.transaction_merkle_root = pending_block.calculate_merkle_root(); pending_block.witness = witness_id; - + // Genesis witnesses start with a default initial secret - if( witness_obj.next_secret_hash == secret_hash_type::hash( secret_hash_type() ) ) - pending_block.previous_secret = secret_hash_type(); - else - { - secret_hash_type::encoder last_enc; - fc::raw::pack( last_enc, block_signing_private_key ); - fc::raw::pack( last_enc, witness_obj.previous_secret ); - pending_block.previous_secret = last_enc.result(); + if( secret_hash_type::hash( witness_obj.previous_secret ) == witness_obj.next_secret_hash ) { + pending_block.previous_secret = witness_obj.previous_secret; + } else { + secret_hash_type::encoder last_enc; + fc::raw::pack( last_enc, block_signing_private_key ); + fc::raw::pack( last_enc, witness_obj.previous_secret ); + pending_block.previous_secret = last_enc.result(); } secret_hash_type::encoder next_enc; @@ -422,7 +421,7 @@ signed_block database::_generate_block( } push_block( pending_block, skip ); - + idump(( get_winner_numbers(asset_id_type(3), 253, 64) )); return pending_block; } FC_CAPTURE_AND_RETHROW( (witness_id) ) } @@ -688,8 +687,8 @@ const witness_object& database::validate_block_header( uint32_t skip, const sign FC_ASSERT( head_block_time() < next_block.timestamp, "", ("head_block_time",head_block_time())("next",next_block.timestamp)("blocknum",next_block.block_num()) ); const witness_object& witness = next_block.witness(*this); //DLN: TODO: Temporarily commented out to test shuffle vs RNG scheduling algorithm for witnesses, this was causing shuffle agorithm to fail during create_witness test. This should be re-enabled for RNG, and maybe for shuffle too, don't really know for sure. -// FC_ASSERT( secret_hash_type::hash( next_block.previous_secret ) == witness.next_secret_hash, "", -// ("previous_secret", next_block.previous_secret)("next_secret_hash", witness.next_secret_hash)("null_secret_hash", secret_hash_type::hash( secret_hash_type()))); + FC_ASSERT( secret_hash_type::hash( next_block.previous_secret ) == witness.next_secret_hash, "", + ("previous_secret", next_block.previous_secret)("next_secret_hash", witness.next_secret_hash)); if( !(skip&skip_witness_signature) ) FC_ASSERT( next_block.validate_signee( witness.signing_key ) ); diff --git a/libraries/chain/db_getter.cpp b/libraries/chain/db_getter.cpp index 4af2df3e..dc3a023a 100644 --- a/libraries/chain/db_getter.cpp +++ b/libraries/chain/db_getter.cpp @@ -30,6 +30,8 @@ #include +#include + namespace graphene { namespace chain { const asset_object& database::get_core_asset() const @@ -97,5 +99,44 @@ uint32_t database::last_non_undoable_block_num() const return head_block_num() - _undo_db.size(); } +std::vector database::get_seeds(asset_id_type for_asset, uint32_t count_winners) const +{ + FC_ASSERT( count_winners <= 64 ); + std::string salted_string = std::string(_random_number_generator._seed) + std::to_string(for_asset.instance.value); + uint32_t* seeds = (uint32_t*)(fc::sha256::hash(salted_string)._hash); + + std::vector result; + result.reserve(64); + + for( int s = 0; s < 8; ++s ) { + uint32_t* sub_seeds = ( uint32_t* ) fc::sha256::hash( std::to_string( seeds[s] ) + std::to_string( for_asset.instance.value ) )._hash; + for( int ss = 0; ss < 8; ++ss ) { + result.push_back(sub_seeds[ss]); + } + } + return result; +} + +const std::unordered_set database::get_winner_numbers( asset_id_type for_asset, uint8_t count_members, uint32_t count_winners ) const +{ + std::unordered_set result; + result.reserve(count_winners); + + auto seeds = get_seeds(for_asset, count_winners); + + for (auto current_seed = seeds.begin(); current_seed != seeds.end(); ++current_seed) { + uint8_t winner_num = *current_seed % count_members; + int iter_count = 0; + while (result.count(winner_num)) { + *current_seed = (*current_seed * 1103515245 + 12345) / 65536; //using gcc's consts for pseudorandom + winner_num = *current_seed % count_members; + } + result.emplace(winner_num); + if (result.size() >= count_winners) break; + } + + FC_ASSERT(result.size() == count_winners); + return result; +} } } diff --git a/libraries/chain/db_init.cpp b/libraries/chain/db_init.cpp index 19d32e8c..e90ffb99 100644 --- a/libraries/chain/db_init.cpp +++ b/libraries/chain/db_init.cpp @@ -781,7 +781,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) std::for_each(genesis_state.initial_witness_candidates.begin(), genesis_state.initial_witness_candidates.end(), [&](const genesis_state_type::initial_witness_type& witness) { witness_create_operation op; - op.initial_secret = secret_hash_type::hash(secret_hash_type()); + op.initial_secret = secret_hash_type::hash(witness.owner_name); op.witness_account = get_account_id(witness.owner_name); op.block_signing_key = witness.block_signing_key; apply_operation(genesis_eval_state, op); diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index b701259c..ee4dd3c1 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -775,8 +775,8 @@ void schedule_pending_dividend_balances(database& db, auto current_distribution_account_balance_iter = current_distribution_account_balance_range.first; auto previous_distribution_account_balance_iter = previous_distribution_account_balance_range.first; dlog("Current balances in distribution account: ${current}, Previous balances: ${previous}", - ("current", std::distance(current_distribution_account_balance_range.first, current_distribution_account_balance_range.second)) - ("previous", std::distance(previous_distribution_account_balance_range.first, previous_distribution_account_balance_range.second))); + ("current", (int64_t)std::distance(current_distribution_account_balance_range.first, current_distribution_account_balance_range.second)) + ("previous", (int64_t)std::distance(previous_distribution_account_balance_range.first, previous_distribution_account_balance_range.second))); // when we pay out the dividends to the holders, we need to know the total balance of the dividend asset in all // accounts other than the distribution account (it would be silly to distribute dividends back to diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index 893a095a..31f24628 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -253,7 +253,8 @@ namespace graphene { namespace chain { const dynamic_global_property_object& get_dynamic_global_properties()const; const node_property_object& get_node_properties()const; const fee_schedule& current_fee_schedule()const; - + const std::unordered_set get_winner_numbers(asset_id_type for_asset, uint8_t count_members, uint32_t count_winners)const; + std::vector get_seeds(asset_id_type for_asset, uint32_t count_winners)const; uint64_t get_random_bits( uint64_t bound ); time_point_sec head_block_time()const; diff --git a/libraries/chain/include/graphene/chain/vesting_balance_object.hpp b/libraries/chain/include/graphene/chain/vesting_balance_object.hpp index dc2fe18c..4742323b 100644 --- a/libraries/chain/include/graphene/chain/vesting_balance_object.hpp +++ b/libraries/chain/include/graphene/chain/vesting_balance_object.hpp @@ -144,6 +144,10 @@ namespace graphene { namespace chain { vesting_policy policy; vesting_balance_object() {} + + asset_id_type get_asset_id() const { return balance.asset_id; } + + share_type get_asset_amount() const { return balance.amount; } ///@brief Deposit amount into vesting balance, requiring it to vest before withdrawal void deposit(const fc::time_point_sec& now, const asset& amount); @@ -184,8 +188,8 @@ namespace graphene { namespace chain { ordered_non_unique< tag, composite_key< vesting_balance_object, - member_offset, - member_offset + const_mem_fun, + const_mem_fun //member //member_offset >, diff --git a/libraries/chain/witness_evaluator.cpp b/libraries/chain/witness_evaluator.cpp index 1d4bbe2a..1d0c1e70 100644 --- a/libraries/chain/witness_evaluator.cpp +++ b/libraries/chain/witness_evaluator.cpp @@ -43,10 +43,11 @@ object_id_type witness_create_evaluator::do_apply( const witness_create_operatio vote_id = get_next_vote_id(p, vote_id_type::witness); }); - const auto& new_witness_object = db().create( [&]( witness_object& obj ){ + const auto& new_witness_object = db().create( [&]( witness_object& obj ) { obj.witness_account = op.witness_account; - obj.signing_key = op.block_signing_key; - obj.next_secret_hash = op.initial_secret; + obj.signing_key = op.block_signing_key; + obj.previous_secret = op.initial_secret; + obj.next_secret_hash = secret_hash_type::hash( op.initial_secret ); obj.vote_id = vote_id; obj.url = op.url; }); diff --git a/libraries/plugins/generate_genesis/generate_genesis.cpp b/libraries/plugins/generate_genesis/generate_genesis.cpp index d369392a..337b4255 100644 --- a/libraries/plugins/generate_genesis/generate_genesis.cpp +++ b/libraries/plugins/generate_genesis/generate_genesis.cpp @@ -113,7 +113,7 @@ std::string modify_account_name(const std::string& name) bool is_special_account(const graphene::chain::account_id_type& account_id) { - return account_id.instance < 100; + return account_id.instance.value < 100; } bool is_scam(const std::string& account_name) diff --git a/libraries/plugins/generate_uia_sharedrop_genesis/generate_uia_sharedrop_genesis.cpp b/libraries/plugins/generate_uia_sharedrop_genesis/generate_uia_sharedrop_genesis.cpp index 5d4b8594..d6db850a 100644 --- a/libraries/plugins/generate_uia_sharedrop_genesis/generate_uia_sharedrop_genesis.cpp +++ b/libraries/plugins/generate_uia_sharedrop_genesis/generate_uia_sharedrop_genesis.cpp @@ -122,7 +122,7 @@ namespace bool is_special_account(const graphene::chain::account_id_type& account_id) { - return account_id.instance < 100; + return account_id.instance.value < 100; } bool is_scam(const std::string& account_name) diff --git a/libraries/wallet/wallet.cpp b/libraries/wallet/wallet.cpp index 8f24192a..c0c998a9 100644 --- a/libraries/wallet/wallet.cpp +++ b/libraries/wallet/wallet.cpp @@ -1762,10 +1762,11 @@ public: witness_create_op.witness_account = witness_account.id; witness_create_op.block_signing_key = witness_public_key; witness_create_op.url = url; - secret_hash_type::encoder enc; - fc::raw::pack(enc, witness_private_key); - fc::raw::pack(enc, secret_hash_type()); - witness_create_op.initial_secret = secret_hash_type::hash(enc.result()); + + // secret_hash_type::encoder enc; + // fc::raw::pack(enc, witness_private_key); + // fc::raw::pack(enc, secret_hash_type()); + witness_create_op.initial_secret = secret_hash_type::hash(owner_account); if (_remote_db->get_witness_by_account(witness_create_op.witness_account)) diff --git a/tests/common/database_fixture.cpp b/tests/common/database_fixture.cpp index d1b9119d..e6a515ea 100644 --- a/tests/common/database_fixture.cpp +++ b/tests/common/database_fixture.cpp @@ -665,10 +665,12 @@ const witness_object& database_fixture::create_witness( const account_object& ow witness_create_operation op; op.witness_account = owner.id; op.block_signing_key = signing_private_key.get_public_key(); - secret_hash_type::encoder enc; - fc::raw::pack(enc, signing_private_key); - fc::raw::pack(enc, secret_hash_type()); - op.initial_secret = secret_hash_type::hash(enc.result()); + + // secret_hash_type::encoder enc; + // fc::raw::pack(enc, signing_private_key); + // fc::raw::pack(enc, owner.name); + op.initial_secret = secret_hash_type::hash(owner.name); + trx.operations.push_back(op); trx.validate(); processed_transaction ptx = db.push_transaction(trx, ~0);