diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f300e82bd..3ec040bc3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -151,16 +151,19 @@ test-e2e: - python3 -m venv venv - source venv/bin/activate - pip3 install -r requirements.txt - - python3 main.py --stop + - docker-compose down --remove-orphans - docker ps -a - docker pull $IMAGE - docker tag $IMAGE peerplays-base:latest - docker image ls -a + - docker-compose build - python3 main.py --start all - docker ps -a - python3 -m pytest test_btc_init_state.py test_hive_inital_state.py test_pp_inital_state.py - python3 main.py --stop - deactivate - docker ps -a + after_script: + - docker rmi $(docker images -a | grep -v 'hive-for-peerplays\|ethereum-for-peerplays\|bitcoin-for-peerplays\|ubuntu-for-peerplays' | awk '{print $3}') tags: - python-tests diff --git a/libraries/chain/confidential_evaluator.cpp b/libraries/chain/confidential_evaluator.cpp index fa4ac5153..0526c1165 100644 --- a/libraries/chain/confidential_evaluator.cpp +++ b/libraries/chain/confidential_evaluator.cpp @@ -33,45 +33,163 @@ namespace graphene { namespace chain { void_result transfer_to_blind_evaluator::do_evaluate( const transfer_to_blind_operation& o ) { try { - return void_result(); + const auto& d = db(); + if( d.head_block_time() < HARDFORK_SON_FOR_ETHEREUM_TIME ) + { + const auto& atype = o.amount.asset_id(d); + FC_ASSERT( atype.allow_confidential() ); + FC_ASSERT( !atype.is_transfer_restricted() ); + FC_ASSERT( !(atype.options.flags & white_list) ); + + for( const auto& out : o.outputs ) + { + for( const auto& a : out.owner.account_auths ) + a.first(d); // verify all accounts exist and are valid + } + } + + return void_result(); } FC_CAPTURE_AND_RETHROW( (o) ) } -void_result transfer_to_blind_evaluator::do_apply( const transfer_to_blind_operation& o ) +void_result transfer_to_blind_evaluator::do_apply( const transfer_to_blind_operation& o ) { try { - return void_result(); + if( db().head_block_time() < HARDFORK_SON_FOR_ETHEREUM_TIME ) { + db().adjust_balance(o.from, -o.amount); + + const auto &add = o.amount.asset_id(db()).dynamic_asset_data_id(db()); // verify fee is a legit asset + db().modify(add, [&](asset_dynamic_data_object &obj) { + obj.confidential_supply += o.amount.amount; + FC_ASSERT(obj.confidential_supply >= 0); + }); + for (const auto &out : o.outputs) { + db().create([&](blinded_balance_object &obj) { + obj.asset_id = o.amount.asset_id; + obj.owner = out.owner; + obj.commitment = out.commitment; + }); + } + } + return void_result(); } FC_CAPTURE_AND_RETHROW( (o) ) } void transfer_to_blind_evaluator::pay_fee() { + const auto& d = db(); + if( d.head_block_time() < HARDFORK_SON_FOR_ETHEREUM_TIME ) { + if (d.head_block_time() >= HARDFORK_563_TIME) + pay_fba_fee(fba_accumulator_id_transfer_to_blind); + else + generic_evaluator::pay_fee(); + } } void_result transfer_from_blind_evaluator::do_evaluate( const transfer_from_blind_operation& o ) { try { - return void_result(); + const auto& d = db(); + if( d.head_block_time() < HARDFORK_SON_FOR_ETHEREUM_TIME ) { + o.fee.asset_id(d); // verify fee is a legit asset + const auto &bbi = d.get_index_type(); + const auto &cidx = bbi.indices().get(); + for (const auto &in : o.inputs) { + auto itr = cidx.find(in.commitment); + FC_ASSERT(itr != cidx.end()); + FC_ASSERT(itr->asset_id == o.fee.asset_id); + FC_ASSERT(itr->owner == in.owner); + } + } + return void_result(); } FC_CAPTURE_AND_RETHROW( (o) ) } -void_result transfer_from_blind_evaluator::do_apply( const transfer_from_blind_operation& o ) +void_result transfer_from_blind_evaluator::do_apply( const transfer_from_blind_operation& o ) { try { - return void_result(); + if( db().head_block_time() < HARDFORK_SON_FOR_ETHEREUM_TIME ) { + db().adjust_balance(o.fee_payer(), o.fee); + db().adjust_balance(o.to, o.amount); + const auto &bbi = db().get_index_type(); + const auto &cidx = bbi.indices().get(); + for (const auto &in : o.inputs) { + auto itr = cidx.find(in.commitment); + FC_ASSERT(itr != cidx.end()); + db().remove(*itr); + } + const auto &add = o.amount.asset_id(db()).dynamic_asset_data_id(db()); // verify fee is a legit asset + db().modify(add, [&](asset_dynamic_data_object &obj) { + obj.confidential_supply -= o.amount.amount + o.fee.amount; + FC_ASSERT(obj.confidential_supply >= 0); + }); + } + return void_result(); } FC_CAPTURE_AND_RETHROW( (o) ) } void transfer_from_blind_evaluator::pay_fee() { + const auto& d = db(); + if( d.head_block_time() < HARDFORK_SON_FOR_ETHEREUM_TIME ) { + if (d.head_block_time() >= HARDFORK_563_TIME) + pay_fba_fee(fba_accumulator_id_transfer_from_blind); + else + generic_evaluator::pay_fee(); + } } void_result blind_transfer_evaluator::do_evaluate( const blind_transfer_operation& o ) { try { - return void_result(); + const auto& d = db(); + if( d.head_block_time() < HARDFORK_SON_FOR_ETHEREUM_TIME ) { + o.fee.asset_id(d); // verify fee is a legit asset + const auto &bbi = d.get_index_type(); + const auto &cidx = bbi.indices().get(); + for (const auto &out : o.outputs) { + for (const auto &a : out.owner.account_auths) + a.first(d); // verify all accounts exist and are valid + } + for (const auto &in : o.inputs) { + auto itr = cidx.find(in.commitment); + GRAPHENE_ASSERT(itr != cidx.end(), blind_transfer_unknown_commitment, "", ("commitment", in.commitment)); + FC_ASSERT(itr->asset_id == o.fee.asset_id); + FC_ASSERT(itr->owner == in.owner); + } + } + return void_result(); } FC_CAPTURE_AND_RETHROW( (o) ) } -void_result blind_transfer_evaluator::do_apply( const blind_transfer_operation& o ) +void_result blind_transfer_evaluator::do_apply( const blind_transfer_operation& o ) { try { - return void_result(); + if( db().head_block_time() < HARDFORK_SON_FOR_ETHEREUM_TIME ) { + db().adjust_balance(o.fee_payer(), o.fee); // deposit the fee to the temp account + const auto &bbi = db().get_index_type(); + const auto &cidx = bbi.indices().get(); + for (const auto &in : o.inputs) { + auto itr = cidx.find(in.commitment); + GRAPHENE_ASSERT(itr != cidx.end(), blind_transfer_unknown_commitment, "", ("commitment", in.commitment)); + db().remove(*itr); + } + for (const auto &out : o.outputs) { + db().create([&](blinded_balance_object &obj) { + obj.asset_id = o.fee.asset_id; + obj.owner = out.owner; + obj.commitment = out.commitment; + }); + } + const auto &add = o.fee.asset_id(db()).dynamic_asset_data_id(db()); + db().modify(add, [&](asset_dynamic_data_object &obj) { + obj.confidential_supply -= o.fee.amount; + FC_ASSERT(obj.confidential_supply >= 0); + }); + } + return void_result(); } FC_CAPTURE_AND_RETHROW( (o) ) } void blind_transfer_evaluator::pay_fee() { + const auto& d = db(); + if( d.head_block_time() < HARDFORK_SON_FOR_ETHEREUM_TIME ) { + if (d.head_block_time() >= HARDFORK_563_TIME) + pay_fba_fee(fba_accumulator_id_blind_transfer); + else + generic_evaluator::pay_fee(); + } } } } // graphene::chain diff --git a/libraries/chain/db_getter.cpp b/libraries/chain/db_getter.cpp index 9510692c7..af3635c0f 100644 --- a/libraries/chain/db_getter.cpp +++ b/libraries/chain/db_getter.cpp @@ -305,16 +305,14 @@ bool database::is_son_dereg_valid( son_id_type son_id ) } bool status_son_dereg_valid = true; - for(const auto& status : son->statuses) - { - const auto& sidechain = status.first; - if(status.second != son_status::in_maintenance) + for (const auto &active_sidechain_type : active_sidechain_types(head_block_time())) { + if(son->statuses.at(active_sidechain_type) != son_status::in_maintenance) status_son_dereg_valid = false; if(status_son_dereg_valid) { - if(son->statistics(*this).last_active_timestamp.contains(sidechain)) { - if (head_block_time() - son->statistics(*this).last_active_timestamp.at(sidechain) < fc::seconds(get_global_properties().parameters.son_deregister_time())) { + if(son->statistics(*this).last_active_timestamp.contains(active_sidechain_type)) { + if (head_block_time() - son->statistics(*this).last_active_timestamp.at(active_sidechain_type) < fc::seconds(get_global_properties().parameters.son_deregister_time())) { status_son_dereg_valid = false; } } diff --git a/libraries/chain/include/graphene/chain/exceptions.hpp b/libraries/chain/include/graphene/chain/exceptions.hpp index 92c7c5dd4..406a235eb 100644 --- a/libraries/chain/include/graphene/chain/exceptions.hpp +++ b/libraries/chain/include/graphene/chain/exceptions.hpp @@ -182,6 +182,9 @@ namespace graphene { namespace chain { GRAPHENE_DECLARE_OP_BASE_EXCEPTIONS( override_transfer ); GRAPHENE_DECLARE_OP_EVALUATE_EXCEPTION( not_permitted, override_transfer, 1, "not permitted" ) + GRAPHENE_DECLARE_OP_BASE_EXCEPTIONS( blind_transfer ); + GRAPHENE_DECLARE_OP_EVALUATE_EXCEPTION( unknown_commitment, blind_transfer, 1, "Attempting to claim an unknown prior commitment" ); + /* FC_DECLARE_DERIVED_EXCEPTION( addition_overflow, graphene::chain::chain_exception, 30002, "addition overflow" ) FC_DECLARE_DERIVED_EXCEPTION( subtraction_overflow, graphene::chain::chain_exception, 30003, "subtraction overflow" ) diff --git a/libraries/chain/include/graphene/chain/protocol/confidential.hpp b/libraries/chain/include/graphene/chain/protocol/confidential.hpp index d1a28da35..86628f3bb 100644 --- a/libraries/chain/include/graphene/chain/protocol/confidential.hpp +++ b/libraries/chain/include/graphene/chain/protocol/confidential.hpp @@ -158,9 +158,7 @@ struct transfer_to_blind_operation : public base_operation blind_factor_type blinding_factor; vector outputs; - account_id_type fee_payer()const { return account_id_type{}; } - - //account_id_type fee_payer()const { return from; } + account_id_type fee_payer()const { return from; } //void validate()const; //share_type calculate_fee(const fee_parameters_type& )const; }; @@ -181,9 +179,7 @@ struct transfer_from_blind_operation : public base_operation blind_factor_type blinding_factor; vector inputs; - account_id_type fee_payer()const { return account_id_type{}; } - - //account_id_type fee_payer()const { return GRAPHENE_TEMP_ACCOUNT; } + account_id_type fee_payer()const { return GRAPHENE_TEMP_ACCOUNT; } //void validate()const; //void get_required_authorities( vector& a )const //{ @@ -246,10 +242,8 @@ struct blind_transfer_operation : public base_operation vector inputs; vector outputs; - account_id_type fee_payer()const { return account_id_type{}; } - /** graphene TEMP account */ - //account_id_type fee_payer()const; + account_id_type fee_payer()const { return GRAPHENE_TEMP_ACCOUNT; } //void validate()const; //share_type calculate_fee( const fee_parameters_type& k )const; //void get_required_authorities( vector& a )const