From 0eda7025c9148835cb12ebdcc9903d16070bf3a7 Mon Sep 17 00:00:00 2001 From: Alexander Suslikov Date: Thu, 7 Feb 2019 11:14:03 +0300 Subject: [PATCH] Changed constant params to dynamic sidechain_parameters --- libraries/chain/bitcoin_address_evaluator.cpp | 2 +- libraries/chain/db_sidechain.cpp | 2 +- .../graphene/chain/bitcoin_address_object.hpp | 2 +- .../chain/include/graphene/chain/config.hpp | 9 ++++---- libraries/chain/withdraw_pbtc_evaluator.cpp | 2 +- .../sidechain/sidechain_condensing_tx.hpp | 2 +- .../sidechain/sidechain_parameters.hpp | 16 +++++++++----- libraries/sidechain/input_withdrawal_info.cpp | 7 ++++-- .../sidechain/primary_wallet_vout_manager.cpp | 2 +- .../sidechain/sidechain_condensing_tx.cpp | 4 ++-- tests/tests/sidechain_condensing_tx_tests.cpp | 22 +++++++++---------- 11 files changed, 39 insertions(+), 31 deletions(-) diff --git a/libraries/chain/bitcoin_address_evaluator.cpp b/libraries/chain/bitcoin_address_evaluator.cpp index 40482e62..ab9cb6e1 100644 --- a/libraries/chain/bitcoin_address_evaluator.cpp +++ b/libraries/chain/bitcoin_address_evaluator.cpp @@ -26,7 +26,7 @@ object_id_type bitcoin_address_create_evaluator::do_apply( const bitcoin_address witnesses_keys.emplace( d.get_sidechain_account_id(), pubkey_from_id( a.id ) ); a.owner = op.owner; - a.address = sidechain::btc_multisig_segwit_address(5, witnesses_keys); + a.address = sidechain::btc_multisig_segwit_address( SIDECHAIN_DEFAULT_NUMBER_SIG_MULTISIG, witnesses_keys ); a.count_invalid_pub_key = 1; }); diff --git a/libraries/chain/db_sidechain.cpp b/libraries/chain/db_sidechain.cpp index 86d76635..a1a7016a 100644 --- a/libraries/chain/db_sidechain.cpp +++ b/libraries/chain/db_sidechain.cpp @@ -175,7 +175,7 @@ full_btc_transaction database::create_btc_transaction( const std::vector bitcoin_address_id_type get_id()const { return id; } // multisig m-of-n (m = 5). Address is valid before count of changed witnesses < 5 - bool valid() { return count_invalid_pub_key < 5; } // TODO: move to global_properties + bool valid() { return count_invalid_pub_key < SIDECHAIN_NUMBER_INVALID_KEYS; } std::string get_address() const { return address.get_address(); } diff --git a/libraries/chain/include/graphene/chain/config.hpp b/libraries/chain/include/graphene/chain/config.hpp index db7e390c..8c4b0346 100644 --- a/libraries/chain/include/graphene/chain/config.hpp +++ b/libraries/chain/include/graphene/chain/config.hpp @@ -232,11 +232,12 @@ #define SIDECHAIN_SYMBOL "pBTC" #define SIDECHAIN_PRECISION_DIGITS 8 #define SIDECHAIN_MAX_SHARE_SUPPLY int64_t(21000000ll * 100000000ll) -#define SIDECHAIN_DEFAULT_NUMBER_UNCONFIRMED_VINS 25 +#define SIDECHAIN_NUMBER_INVALID_KEYS 5 #define SIDECHAIN_DEFAULT_NUMBER_SIG_MULTISIG 5 #define SIDECHAIN_DEFAULT_NUMBER_OF_CONFIRMATIONS 6 -#define SIDECHAIN_DEFAULT_CONDENSING_TX_VINS_NUMBER 5 -#define SIDECHAIN_DEFAULT_CONDENSING_TX_VOUTS_NUMBER 5 -#define SIDECHAIN_DEFAULT_PERCENTAGE_PAYMENT_TO_WIT 0.001 +#define SIDECHAIN_DEFAULT_MAX_UNCONFIRMED_VINS 25 +#define SIDECHAIN_DEFAULT_MAX_CONDENSING_TX_VINS 5 +#define SIDECHAIN_DEFAULT_MAX_CONDENSING_TX_VOUTS 5 +#define SIDECHAIN_DEFAULT_PERCENT_PAYMENT_TO_WITNESSES (GRAPHENE_1_PERCENT/10) #define SIDECHAIN_NULL_VIN_IDENTIFIER "5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b4" // fc::sha256::hash( "" + std::to_string( 0 ) ) - ( 8 bytes ) ////////////////////////////////////////////////////////////////////// diff --git a/libraries/chain/withdraw_pbtc_evaluator.cpp b/libraries/chain/withdraw_pbtc_evaluator.cpp index ac256fb2..b1b517fd 100644 --- a/libraries/chain/withdraw_pbtc_evaluator.cpp +++ b/libraries/chain/withdraw_pbtc_evaluator.cpp @@ -74,7 +74,7 @@ bool withdraw_pbtc_evaluator::check_amount_higher_than_fee( const withdraw_pbtc_ if( op.amount < mock_trx.second ) return false; - auto fee_for_witnesses = ( op.amount - mock_trx.second ) * SIDECHAIN_DEFAULT_PERCENTAGE_PAYMENT_TO_WIT; + uint64_t fee_for_witnesses = ( (op.amount - mock_trx.second) * d.get_sidechain_params().percent_payment_to_witnesses ) / GRAPHENE_100_PERCENT; if( op.amount < mock_trx.second + fee_for_witnesses ) return false; diff --git a/libraries/sidechain/include/sidechain/sidechain_condensing_tx.hpp b/libraries/sidechain/include/sidechain/sidechain_condensing_tx.hpp index e6d9ba59..305aaba0 100644 --- a/libraries/sidechain/include/sidechain/sidechain_condensing_tx.hpp +++ b/libraries/sidechain/include/sidechain/sidechain_condensing_tx.hpp @@ -21,7 +21,7 @@ public: uint64_t get_estimate_tx_size( size_t number_witness ) const; - void subtract_fee( const uint64_t& fee, const double& witness_percentage ); + void subtract_fee( const uint64_t& fee, const uint16_t& witnesses_percentage ); bitcoin_transaction get_transaction() const { return tb.get_transaction(); } diff --git a/libraries/sidechain/include/sidechain/sidechain_parameters.hpp b/libraries/sidechain/include/sidechain/sidechain_parameters.hpp index b0b540dc..440d6a0d 100644 --- a/libraries/sidechain/include/sidechain/sidechain_parameters.hpp +++ b/libraries/sidechain/include/sidechain/sidechain_parameters.hpp @@ -5,10 +5,12 @@ namespace sidechain { struct sidechain_parameters_extension { - uint8_t multisig_sigs_num = SIDECHAIN_DEFAULT_NUMBER_SIG_MULTISIG; - uint8_t condensing_tx_vins_num = SIDECHAIN_DEFAULT_CONDENSING_TX_VINS_NUMBER; - uint8_t condensing_tx_vouts_num = SIDECHAIN_DEFAULT_CONDENSING_TX_VOUTS_NUMBER; - uint8_t confirmations_num = SIDECHAIN_DEFAULT_NUMBER_OF_CONFIRMATIONS; + uint8_t maximum_condensing_tx_vins = SIDECHAIN_DEFAULT_MAX_CONDENSING_TX_VINS; + uint8_t maximum_condensing_tx_vouts = SIDECHAIN_DEFAULT_MAX_CONDENSING_TX_VOUTS; + uint8_t maxmum_unconfirmed_vins = SIDECHAIN_DEFAULT_MAX_UNCONFIRMED_VINS; + uint16_t percent_payment_to_witnesses = SIDECHAIN_DEFAULT_PERCENT_PAYMENT_TO_WITNESSES; + uint8_t multisig_sigs_num = SIDECHAIN_DEFAULT_NUMBER_SIG_MULTISIG; + uint8_t confirmations_num = SIDECHAIN_DEFAULT_NUMBER_OF_CONFIRMATIONS; graphene::chain::account_id_type managing_account; graphene::chain::asset_id_type asset_id; @@ -17,9 +19,11 @@ namespace sidechain { } FC_REFLECT( sidechain::sidechain_parameters_extension, + (maximum_condensing_tx_vins) + (maximum_condensing_tx_vouts) + (maxmum_unconfirmed_vins) + (percent_payment_to_witnesses) (multisig_sigs_num) - (condensing_tx_vins_num) - (condensing_tx_vins_num) (confirmations_num) (managing_account) (asset_id) diff --git a/libraries/sidechain/input_withdrawal_info.cpp b/libraries/sidechain/input_withdrawal_info.cpp index b616d783..e2fc55e7 100644 --- a/libraries/sidechain/input_withdrawal_info.cpp +++ b/libraries/sidechain/input_withdrawal_info.cpp @@ -94,11 +94,12 @@ std::vector input_withdrawal_info::get_info_for_vins() std::vector result; const auto& addr_idx = db.get_index_type().indices().get(); + const auto max_vins = db.get_sidechain_params().maximum_condensing_tx_vins; info_for_vins.safe_for( [&]( info_for_vin_index::index::type::iterator itr_b, info_for_vin_index::index::type::iterator itr_e ) { - for( size_t i = 0; itr_b != itr_e && i < 5 && !itr_b->used; i++ ) { // 5 amount vins to bitcoin transaction + for( size_t i = 0; itr_b != itr_e && i < max_vins && !itr_b->used; i++ ) { info_for_vin vin; vin.identifier = itr_b->identifier; vin.out.hash_tx = itr_b->out.hash_tx; @@ -173,8 +174,10 @@ std::vector input_withdrawal_info::get_info_for_vouts() std::vector result; const auto& info_for_vout_idx = db.get_index_type().indices().get< graphene::chain::by_id_and_not_used >(); + const auto max_vouts = db.get_sidechain_params().maximum_condensing_tx_vouts; + auto itr = info_for_vout_idx.begin(); - for(size_t i = 0; i < 5 && itr != info_for_vout_idx.end() && !itr->used; i++) { + for(size_t i = 0; i < max_vouts && itr != info_for_vout_idx.end() && !itr->used; i++) { result.push_back( *itr ); ++itr; diff --git a/libraries/sidechain/primary_wallet_vout_manager.cpp b/libraries/sidechain/primary_wallet_vout_manager.cpp index 35524ffc..6b6400bd 100644 --- a/libraries/sidechain/primary_wallet_vout_manager.cpp +++ b/libraries/sidechain/primary_wallet_vout_manager.cpp @@ -9,7 +9,7 @@ namespace sidechain { bool primary_wallet_vout_manager::is_reach_max_unconfirmaed_vout() const { const auto& PW_vout_idx = db.get_index_type().indices().get< graphene::chain::by_id >(); - return !( PW_vout_idx.size() < SIDECHAIN_DEFAULT_NUMBER_UNCONFIRMED_VINS ); + return !( PW_vout_idx.size() < db.get_sidechain_params().maxmum_unconfirmed_vins ); } fc::optional< primary_wallet_vout_object > primary_wallet_vout_manager::get_latest_unused_vout() const diff --git a/libraries/sidechain/sidechain_condensing_tx.cpp b/libraries/sidechain/sidechain_condensing_tx.cpp index 54665e61..41afe321 100644 --- a/libraries/sidechain/sidechain_condensing_tx.cpp +++ b/libraries/sidechain/sidechain_condensing_tx.cpp @@ -68,7 +68,7 @@ uint64_t sidechain_condensing_tx::get_estimate_tx_size( size_t number_witness ) return temp_tx.get_vsize(); } -void sidechain_condensing_tx::subtract_fee( const uint64_t& fee, const double& witness_percentage ) +void sidechain_condensing_tx::subtract_fee( const uint64_t& fee, const uint16_t& witnesses_percentage ) { bitcoin_transaction tx = get_transaction(); @@ -86,7 +86,7 @@ void sidechain_condensing_tx::subtract_fee( const uint64_t& fee, const double& w size_t offset = is_pw_vin ? 1 + count_witness_vout : count_witness_vout; for( ; offset < tx.vout.size(); offset++ ) { uint64_t amount_without_fee_size = tx.vout[offset].value - fee_size; - uint64_t amount_fee_witness = amount_without_fee_size * witness_percentage; + uint64_t amount_fee_witness = ( amount_without_fee_size * witnesses_percentage ) / GRAPHENE_100_PERCENT; tx.vout[offset].value = amount_without_fee_size; tx.vout[offset].value -= amount_fee_witness; fee_witnesses += amount_fee_witness; diff --git a/tests/tests/sidechain_condensing_tx_tests.cpp b/tests/tests/sidechain_condensing_tx_tests.cpp index ad0ee5be..61c127d0 100644 --- a/tests/tests/sidechain_condensing_tx_tests.cpp +++ b/tests/tests/sidechain_condensing_tx_tests.cpp @@ -11,7 +11,7 @@ BOOST_AUTO_TEST_SUITE( sidechain_condensing_tx_tests ) uint64_t size_fee = 100; uint64_t pw_vout_amount = 113; -double witness_percentage = 0.01; +double witness_percentage = SIDECHAIN_DEFAULT_PERCENT_PAYMENT_TO_WITNESSES; void create_info_vins_and_info_vouts( std::vector& info_vins, std::vector& info_vouts ) { @@ -19,7 +19,7 @@ void create_info_vins_and_info_vouts( std::vector& info_vins, std: info_for_vin vin; vin.out.hash_tx = "1111111111111111111111111111111111111111111111111111111111111111"; vin.out.n_vout = static_cast( i ); - vin.out.amount = static_cast( i + 1000 ); + vin.out.amount = static_cast( i + 10000 ); vin.address = std::to_string( i ); vin.script = { 0x0d }; info_vins.push_back( vin ); @@ -27,7 +27,7 @@ void create_info_vins_and_info_vouts( std::vector& info_vins, std: info_for_vout vout; vout.payer = account_id_type( i ); vout.address = sidechain::bitcoin_address( "mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn" ); - vout.amount = static_cast( i + 1000 ); + vout.amount = static_cast( i + 10000 ); info_vouts.push_back( vout ); } } @@ -71,7 +71,7 @@ BOOST_AUTO_TEST_CASE( create_sidechain_condensing_tx_test ) BOOST_CHECK( tx.vin[i].scriptSig == scriptSig ); BOOST_CHECK( tx.vin[i].scriptWitness == std::vector() ); - BOOST_CHECK( tx.vout[i].value == static_cast( i + 1000 ) ); + BOOST_CHECK( tx.vout[i].value == static_cast( i + 10000 ) ); const auto address_bytes = fc::from_base58( "mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn" ); bytes raw_address( address_bytes.begin() + 1, address_bytes.begin() + 21 ); bytes scriptPubKey = script_builder() << op::DUP << op::HASH160 << raw_address << op::EQUALVERIFY << op::CHECKSIG; @@ -133,12 +133,12 @@ BOOST_AUTO_TEST_CASE( subtract_fee_tests ) std::vector witnesses_fee; for( size_t i = 0; i < info_vouts.size(); i++ ) { - witnesses_fee.push_back( ( info_vouts[i].amount - size_fee_user ) * witness_percentage ); + witnesses_fee.push_back( ( info_vouts[i].amount - size_fee_user ) * witness_percentage / GRAPHENE_100_PERCENT ); } uint64_t witnesses_fee_sum = std::accumulate( witnesses_fee.begin(), witnesses_fee.end(), 0 ); uint64_t witness_fee = witnesses_fee_sum / keys.size(); - BOOST_CHECK( tx.vout[0].value == static_cast( pw_vout_amount ) ); + BOOST_CHECK( tx.vout[0].value == static_cast( pw_vout_amount - size_fee_user * info_vins.size() ) ); for( size_t i = 1; i <= keys.size(); i++ ) { BOOST_CHECK( tx.vout[i].value == static_cast( witness_fee ) ); } @@ -164,7 +164,7 @@ BOOST_AUTO_TEST_CASE( subtract_fee_not_pw_vout_and_witness_vouts_tests ) std::vector witnesses_fee; for( size_t i = 0; i < info_vouts.size(); i++ ) { - witnesses_fee.push_back( ( info_vouts[i].amount - size_fee_user ) * witness_percentage ); + witnesses_fee.push_back( ( info_vouts[i].amount - size_fee_user ) * witness_percentage / GRAPHENE_100_PERCENT ); } for( size_t i = 0; i < tx.vout.size(); i++ ) { @@ -188,7 +188,7 @@ BOOST_AUTO_TEST_CASE( subtract_fee_not_witness_vouts_tests ) std::vector witnesses_fee; for( size_t i = 0; i < info_vouts.size(); i++ ) { - witnesses_fee.push_back( ( info_vouts[i].amount - size_fee_user ) * witness_percentage ); + witnesses_fee.push_back( ( info_vouts[i].amount - size_fee_user ) * witness_percentage / GRAPHENE_100_PERCENT ); } size_t offset = 1; @@ -214,7 +214,7 @@ BOOST_AUTO_TEST_CASE( subtract_fee_not_pw_vout_tests ) std::vector witnesses_fee; for( size_t i = 0; i < info_vouts.size(); i++ ) { - witnesses_fee.push_back( ( info_vouts[i].amount - size_fee_user ) * witness_percentage ); + witnesses_fee.push_back( ( info_vouts[i].amount - size_fee_user ) * witness_percentage / GRAPHENE_100_PERCENT ); } size_t offset = keys.size(); @@ -223,7 +223,7 @@ BOOST_AUTO_TEST_CASE( subtract_fee_not_pw_vout_tests ) } } -BOOST_AUTO_TEST_CASE( subtract_fee_not_vins_vout_tests ) +BOOST_AUTO_TEST_CASE( subtract_fee_not_vins_tests ) { std::vector info_vins; std::vector info_vouts; @@ -242,7 +242,7 @@ BOOST_AUTO_TEST_CASE( subtract_fee_not_vins_vout_tests ) std::vector witnesses_fee; for( size_t i = 0; i < info_vouts.size(); i++ ) { - witnesses_fee.push_back( ( info_vouts[i].amount - size_fee_user ) * witness_percentage ); + witnesses_fee.push_back( ( info_vouts[i].amount - size_fee_user ) * witness_percentage / GRAPHENE_100_PERCENT ); } size_t offset = 1 + keys.size();