From 8e0e20eb6fe59a4544b75b107ecb03e2409007ea Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Fri, 17 Mar 2023 11:33:33 +0300 Subject: [PATCH 01/32] #518 - update update_vote_time when voting for SON --- libraries/wallet/wallet.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/libraries/wallet/wallet.cpp b/libraries/wallet/wallet.cpp index e1363b0b..f01e2605 100644 --- a/libraries/wallet/wallet.cpp +++ b/libraries/wallet/wallet.cpp @@ -2773,12 +2773,21 @@ public: FC_ASSERT(son_obj, "Account ${son} is not registered as a son", ("son", son)); FC_ASSERT(sidechain == sidechain_type::bitcoin || sidechain == sidechain_type::hive || sidechain == sidechain_type::ethereum, "Unexpected sidechain type"); + bool update_vote_time = false; if (approve) { FC_ASSERT(son_obj->get_sidechain_vote_id(sidechain).valid(), "Invalid vote id, sidechain: ${sidechain}, son: ${son}", ("sidechain", sidechain)("son", *son_obj)); + account_id_type stake_account = get_account_id(voting_account); + const auto gpos_info = _remote_db->get_gpos_info(stake_account); + const auto vesting_subperiod = _remote_db->get_global_properties().parameters.gpos_subperiod(); + const auto gpos_start_time = fc::time_point_sec(_remote_db->get_global_properties().parameters.gpos_period_start()); + const auto subperiod_start_time = gpos_start_time.sec_since_epoch() + (gpos_info.current_subperiod - 1) * vesting_subperiod; + auto insert_result = voting_account_object.options.votes.insert(*son_obj->get_sidechain_vote_id(sidechain)); - if (!insert_result.second) - FC_THROW("Account ${account} has already voted for son ${son} for sidechain ${sidechain}", ("account", voting_account)("son", son)("sidechain", sidechain)); + if (!insert_result.second && (gpos_info.last_voted_time.sec_since_epoch() >= subperiod_start_time)) + FC_THROW("Account ${account} was already voting for son ${son} in the current GPOS sub-period", ("account", voting_account)("son", son)); + else + update_vote_time = true; //Allow user to vote in each sub-period(Update voting time, which is reference in calculating VF) } else { @@ -2787,9 +2796,11 @@ public: if (!votes_removed) FC_THROW("Account ${account} has already unvoted for son ${son} for sidechain ${sidechain}", ("account", voting_account)("son", son)("sidechain", sidechain)); } + account_update_operation account_update_op; account_update_op.account = voting_account_object.id; account_update_op.new_options = voting_account_object.options; + account_update_op.extensions.value.update_last_voting_time = update_vote_time; signed_transaction tx; tx.operations.push_back( account_update_op ); -- 2.45.2 From b21f9c4282f8d000fac2270f3c8ef82b9cbe8edb Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Wed, 29 Mar 2023 09:38:54 +0000 Subject: [PATCH 02/32] Bug/524-eth-mainnet-tr --- .../plugins/peerplays_sidechain/ethereum/encoders.cpp | 5 +++-- .../sidechain_net_handler_ethereum.cpp | 11 ++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/libraries/plugins/peerplays_sidechain/ethereum/encoders.cpp b/libraries/plugins/peerplays_sidechain/ethereum/encoders.cpp index 872a5720..19a373de 100644 --- a/libraries/plugins/peerplays_sidechain/ethereum/encoders.cpp +++ b/libraries/plugins/peerplays_sidechain/ethereum/encoders.cpp @@ -137,8 +137,9 @@ std::string rlp_encoder::encode_length(int len, int offset) { std::string rlp_encoder::hex2bytes(const std::string &s) { std::string dest; - dest.resize(s.size() / 2); - hex2bin(s.c_str(), &dest[0]); + const auto s_final = s.size() % 2 == 0 ? s : "0" + s; + dest.resize(s_final.size() / 2); + hex2bin(s_final.c_str(), &dest[0]); return dest; } diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_ethereum.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_ethereum.cpp index c4db3266..5ffe1332 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_ethereum.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_ethereum.cpp @@ -684,13 +684,18 @@ std::string sidechain_net_handler_ethereum::send_sidechain_transaction(const sid const ethereum::signature_encoder encoder{function_signature}; #ifdef SEND_RAW_TRANSACTION + const auto data = encoder.encode(transactions); + const std::string params = "[{\"from\":\"" + ethereum::add_0x(public_key) + "\", \"to\":\"" + wallet_contract_address + "\", \"data\":\"" + data + "\"}]"; + ethereum::raw_transaction raw_tr; raw_tr.nonce = rpc_client->get_nonce(ethereum::add_0x(public_key)); raw_tr.gas_price = rpc_client->get_gas_price(); - raw_tr.gas_limit = rpc_client->get_gas_limit(); + raw_tr.gas_limit = rpc_client->get_estimate_gas(params); + if (raw_tr.gas_limit.empty()) + raw_tr.gas_limit = rpc_client->get_gas_limit(); raw_tr.to = wallet_contract_address; raw_tr.value = ""; - raw_tr.data = encoder.encode(transactions); + raw_tr.data = data; raw_tr.chain_id = ethereum::add_0x(ethereum::to_hex(chain_id)); const auto sign_tr = raw_tr.sign(get_private_key(public_key)); @@ -804,7 +809,7 @@ optional sidechain_net_handler_ethereum::estimate_withdrawal_transaction_ } const auto &public_key = son->sidechain_public_keys.at(sidechain); - const auto data = ethereum::withdrawal_encoder::encode(public_key, boost::multiprecision::uint256_t{1} * boost::multiprecision::uint256_t{10000000000}, son_wallet_withdraw_id_type{0}.operator object_id_type().operator std::string()); + const auto data = ethereum::withdrawal_encoder::encode(public_key, boost::multiprecision::uint256_t{1} * boost::multiprecision::uint256_t{10000000000}, "0"); const std::string params = "[{\"from\":\"" + ethereum::add_0x(public_key) + "\", \"to\":\"" + wallet_contract_address + "\", \"data\":\"" + data + "\"}]"; const auto estimate_gas = ethereum::from_hex(rpc_client->get_estimate_gas(params)); -- 2.45.2 From 432876a677a52ce593b13837662718d5463c17fa Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Sun, 16 Apr 2023 23:49:51 +0200 Subject: [PATCH 03/32] Try different approach --- .gitlab-ci.yml | 29 ++++++++++++++++++++++++++++- Dockerfile | 5 ----- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 61afce6e..08b1025a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,8 +7,9 @@ include: stages: - build - - test - dockerize + - python-test + - test build-mainnet: stage: build @@ -119,3 +120,29 @@ dockerize-testnet: manual timeout: 3h + +test-e2e: + stage: python-test + variables: + IMAGE: $CI_REGISTRY_IMAGE/mainnet/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA + before_script: + - docker info + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + script: + - git clone https://gitlab.com/PBSA/tools-libs/peerplays-utils.git + - cd peerplays-utils/peerplays-qa-environment + - git checkout origin/feature/python-e2e-tests-for-CI + - cd e2e-tests/ + - python3 -m venv venv + - source venv/bin/activate + - pip3 install -r requirements.txt + - python3 start.py --stop + - docker ps -a + - export COMPOSE_SERVICE_PEERPLAYS_BASE_IMAGE=$IMAGE + - python3 start.py --start all + - docker ps -a + - python3 start.py --stop + - deactivate + - docker ps -a + tags: + - python-tests diff --git a/Dockerfile b/Dockerfile index 7a229aa7..43db4a39 100644 --- a/Dockerfile +++ b/Dockerfile @@ -190,8 +190,6 @@ ADD . peerplays RUN \ cd peerplays && \ git submodule update --init --recursive && \ - git symbolic-ref --short HEAD && \ - git log --oneline -n 5 && \ mkdir build && \ cd build && \ cmake -DCMAKE_BUILD_TYPE=Release .. @@ -217,6 +215,3 @@ RUN chown peerplays:root -R /home/peerplays/peerplays-network EXPOSE 8090 # Peerplays P2P: EXPOSE 9777 - -# Peerplays -CMD ["./witness_node", "-d", "./witness_node_data_dir"] -- 2.45.2 From a2ce65e1ef1ed1334e1eda21ce2a0f73b58353e5 Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Mon, 17 Apr 2023 08:52:41 +0200 Subject: [PATCH 04/32] Add pull image --- .gitlab-ci.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 08b1025a..08538c83 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -57,8 +57,6 @@ dockerize-mainnet: - docker rmi $IMAGE tags: - builder - when: - manual timeout: 3h @@ -136,12 +134,13 @@ test-e2e: - python3 -m venv venv - source venv/bin/activate - pip3 install -r requirements.txt - - python3 start.py --stop + - python3 main.py --stop - docker ps -a + - docker pull $IMAGE - export COMPOSE_SERVICE_PEERPLAYS_BASE_IMAGE=$IMAGE - - python3 start.py --start all + - python3 main.py --start all - docker ps -a - - python3 start.py --stop + - python3 main.py --stop - deactivate - docker ps -a tags: -- 2.45.2 From 0f375777c246717ec6a3f3e8824b887c99bc1af3 Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Mon, 17 Apr 2023 22:37:26 +0200 Subject: [PATCH 05/32] Quick exec --- .gitlab-ci.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 08538c83..75ab1930 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,9 +6,9 @@ include: - template: Secret-Detection.gitlab-ci.yml stages: + - python-test - build - dockerize - - python-test - test build-mainnet: @@ -122,10 +122,7 @@ dockerize-testnet: test-e2e: stage: python-test variables: - IMAGE: $CI_REGISTRY_IMAGE/mainnet/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA - before_script: - - docker info - - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + IMAGE: registry.gitlab.com/pbsa/peerplays/mainnet/feature-python-e2e-tests:943e02cdcd9fb8a90137851635b998cf1b4f622c script: - git clone https://gitlab.com/PBSA/tools-libs/peerplays-utils.git - cd peerplays-utils/peerplays-qa-environment -- 2.45.2 From 1b61016693a037c52fd8842a59b5759b4c03278f Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Mon, 17 Apr 2023 22:45:05 +0200 Subject: [PATCH 06/32] docker login still needed --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 75ab1930..37be02a5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -123,6 +123,9 @@ test-e2e: stage: python-test variables: IMAGE: registry.gitlab.com/pbsa/peerplays/mainnet/feature-python-e2e-tests:943e02cdcd9fb8a90137851635b998cf1b4f622c + before_script: + - docker info + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY script: - git clone https://gitlab.com/PBSA/tools-libs/peerplays-utils.git - cd peerplays-utils/peerplays-qa-environment -- 2.45.2 From 6f792db52dc5f09ecbdc0697cd16822076cbe7fc Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Tue, 18 Apr 2023 00:22:26 +0200 Subject: [PATCH 07/32] Passing locally --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 37be02a5..021e63e6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -138,7 +138,8 @@ test-e2e: - docker ps -a - docker pull $IMAGE - export COMPOSE_SERVICE_PEERPLAYS_BASE_IMAGE=$IMAGE - - python3 main.py --start all + - python3 main.py --start btc hive eth + - python3 main.py --start pp - docker ps -a - python3 main.py --stop - deactivate -- 2.45.2 From d2374aeed92e0ed7c438860a78c266a71a622b75 Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Tue, 18 Apr 2023 08:13:20 +0200 Subject: [PATCH 08/32] Try via command line again --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 021e63e6..5a84bd7e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -139,7 +139,7 @@ test-e2e: - docker pull $IMAGE - export COMPOSE_SERVICE_PEERPLAYS_BASE_IMAGE=$IMAGE - python3 main.py --start btc hive eth - - python3 main.py --start pp + - docker-compose up peerplays01 peerplays02 peerplays03 peerplays04 peerplays05 peerplays06 peerplays07 peerplays08 peerplays09 peerplays10 peerplays11 peerplays12 peerplays13 peerplays14 peerplays15 peerplays16 - docker ps -a - python3 main.py --stop - deactivate -- 2.45.2 From 6fe15f27b076069614725ddab9b18c0d715b7f0a Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Tue, 18 Apr 2023 08:44:27 +0200 Subject: [PATCH 09/32] Try with rename --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5a84bd7e..565488f1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -137,7 +137,8 @@ test-e2e: - python3 main.py --stop - docker ps -a - docker pull $IMAGE - - export COMPOSE_SERVICE_PEERPLAYS_BASE_IMAGE=$IMAGE + - docker tag $IMAGE peerplays-base:latest + - docker image ls -a - python3 main.py --start btc hive eth - docker-compose up peerplays01 peerplays02 peerplays03 peerplays04 peerplays05 peerplays06 peerplays07 peerplays08 peerplays09 peerplays10 peerplays11 peerplays12 peerplays13 peerplays14 peerplays15 peerplays16 - docker ps -a -- 2.45.2 From 2a6c917e4c72b1ae0e83fdb2717d90d91483d6a4 Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Tue, 18 Apr 2023 11:14:20 +0200 Subject: [PATCH 10/32] Try through python --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 565488f1..47d2c6c0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -139,8 +139,7 @@ test-e2e: - docker pull $IMAGE - docker tag $IMAGE peerplays-base:latest - docker image ls -a - - python3 main.py --start btc hive eth - - docker-compose up peerplays01 peerplays02 peerplays03 peerplays04 peerplays05 peerplays06 peerplays07 peerplays08 peerplays09 peerplays10 peerplays11 peerplays12 peerplays13 peerplays14 peerplays15 peerplays16 + - python3 main.py --start all - docker ps -a - python3 main.py --stop - deactivate -- 2.45.2 From fd492ca19695d45948bb1eff74107f5a904b5a71 Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Tue, 18 Apr 2023 12:53:12 +0200 Subject: [PATCH 11/32] Run tests in the end --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 47d2c6c0..25ff9b62 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -141,6 +141,7 @@ test-e2e: - docker image ls -a - 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 -- 2.45.2 From 0175a7d0ecf4032c928535a9e93639a5676d2bf7 Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Tue, 18 Apr 2023 13:27:00 +0200 Subject: [PATCH 12/32] Try the full flow --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 25ff9b62..2c3dadaa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,9 +6,9 @@ include: - template: Secret-Detection.gitlab-ci.yml stages: - - python-test - build - dockerize + - python-test - test build-mainnet: @@ -122,7 +122,7 @@ dockerize-testnet: test-e2e: stage: python-test variables: - IMAGE: registry.gitlab.com/pbsa/peerplays/mainnet/feature-python-e2e-tests:943e02cdcd9fb8a90137851635b998cf1b4f622c + IMAGE: $CI_REGISTRY_IMAGE/testnet/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA before_script: - docker info - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY -- 2.45.2 From 25bbacaa88bc94c21482e1ec1dac88a84d925437 Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Tue, 18 Apr 2023 16:17:48 +0200 Subject: [PATCH 13/32] Add docker prune before run --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2c3dadaa..6767b196 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -49,6 +49,7 @@ dockerize-mainnet: IMAGE: $CI_REGISTRY_IMAGE/mainnet/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA before_script: - docker info + - docker builder prune -a -f - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY script: - docker build --no-cache -t $IMAGE . -- 2.45.2 From cfecfb457b6bb7791fcd170200cbd1f47f51d243 Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Wed, 19 Apr 2023 00:23:54 +0200 Subject: [PATCH 14/32] Pull propper image --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6767b196..02e74c0c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -123,7 +123,7 @@ dockerize-testnet: test-e2e: stage: python-test variables: - IMAGE: $CI_REGISTRY_IMAGE/testnet/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA + IMAGE: $CI_REGISTRY_IMAGE/mainnet/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA before_script: - docker info - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY -- 2.45.2 From 3ee2439d5b8ee3d18bf50fd93edfdc0fe6b2cf46 Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Thu, 20 Apr 2023 14:15:30 +0200 Subject: [PATCH 15/32] Revert changes on Dockerfile --- Dockerfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Dockerfile b/Dockerfile index 43db4a39..7a229aa7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -190,6 +190,8 @@ ADD . peerplays RUN \ cd peerplays && \ git submodule update --init --recursive && \ + git symbolic-ref --short HEAD && \ + git log --oneline -n 5 && \ mkdir build && \ cd build && \ cmake -DCMAKE_BUILD_TYPE=Release .. @@ -215,3 +217,6 @@ RUN chown peerplays:root -R /home/peerplays/peerplays-network EXPOSE 8090 # Peerplays P2P: EXPOSE 9777 + +# Peerplays +CMD ["./witness_node", "-d", "./witness_node_data_dir"] -- 2.45.2 From 1f72b4fbd62f5947ddb21cc4bc378f159b817307 Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Fri, 21 Apr 2023 00:35:02 +0200 Subject: [PATCH 16/32] Remove symbolic-ref call --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7a229aa7..8e2c76f3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -190,7 +190,6 @@ ADD . peerplays RUN \ cd peerplays && \ git submodule update --init --recursive && \ - git symbolic-ref --short HEAD && \ git log --oneline -n 5 && \ mkdir build && \ cd build && \ -- 2.45.2 From dfd3dfae097866e9cec4911dd4b3891748ca69e6 Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Fri, 21 Apr 2023 09:21:17 +0300 Subject: [PATCH 17/32] #530 - fix ETH deposit_address --- .../graphene/chain/sidechain_address_object.hpp | 11 ++++++++++- .../sidechain_net_handler_ethereum.cpp | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/libraries/chain/include/graphene/chain/sidechain_address_object.hpp b/libraries/chain/include/graphene/chain/sidechain_address_object.hpp index 73be44d5..b808a23c 100644 --- a/libraries/chain/include/graphene/chain/sidechain_address_object.hpp +++ b/libraries/chain/include/graphene/chain/sidechain_address_object.hpp @@ -36,6 +36,15 @@ namespace graphene { namespace chain { deposit_address(""), withdraw_public_key(""), withdraw_address("") {} + + inline string get_deposit_address() const { + if(sidechain_type::ethereum != sidechain) + return deposit_address; + + auto deposit_address_lower = deposit_address; + std::transform(deposit_address_lower.begin(), deposit_address_lower.end(), deposit_address_lower.begin(), ::tolower); + return deposit_address_lower; + } }; struct by_account; @@ -76,7 +85,7 @@ namespace graphene { namespace chain { ordered_non_unique< tag, composite_key, - member, + const_mem_fun, member > > diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_ethereum.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_ethereum.cpp index 5ffe1332..fb21a87c 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_ethereum.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_ethereum.cpp @@ -914,8 +914,9 @@ void sidechain_net_handler_ethereum::handle_event(const std::string &block_numbe const boost::property_tree::ptree tx = tx_child.second; tx_idx = tx_idx + 1; - const std::string from = tx.get("from"); const std::string to = tx.get("to"); + std::string from = tx.get("from"); + std::transform(from.begin(), from.end(), from.begin(), ::tolower); std::string cmp_to = to; std::transform(cmp_to.begin(), cmp_to.end(), cmp_to.begin(), ::toupper); -- 2.45.2 From 838a9820f1873aa30bff59d80ae924fe163a1a74 Mon Sep 17 00:00:00 2001 From: Milos Milosevic Date: Wed, 26 Apr 2023 13:22:19 +0200 Subject: [PATCH 18/32] Right order of the steps --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 02e74c0c..0da838fb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,9 +7,9 @@ include: stages: - build + - test - dockerize - python-test - - test build-mainnet: stage: build -- 2.45.2 From 6cf31b107580aff207558e160154a536e7434c18 Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Mon, 5 Jun 2023 12:21:45 +0300 Subject: [PATCH 19/32] Add develop branch to build target --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c443fe98..80c8fb23 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -30,7 +30,7 @@ build-mainnet: - build/programs/ - build/tests/ rules: - - if: $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" + - if: $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "beatrice" || $CI_COMMIT_BRANCH == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" tags: - builder @@ -82,7 +82,7 @@ build-testnet: - build/programs/ - build/tests/ rules: - - if: $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" + - if: $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "beatrice" || $CI_COMMIT_BRANCH == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" when: manual tags: - builder -- 2.45.2 From fee7bc99faabf6779f9f2177d052b7318253500c Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Mon, 5 Jun 2023 09:24:04 +0000 Subject: [PATCH 20/32] Fix #549 testnet sync --- .gitlab-ci.yml | 4 ++-- libraries/chain/son_wallet_evaluator.cpp | 28 +++++++++++++++++++----- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c443fe98..80c8fb23 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -30,7 +30,7 @@ build-mainnet: - build/programs/ - build/tests/ rules: - - if: $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" + - if: $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "beatrice" || $CI_COMMIT_BRANCH == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" tags: - builder @@ -82,7 +82,7 @@ build-testnet: - build/programs/ - build/tests/ rules: - - if: $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" + - if: $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "beatrice" || $CI_COMMIT_BRANCH == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" when: manual tags: - builder diff --git a/libraries/chain/son_wallet_evaluator.cpp b/libraries/chain/son_wallet_evaluator.cpp index 138f8e57..03e2edc1 100644 --- a/libraries/chain/son_wallet_evaluator.cpp +++ b/libraries/chain/son_wallet_evaluator.cpp @@ -97,10 +97,18 @@ void_result update_son_wallet_evaluator::do_evaluate(const son_wallet_update_ope FC_ASSERT(db().head_block_time() >= HARDFORK_SON_TIME, "Not allowed until SON HARDFORK"); FC_ASSERT( op.payer == db().get_global_properties().parameters.son_account(), "SON paying account must be set as payer." ); + const son_wallet_id_type son_wallet_id = [&]{ + if(db().head_block_time() >= HARDFORK_SON_FOR_ETHEREUM_TIME) + { + const auto ast = active_sidechain_types(db().head_block_time()); + const auto id = (op.son_wallet_id.instance.value - std::distance(ast.begin(), ast.find(op.sidechain))) / ast.size(); + return son_wallet_id_type{ id }; + } + + return op.son_wallet_id; + }(); + const auto& idx = db().get_index_type().indices().get(); - const auto ast = active_sidechain_types(db().head_block_time()); - const auto id = (op.son_wallet_id.instance.value - std::distance(ast.begin(), ast.find(op.sidechain))) / ast.size(); - const son_wallet_id_type son_wallet_id{ id }; FC_ASSERT( idx.find(son_wallet_id) != idx.end() ); //auto itr = idx.find(op.son_wallet_id); //FC_ASSERT( itr->addresses.find(op.sidechain) == itr->addresses.end() || @@ -110,10 +118,18 @@ void_result update_son_wallet_evaluator::do_evaluate(const son_wallet_update_ope object_id_type update_son_wallet_evaluator::do_apply(const son_wallet_update_operation& op) { try { + const son_wallet_id_type son_wallet_id = [&]{ + if(db().head_block_time() >= HARDFORK_SON_FOR_ETHEREUM_TIME) + { + const auto ast = active_sidechain_types(db().head_block_time()); + const auto id = (op.son_wallet_id.instance.value - std::distance(ast.begin(), ast.find(op.sidechain))) / ast.size(); + return son_wallet_id_type{ id }; + } + + return op.son_wallet_id; + }(); + const auto& idx = db().get_index_type().indices().get(); - const auto ast = active_sidechain_types(db().head_block_time()); - const auto id = (op.son_wallet_id.instance.value - std::distance(ast.begin(), ast.find(op.sidechain))) / ast.size(); - const son_wallet_id_type son_wallet_id{ id }; auto itr = idx.find(son_wallet_id); if (itr != idx.end()) { -- 2.45.2 From 3a51723e513ca62c44b3cc7a73344856a8e2c194 Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Thu, 8 Jun 2023 05:28:30 +0000 Subject: [PATCH 21/32] #550 - update schedule for sidechain type --- .gitlab-ci.yml | 6 +- libraries/chain/db_block.cpp | 18 +-- libraries/chain/db_witness_schedule.cpp | 140 ++++++++---------- .../chain/include/graphene/chain/database.hpp | 4 +- 4 files changed, 72 insertions(+), 96 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 80c8fb23..f300e82b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,8 +29,6 @@ build-mainnet: - build/libraries/ - build/programs/ - build/tests/ - rules: - - if: $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "beatrice" || $CI_COMMIT_BRANCH == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" tags: - builder @@ -81,9 +79,7 @@ build-testnet: - build/libraries/ - build/programs/ - build/tests/ - rules: - - if: $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "beatrice" || $CI_COMMIT_BRANCH == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "beatrice" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" - when: manual + when: manual tags: - builder diff --git a/libraries/chain/db_block.cpp b/libraries/chain/db_block.cpp index adabcffe..79b24464 100644 --- a/libraries/chain/db_block.cpp +++ b/libraries/chain/db_block.cpp @@ -739,13 +739,11 @@ void database::_apply_block( const signed_block& next_block ) if (global_props.parameters.witness_schedule_algorithm == GRAPHENE_WITNESS_SCHEDULED_ALGORITHM) { update_witness_schedule(next_block); - bool need_to_update_son_schedule = false; - for(const auto& active_sons : global_props.active_sons){ - if(!active_sons.second.empty()) - need_to_update_son_schedule = true; - } - if(need_to_update_son_schedule) { - update_son_schedule(next_block); + + for(const auto& active_sons : global_props.active_sons) { + if(!active_sons.second.empty()) { + update_son_schedule(active_sons.first, next_block); + } } } @@ -783,15 +781,11 @@ void database::_apply_block( const signed_block& next_block ) if (global_props.parameters.witness_schedule_algorithm == GRAPHENE_WITNESS_SHUFFLED_ALGORITHM) { update_witness_schedule(); - bool need_update_son_schedule = false; for(const auto& active_sidechain_type : active_sidechain_types(dynamic_global_props.time)) { if(global_props.active_sons.at(active_sidechain_type).size() > 0) { - need_update_son_schedule = true; + update_son_schedule(active_sidechain_type); } } - if(need_update_son_schedule) { - update_son_schedule(); - } } if( !_node_property_object.debug_updates.empty() ) diff --git a/libraries/chain/db_witness_schedule.cpp b/libraries/chain/db_witness_schedule.cpp index 12d4a6dd..d4874b29 100644 --- a/libraries/chain/db_witness_schedule.cpp +++ b/libraries/chain/db_witness_schedule.cpp @@ -200,44 +200,41 @@ void database::update_witness_schedule() } } -void database::update_son_schedule() +void database::update_son_schedule(sidechain_type type) { const global_property_object& gpo = get_global_properties(); - for(const auto& active_sidechain_type : active_sidechain_types(head_block_time())) + const son_schedule_object& sidechain_sso = get(son_schedule_id_type(get_son_schedule_id(type))); + if( gpo.active_sons.at(type).size() != 0 && + head_block_num() % gpo.active_sons.at(type).size() == 0) { - const son_schedule_object& sidechain_sso = get(son_schedule_id_type(get_son_schedule_id(active_sidechain_type))); - if( gpo.active_sons.at(active_sidechain_type).size() != 0 && - head_block_num() % gpo.active_sons.at(active_sidechain_type).size() == 0) + modify( sidechain_sso, [&]( son_schedule_object& _sso ) { - modify( sidechain_sso, [&]( son_schedule_object& _sso ) + _sso.current_shuffled_sons.clear(); + _sso.current_shuffled_sons.reserve( gpo.active_sons.at(type).size() ); + + for ( const auto &w : gpo.active_sons.at(type) ) { + _sso.current_shuffled_sons.push_back(w.son_id); + } + + auto now_hi = uint64_t(head_block_time().sec_since_epoch()) << 32; + + for (uint32_t i = 0; i < _sso.current_shuffled_sons.size(); ++i) { - _sso.current_shuffled_sons.clear(); - _sso.current_shuffled_sons.reserve( gpo.active_sons.at(active_sidechain_type).size() ); + /// High performance random generator + /// http://xorshift.di.unimi.it/ + uint64_t k = now_hi + uint64_t(i) * 2685821657736338717ULL; + k ^= (k >> 12); + k ^= (k << 25); + k ^= (k >> 27); + k *= 2685821657736338717ULL; - for ( const auto &w : gpo.active_sons.at(active_sidechain_type) ) { - _sso.current_shuffled_sons.push_back(w.son_id); - } - - auto now_hi = uint64_t(head_block_time().sec_since_epoch()) << 32; - - for (uint32_t i = 0; i < _sso.current_shuffled_sons.size(); ++i) - { - /// High performance random generator - /// http://xorshift.di.unimi.it/ - uint64_t k = now_hi + uint64_t(i) * 2685821657736338717ULL; - k ^= (k >> 12); - k ^= (k << 25); - k ^= (k >> 27); - k *= 2685821657736338717ULL; - - uint32_t jmax = _sso.current_shuffled_sons.size() - i; - uint32_t j = i + k % jmax; - std::swap(_sso.current_shuffled_sons[i], - _sso.current_shuffled_sons[j]); - } - }); - } + uint32_t jmax = _sso.current_shuffled_sons.size() - i; + uint32_t j = i + k % jmax; + std::swap(_sso.current_shuffled_sons[i], + _sso.current_shuffled_sons[j]); + } + }); } } @@ -321,23 +318,15 @@ void database::update_witness_schedule(const signed_block& next_block) idump( ( double(total_time/1000000.0)/calls) ); } -void database::update_son_schedule(const signed_block& next_block) +void database::update_son_schedule(sidechain_type type, const signed_block& next_block) { auto start = fc::time_point::now(); #ifndef NDEBUG const son_schedule_object& sso = get(son_schedule_id_type()); #endif const global_property_object& gpo = get_global_properties(); - const flat_map schedule_needs_filled = [&gpo]() - { - flat_map schedule_needs_filled; - for(const auto& sidechain_active_sons : gpo.active_sons) - { - schedule_needs_filled[sidechain_active_sons.first] = sidechain_active_sons.second.size(); - } - return schedule_needs_filled; - }(); - uint32_t schedule_slot = get_slot_at_time(next_block.timestamp); + const uint32_t schedule_needs_filled = gpo.active_sons.at(type).size(); + const uint32_t schedule_slot = get_slot_at_time(next_block.timestamp); // We shouldn't be able to generate _pending_block with timestamp // in the past, and incoming blocks from the network with timestamp @@ -351,46 +340,43 @@ void database::update_son_schedule(const signed_block& next_block) assert( dpo.random.data_size() == witness_scheduler_rng::seed_length ); assert( witness_scheduler_rng::seed_length == sso.rng_seed.size() ); - for(const auto& active_sidechain_type : active_sidechain_types(head_block_time())) + const son_schedule_object& sidechain_sso = get(son_schedule_id_type(get_son_schedule_id(type))); + son_id_type first_son; + bool slot_is_near = sidechain_sso.scheduler.get_slot( schedule_slot-1, first_son ); + son_id_type son_id; + + modify(sidechain_sso, [&](son_schedule_object& _sso) { - const son_schedule_object& sidechain_sso = get(son_schedule_id_type(get_son_schedule_id(active_sidechain_type))); - son_id_type first_son; - bool slot_is_near = sidechain_sso.scheduler.get_slot( schedule_slot-1, first_son ); - son_id_type son_id; + _sso.slots_since_genesis += schedule_slot; + witness_scheduler_rng rng(_sso.rng_seed.data, _sso.slots_since_genesis); - modify(sidechain_sso, [&](son_schedule_object& _sso) - { - _sso.slots_since_genesis += schedule_slot; - witness_scheduler_rng rng(_sso.rng_seed.data, _sso.slots_since_genesis); + _sso.scheduler._min_token_count = std::max(int(gpo.active_sons.at(type).size()) / 2, 1); - _sso.scheduler._min_token_count = std::max(int(gpo.active_sons.at(active_sidechain_type).size()) / 2, 1); - - if( slot_is_near ) + if( slot_is_near ) + { + uint32_t drain = schedule_slot; + while( drain > 0 ) { - uint32_t drain = schedule_slot; - while( drain > 0 ) - { - if( _sso.scheduler.size() == 0 ) - break; - _sso.scheduler.consume_schedule(); - --drain; - } + if( _sso.scheduler.size() == 0 ) + break; + _sso.scheduler.consume_schedule(); + --drain; } - else - { - _sso.scheduler.reset_schedule( first_son ); - } - while( !_sso.scheduler.get_slot(schedule_needs_filled.at(active_sidechain_type), son_id) ) - { - if( _sso.scheduler.produce_schedule(rng) & emit_turn ) - memcpy(_sso.rng_seed.begin(), dpo.random.data(), dpo.random.data_size()); - } - _sso.last_scheduling_block = next_block.block_num(); - _sso.recent_slots_filled = ( - (_sso.recent_slots_filled << 1) - + 1) << (schedule_slot - 1); - }); - } + } + else + { + _sso.scheduler.reset_schedule( first_son ); + } + while( !_sso.scheduler.get_slot(schedule_needs_filled, son_id) ) + { + if( _sso.scheduler.produce_schedule(rng) & emit_turn ) + memcpy(_sso.rng_seed.begin(), dpo.random.data(), dpo.random.data_size()); + } + _sso.last_scheduling_block = next_block.block_num(); + _sso.recent_slots_filled = ( + (_sso.recent_slots_filled << 1) + + 1) << (schedule_slot - 1); + }); auto end = fc::time_point::now(); static uint64_t total_time = 0; diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index c8e1f214..48be59f0 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -292,8 +292,8 @@ namespace graphene { namespace chain { vector get_near_witness_schedule()const; void update_witness_schedule(); void update_witness_schedule(const signed_block& next_block); - void update_son_schedule(); - void update_son_schedule(const signed_block& next_block); + void update_son_schedule(sidechain_type type); + void update_son_schedule(sidechain_type type, const signed_block& next_block); void check_lottery_end_by_participants( asset_id_type asset_id ); void check_ending_lotteries(); -- 2.45.2 From fb01043e55694b15e7ad8c727617f8a94c242126 Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Mon, 19 Jun 2023 09:58:12 +0000 Subject: [PATCH 22/32] Fix balance discrepancies --- libraries/chain/db_maint.cpp | 228 ++++++++++++------ .../chain/include/graphene/chain/database.hpp | 3 +- .../sidechain_net_handler.cpp | 3 +- .../sidechain_net_handler_bitcoin.cpp | 2 +- tests/tests/son_operations_tests.cpp | 2 +- 5 files changed, 158 insertions(+), 80 deletions(-) diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index e4ccc45d..7df4f403 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -185,13 +185,109 @@ void database::update_worker_votes() } } -void database::pay_sons() +void database::pay_sons_before_hf_ethereum() +{ + const auto now = head_block_time(); + const dynamic_global_property_object& dpo = get_dynamic_global_properties(); + // Current requirement is that we have to pay every 24 hours, so the following check + if( dpo.son_budget.value > 0 && ((now - dpo.last_son_payout_time) >= fc::seconds(get_global_properties().parameters.son_pay_time()))) + { + const sidechain_type st = sidechain_type::bitcoin; + const auto sons = sort_votable_objects(st, get_global_properties().parameters.maximum_son_count()); + + // After SON2 HF + uint64_t total_votes = 0; + for( const son_object& son : sons ) + { + FC_ASSERT(son.get_sidechain_vote_id(st).valid(), "Invalid vote id, sidechain: ${sidechain}, son: ${son}", ("sidechain", st)("son", son)); + total_votes += _vote_tally_buffer[*son.get_sidechain_vote_id(st)]; + } + const int8_t bits_to_drop = std::max(int(boost::multiprecision::detail::find_msb(total_votes)) - 15, 0); + auto get_weight = [&bits_to_drop]( uint64_t son_votes ) { + const uint16_t weight = std::max((son_votes >> bits_to_drop), uint64_t(1) ); + return weight; + }; + + // Before SON2 HF + auto get_weight_before_son2_hf = []( uint64_t son_votes ) { + const int8_t bits_to_drop = std::max(int(boost::multiprecision::detail::find_msb(son_votes)) - 15, 0); + const uint16_t weight = std::max((son_votes >> bits_to_drop), uint64_t(1) ); + return weight; + }; + + uint64_t weighted_total_txs_signed = 0; + const share_type son_budget = dpo.son_budget; + get_index_type().inspect_all_objects([this, &weighted_total_txs_signed, &get_weight, &now, &get_weight_before_son2_hf, &st](const object& o) { + const son_statistics_object& s = static_cast(o); + const auto& idx = get_index_type().indices().get(); + const auto son_obj = idx.find( s.owner ); + uint16_t son_weight = 0; + FC_ASSERT(son_obj->get_sidechain_vote_id(st).valid(), "Invalid vote id, sidechain: ${sidechain}, son: ${son}", ("sidechain", st)("son", *son_obj)); + if( now >= HARDFORK_SON2_TIME ) { + son_weight += get_weight(_vote_tally_buffer[*son_obj->get_sidechain_vote_id(st)]); + } + else { + son_weight += get_weight_before_son2_hf(_vote_tally_buffer[*son_obj->get_sidechain_vote_id(st)]); + } + const uint64_t txs_signed_bitcoin = s.txs_signed.contains(sidechain_type::bitcoin) ? s.txs_signed.at(sidechain_type::bitcoin) : 0; + const uint64_t txs_signed_hive = s.txs_signed.contains(sidechain_type::hive) ? s.txs_signed.at(sidechain_type::hive) : 0; + weighted_total_txs_signed += ((txs_signed_bitcoin + txs_signed_hive) * son_weight); + }); + + // Now pay off each SON proportional to the number of transactions signed. + get_index_type().inspect_all_objects([this, &weighted_total_txs_signed, &dpo, &son_budget, &get_weight, &get_weight_before_son2_hf, &now, &st](const object& o) { + const son_statistics_object& s = static_cast(o); + const uint64_t txs_signed_bitcoin = s.txs_signed.contains(sidechain_type::bitcoin) ? s.txs_signed.at(sidechain_type::bitcoin) : 0; + const uint64_t txs_signed_hive = s.txs_signed.contains(sidechain_type::hive) ? s.txs_signed.at(sidechain_type::hive) : 0; + + if(txs_signed_bitcoin > 0 || txs_signed_hive > 0) { + const auto& idx = get_index_type().indices().get(); + auto son_obj = idx.find( s.owner ); + uint16_t son_weight = 0; + FC_ASSERT(son_obj->get_sidechain_vote_id(st).valid(), "Invalid vote id, sidechain: ${sidechain}, son: ${son}", ("sidechain", st)("son", *son_obj)); + if( now >= HARDFORK_SON2_TIME ) { + son_weight += get_weight(_vote_tally_buffer[*son_obj->get_sidechain_vote_id(st)]); + } + else { + son_weight += get_weight_before_son2_hf(_vote_tally_buffer[*son_obj->get_sidechain_vote_id(st)]); + } + const share_type pay = ((txs_signed_bitcoin + txs_signed_hive) * son_weight * son_budget.value)/weighted_total_txs_signed; + modify( *son_obj, [&]( son_object& _son_obj) + { + _son_obj.pay_son_fee(pay, *this); + }); + //Remove the amount paid out to SON from global SON Budget + modify( dpo, [&]( dynamic_global_property_object& _dpo ) + { + _dpo.son_budget -= pay; + } ); + //Reset the tx counter in each son statistics object + modify( s, [&]( son_statistics_object& _s) + { + if(_s.txs_signed.contains(sidechain_type::bitcoin)) + _s.txs_signed.at(sidechain_type::bitcoin) = 0; + if(_s.txs_signed.contains(sidechain_type::hive)) + _s.txs_signed.at(sidechain_type::hive) = 0; + }); + } + }); + + //Note the last son pay out time + modify( dpo, [&]( dynamic_global_property_object& _dpo ) + { + _dpo.last_son_payout_time = now; + }); + } +} + +void database::pay_sons_after_hf_ethereum() { const time_point_sec now = head_block_time(); const dynamic_global_property_object& dpo = get_dynamic_global_properties(); // Current requirement is that we have to pay every 24 hours, so the following check if( dpo.son_budget.value > 0 && ((now - dpo.last_son_payout_time) >= fc::seconds(get_global_properties().parameters.son_pay_time()))) { + flat_map bits_to_drop; for(const auto& active_sidechain_type : active_sidechain_types(now)) { assert( _son_count_histogram_buffer.at(active_sidechain_type).size() > 0 ); @@ -209,93 +305,72 @@ void database::pay_sons() } } - const sidechain_type st = [&now, &active_sidechain_type]{ - if( now < HARDFORK_SON_FOR_ETHEREUM_TIME ) - return sidechain_type::bitcoin; - else - return active_sidechain_type; - }(); - - const auto sons = sort_votable_objects(st, - (std::max(son_count*2+1, (size_t)get_chain_properties().immutable_parameters.min_son_count)) - ); + const auto sons = sort_votable_objects(active_sidechain_type, (std::max(son_count*2+1, (size_t)get_chain_properties().immutable_parameters.min_son_count))); // After SON2 HF uint64_t total_votes = 0; for( const son_object& son : sons ) { - FC_ASSERT(son.get_sidechain_vote_id(st).valid(), "Invalid vote id, sidechain: ${sidechain}, son: ${son}", ("sidechain", st)("son", son)); - total_votes += _vote_tally_buffer[*son.get_sidechain_vote_id(st)]; + FC_ASSERT(son.get_sidechain_vote_id(active_sidechain_type).valid(), "Invalid vote id, sidechain: ${sidechain}, son: ${son}", ("sidechain", active_sidechain_type)("son", son)); + total_votes += _vote_tally_buffer[*son.get_sidechain_vote_id(active_sidechain_type)]; } - const int8_t bits_to_drop = std::max(int(boost::multiprecision::detail::find_msb(total_votes)) - 15, 0); - auto get_weight = [&bits_to_drop]( uint64_t son_votes ) { - const uint16_t weight = std::max((son_votes >> bits_to_drop), uint64_t(1) ); - return weight; - }; - // Before SON2 HF - auto get_weight_before_son2_hf = []( uint64_t son_votes ) { - const int8_t bits_to_drop = std::max(int(boost::multiprecision::detail::find_msb(son_votes)) - 15, 0); - const uint16_t weight = std::max((son_votes >> bits_to_drop), uint64_t(1) ); - return weight; - }; - uint64_t weighted_total_txs_signed = 0; - const share_type son_budget = dpo.son_budget; - get_index_type().inspect_all_objects([this, &weighted_total_txs_signed, &get_weight, &now, &get_weight_before_son2_hf, &active_sidechain_type, &st](const object& o) { - const son_statistics_object& s = static_cast(o); - const auto& idx = get_index_type().indices().get(); - const auto son_obj = idx.find( s.owner ); - uint16_t son_weight = 0; - FC_ASSERT(son_obj->get_sidechain_vote_id(st).valid(), "Invalid vote id, sidechain: ${sidechain}, son: ${son}", ("sidechain", st)("son", *son_obj)); - if( now >= HARDFORK_SON2_TIME ) { - son_weight += get_weight(_vote_tally_buffer[*son_obj->get_sidechain_vote_id(st)]); - } - else { - son_weight += get_weight_before_son2_hf(_vote_tally_buffer[*son_obj->get_sidechain_vote_id(st)]); - } + bits_to_drop[active_sidechain_type] = std::max(int(boost::multiprecision::detail::find_msb(total_votes)) - 15, 0); + } + + auto get_weight = [&bits_to_drop]( sidechain_type sidechain, uint64_t son_votes ) { + const uint16_t weight = std::max((son_votes >> bits_to_drop.at(sidechain)), uint64_t(1) ); + return weight; + }; + + // Calculate weighted_total_txs_signed + uint64_t weighted_total_txs_signed = 0; + get_index_type().inspect_all_objects([this, &weighted_total_txs_signed, &get_weight, &now](const object& o) { + for(const auto& active_sidechain_type : active_sidechain_types(now)) { + const son_statistics_object &s = static_cast(o); + const auto &idx = get_index_type().indices().get(); + const auto son_obj = idx.find(s.owner); + FC_ASSERT(son_obj->get_sidechain_vote_id(active_sidechain_type).valid(), "Invalid vote id, sidechain: ${sidechain}, son: ${son}", ("sidechain", active_sidechain_type)("son", *son_obj)); + const uint16_t son_weight = get_weight(active_sidechain_type, _vote_tally_buffer[*son_obj->get_sidechain_vote_id(active_sidechain_type)]); const uint64_t txs_signed = s.txs_signed.contains(active_sidechain_type) ? s.txs_signed.at(active_sidechain_type) : 0; weighted_total_txs_signed += (txs_signed * son_weight); - }); + } + }); + + // Now pay off each SON proportional to the number of transactions signed + const share_type son_budget = dpo.son_budget; + get_index_type().inspect_all_objects([this, &now, &get_weight, &weighted_total_txs_signed, &dpo, &son_budget](const object& o) { + for(const auto& active_sidechain_type : active_sidechain_types(now)) { + const son_statistics_object &s = static_cast(o); - // Now pay off each SON proportional to the number of transactions signed. - get_index_type().inspect_all_objects([this, &weighted_total_txs_signed, &dpo, &son_budget, &get_weight, &get_weight_before_son2_hf, &now, &active_sidechain_type, &st](const object& o) { - const son_statistics_object& s = static_cast(o); const uint64_t txs_signed = s.txs_signed.contains(active_sidechain_type) ? s.txs_signed.at(active_sidechain_type) : 0; - - if(txs_signed > 0) { - const auto& idx = get_index_type().indices().get(); - auto son_obj = idx.find( s.owner ); + if (txs_signed > 0) { + const auto &idx = get_index_type().indices().get(); + auto son_obj = idx.find(s.owner); uint16_t son_weight = 0; - FC_ASSERT(son_obj->get_sidechain_vote_id(st).valid(), "Invalid vote id, sidechain: ${sidechain}, son: ${son}", ("sidechain", st)("son", *son_obj)); - if( now >= HARDFORK_SON2_TIME ) { - son_weight += get_weight(_vote_tally_buffer[*son_obj->get_sidechain_vote_id(st)]); - } - else { - son_weight += get_weight_before_son2_hf(_vote_tally_buffer[*son_obj->get_sidechain_vote_id(st)]); - } - const share_type pay = (txs_signed * son_weight * son_budget.value)/weighted_total_txs_signed; - modify( *son_obj, [&]( son_object& _son_obj) - { - _son_obj.pay_son_fee(pay, *this); + FC_ASSERT(son_obj->get_sidechain_vote_id(active_sidechain_type).valid(), "Invalid vote id, sidechain: ${sidechain}, son: ${son}", ("sidechain", active_sidechain_type)("son", *son_obj)); + son_weight += get_weight(active_sidechain_type, _vote_tally_buffer[*son_obj->get_sidechain_vote_id(active_sidechain_type)]); + const share_type pay = (txs_signed * son_weight * son_budget.value) / weighted_total_txs_signed; + modify(*son_obj, [&](son_object &_son_obj) { + _son_obj.pay_son_fee(pay, *this); }); - //Remove the amount paid out to SON from global SON Budget - modify( dpo, [&]( dynamic_global_property_object& _dpo ) - { - _dpo.son_budget -= pay; - } ); - //Reset the tx counter in each son statistics object - modify( s, [&]( son_statistics_object& _s) - { - if(_s.txs_signed.contains(active_sidechain_type)) + // Remove the amount paid out to SON from global SON Budget + modify(dpo, [&](dynamic_global_property_object &_dpo) { + _dpo.son_budget -= pay; + }); + // Reset the tx counter in each son statistics object + modify(s, [&](son_statistics_object &_s) { + if (_s.txs_signed.contains(active_sidechain_type)) _s.txs_signed.at(active_sidechain_type) = 0; }); } - }); - //Note the last son pay out time - modify( dpo, [&]( dynamic_global_property_object& _dpo ) - { - _dpo.last_son_payout_time = now; - }); - } + } + }); + + //Note the last son pay out time + modify( dpo, [&]( dynamic_global_property_object& _dpo ) + { + _dpo.last_son_payout_time = now; + }); } } @@ -2152,7 +2227,7 @@ void database::perform_son_tasks() }); } // create HIVE asset here because son_account is the issuer of the HIVE - if (gpo.parameters.hive_asset() == asset_id_type() && head_block_time() >= HARDFORK_SON_FOR_HIVE_TIME) + if (gpo.parameters.hive_asset() == asset_id_type() && head_block_time() >= HARDFORK_SON_FOR_HIVE_TIME) { const asset_dynamic_data_object& dyn_asset = create([](asset_dynamic_data_object& a) { @@ -2192,7 +2267,10 @@ void database::perform_son_tasks() // Before making a budget we should pay out SONs // This function should check if its time to pay sons // and modify the global son funds accordingly, whatever is left is passed on to next budget - pay_sons(); + if(head_block_time() < HARDFORK_SON_FOR_ETHEREUM_TIME) + pay_sons_before_hf_ethereum(); + else + pay_sons_after_hf_ethereum(); } // Split vote_ids diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index 48be59f0..24fb32d4 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -579,7 +579,8 @@ namespace graphene { namespace chain { void initialize_budget_record( fc::time_point_sec now, budget_record& rec )const; void process_budget(); void pay_workers( share_type& budget ); - void pay_sons(); + void pay_sons_before_hf_ethereum(); + void pay_sons_after_hf_ethereum(); void perform_son_tasks(); void perform_chain_maintenance(const signed_block& next_block, const global_property_object& global_props); void update_active_witnesses(); diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp index f762da49..0d19b179 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp @@ -680,8 +680,7 @@ void sidechain_net_handler::on_applied_block(const signed_block &b) { const bool is_tracked_asset = ((sidechain == sidechain_type::bitcoin) && (transfer_op.amount.asset_id == gpo.parameters.btc_asset())) || ((sidechain == sidechain_type::ethereum) && (transfer_op.amount.asset_id == gpo.parameters.eth_asset())) || - ((sidechain == sidechain_type::ethereum) && (transfer_op.amount.asset_id != gpo.parameters.btc_asset()) - && (transfer_op.amount.asset_id != gpo.parameters.hbd_asset()) && (transfer_op.amount.asset_id != gpo.parameters.hive_asset())) || + ((sidechain == sidechain_type::ethereum) && (transfer_op.amount.asset_id != gpo.parameters.btc_asset()) && (transfer_op.amount.asset_id != gpo.parameters.hbd_asset()) && (transfer_op.amount.asset_id != gpo.parameters.hive_asset())) || ((sidechain == sidechain_type::hive) && (transfer_op.amount.asset_id == gpo.parameters.hbd_asset())) || ((sidechain == sidechain_type::hive) && (transfer_op.amount.asset_id == gpo.parameters.hive_asset())); diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp index 76e23ab0..974670ea 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -674,7 +674,7 @@ sidechain_net_handler_bitcoin::sidechain_net_handler_bitcoin(peerplays_sidechain uint32_t rpc_port = options.at("bitcoin-node-rpc-port").as(); std::string rpc_user = options.at("bitcoin-node-rpc-user").as(); std::string rpc_password = options.at("bitcoin-node-rpc-password").as(); - + if (options.count("use-bitcoind-client")) { use_bitcoind_client = options.at("use-bitcoind-client").as(); } diff --git a/tests/tests/son_operations_tests.cpp b/tests/tests/son_operations_tests.cpp index 0da34705..0d671a62 100644 --- a/tests/tests/son_operations_tests.cpp +++ b/tests/tests/son_operations_tests.cpp @@ -574,7 +574,7 @@ BOOST_AUTO_TEST_CASE( son_pay_test ) BOOST_REQUIRE_EQUAL(son_stats_obj2->total_sidechain_txs_reported.at(sidechain_type::hive), 12); BOOST_REQUIRE_EQUAL(son_stats_obj2->total_sidechain_txs_reported.at(sidechain_type::ethereum), 18); // Check that Alice and Bob are paid for signing the transactions in the previous day/cycle - BOOST_REQUIRE_EQUAL(db.get_balance(obj1->son_account, asset_id_type()).amount.value, 80+obj1_balance); + BOOST_REQUIRE_EQUAL(db.get_balance(obj1->son_account, asset_id_type()).amount.value, 79+obj1_balance); BOOST_REQUIRE_EQUAL(db.get_balance(obj2->son_account, asset_id_type()).amount.value, 120+obj2_balance); // Check the SON Budget is again allocated after maintenance BOOST_CHECK( dpo.son_budget.value == 200); -- 2.45.2 From 85fb3fee67cde9eb9de0bcfc8f4b35f4c6c88744 Mon Sep 17 00:00:00 2001 From: Milo M Date: Fri, 30 Jun 2023 18:33:26 +0000 Subject: [PATCH 23/32] Remove unneeded docker images at the end of the pipeline --- .gitlab-ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f300e82b..3ec040bc 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 -- 2.45.2 From ae0a895dafa002a5b2d2f423caf1011d87bad52b Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Sat, 1 Jul 2023 11:51:01 +0000 Subject: [PATCH 24/32] #548 - Fix blind_transfer before and after ETH HARDFORK --- libraries/chain/confidential_evaluator.cpp | 136 ++++++++++++++++-- .../include/graphene/chain/exceptions.hpp | 3 + .../graphene/chain/protocol/confidential.hpp | 12 +- 3 files changed, 133 insertions(+), 18 deletions(-) diff --git a/libraries/chain/confidential_evaluator.cpp b/libraries/chain/confidential_evaluator.cpp index fa4ac515..0526c116 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/include/graphene/chain/exceptions.hpp b/libraries/chain/include/graphene/chain/exceptions.hpp index 92c7c5dd..406a235e 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 d1a28da3..86628f3b 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 -- 2.45.2 From 646b421308a4522f6d07723432ddce8adfaf8087 Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Mon, 3 Jul 2023 18:35:58 +0300 Subject: [PATCH 25/32] #551 - fix is_son_dereg_valid funtion --- libraries/chain/db_getter.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libraries/chain/db_getter.cpp b/libraries/chain/db_getter.cpp index 9510692c..af3635c0 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; } } -- 2.45.2 From 15ebbfe6bb5440b6c6377c0ad262717207a71f9a Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Thu, 6 Jul 2023 15:38:20 +0300 Subject: [PATCH 26/32] #552 - NEW HARDFORK TIME FOR SON ETH --- libraries/chain/hardfork.d/SON_FOR_ETHEREUM.hf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/chain/hardfork.d/SON_FOR_ETHEREUM.hf b/libraries/chain/hardfork.d/SON_FOR_ETHEREUM.hf index e6d8a9cb..1caf70c2 100644 --- a/libraries/chain/hardfork.d/SON_FOR_ETHEREUM.hf +++ b/libraries/chain/hardfork.d/SON_FOR_ETHEREUM.hf @@ -1,7 +1,7 @@ #ifndef HARDFORK_SON_FOR_ETHEREUM_TIME #ifdef BUILD_PEERPLAYS_TESTNET -#define HARDFORK_SON_FOR_ETHEREUM_TIME (fc::time_point_sec::from_iso_string("2023-06-05T12:00:00")) +#define HARDFORK_SON_FOR_ETHEREUM_TIME (fc::time_point_sec::from_iso_string("2023-07-17T12:00:00")) #else -#define HARDFORK_SON_FOR_ETHEREUM_TIME (fc::time_point_sec::from_iso_string("2023-07-05T12:00:00")) +#define HARDFORK_SON_FOR_ETHEREUM_TIME (fc::time_point_sec::from_iso_string("2023-07-31T12:00:00")) #endif #endif -- 2.45.2 From 113790d9563ae3f5ce75639fcd5d7627b4e22bb3 Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Thu, 13 Jul 2023 09:39:57 +0300 Subject: [PATCH 27/32] #554 - new DB_VERSION --- libraries/chain/include/graphene/chain/config.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/chain/include/graphene/chain/config.hpp b/libraries/chain/include/graphene/chain/config.hpp index ef9a0c80..9b55b7b5 100644 --- a/libraries/chain/include/graphene/chain/config.hpp +++ b/libraries/chain/include/graphene/chain/config.hpp @@ -158,7 +158,7 @@ #define GRAPHENE_RECENTLY_MISSED_COUNT_INCREMENT 4 #define GRAPHENE_RECENTLY_MISSED_COUNT_DECREMENT 3 -#define GRAPHENE_CURRENT_DB_VERSION "PPY2.4" +#define GRAPHENE_CURRENT_DB_VERSION "PPY2.5" #define GRAPHENE_IRREVERSIBLE_THRESHOLD (70 * GRAPHENE_1_PERCENT) -- 2.45.2 From 8e2d3cf2f63df5e0695817ae654d903dc8a578c7 Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Mon, 17 Jul 2023 10:06:14 +0300 Subject: [PATCH 28/32] #555 - set test-e2e as manual --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3ec040bc..ca0c83a6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -167,3 +167,5 @@ test-e2e: - 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 + when: + manual -- 2.45.2 From 675eba96bbc1780a2103f2a6fdd099ba6ddac396 Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Tue, 1 Aug 2023 12:12:01 +0000 Subject: [PATCH 29/32] #556 split vote ids fix --- libraries/chain/db_maint.cpp | 4 ++-- tests/cli/son.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index 7df4f403..eaa50d51 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -2283,7 +2283,7 @@ void database::perform_son_tasks() // Add vote_ids for HIVE and ETHEREUM to all existing SONs const auto &all_sons = get_index_type().indices().get(); for (const son_object &son : all_sons) { - vote_id_type existing_vote_id_bitcoin; + const auto existing_vote_id_bitcoin = son.get_bitcoin_vote_id(); vote_id_type new_vote_id_hive; vote_id_type new_vote_id_eth; @@ -2300,7 +2300,7 @@ void database::perform_son_tasks() // Duplicate all votes from bitcoin to hive const auto &all_accounts = get_index_type().indices().get(); for (const auto &account : all_accounts) { - if (account.options.votes.count(existing_vote_id_bitcoin) != 0) { + if (existing_vote_id_bitcoin.valid() && account.options.votes.count(*existing_vote_id_bitcoin) != 0) { modify(account, [new_vote_id_hive](account_object &a) { a.options.votes.insert(new_vote_id_hive); }); diff --git a/tests/cli/son.cpp b/tests/cli/son.cpp index e3758557..ed01be2a 100644 --- a/tests/cli/son.cpp +++ b/tests/cli/son.cpp @@ -40,7 +40,7 @@ public: { fixture_.init_nathan(); fixture_.generate_blocks(HARDFORK_SON_FOR_ETHEREUM_TIME); - fixture_.generate_block(); + fixture_.generate_maintenance_block(); } void create_son(const std::string& account_name, const std::string& son_url, -- 2.45.2 From 1520585b17e24cd34ae234cd8319ffa01e8c6b3d Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Wed, 9 Aug 2023 14:21:39 +0300 Subject: [PATCH 30/32] #558 - Fix schedule_son_processing before fully sync --- .../peerplays_sidechain_plugin.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp index 6f6747db..98ebbbf2 100644 --- a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp +++ b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp @@ -100,6 +100,7 @@ private: uint16_t retries_threshold = 150; bool first_block_skipped; + bool son_processing_enabled; void on_applied_block(const signed_block &b); }; @@ -135,7 +136,8 @@ peerplays_sidechain_plugin_impl::peerplays_sidechain_plugin_impl(peerplays_sidec } return net_handlers; }()), - first_block_skipped(false) { + first_block_skipped(false), + son_processing_enabled(false) { } peerplays_sidechain_plugin_impl::~peerplays_sidechain_plugin_impl() { @@ -871,7 +873,19 @@ void peerplays_sidechain_plugin_impl::settle_sidechain_transactions(sidechain_ty void peerplays_sidechain_plugin_impl::on_applied_block(const signed_block &b) { if (first_block_skipped) { - schedule_son_processing(); + if(son_processing_enabled) { + schedule_son_processing(); + } + else + { + const fc::time_point now_fine = fc::time_point::now(); + const fc::time_point_sec now = now_fine + fc::microseconds( 500000 ); + if( plugin.database().get_slot_time(1) >= now ) + { + son_processing_enabled = true; + schedule_son_processing(); + } + } } else { first_block_skipped = true; } -- 2.45.2 From 18589ab198533fee87c083675081cdf8bdb8e570 Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Tue, 22 Aug 2023 12:11:56 +0300 Subject: [PATCH 31/32] #559 - Don't create withdraw operation if we use native asset --- libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp index 0d19b179..667f1edc 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp @@ -680,7 +680,7 @@ void sidechain_net_handler::on_applied_block(const signed_block &b) { const bool is_tracked_asset = ((sidechain == sidechain_type::bitcoin) && (transfer_op.amount.asset_id == gpo.parameters.btc_asset())) || ((sidechain == sidechain_type::ethereum) && (transfer_op.amount.asset_id == gpo.parameters.eth_asset())) || - ((sidechain == sidechain_type::ethereum) && (transfer_op.amount.asset_id != gpo.parameters.btc_asset()) && (transfer_op.amount.asset_id != gpo.parameters.hbd_asset()) && (transfer_op.amount.asset_id != gpo.parameters.hive_asset())) || + ((sidechain == sidechain_type::ethereum) && (transfer_op.amount.asset_id != gpo.parameters.btc_asset()) && (transfer_op.amount.asset_id != gpo.parameters.hbd_asset()) && (transfer_op.amount.asset_id != gpo.parameters.hive_asset()) && (transfer_op.amount.asset_id != asset_id_type())) || ((sidechain == sidechain_type::hive) && (transfer_op.amount.asset_id == gpo.parameters.hbd_asset())) || ((sidechain == sidechain_type::hive) && (transfer_op.amount.asset_id == gpo.parameters.hive_asset())); -- 2.45.2 From f6c6ac2cc834edae26ea24530de6c590ee3897d8 Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Tue, 3 Oct 2023 11:57:09 +0300 Subject: [PATCH 32/32] #562 - Point to libbitcoin tag v3.8.0 --- Dockerfile | 7 ++----- Dockerfile.18.04 | 7 ++----- README.md | 7 ++----- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8e2c76f3..b9068197 100644 --- a/Dockerfile +++ b/Dockerfile @@ -134,11 +134,8 @@ RUN \ libsodium-dev RUN \ - git clone https://github.com/libbitcoin/libbitcoin-build.git && \ - cd libbitcoin-build && \ - git reset --hard 92c215fc1ffa272bab4d485d369d0306db52d69d && \ - ./generate3.sh && \ - cd ../libbitcoin-explorer && \ + git clone --branch version3.8.0 --depth 1 https://gitlab.com/PBSA/peerplays-1.0/libbitcoin-explorer.git && \ + cd libbitcoin-explorer && \ ./install.sh && \ ldconfig && \ rm -rf /home/peerplays/src/* diff --git a/Dockerfile.18.04 b/Dockerfile.18.04 index 9531d986..1fe40a55 100644 --- a/Dockerfile.18.04 +++ b/Dockerfile.18.04 @@ -134,11 +134,8 @@ RUN \ libsodium-dev RUN \ - git clone https://github.com/libbitcoin/libbitcoin-build.git && \ - cd libbitcoin-build && \ - git reset --hard 92c215fc1ffa272bab4d485d369d0306db52d69d && \ - ./generate3.sh && \ - cd ../libbitcoin-explorer && \ + git clone --branch version3.8.0 --depth 1 https://gitlab.com/PBSA/peerplays-1.0/libbitcoin-explorer.git && \ + cd libbitcoin-explorer && \ ./install.sh && \ ldconfig && \ rm -rf /home/peerplays/src/* diff --git a/README.md b/README.md index 00b2fff3..cff50dc3 100644 --- a/README.md +++ b/README.md @@ -77,11 +77,8 @@ sudo ldconfig libbitcoin-explorer setup: ``` -git clone https://github.com/libbitcoin/libbitcoin-build.git -cd libbitcoin-build -git reset --hard 92c215fc1ffa272bab4d485d369d0306db52d69d -./generate3.sh -cd ../libbitcoin-explorer +git clone --branch version3.8.0 --depth 1 https://gitlab.com/PBSA/peerplays-1.0/libbitcoin-explorer.git +cd libbitcoin-explorer sudo ./install.sh sudo ldconfig ``` -- 2.45.2