From 83f9e4666899a04f98da9185e526479de33aa54b Mon Sep 17 00:00:00 2001 From: BhuzOr Date: Sun, 4 Jun 2017 15:16:49 +0200 Subject: [PATCH 1/4] Validate block timestamps Reject blocks with timestamp too far in the future Backport from BitShares: https://github.com/bitshares/bitshares-core/pull/17 --- libraries/app/application.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/app/application.cpp b/libraries/app/application.cpp index ea5789b8..a700837a 100644 --- a/libraries/app/application.cpp +++ b/libraries/app/application.cpp @@ -493,6 +493,7 @@ namespace detail { { try { auto latency = graphene::time::now() - blk_msg.block.timestamp; + FC_ASSERT( (latency.count()/1000) > -5000, "Rejecting block with timestamp in the future" ); if (!sync_mode || blk_msg.block.block_num() % 10000 == 0) { const auto& witness = blk_msg.block.witness(*_chain_db); From 8ceaeb0aa29245004df4eeb8e24e4972fde3cae5 Mon Sep 17 00:00:00 2001 From: BhuzOr Date: Sun, 4 Jun 2017 23:29:55 +0200 Subject: [PATCH 2/4] Fix clear_expired_transactions memory leak Backport from Steem/BitShares: https://github.com/bitshares/bitshares-core/issues/256 --- libraries/chain/db_update.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/chain/db_update.cpp b/libraries/chain/db_update.cpp index d14d5cf2..d119d486 100644 --- a/libraries/chain/db_update.cpp +++ b/libraries/chain/db_update.cpp @@ -184,8 +184,8 @@ void database::clear_expired_transactions() //Transactions must have expired by at least two forking windows in order to be removed. auto& transaction_idx = static_cast(get_mutable_index(implementation_ids, impl_transaction_object_type)); const auto& dedupe_index = transaction_idx.indices().get(); - while( (!dedupe_index.empty()) && (head_block_time() > dedupe_index.rbegin()->trx.expiration) ) - transaction_idx.remove(*dedupe_index.rbegin()); + while( (!dedupe_index.empty()) && (head_block_time() > dedupe_index.begin()->trx.expiration) ) + transaction_idx.remove(*dedupe_index.begin()); } FC_CAPTURE_AND_RETHROW() } void database::clear_expired_proposals() From d5d7900cb47f85b38afcf192b4ddc58d623cebdf Mon Sep 17 00:00:00 2001 From: Michael Neynens Date: Mon, 9 Jul 2018 08:51:56 -0700 Subject: [PATCH 3/4] Updated seed nodes and added update section in README --- README.md | 7 ++++- libraries/app/application.cpp | 51 +++++++++++++++++++++++------------ 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index aeeff8a5..52b730be 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,12 @@ Start the witness back up ./programs/witness_node/witness_node +Upgrading A Peerplays Node +----------------- +To minimize downtime of your peerplays node when upgrading, one upgrade idea was written in this steemit article: https://steemit.com/peerplays/@joseph/peerplays-update-setting-a-backup-witness-server-switching-servers + +Wallet Setup +----------------- Then, in a separate terminal window, start the command-line wallet `cli_wallet`: ./programs/cli_wallet/cli_wallet @@ -38,7 +44,6 @@ To set your initial password to 'password' use: >>> set_password password >>> unlock password - A list of CLI wallet commands is available [here](https://github.com/PBSA/peerplays/blob/master/libraries/wallet/include/graphene/wallet/wallet.hpp). diff --git a/libraries/app/application.cpp b/libraries/app/application.cpp index 4fb00118..105a9912 100644 --- a/libraries/app/application.cpp +++ b/libraries/app/application.cpp @@ -163,23 +163,40 @@ 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 + "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 + "seed.ppy.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 + "82.223.108.91:7777", // hiltos-witness + "seed.ppy.nuevax.com:19777", // nuevax + "peerplays.butler.net:9777", // billbutler-witness + "peerplays.bitcoiner.me:9777", // bitcoiner + "ppyseed.bacchist.me:42420", // bacchist-witness + "peerplays.bhuz.info:9777", // bhuz + "node.peerblock.trade:9777", // bitcoinsig + "peerplays.crypto.fans:9777", // sc-steemit + "54.38.193.20:9777", // royal-flush + "ppy001.bts-nodes.net:7777", // baxters-sports-witness + "ppy002.bts-nodes.net:7777", // baxters-sports-witness + "ppy003.bts-nodes.net:7777", // baxters-sports-witness + "ppy004.bts-nodes.net:7777", // baxters-sports-witness + "ppy.proxyhosts.info:7777", // baxters-sports-witness + "ppyseed.spacemx.tech:9777", // spacecrypt-witness + "peerplaysblockchain.net:9777", // houdini-witness + "54.37.235.164:7777", // melea-trust + "peerplays-seed.lukestokes.info:7777" // lukestokes-witness }; for( const string& endpoint_string : seeds ) { From 1c1026516ac8de96d25f74e901990573638682d5 Mon Sep 17 00:00:00 2001 From: Michael Neynens Date: Tue, 7 Aug 2018 18:04:17 -0700 Subject: [PATCH 4/4] Updated vote tallying, skipping non-existing accounts --- libraries/chain/account_evaluator.cpp | 2 +- libraries/chain/db_maint.cpp | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libraries/chain/account_evaluator.cpp b/libraries/chain/account_evaluator.cpp index b9b27716..51205ae5 100644 --- a/libraries/chain/account_evaluator.cpp +++ b/libraries/chain/account_evaluator.cpp @@ -68,6 +68,7 @@ void verify_account_votes( const database& db, const account_options& options ) "Voted for more witnesses than currently allowed (${c})", ("c", chain_params.maximum_witness_count) ); FC_ASSERT( options.num_committee <= chain_params.maximum_committee_count, "Voted for more committee members than currently allowed (${c})", ("c", chain_params.maximum_committee_count) ); + FC_ASSERT( db.find_object(options.voting_account), "Invalid proxy account specified." ); uint32_t max_vote_id = gpo.next_available_vote_id; bool has_worker_votes = false; @@ -108,7 +109,6 @@ void_result account_create_evaluator::do_evaluate( const account_create_operatio FC_ASSERT( !op.extensions.value.buyback_options.valid() ); } - FC_ASSERT( d.find_object(op.options.voting_account), "Invalid proxy account specified." ); FC_ASSERT( fee_paying_account->is_lifetime_member(), "Only Lifetime members may register an account." ); FC_ASSERT( op.referrer(d).is_member(d.head_block_time()), "The referrer must be either a lifetime or annual subscriber." ); diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index b701259c..a41bc7df 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -1244,10 +1244,15 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g // There may be a difference between the account whose stake is voting and the one specifying opinions. // Usually they're the same, but if the stake account has specified a voting_account, that account is the one // specifying the opinions. - const account_object& opinion_account = + const account_object* opinion_account_ptr = (stake_account.options.voting_account == - GRAPHENE_PROXY_TO_SELF_ACCOUNT)? stake_account - : d.get(stake_account.options.voting_account); + GRAPHENE_PROXY_TO_SELF_ACCOUNT)? &stake_account + : d.find(stake_account.options.voting_account); + + if( !opinion_account_ptr ) // skip non-exist account + return; + + const account_object& opinion_account = *opinion_account_ptr; const auto& stats = stake_account.statistics(d); uint64_t voting_stake = stats.total_core_in_orders.value