From 7960de90e4f3237719b0b3b8cac2d685c81602c2 Mon Sep 17 00:00:00 2001 From: levonpetrosyan93 <45027856+levonpetrosyan93@users.noreply.github.com> Date: Wed, 21 Jul 2021 23:02:48 +0400 Subject: [PATCH] =?UTF-8?q?Fixing=20performance=20issue=20by=20removing=20?= =?UTF-8?q?uneeded=20GroupElement=20conversions=E2=80=A6=20(#1056)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixing performance issue by removing uneeded GroupElement conversions and hashing by std::hash() --- src/chainparams.cpp | 6 ++++++ src/consensus/params.h | 3 +++ src/lelantus.cpp | 4 +--- src/secp256k1/include/GroupElement.h | 4 +++- src/secp256k1/include/Scalar.h | 6 +++--- src/secp256k1/src/cpp/GroupElement.cpp | 6 ++++++ src/secp256k1/src/cpp/Scalar.cpp | 4 ++++ src/sigma.cpp | 11 +++-------- 8 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index c083f3accb..f439834457 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -397,6 +397,12 @@ class CMainParams : public CChainParams { consensus.lelantusBlacklist.insert(coin); } + for (const auto& str : sigma::sigma_blacklist) { + GroupElement coin; + coin.deserialize(ParseHex(str).data()); + consensus.sigmaBlacklist.insert(coin); + } + consensus.evoSporkKeyID = "a78fERshquPsTv2TuKMSsxTeKom56uBwLP"; consensus.nEvoSporkStartBlock = ZC_LELANTUS_STARTING_BLOCK; consensus.nEvoSporkStopBlock = ZC_LELANTUS_STARTING_BLOCK + 24*12*365; // one year after lelantus diff --git a/src/consensus/params.h b/src/consensus/params.h index 5c1a86f5db..a689b326fc 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -236,6 +236,9 @@ struct Params { // Lelantus Blacklist std::unordered_set lelantusBlacklist; + // Sigma Blacklist + std::unordered_set sigmaBlacklist; + // The block number introducing evo sporks int nEvoSporkStartBlock; diff --git a/src/lelantus.cpp b/src/lelantus.cpp index 36952321de..37c1eec7cc 100644 --- a/src/lelantus.cpp +++ b/src/lelantus.cpp @@ -17,7 +17,6 @@ #include "policy/policy.h" #include "coins.h" #include "batchproof_container.h" -#include "blacklists.h" #include #include @@ -440,8 +439,7 @@ bool CheckLelantusJoinSplitTransaction( BOOST_FOREACH( const sigma::PublicCoin &pubCoinValue, index->sigmaMintedPubCoins[denominationAndId]) { - std::vector vch = pubCoinValue.getValue().getvch(); - if (sigma::sigma_blacklist.count(HexStr(vch.begin(), vch.end())) > 0) { + if (::Params().GetConsensus().sigmaBlacklist.count(pubCoinValue.getValue()) > 0) { continue; } lelantus::PublicCoin publicCoin(pubCoinValue.getValue() + lelantusParams->get_h1() * intDenom); diff --git a/src/secp256k1/include/GroupElement.h b/src/secp256k1/include/GroupElement.h index 45d2209900..a3234d202b 100644 --- a/src/secp256k1/include/GroupElement.h +++ b/src/secp256k1/include/GroupElement.h @@ -103,6 +103,8 @@ class GroupElement final { std::size_t hash() const; + std::size_t get_hash() const; + GroupElement& set_base_g(); friend class MultiExponent; @@ -125,7 +127,7 @@ namespace std { { size_t operator()(const secp_primitives::GroupElement& g) const { - return g.hash(); + return g.get_hash(); } }; } // namespace std diff --git a/src/secp256k1/include/Scalar.h b/src/secp256k1/include/Scalar.h index 95d704c8c5..0a35bb9b77 100644 --- a/src/secp256k1/include/Scalar.h +++ b/src/secp256k1/include/Scalar.h @@ -69,6 +69,8 @@ class Scalar final { Scalar hash(const unsigned char* data,size_t len); + std::size_t get_hash() const; + bool isMember() const; bool isZero() const; @@ -131,9 +133,7 @@ using namespace secp_primitives; template<> struct hash { size_t operator()(const Scalar& s) const { - array d; - s.serialize(d.data()); - return hash()(string(d.begin(), d.end())); + return s.get_hash(); } }; diff --git a/src/secp256k1/src/cpp/GroupElement.cpp b/src/secp256k1/src/cpp/GroupElement.cpp index 312bc7c469..b9a2a4a389 100644 --- a/src/secp256k1/src/cpp/GroupElement.cpp +++ b/src/secp256k1/src/cpp/GroupElement.cpp @@ -555,6 +555,12 @@ std::size_t GroupElement::hash() const return std::hash()(std::string(coord.begin(), coord.end())); } +std::size_t GroupElement::get_hash() const { + secp256k1_fe x = reinterpret_cast(g_)->x; + secp256k1_fe_normalize(&x); + return x.n[0] ^ (x.n[1] << 16); +} + const void* GroupElement::get_value() const { return g_; } diff --git a/src/secp256k1/src/cpp/Scalar.cpp b/src/secp256k1/src/cpp/Scalar.cpp index 55eae220c2..05df5087f4 100644 --- a/src/secp256k1/src/cpp/Scalar.cpp +++ b/src/secp256k1/src/cpp/Scalar.cpp @@ -263,6 +263,10 @@ Scalar Scalar::hash(const unsigned char* data, size_t len) { return result_; } +std::size_t Scalar::get_hash() const { + auto scalar = reinterpret_cast(value_); + return scalar->d[0] ^ (scalar->d[1] << 8); +} std::string Scalar::tostring() const { unsigned char buffer[32]; diff --git a/src/sigma.cpp b/src/sigma.cpp index 274427cbdb..383f95a93e 100644 --- a/src/sigma.cpp +++ b/src/sigma.cpp @@ -14,8 +14,6 @@ #include "primitives/mint_spend.h" #include "batchproof_container.h" -#include "blacklists.h" - #include #include #include @@ -277,8 +275,7 @@ bool CheckSigmaSpendTransaction( BOOST_FOREACH(const sigma::PublicCoin& pubCoinValue, index->sigmaMintedPubCoins[denominationAndId]) { if (nHeight >= params.nStartSigmaBlacklist) { - std::vector vch = pubCoinValue.getValue().getvch(); - if(sigma_blacklist.count(HexStr(vch.begin(), vch.end())) > 0) { + if (::Params().GetConsensus().sigmaBlacklist.count(pubCoinValue.getValue()) > 0) { continue; } } @@ -1069,8 +1066,7 @@ int CSigmaState::GetCoinSetForSpend( BOOST_FOREACH(const sigma::PublicCoin& pubCoinValue, block->sigmaMintedPubCoins[denomAndId]) { if (chainActive.Height() >= ::Params().GetConsensus().nStartSigmaBlacklist) { - std::vector vch = pubCoinValue.getValue().getvch(); - if(sigma_blacklist.count(HexStr(vch.begin(), vch.end())) > 0) { + if (::Params().GetConsensus().sigmaBlacklist.count(pubCoinValue.getValue()) > 0) { continue; } } @@ -1112,8 +1108,7 @@ void CSigmaState::GetAnonymitySet( BOOST_FOREACH(const sigma::PublicCoin& pubCoinValue, block->sigmaMintedPubCoins[denomAndId]) { if (fStartSigmaBlacklist && chainActive.Height() >= params.nStartSigmaBlacklist) { - std::vector vch = pubCoinValue.getValue().getvch(); - if(sigma_blacklist.count(HexStr(vch.begin(), vch.end())) > 0) { + if (::Params().GetConsensus().sigmaBlacklist.count(pubCoinValue.getValue()) > 0) { continue; } }