From b2c3d5d2c71544c62d278530c351242753afd3c0 Mon Sep 17 00:00:00 2001 From: Robert Day Date: Sat, 3 Jul 2021 06:52:55 +0000 Subject: [PATCH 1/9] mining: Apply PoW reward tx to the currently mined block; *before* other txs --- libraries/plugins/chain/chain_plugin.cpp | 8 +++- .../plugins/chain/abstract_block_producer.hpp | 1 + .../xgt/plugins/chain/chain_plugin.hpp | 1 + .../plugins/debug_node/debug_node_plugin.cpp | 6 ++- libraries/plugins/witness/block_producer.cpp | 40 ++++++++++++++++--- .../xgt/plugins/witness/block_producer.hpp | 7 +++- libraries/plugins/witness/witness_plugin.cpp | 23 +++++++++-- 7 files changed, 72 insertions(+), 14 deletions(-) diff --git a/libraries/plugins/chain/chain_plugin.cpp b/libraries/plugins/chain/chain_plugin.cpp index edb0d796..8f8a6fb6 100644 --- a/libraries/plugins/chain/chain_plugin.cpp +++ b/libraries/plugins/chain/chain_plugin.cpp @@ -37,15 +37,17 @@ namespace asio = boost::asio; struct generate_block_request { - generate_block_request( const fc::time_point_sec w, const wallet_name_type& wo, const fc::ecc::private_key& priv_key, uint32_t s ) : + generate_block_request( const fc::time_point_sec w, const wallet_name_type& wo, const fc::ecc::private_key& priv_key, const xgt::chain::signed_transaction& br, uint32_t s ) : when( w ), witness_recovery( wo ), block_signing_private_key( priv_key ), + block_reward( br ), skip( s ) {} const fc::time_point_sec when; const wallet_name_type& witness_recovery; const fc::ecc::private_key& block_signing_private_key; + const xgt::chain::signed_transaction block_reward; uint32_t skip; signed_block block; }; @@ -183,6 +185,7 @@ struct write_request_visitor req->when, req->witness_recovery, req->block_signing_private_key, + req->block_reward, req->skip ); @@ -733,9 +736,10 @@ xgt::chain::signed_block chain_plugin::generate_block( const fc::time_point_sec when, const wallet_name_type& witness_recovery, const fc::ecc::private_key& block_signing_private_key, + const xgt::chain::signed_transaction& block_reward, uint32_t skip ) { - generate_block_request req( when, witness_recovery, block_signing_private_key, skip ); + generate_block_request req( when, witness_recovery, block_signing_private_key, block_reward, skip ); boost::promise< void > prom; write_context cxt; cxt.req_ptr = &req; diff --git a/libraries/plugins/chain/include/xgt/plugins/chain/abstract_block_producer.hpp b/libraries/plugins/chain/include/xgt/plugins/chain/abstract_block_producer.hpp index e3d2943d..f41931b5 100644 --- a/libraries/plugins/chain/include/xgt/plugins/chain/abstract_block_producer.hpp +++ b/libraries/plugins/chain/include/xgt/plugins/chain/abstract_block_producer.hpp @@ -14,6 +14,7 @@ class abstract_block_producer { fc::time_point_sec when, const xgt::chain::wallet_name_type& witness_recovery, const fc::ecc::private_key& block_signing_private_key, + const xgt::chain::signed_transaction& block_reward, uint32_t skip = xgt::chain::database::skip_nothing) = 0; }; diff --git a/libraries/plugins/chain/include/xgt/plugins/chain/chain_plugin.hpp b/libraries/plugins/chain/include/xgt/plugins/chain/chain_plugin.hpp index c8331cec..bd6b77a8 100644 --- a/libraries/plugins/chain/include/xgt/plugins/chain/chain_plugin.hpp +++ b/libraries/plugins/chain/include/xgt/plugins/chain/chain_plugin.hpp @@ -51,6 +51,7 @@ class chain_plugin : public plugin< chain_plugin > const fc::time_point_sec when, const wallet_name_type& witness_recovery, const fc::ecc::private_key& block_signing_private_key, + const xgt::chain::signed_transaction& block_reward, uint32_t skip = database::skip_nothing ); diff --git a/libraries/plugins/debug_node/debug_node_plugin.cpp b/libraries/plugins/debug_node/debug_node_plugin.cpp index 86a20ee1..fe09322a 100644 --- a/libraries/plugins/debug_node/debug_node_plugin.cpp +++ b/libraries/plugins/debug_node/debug_node_plugin.cpp @@ -253,7 +253,11 @@ void debug_node_plugin::debug_generate_blocks( break; } - bp.generate_block( scheduled_time, scheduled_witness_name, *debug_private_key, args.skip ); + // For expediency, this is just a hacked together block; a less-fake version would be a + // PoW operation. + protocol::signed_transaction fake_block_reward; + + bp.generate_block( scheduled_time, scheduled_witness_name, *debug_private_key, fake_block_reward, args.skip ); ++produced; slot = new_slot; } diff --git a/libraries/plugins/witness/block_producer.cpp b/libraries/plugins/witness/block_producer.cpp index b12e263f..800dbcf9 100644 --- a/libraries/plugins/witness/block_producer.cpp +++ b/libraries/plugins/witness/block_producer.cpp @@ -16,7 +16,7 @@ namespace xgt { namespace plugins { namespace witness { -chain::signed_block block_producer::generate_block(fc::time_point_sec when, const chain::wallet_name_type& witness_recovery, const fc::ecc::private_key& block_signing_private_key, uint32_t skip) +chain::signed_block block_producer::generate_block(fc::time_point_sec when, const chain::wallet_name_type& witness_recovery, const fc::ecc::private_key& block_signing_private_key, const xgt::chain::signed_transaction& trx, uint32_t skip) { chain::signed_block result; try @@ -29,7 +29,7 @@ chain::signed_block block_producer::generate_block(fc::time_point_sec when, cons { try { - result = _generate_block( when, witness_recovery, block_signing_private_key ); + result = _generate_block( when, witness_recovery, block_signing_private_key, trx ); } FC_CAPTURE_AND_RETHROW( (witness_recovery) ) }); @@ -44,7 +44,7 @@ chain::signed_block block_producer::generate_block(fc::time_point_sec when, cons return result; } -chain::signed_block block_producer::_generate_block(fc::time_point_sec when, const chain::wallet_name_type& witness, const fc::ecc::private_key& block_signing_private_key) +chain::signed_block block_producer::_generate_block(fc::time_point_sec when, const chain::wallet_name_type& witness, const fc::ecc::private_key& block_signing_private_key, const xgt::chain::signed_transaction& block_reward) { try { uint32_t skip = _db.get_node_properties().skip_flags; // const auto& witness_obj = _db.get_witness( witness ); @@ -70,7 +70,7 @@ chain::signed_block block_producer::_generate_block(fc::time_point_sec when, con adjust_hardfork_version_vote( _db.get_witness( witness ), pending_block ); - apply_pending_transactions( witness, when, pending_block ); + apply_pending_transactions( witness, when, pending_block, block_reward ); // We have temporarily broken the invariant that // _pending_tx_session is the result of applying _pending_tx, as @@ -120,7 +120,8 @@ void block_producer::adjust_hardfork_version_vote(const chain::witness_object& w void block_producer::apply_pending_transactions( const chain::wallet_name_type& witness_recovery, fc::time_point_sec when, - chain::signed_block& pending_block) + chain::signed_block& pending_block, + const xgt::chain::signed_transaction& block_reward ) { size_t total_block_size = fc::raw::pack_size( pending_block ); total_block_size += sizeof( uint32_t ); // Transaction vector length @@ -153,7 +154,36 @@ void block_producer::apply_pending_transactions( dgp.current_witness = witness_recovery; }); + uint64_t postponed_tx_count = 0; + + + // postpone transaction if it would make block too big + + uint64_t new_total_size = total_block_size + fc::raw::pack_size( block_reward ); + if (new_total_size >= maximum_transaction_partition_size) + { + postponed_tx_count++; + } + else + { + try + { + auto temp_session = _db.start_undo_session(); + _db.apply_transaction(block_reward, _db.get_node_properties().skip_flags); + temp_session.squash(); + + total_block_size = new_total_size; + pending_block.transactions.push_back(block_reward); + } + catch (const fc::exception& e) + { + // Do nothing, transaction will not be re-applied + //wlog( "Transaction was not processed while generating block due to ${e}", ("e", e) ); + //wlog( "The transaction was ${t}", ("t", tx) ); + } + } + // pop pending state (reset to head block state) for( const chain::signed_transaction& tx : _db._pending_tx ) { diff --git a/libraries/plugins/witness/include/xgt/plugins/witness/block_producer.hpp b/libraries/plugins/witness/include/xgt/plugins/witness/block_producer.hpp index a5389d6b..dcefe996 100644 --- a/libraries/plugins/witness/include/xgt/plugins/witness/block_producer.hpp +++ b/libraries/plugins/witness/include/xgt/plugins/witness/block_producer.hpp @@ -22,6 +22,7 @@ class block_producer : public chain::abstract_block_producer { fc::time_point_sec when, const chain::wallet_name_type& witness_recovery, const fc::ecc::private_key& block_signing_private_key, + const xgt::chain::signed_transaction& trx, uint32_t skip = chain::database::skip_nothing); private: @@ -30,14 +31,16 @@ class block_producer : public chain::abstract_block_producer { chain::signed_block _generate_block( fc::time_point_sec when, const chain::wallet_name_type& witness_recovery, - const fc::ecc::private_key& block_signing_private_key); + const fc::ecc::private_key& block_signing_private_key, + const xgt::chain::signed_transaction& block_reward); void adjust_hardfork_version_vote( const chain::witness_object& witness, chain::signed_block& pending_block ); void apply_pending_transactions( const chain::wallet_name_type& witness_recovery, fc::time_point_sec when, - chain::signed_block& pending_block); + chain::signed_block& pending_block, + const xgt::chain::signed_transaction& trx); }; } } } // xgt::plugins::witness diff --git a/libraries/plugins/witness/witness_plugin.cpp b/libraries/plugins/witness/witness_plugin.cpp index 31cbb81b..deaee851 100644 --- a/libraries/plugins/witness/witness_plugin.cpp +++ b/libraries/plugins/witness/witness_plugin.cpp @@ -319,8 +319,8 @@ namespace detail { appbase::app().get_plugin< xgt::plugins::p2p::p2p_plugin >().broadcast_block( block ); wlog( "Broadcasting Proof of Work for ${miner}", ("miner", miner) ); - _db.push_transaction( trx ); - appbase::app().get_plugin< xgt::plugins::p2p::p2p_plugin >().broadcast_transaction( trx ); + // _db.push_transaction( trx ); + // appbase::app().get_plugin< xgt::plugins::p2p::p2p_plugin >().broadcast_transaction( trx ); ++this->_head_block_num; wlog( "Broadcast succeeded!" ); @@ -395,9 +395,24 @@ namespace detail { { wlog("Generating genesis block..."); + // TODO :: generate PoW reward for genesis block; or otherwise auto pair = _private_keys.begin(); - auto block = _chain_plugin.generate_block( now, XGT_INIT_MINER_NAME, pair->second, _production_skip_flags ); - _db.push_block(block, (uint32_t)0); + xgt::chain::signed_transaction init_tx; + + comment_operation op; + op.author = "anon"; + op.permlink = "/xgt"; + op.parent_author = ""; + op.parent_permlink = "/sn"; + op.body = "New York Times 7/1/2021 U.S. Deficit Expected to Hit $3 Trillion in 2021, Budget Office Says"; + + init_tx.operations.push_back( op ); + init_tx.set_expiration( _db.head_block_time() + XGT_MAX_TIME_UNTIL_EXPIRATION ); + init_tx.sign( pair->second, XGT_CHAIN_ID, fc::ecc::fc_canonical ); + // sign( init_tx, alice_private_key ); + + auto block = _chain_plugin.generate_block( now, XGT_INIT_MINER_NAME, pair->second, init_tx, _production_skip_flags ); + // _db.push_block(block, (uint32_t)0); this->_head_block_num++; schedule_production_loop(); return; From 07d4b541ca15cc2c5702a7dec541c0848cd62225 Mon Sep 17 00:00:00 2001 From: Roger Jungemann Date: Thu, 8 Jul 2021 21:19:09 -0700 Subject: [PATCH 2/9] WIP: One reward per block. block_producer still needs updating --- libraries/chain/database.cpp | 65 ++++++++++++++++++++++++++-- libraries/chain/xgt_evaluator.cpp | 6 +++ libraries/plugins/p2p/p2p_plugin.cpp | 2 +- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/libraries/chain/database.cpp b/libraries/chain/database.cpp index cb0d8e86..bb1defd6 100644 --- a/libraries/chain/database.cpp +++ b/libraries/chain/database.cpp @@ -1403,7 +1403,7 @@ void database::init_genesis( uint64_t init_supply ) auth.money.weight_threshold = 0; }); - ilog( "!!!!!! Preparing to create genesis account..." ); + ilog( "Preparing to create genesis account..." ); create< dynamic_global_property_object >( [&]( dynamic_global_property_object& p ) { p.mining_target = fc::sha256(XGT_MINING_TARGET_START); @@ -1703,9 +1703,10 @@ void database::_apply_block( const signed_block& next_block ) // process_optional_actions( opt_actions ); // Ensure no duplicate mining rewards - /// @since 1.1.2 reject blocks with duplicate rewards + /// @since 1.2.0 reject blocks with duplicate rewards + /// @since 1.3.0 deprecated uint32_t head_num = head_block_num(); - if (head_num >= 907200) + if (head_num >= 907200 && head_num < 1814400) { std::set< wallet_name_type > rewarded_wallets; for( const auto& trx : next_block.transactions ) @@ -1729,6 +1730,64 @@ void database::_apply_block( const signed_block& next_block ) } } + /// @since 1.3.0 reward the first miner, on the current ("next") block + if (head_num >= 1814400) + { + optional< wallet_name_type > rewarded_miner; + for( const auto& trx : next_block.transactions ) + { + if ( rewarded_miner ) + break; + const auto& operations = trx.operations; + for (auto& op : operations) + { + if ( rewarded_miner ) + break; + if ( !is_pow_operation(op) ) + continue; + const pow_operation& o = op.template get< pow_operation >(); + const wallet_name_type& wallet_name = o.get_worker_name(); + + const auto& dgp = get_dynamic_global_properties(); + uint32_t target_pow = get_pow_summary_target(); + + const auto& work = o.work.get< sha2_pow >(); + FC_ASSERT( work.pow_summary < target_pow, "Insufficient work difficulty. Work: ${w}, Target: ${t}", ("w",work.pow_summary)("t", target_pow) ); + FC_ASSERT( work.prev_block < next_block.previous, "Op prev block id ${m} doesn't match prev block id ${n} do not match.", ("m",work.prev_block)("n",next_block.previous) ); + FC_ASSERT( next_block.witness == wallet_name, "Block miner name ${m} and op miner name (${n}) do not match.", ("m",next_block.witness)("n",wallet_name) ); + wallet_name_type worker_account = work.input.worker_account; + + // TODO: Check for 0 + int halvings = (XGT_STARTING_OFFSET + dgp.head_block_number) / XGT_MINING_REWARD_HALVING_INTERVAL; + // TODO: Assert no overflow + long divisor = 1L << halvings; + asset base_reward = XGT_MINING_REWARD; + double value = base_reward.amount.value * (1.0 / static_cast(divisor)); + long price = static_cast(floor(value)); + asset reward = asset(price, base_reward.symbol); + wlog("!!!!!! Mining reward for ${w} amount ${r}", ("w",worker_account)("r",reward)); + + const wallet_object* w = find_account( worker_account ); + const witness_object* cur_witness = find_witness( worker_account ); + if (w == nullptr) + { + wlog( "Wallet does not exist for worker account ${w}", ("w",worker_account) ); + throw operation_validate_exception(); + } + if (cur_witness == nullptr) + { + wlog( "Witness does not exist for worker account ${w}", ("w",worker_account) ); + throw operation_validate_exception(); + } + + adjust_balance(worker_account, reward); + + rewarded_miner = optional< wallet_name_type >(wallet_name); + } + } + } + + // Adjust mining difficulty const uint32_t frequency = XGT_MINING_RECALC_EVERY_N_BLOCKS; if( next_block_num == 1) diff --git a/libraries/chain/xgt_evaluator.cpp b/libraries/chain/xgt_evaluator.cpp index d3943056..50117879 100644 --- a/libraries/chain/xgt_evaluator.cpp +++ b/libraries/chain/xgt_evaluator.cpp @@ -918,6 +918,12 @@ void pow_evaluator::do_apply( const pow_operation& o ) { database& db = this->db(); + uint32_t head_num = db.head_block_num(); + if (head_num >= 181440) + { + return; + } + const auto& dgp = db.get_dynamic_global_properties(); uint32_t target_pow = db.get_pow_summary_target(); diff --git a/libraries/plugins/p2p/p2p_plugin.cpp b/libraries/plugins/p2p/p2p_plugin.cpp index ec7fa398..aca5cd02 100644 --- a/libraries/plugins/p2p/p2p_plugin.cpp +++ b/libraries/plugins/p2p/p2p_plugin.cpp @@ -576,7 +576,7 @@ void p2p_plugin::plugin_initialize(const boost::program_options::variables_map& { my = std::make_unique< detail::p2p_plugin_impl >( appbase::app().get_plugin< plugins::chain::chain_plugin >() ); - my->ready_to_mine = false; + my->ready_to_mine = true; // TODO: Change this back if( options.count( "p2p-endpoint" ) ) my->endpoint = fc::ip::endpoint::from_string( options.at( "p2p-endpoint" ).as< string >() ); From b93edb78698c5431b42e1219bb3797b20a346fd1 Mon Sep 17 00:00:00 2001 From: Roger Jungemann Date: Tue, 13 Jul 2021 15:18:01 -0700 Subject: [PATCH 3/9] Use optionals for block reward trx --- libraries/plugins/chain/chain_plugin.cpp | 14 +++++--- .../plugins/chain/abstract_block_producer.hpp | 2 +- .../xgt/plugins/chain/chain_plugin.hpp | 2 +- libraries/plugins/witness/block_producer.cpp | 35 +++++++++++++------ .../xgt/plugins/witness/block_producer.hpp | 11 +++--- libraries/plugins/witness/witness_plugin.cpp | 34 ++++++++---------- 6 files changed, 59 insertions(+), 39 deletions(-) diff --git a/libraries/plugins/chain/chain_plugin.cpp b/libraries/plugins/chain/chain_plugin.cpp index 8f8a6fb6..934cfc85 100644 --- a/libraries/plugins/chain/chain_plugin.cpp +++ b/libraries/plugins/chain/chain_plugin.cpp @@ -37,7 +37,13 @@ namespace asio = boost::asio; struct generate_block_request { - generate_block_request( const fc::time_point_sec w, const wallet_name_type& wo, const fc::ecc::private_key& priv_key, const xgt::chain::signed_transaction& br, uint32_t s ) : + generate_block_request( + const fc::time_point_sec w, + const wallet_name_type& wo, + const fc::ecc::private_key& priv_key, + fc::optional< xgt::chain::signed_transaction > br, + uint32_t s + ) : when( w ), witness_recovery( wo ), block_signing_private_key( priv_key ), @@ -47,7 +53,7 @@ struct generate_block_request const fc::time_point_sec when; const wallet_name_type& witness_recovery; const fc::ecc::private_key& block_signing_private_key; - const xgt::chain::signed_transaction block_reward; + fc::optional< xgt::chain::signed_transaction > block_reward; uint32_t skip; signed_block block; }; @@ -185,7 +191,7 @@ struct write_request_visitor req->when, req->witness_recovery, req->block_signing_private_key, - req->block_reward, + fc::optional< xgt::chain::signed_transaction >(req->block_reward), req->skip ); @@ -736,7 +742,7 @@ xgt::chain::signed_block chain_plugin::generate_block( const fc::time_point_sec when, const wallet_name_type& witness_recovery, const fc::ecc::private_key& block_signing_private_key, - const xgt::chain::signed_transaction& block_reward, + fc::optional< xgt::chain::signed_transaction > block_reward, uint32_t skip ) { generate_block_request req( when, witness_recovery, block_signing_private_key, block_reward, skip ); diff --git a/libraries/plugins/chain/include/xgt/plugins/chain/abstract_block_producer.hpp b/libraries/plugins/chain/include/xgt/plugins/chain/abstract_block_producer.hpp index f41931b5..64bbec7f 100644 --- a/libraries/plugins/chain/include/xgt/plugins/chain/abstract_block_producer.hpp +++ b/libraries/plugins/chain/include/xgt/plugins/chain/abstract_block_producer.hpp @@ -14,7 +14,7 @@ class abstract_block_producer { fc::time_point_sec when, const xgt::chain::wallet_name_type& witness_recovery, const fc::ecc::private_key& block_signing_private_key, - const xgt::chain::signed_transaction& block_reward, + fc::optional< xgt::chain::signed_transaction > block_reward, uint32_t skip = xgt::chain::database::skip_nothing) = 0; }; diff --git a/libraries/plugins/chain/include/xgt/plugins/chain/chain_plugin.hpp b/libraries/plugins/chain/include/xgt/plugins/chain/chain_plugin.hpp index bd6b77a8..da1dbed2 100644 --- a/libraries/plugins/chain/include/xgt/plugins/chain/chain_plugin.hpp +++ b/libraries/plugins/chain/include/xgt/plugins/chain/chain_plugin.hpp @@ -51,7 +51,7 @@ class chain_plugin : public plugin< chain_plugin > const fc::time_point_sec when, const wallet_name_type& witness_recovery, const fc::ecc::private_key& block_signing_private_key, - const xgt::chain::signed_transaction& block_reward, + fc::optional< xgt::chain::signed_transaction > block_reward, uint32_t skip = database::skip_nothing ); diff --git a/libraries/plugins/witness/block_producer.cpp b/libraries/plugins/witness/block_producer.cpp index 800dbcf9..de02d50d 100644 --- a/libraries/plugins/witness/block_producer.cpp +++ b/libraries/plugins/witness/block_producer.cpp @@ -16,7 +16,13 @@ namespace xgt { namespace plugins { namespace witness { -chain::signed_block block_producer::generate_block(fc::time_point_sec when, const chain::wallet_name_type& witness_recovery, const fc::ecc::private_key& block_signing_private_key, const xgt::chain::signed_transaction& trx, uint32_t skip) +chain::signed_block block_producer::generate_block( + fc::time_point_sec when, + const chain::wallet_name_type& witness_recovery, + const fc::ecc::private_key& block_signing_private_key, + fc::optional< xgt::chain::signed_transaction > trx, + uint32_t skip +) { chain::signed_block result; try @@ -44,7 +50,12 @@ chain::signed_block block_producer::generate_block(fc::time_point_sec when, cons return result; } -chain::signed_block block_producer::_generate_block(fc::time_point_sec when, const chain::wallet_name_type& witness, const fc::ecc::private_key& block_signing_private_key, const xgt::chain::signed_transaction& block_reward) +chain::signed_block block_producer::_generate_block( + fc::time_point_sec when, + const chain::wallet_name_type& witness, + const fc::ecc::private_key& block_signing_private_key, + fc::optional< xgt::chain::signed_transaction > block_reward +) { try { uint32_t skip = _db.get_node_properties().skip_flags; // const auto& witness_obj = _db.get_witness( witness ); @@ -118,10 +129,11 @@ void block_producer::adjust_hardfork_version_vote(const chain::witness_object& w } void block_producer::apply_pending_transactions( - const chain::wallet_name_type& witness_recovery, - fc::time_point_sec when, - chain::signed_block& pending_block, - const xgt::chain::signed_transaction& block_reward ) + const chain::wallet_name_type& witness_recovery, + fc::time_point_sec when, + chain::signed_block& pending_block, + fc::optional< xgt::chain::signed_transaction > block_reward +) { size_t total_block_size = fc::raw::pack_size( pending_block ); total_block_size += sizeof( uint32_t ); // Transaction vector length @@ -158,9 +170,11 @@ void block_producer::apply_pending_transactions( uint64_t postponed_tx_count = 0; - // postpone transaction if it would make block too big + // postpone transaction if it would make block too big - uint64_t new_total_size = total_block_size + fc::raw::pack_size( block_reward ); + if (block_reward) + { + uint64_t new_total_size = total_block_size + fc::raw::pack_size( *block_reward ); if (new_total_size >= maximum_transaction_partition_size) { postponed_tx_count++; @@ -170,11 +184,11 @@ void block_producer::apply_pending_transactions( try { auto temp_session = _db.start_undo_session(); - _db.apply_transaction(block_reward, _db.get_node_properties().skip_flags); + _db.apply_transaction(*block_reward, _db.get_node_properties().skip_flags); temp_session.squash(); total_block_size = new_total_size; - pending_block.transactions.push_back(block_reward); + pending_block.transactions.push_back(*block_reward); } catch (const fc::exception& e) { @@ -183,6 +197,7 @@ void block_producer::apply_pending_transactions( //wlog( "The transaction was ${t}", ("t", tx) ); } } + } // pop pending state (reset to head block state) for( const chain::signed_transaction& tx : _db._pending_tx ) diff --git a/libraries/plugins/witness/include/xgt/plugins/witness/block_producer.hpp b/libraries/plugins/witness/include/xgt/plugins/witness/block_producer.hpp index dcefe996..8fe79413 100644 --- a/libraries/plugins/witness/include/xgt/plugins/witness/block_producer.hpp +++ b/libraries/plugins/witness/include/xgt/plugins/witness/block_producer.hpp @@ -22,8 +22,9 @@ class block_producer : public chain::abstract_block_producer { fc::time_point_sec when, const chain::wallet_name_type& witness_recovery, const fc::ecc::private_key& block_signing_private_key, - const xgt::chain::signed_transaction& trx, - uint32_t skip = chain::database::skip_nothing); + fc::optional< xgt::chain::signed_transaction > trx, + uint32_t skip = chain::database::skip_nothing + ); private: chain::database& _db; @@ -32,7 +33,8 @@ class block_producer : public chain::abstract_block_producer { fc::time_point_sec when, const chain::wallet_name_type& witness_recovery, const fc::ecc::private_key& block_signing_private_key, - const xgt::chain::signed_transaction& block_reward); + fc::optional< xgt::chain::signed_transaction > block_reward + ); void adjust_hardfork_version_vote( const chain::witness_object& witness, chain::signed_block& pending_block ); @@ -40,7 +42,8 @@ class block_producer : public chain::abstract_block_producer { const chain::wallet_name_type& witness_recovery, fc::time_point_sec when, chain::signed_block& pending_block, - const xgt::chain::signed_transaction& trx); + fc::optional< xgt::chain::signed_transaction > trx + ); }; } } } // xgt::plugins::witness diff --git a/libraries/plugins/witness/witness_plugin.cpp b/libraries/plugins/witness/witness_plugin.cpp index deaee851..759b2699 100644 --- a/libraries/plugins/witness/witness_plugin.cpp +++ b/libraries/plugins/witness/witness_plugin.cpp @@ -314,7 +314,13 @@ namespace detail { { wlog("Mined block proceeding #${n} with timestamp ${t} at time ${c}", ("n", block_num)("t", head_block_time)("c", fc::time_point::now())); fc::time_point now = fc::time_point::now(); - auto block = _chain_plugin.generate_block( now, miner, pk, _production_skip_flags); + auto block = _chain_plugin.generate_block( + now, + miner, + pk, + fc::optional< protocol::signed_transaction >(trx), + _production_skip_flags + ); _db.push_block(block, (uint32_t)0); appbase::app().get_plugin< xgt::plugins::p2p::p2p_plugin >().broadcast_block( block ); @@ -394,25 +400,15 @@ namespace detail { if (*name_ptr == XGT_INIT_MINER_NAME) { wlog("Generating genesis block..."); - - // TODO :: generate PoW reward for genesis block; or otherwise auto pair = _private_keys.begin(); - xgt::chain::signed_transaction init_tx; - - comment_operation op; - op.author = "anon"; - op.permlink = "/xgt"; - op.parent_author = ""; - op.parent_permlink = "/sn"; - op.body = "New York Times 7/1/2021 U.S. Deficit Expected to Hit $3 Trillion in 2021, Budget Office Says"; - - init_tx.operations.push_back( op ); - init_tx.set_expiration( _db.head_block_time() + XGT_MAX_TIME_UNTIL_EXPIRATION ); - init_tx.sign( pair->second, XGT_CHAIN_ID, fc::ecc::fc_canonical ); - // sign( init_tx, alice_private_key ); - - auto block = _chain_plugin.generate_block( now, XGT_INIT_MINER_NAME, pair->second, init_tx, _production_skip_flags ); - // _db.push_block(block, (uint32_t)0); + auto block = _chain_plugin.generate_block( + now, + XGT_INIT_MINER_NAME, + pair->second, + fc::optional< xgt::chain::signed_transaction >(), + _production_skip_flags + ); + _db.push_block(block, (uint32_t)0); this->_head_block_num++; schedule_production_loop(); return; From 5b262f3fd652c38b31b64395bd1d6f0c4734d097 Mon Sep 17 00:00:00 2001 From: Roger Jungemann Date: Wed, 14 Jul 2021 11:20:21 -0700 Subject: [PATCH 4/9] Hardfork logic --- libraries/chain/database.cpp | 7 ++- libraries/chain/xgt_evaluator.cpp | 2 - libraries/plugins/witness/witness_plugin.cpp | 47 ++++++++++++++------ 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/libraries/chain/database.cpp b/libraries/chain/database.cpp index bb1defd6..afe5fd7f 100644 --- a/libraries/chain/database.cpp +++ b/libraries/chain/database.cpp @@ -1702,7 +1702,7 @@ void database::_apply_block( const signed_block& next_block ) // process_required_actions( req_actions ); // process_optional_actions( opt_actions ); - // Ensure no duplicate mining rewards + /// Ensure no duplicate mining rewards /// @since 1.2.0 reject blocks with duplicate rewards /// @since 1.3.0 deprecated uint32_t head_num = head_block_num(); @@ -1753,7 +1753,7 @@ void database::_apply_block( const signed_block& next_block ) const auto& work = o.work.get< sha2_pow >(); FC_ASSERT( work.pow_summary < target_pow, "Insufficient work difficulty. Work: ${w}, Target: ${t}", ("w",work.pow_summary)("t", target_pow) ); - FC_ASSERT( work.prev_block < next_block.previous, "Op prev block id ${m} doesn't match prev block id ${n} do not match.", ("m",work.prev_block)("n",next_block.previous) ); + FC_ASSERT( work.prev_block == next_block.previous, "Op prev block id ${m} doesn't match prev block id ${n} do not match.", ("m",work.prev_block)("n",next_block.previous) ); FC_ASSERT( next_block.witness == wallet_name, "Block miner name ${m} and op miner name (${n}) do not match.", ("m",next_block.witness)("n",wallet_name) ); wallet_name_type worker_account = work.input.worker_account; @@ -1765,7 +1765,7 @@ void database::_apply_block( const signed_block& next_block ) double value = base_reward.amount.value * (1.0 / static_cast(divisor)); long price = static_cast(floor(value)); asset reward = asset(price, base_reward.symbol); - wlog("!!!!!! Mining reward for ${w} amount ${r}", ("w",worker_account)("r",reward)); + ilog("Mining reward for ${w} amount ${r}", ("w",worker_account)("r",reward)); const wallet_object* w = find_account( worker_account ); const witness_object* cur_witness = find_witness( worker_account ); @@ -1787,7 +1787,6 @@ void database::_apply_block( const signed_block& next_block ) } } - // Adjust mining difficulty const uint32_t frequency = XGT_MINING_RECALC_EVERY_N_BLOCKS; if( next_block_num == 1) diff --git a/libraries/chain/xgt_evaluator.cpp b/libraries/chain/xgt_evaluator.cpp index 50117879..d736d382 100644 --- a/libraries/chain/xgt_evaluator.cpp +++ b/libraries/chain/xgt_evaluator.cpp @@ -920,9 +920,7 @@ void pow_evaluator::do_apply( const pow_operation& o ) uint32_t head_num = db.head_block_num(); if (head_num >= 181440) - { return; - } const auto& dgp = db.get_dynamic_global_properties(); uint32_t target_pow = db.get_pow_summary_target(); diff --git a/libraries/plugins/witness/witness_plugin.cpp b/libraries/plugins/witness/witness_plugin.cpp index 759b2699..99df4dac 100644 --- a/libraries/plugins/witness/witness_plugin.cpp +++ b/libraries/plugins/witness/witness_plugin.cpp @@ -314,19 +314,37 @@ namespace detail { { wlog("Mined block proceeding #${n} with timestamp ${t} at time ${c}", ("n", block_num)("t", head_block_time)("c", fc::time_point::now())); fc::time_point now = fc::time_point::now(); - auto block = _chain_plugin.generate_block( - now, - miner, - pk, - fc::optional< protocol::signed_transaction >(trx), - _production_skip_flags - ); - _db.push_block(block, (uint32_t)0); - appbase::app().get_plugin< xgt::plugins::p2p::p2p_plugin >().broadcast_block( block ); - - wlog( "Broadcasting Proof of Work for ${miner}", ("miner", miner) ); - // _db.push_transaction( trx ); - // appbase::app().get_plugin< xgt::plugins::p2p::p2p_plugin >().broadcast_transaction( trx ); + uint32_t head_num = _db.head_block_num(); + if (head_num < 1814400) + { + auto block_reward = fc::optional< protocol::signed_transaction >(); + auto block = _chain_plugin.generate_block( + now, + miner, + pk, + block_reward, + _production_skip_flags + ); + _db.push_block(block, (uint32_t)0); + appbase::app().get_plugin< xgt::plugins::p2p::p2p_plugin >().broadcast_block( block ); + wlog( "Broadcasting Proof of Work for ${miner}", ("miner", miner) ); + _db.push_transaction( trx ); + appbase::app().get_plugin< xgt::plugins::p2p::p2p_plugin >().broadcast_transaction( trx ); + } + else + { + auto block_reward = fc::optional< protocol::signed_transaction >(trx); + auto block = _chain_plugin.generate_block( + now, + miner, + pk, + block_reward, + _production_skip_flags + ); + _db.push_block(block, (uint32_t)0); + appbase::app().get_plugin< xgt::plugins::p2p::p2p_plugin >().broadcast_block( block ); + wlog( "Broadcasting Proof of Work for ${miner}", ("miner", miner) ); + } ++this->_head_block_num; wlog( "Broadcast succeeded!" ); @@ -401,11 +419,12 @@ namespace detail { { wlog("Generating genesis block..."); auto pair = _private_keys.begin(); + auto block_reward = fc::optional< xgt::chain::signed_transaction >(); auto block = _chain_plugin.generate_block( now, XGT_INIT_MINER_NAME, pair->second, - fc::optional< xgt::chain::signed_transaction >(), + block_reward, _production_skip_flags ); _db.push_block(block, (uint32_t)0); From 6a3e2b80d25fa1e8730aa314cd87078d7232951e Mon Sep 17 00:00:00 2001 From: Roger Jungemann Date: Thu, 15 Jul 2021 12:14:24 -0700 Subject: [PATCH 5/9] Change flag back, which was used for testing --- libraries/plugins/p2p/p2p_plugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/plugins/p2p/p2p_plugin.cpp b/libraries/plugins/p2p/p2p_plugin.cpp index aca5cd02..ec7fa398 100644 --- a/libraries/plugins/p2p/p2p_plugin.cpp +++ b/libraries/plugins/p2p/p2p_plugin.cpp @@ -576,7 +576,7 @@ void p2p_plugin::plugin_initialize(const boost::program_options::variables_map& { my = std::make_unique< detail::p2p_plugin_impl >( appbase::app().get_plugin< plugins::chain::chain_plugin >() ); - my->ready_to_mine = true; // TODO: Change this back + my->ready_to_mine = false; if( options.count( "p2p-endpoint" ) ) my->endpoint = fc::ip::endpoint::from_string( options.at( "p2p-endpoint" ).as< string >() ); From 92126b9f3a2f2286ed30b1de80737d42024b9cb1 Mon Sep 17 00:00:00 2001 From: Roger Jungemann Date: Fri, 16 Jul 2021 10:59:42 -0700 Subject: [PATCH 6/9] Change fork block height --- libraries/chain/database.cpp | 4 ++-- libraries/plugins/witness/witness_plugin.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/chain/database.cpp b/libraries/chain/database.cpp index afe5fd7f..d84d29b7 100644 --- a/libraries/chain/database.cpp +++ b/libraries/chain/database.cpp @@ -1706,7 +1706,7 @@ void database::_apply_block( const signed_block& next_block ) /// @since 1.2.0 reject blocks with duplicate rewards /// @since 1.3.0 deprecated uint32_t head_num = head_block_num(); - if (head_num >= 907200 && head_num < 1814400) + if (head_num >= 907200 && head_num < 2116800) { std::set< wallet_name_type > rewarded_wallets; for( const auto& trx : next_block.transactions ) @@ -1731,7 +1731,7 @@ void database::_apply_block( const signed_block& next_block ) } /// @since 1.3.0 reward the first miner, on the current ("next") block - if (head_num >= 1814400) + if (head_num >= 2116800) { optional< wallet_name_type > rewarded_miner; for( const auto& trx : next_block.transactions ) diff --git a/libraries/plugins/witness/witness_plugin.cpp b/libraries/plugins/witness/witness_plugin.cpp index 99df4dac..863a12b7 100644 --- a/libraries/plugins/witness/witness_plugin.cpp +++ b/libraries/plugins/witness/witness_plugin.cpp @@ -315,7 +315,7 @@ namespace detail { wlog("Mined block proceeding #${n} with timestamp ${t} at time ${c}", ("n", block_num)("t", head_block_time)("c", fc::time_point::now())); fc::time_point now = fc::time_point::now(); uint32_t head_num = _db.head_block_num(); - if (head_num < 1814400) + if (head_num < 2116800) { auto block_reward = fc::optional< protocol::signed_transaction >(); auto block = _chain_plugin.generate_block( From 7737c35d173ae68a75b0ae4db219dd35412c382b Mon Sep 17 00:00:00 2001 From: Robert Day Date: Fri, 16 Jul 2021 18:24:28 -0700 Subject: [PATCH 7/9] Fix effect block of xgt_evaluator and remove some logging noise --- libraries/chain/database.cpp | 6 ++++-- libraries/chain/xgt_evaluator.cpp | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/chain/database.cpp b/libraries/chain/database.cpp index d84d29b7..eb1feb44 100644 --- a/libraries/chain/database.cpp +++ b/libraries/chain/database.cpp @@ -834,7 +834,9 @@ bool database::_push_block(const signed_block& new_block) try { - ilog("Pushing new block #${n} from ${w} with timestamp ${t} at time ${c}", ("n", new_block.block_num())("w", new_block.witness)("t", new_block.timestamp)("c", fc::time_point::now())); + if (new_block.block_num() % 10000 == 0) { + ilog("Pushing new block #${n} from ${w} with timestamp ${t} at time ${c}", ("n", new_block.block_num())("w", new_block.witness)("t", new_block.timestamp)("c", fc::time_point::now())); + } auto session = start_undo_session(); apply_block(new_block, skip); session.push(); @@ -1722,7 +1724,7 @@ void database::_apply_block( const signed_block& next_block ) auto it = rewarded_wallets.find(wallet_name); if (it != rewarded_wallets.end()) { - wlog("!!!!!! Wallet ${w} already rewarded, discarding duplicate operation!", ("w", wallet_name)); + // Wallet already rewarded, discarding duplicate operation continue; } rewarded_wallets.insert(wallet_name); diff --git a/libraries/chain/xgt_evaluator.cpp b/libraries/chain/xgt_evaluator.cpp index d736d382..03dae1ce 100644 --- a/libraries/chain/xgt_evaluator.cpp +++ b/libraries/chain/xgt_evaluator.cpp @@ -919,7 +919,7 @@ void pow_evaluator::do_apply( const pow_operation& o ) database& db = this->db(); uint32_t head_num = db.head_block_num(); - if (head_num >= 181440) + if (head_num >= 2116800) return; const auto& dgp = db.get_dynamic_global_properties(); From 10326534ed656ec1f09a8ad1a0e6108aa5db50cf Mon Sep 17 00:00:00 2001 From: James Tucker Date: Sat, 17 Jul 2021 11:25:16 -0700 Subject: [PATCH 8/9] webserver: fix thread initialization --- libraries/plugins/webserver/webserver_plugin.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libraries/plugins/webserver/webserver_plugin.cpp b/libraries/plugins/webserver/webserver_plugin.cpp index 6a5805ad..9d03724f 100644 --- a/libraries/plugins/webserver/webserver_plugin.cpp +++ b/libraries/plugins/webserver/webserver_plugin.cpp @@ -118,10 +118,7 @@ class webserver_plugin_impl webserver_plugin_impl(thread_pool_size_t thread_pool_size) : thread_pool_work( this->thread_pool_ios ) { - if (http_endpoint || unix_endpoint) { - for( uint32_t i = 0; i < thread_pool_size; ++i ) - thread_pool.create_thread( boost::bind( &asio::io_service::run, &thread_pool_ios ) ); - } + this->thread_pool_size = thread_pool_size; } void start_webserver(); @@ -140,6 +137,7 @@ class webserver_plugin_impl optional< boost::asio::local::stream_protocol::endpoint > unix_endpoint; websocket_local_server_type unix_server; + thread_pool_size_t thread_pool_size; boost::thread_group thread_pool; asio::io_service thread_pool_ios; asio::io_service::work thread_pool_work; @@ -150,6 +148,10 @@ class webserver_plugin_impl void webserver_plugin_impl::start_webserver() { + if (http_endpoint || unix_endpoint) + for( uint32_t i = 0; i < thread_pool_size; ++i ) + thread_pool.create_thread( boost::bind( &asio::io_service::run, &thread_pool_ios ) ); + if( http_endpoint ) { http_thread = std::make_shared( [&]() @@ -361,6 +363,9 @@ void webserver_plugin::plugin_initialize( const variables_map& options ) my->unix_endpoint = ep; ilog( "configured http to listen on ${ep}", ("ep", unix_endpoint )); } + + if (my->http_endpoint || my->unix_endpoint) { + } } void webserver_plugin::plugin_startup() From 084b564444ef1874d80db8d547e38b687fe169ad Mon Sep 17 00:00:00 2001 From: Robert Day Date: Thu, 22 Jul 2021 18:27:14 -0700 Subject: [PATCH 9/9] config: Increase block accept tolerance to 48 seconds from 5 --- libraries/plugins/chain/chain_plugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/plugins/chain/chain_plugin.cpp b/libraries/plugins/chain/chain_plugin.cpp index 934cfc85..ba8bf142 100644 --- a/libraries/plugins/chain/chain_plugin.cpp +++ b/libraries/plugins/chain/chain_plugin.cpp @@ -106,7 +106,7 @@ class chain_plugin_impl std::string to_state = ""; statefile::state_format_info state_format; - uint32_t allow_future_time = 5; + uint32_t allow_future_time = 48; bool running = true; std::shared_ptr< std::thread > write_processor_thread;