From ab2b561ba16ad08621b7196f619644adb4f2a5c9 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Mon, 30 Aug 2021 21:21:35 +0530 Subject: [PATCH 01/17] fluid: more parameters away from standalone function --- src/base58.h | 1 + src/chainparams.cpp | 31 +++++++++++++++++ src/chainparams.h | 2 ++ src/fluid/fluid.cpp | 67 ++---------------------------------- src/fluid/fluid.h | 16 ++------- src/fluid/fluidsovereign.cpp | 8 ++--- 6 files changed, 43 insertions(+), 82 deletions(-) diff --git a/src/base58.h b/src/base58.h index b249f3892..a43875228 100644 --- a/src/base58.h +++ b/src/base58.h @@ -125,6 +125,7 @@ class CDynamicAddress : public CBase58Data bool IsValidStealthAddress(const CChainParams& params) const; CDynamicAddress() {} + CDynamicAddress(const CPubKey& pk) { Set(pk.GetID()); } // Dynamic: Add the ability to directly import from pubkey CDynamicAddress(const CTxDestination& dest) { Set(dest); } CDynamicAddress(const std::string& strAddress) { SetString(strAddress); } CDynamicAddress(const char* pszAddress) { SetString(pszAddress); } diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 317ceb720..0f474b089 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -236,6 +236,13 @@ class CMainParams : public CChainParams vSporkAddresses = {"DDDax6fjzoCqHj9nwTgNdAQsucFBJUJ3Jk"}; nMinSporkKeys = 1; + fluidSignatureKeys = { + "032f31a815c3bbb8c2386d6006542bb1367073013639161d5e406034203ab9178b", + "03d7f7b945571672b6d6cd06d0abde805a1578872e436cbd4d4624c74cc7c86aef", + "02dab261cd65669d09e83db22d16308f17e99c1c3fe25af2b5b6a105332ce60bbb", + "02e267ae5cc5f7ea05769dacc5c7d0fc61d7a4c0b9bb8a213e77663d8ce002da5e" + }; + checkpointData = (CCheckpointData){ boost::assign::map_list_of (0, uint256S("0x00000e140b0c3028f898431890e9dea79ae6ca537ac9362c65b45325db712de2")) @@ -392,6 +399,14 @@ class CTestNetParams : public CChainParams vSporkAddresses = {"DLWYuC7SNhnqZeY87UMqJzVdMVyLzwebhE"}; // QVdXi1qyxxQwTuZ8h3Dh3YRdpMDBWv6oMs9dTmvJmGzQcnsKtdGm nMinSporkKeys = 1; + fluidSignatureKeys = { + "0246227f26c5a71881ba3312fd443db06b39bdb5f8b6d66cd82e3268f127ebe642", + "0330876a6d45b4b988bc13863ee99d6b8e96022a75979010b46f22ea1cc5551350", + "0359cedc78b59a750641d51c70a30b760b5a0da37ff84a850e7925138c191ab261", + "020506608829abecdb3a61b9ff64a65ea400f882f39dfb2dbb95a71d3b5e3c3434", + "03714874801166849c6dce7bf23b46dc36e05a3cfd06dd5edf038151ffd6c725c0" + }; + checkpointData = (CCheckpointData){ boost::assign::map_list_of (0, uint256S("0x00ff3a06390940bc3fffb7948cc6d0ede8fde544a5fa9eeeafbc4ac65d21f087")) @@ -508,6 +523,14 @@ class CRegTestParams : public CChainParams vSporkAddresses = {"ygUqnUfyRnRfBUks3EBc937tgmYBwQYE2S"}; //private key: cT21Wm3oozS7HpP9K9g1SDxdgr2vw9TBPSTxjxeArLjYxGastsf9 nMinSporkKeys = 1; + fluidSignatureKeys = { + "0246227f26c5a71881ba3312fd443db06b39bdb5f8b6d66cd82e3268f127ebe642", + "0330876a6d45b4b988bc13863ee99d6b8e96022a75979010b46f22ea1cc5551350", + "0359cedc78b59a750641d51c70a30b760b5a0da37ff84a850e7925138c191ab261", + "020506608829abecdb3a61b9ff64a65ea400f882f39dfb2dbb95a71d3b5e3c3434", + "03714874801166849c6dce7bf23b46dc36e05a3cfd06dd5edf038151ffd6c725c0" + }; + checkpointData = (CCheckpointData){ boost::assign::map_list_of(0, uint256S("0x000ab751d858e116043e741d097311f2382e600c219483cfda8f25c7f369cc2c"))}; @@ -656,6 +679,14 @@ class CPrivateNetParams : public CChainParams vSporkAddresses = {"D777Y4eMXrf1NgDSY1Q7kjoZuVso1ed7HL"}; nMinSporkKeys = 1; + fluidSignatureKeys = { + "02f5e52b333f5a4b312785d63fabb86540649cdfa8d3e462e43eb1a77a58416129", + "02a20a6ab3830d007b9658be2dbf2117c8967c5cb98774e0f514f5ae21fe26c037", + "02edd019d81bc33c868540624561ced215d2b31681947cc1ea7c8ae0f882659d26", + "028386691a85811d91f314d01d17cea0d8afda1b82c7b5068310c720d87f6b6628", + "0327490dff2869b81f46cf7801b582b5ade6d2546b6d5a8818135f4b4f24eff245" + }; + checkpointData = (CCheckpointData){ boost::assign::map_list_of(0, uint256S("0x00ff3a06390940bc3fffb7948cc6d0ede8fde544a5fa9eeeafbc4ac65d21f087"))}; diff --git a/src/chainparams.h b/src/chainparams.h index ff9f03bc5..adacd6daa 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -96,6 +96,7 @@ class CChainParams const std::vector& SporkAddresses() const { return vSporkAddresses; } int MinSporkKeys() const { return nMinSporkKeys; } uint64_t DifficultySwitchBlock() const { return nSwitchDifficultyBlock; } + std::set FluidSignatureKeys() const { std::set pkVch; for (auto& pk : fluidSignatureKeys) { pkVch.insert(CPubKey(ParseHex(pk))); } return pkVch; } protected: CChainParams() {} @@ -130,6 +131,7 @@ class CChainParams int64_t nTargetPosSpacing; int nFutureTimeDriftPoS; uint64_t nSwitchDifficultyBlock; + std::vector fluidSignatureKeys; }; /** diff --git a/src/fluid/fluid.cpp b/src/fluid/fluid.cpp index f23b193e7..6974894fc 100644 --- a/src/fluid/fluid.cpp +++ b/src/fluid/fluid.cpp @@ -58,65 +58,6 @@ int GetFluidOpCode(const CScript& fluidScript) return 0; } -/** Initialise sovereign identities that are able to run fluid commands */ -std::vector > CFluidParameters::InitialiseSovereignIdentities() -{ - std::vector > x; - if (Params().NetworkIDString() == CBaseChainParams::MAIN) { - x.push_back(std::make_pair("CEO", CDynamicAddress("D9avNWVBmaUNevMNnkcLMrQpze8M2mKURu"))); - x.push_back(std::make_pair("CTO", CDynamicAddress("DRoyjRoxP4qfeAiiZHX1dmSkbUJiBSXBt7"))); - x.push_back(std::make_pair("CFO", CDynamicAddress("DHkD6oBQ5PtCiKo4wX8CRWrG61Vy5hEu4t"))); - x.push_back(std::make_pair("COO", CDynamicAddress("DKyqamefa7YdbqrP5pdTfNVVuq1gerNhMH"))); - x.push_back(std::make_pair("CDOO", CDynamicAddress("DUDE1zFKK4fezCgcxdGbFh4yHJMcg8qpoP"))); - } else if (Params().NetworkIDString() == CBaseChainParams::TESTNET) { - x.push_back(std::make_pair("Test01", CDynamicAddress("DSCex4e189aULrig3nLd42gVf7AbjTwnP5"))); //importprivkey QVKXuZ2hSo2cT9BhkN3CApLuZYVsuzNvidJRt1ucyniHheZ2Pfq5 - x.push_back(std::make_pair("Test02", CDynamicAddress("DMAh37n3RUdDxox3uiWAnc1zEPp5yFbHiL"))); //importprivkey QU4VGDcVoej7nDZiyaSgoL7foG8xKiaVyk5odHnJdtyv4tYkmBw1 - x.push_back(std::make_pair("Test03", CDynamicAddress("DN4KvqtXyygooPV3oha72TyBB5nqBbkxwj"))); //importprivkey QWjTe6sCFVtKBsXfrYDyrHzn7eBeJktsQnWzfiANkMd9PhVM4Qnp - x.push_back(std::make_pair("Test04", CDynamicAddress("DHVmS621KBBZJTJSxGDdLxoU7LCmpexWDa"))); //importprivkey QScWuazWgWDTj8cXXz1YFKJW7mNJHJgMFY2FB6hkNyh3SJDUhPZt - x.push_back(std::make_pair("Test05", CDynamicAddress("DCZXDSRB3cJdCCUSerE4pvSfGQoXUivUxo"))); //importprivkey QUt4pEDanRPzos3meoiNGUG9g7RctCtiwLoPjhDKfNPK99oLuzcU - } else if (Params().NetworkIDString() == CBaseChainParams::REGTEST) { - x.push_back(std::make_pair("RegTest01", CDynamicAddress("DSCex4e189aULrig3nLd42gVf7AbjTwnP5"))); //importprivkey QVKXuZ2hSo2cT9BhkN3CApLuZYVsuzNvidJRt1ucyniHheZ2Pfq5 - x.push_back(std::make_pair("RegTest02", CDynamicAddress("DMAh37n3RUdDxox3uiWAnc1zEPp5yFbHiL"))); //importprivkey QU4VGDcVoej7nDZiyaSgoL7foG8xKiaVyk5odHnJdtyv4tYkmBw1 - x.push_back(std::make_pair("RegTest03", CDynamicAddress("DN4KvqtXyygooPV3oha72TyBB5nqBbkxwj"))); //importprivkey QWjTe6sCFVtKBsXfrYDyrHzn7eBeJktsQnWzfiANkMd9PhVM4Qnp - x.push_back(std::make_pair("RegTest04", CDynamicAddress("DHVmS621KBBZJTJSxGDdLxoU7LCmpexWDa"))); //importprivkey QScWuazWgWDTj8cXXz1YFKJW7mNJHJgMFY2FB6hkNyh3SJDUhPZt - x.push_back(std::make_pair("RegTest05", CDynamicAddress("DCZXDSRB3cJdCCUSerE4pvSfGQoXUivUxo"))); //importprivkey QUt4pEDanRPzos3meoiNGUG9g7RctCtiwLoPjhDKfNPK99oLuzcU - } - else if (Params().NetworkIDString() == CBaseChainParams::PRIVATENET) { - x.push_back(std::make_pair("Priv01", CDynamicAddress("D6wUMdGtoXtj4zjyk4kYu6cL8LM5j6bEd7"))); //importprivkey QUQsWaE1LRdW95gLgyQgjkUjR4eqhbigmDHENzyTVYy7JCgQcYMd - x.push_back(std::make_pair("Priv02", CDynamicAddress("DKLWazjY91KKWekxPxwjznx56tX1KYtTiy"))); //importprivkey QWR6WRSKZZrpDBM3q2jqyhB5xmE5YDdc72trHzznTLwBEJBbeWKm - x.push_back(std::make_pair("Priv03", CDynamicAddress("DNsEXkNEdzvNbR3zjaDa3TEVPtwR6Efbmd"))); //importprivkey QPWaY6RAm44zFQ9gktpHFwaCLQc1nCGwPaVAnXAZsFMyGXzLce35 - x.push_back(std::make_pair("Priv04", CDynamicAddress("DG2NCt5Z35cLRYnNCDXdVJTbPh3NSScAmF"))); //importprivkey QRF11rngYqeVv4mSE4SCGU8P3MQgZwJaRQQJsknjVa5QqhkFCGW4 - x.push_back(std::make_pair("Priv05", CDynamicAddress("DRqqngX1mPUjKFXPQDdHRmy2jBk9DKUjkx"))); //importprivkey QQja2KMbhyaat4HJLUiEr2PVmb33CtuVN7KgbmTq9ivVwnaZvFUE - } - return x; -} - -std::vector InitialiseAddresses() -{ - CFluidParameters params; - return params.InitialiseAddresses(); -} - -std::vector CFluidParameters::InitialiseAddresses() -{ - std::vector initialSovereignAddresses; - std::vector > fluidIdentities = InitialiseSovereignIdentities(); - for (const std::pair& sovereignId : fluidIdentities) { - initialSovereignAddresses.push_back(sovereignId.second.ToString()); - } - return initialSovereignAddresses; -} - -std::vector > CFluidParameters::InitialiseAddressCharVector() -{ - std::vector > initialSovereignAddresses; - std::vector > fluidIdentities = InitialiseSovereignIdentities(); - for (const std::pair& sovereignId : fluidIdentities) { - initialSovereignAddresses.push_back(CharVectorFromString(sovereignId.second.ToString())); - } - return initialSovereignAddresses; -} - /** Checks fluid transactoin operation script amount for invalid values. */ bool CFluid::CheckFluidOperationScript(const CScript& fluidScriptPubKey, const int64_t& timeStamp, std::string& errorMessage, const bool fSkipTimeStampCheck) { @@ -255,11 +196,9 @@ bool CFluid::CheckIfQuorumExists(const std::string& consentToken, std::string& m GetLastBlockIndex(chainActive.Tip()); CBlockIndex* pindex = chainActive.Tip(); - if (pindex != NULL) { - //TODO fluid - fluidSovereigns = InitialiseAddresses(); - } else - fluidSovereigns = InitialiseAddresses(); + for (const auto& pk : Params().FluidSignatureKeys()) { + fluidSovereigns.push_back(CDynamicAddress(pk).ToString()); + } for (const std::string& address : fluidSovereigns) { CDynamicAddress attemptKey, xAddress(address); diff --git a/src/fluid/fluid.h b/src/fluid/fluid.h index 1d7d9b9a3..a17e64395 100644 --- a/src/fluid/fluid.h +++ b/src/fluid/fluid.h @@ -24,8 +24,8 @@ class CTxMemPool; struct CBlockTemplate; class CTransaction; -/** Configuration Framework */ -class CFluidParameters +/** Fluid Asset Management Framework */ +class CFluid : public COperations { public: static const int FLUID_ACTIVATE_HEIGHT = 10; @@ -35,18 +35,6 @@ class CFluidParameters static const CAmount FLUID_MAX_REWARD_FOR_MINING = 1000 * COIN; // Max mining block reward using fluid OP_REWARD_MINING static const CAmount FLUID_MAX_FOR_MINT = 1000000000 * COIN; // Max minting amount per fluid transaction - std::vector > InitialiseSovereignIdentities(); - - std::vector InitialiseAddresses(); - std::vector > InitialiseAddressCharVector(); -}; - -std::vector InitialiseAddresses(); - -/** Fluid Asset Management Framework */ -class CFluid : public CFluidParameters, public COperations -{ -public: void ReplaceFluidSovereigns(const CBlockHeader& blockHeader, std::vector& fluidSovereigns); bool CheckFluidOperationScript(const CScript& fluidScriptPubKey, const int64_t& timeStamp, std::string& errorMessage, const bool fSkipTimeStampCheck = false); diff --git a/src/fluid/fluidsovereign.cpp b/src/fluid/fluidsovereign.cpp index 16158d309..a9957de4f 100644 --- a/src/fluid/fluidsovereign.cpp +++ b/src/fluid/fluidsovereign.cpp @@ -102,11 +102,11 @@ void CFluidSovereignDB::InitEmpty() { if (IsEmpty()) { LOCK(cs_fluid_sovereign); - CFluidParameters initSovereign; - std::vector > vchAddresses = initSovereign.InitialiseAddressCharVector(); CFluidSovereign fluidSovereign; - for (const std::vector& sovereignId : vchAddresses) { - fluidSovereign.SovereignAddresses.push_back(sovereignId); + for (const auto& pk : Params().FluidSignatureKeys()) { + fluidSovereign.SovereignAddresses.push_back( + CharVectorFromString(CDynamicAddress(pk).ToString()) + ); } fluidSovereign.FluidScript = CharVectorFromString("init sovereign"); fluidSovereign.nTimeStamp = 1; From 8708bd84ba87b7b1041d0c2bea0e9ceb55d8a9cb Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Wed, 18 Aug 2021 21:02:30 +0530 Subject: [PATCH 02/17] fluid: remove extraneous hex conversion logic --- src/fluid/fluid.cpp | 14 +++++++------- src/fluid/fluid.h | 1 + src/fluid/fluiddynode.cpp | 2 +- src/fluid/fluidmining.cpp | 2 +- src/fluid/fluidmint.cpp | 2 +- src/fluid/fluidsovereign.cpp | 2 +- src/fluid/operations.h | 18 ------------------ src/rpc/fluid.cpp | 4 ++-- 8 files changed, 14 insertions(+), 31 deletions(-) diff --git a/src/fluid/fluid.cpp b/src/fluid/fluid.cpp index 6974894fc..14e34f8fa 100644 --- a/src/fluid/fluid.cpp +++ b/src/fluid/fluid.cpp @@ -71,7 +71,7 @@ bool CFluid::CheckFluidOperationScript(const CScript& fluidScriptPubKey, const i } } if (IsHex(verificationWithoutOpCode)) { - std::string strUnHexedFluidOpScript = HexToString(verificationWithoutOpCode); + std::string strUnHexedFluidOpScript = stringFromVch(ParseHex(verificationWithoutOpCode)); std::vector vecSplitScript; SeparateString(strUnHexedFluidOpScript, vecSplitScript, "$"); if (strOperationCode == "OP_MINT" || strOperationCode == "OP_REWARD_MINING" || strOperationCode == "OP_REWARD_DYNODE") { @@ -160,7 +160,7 @@ bool CFluid::CheckAccountBanScript(const CScript& fluidScript, const uint256& tx strErrorMessage = "Fluid token is not a valid hexidecimal value."; return false; } - std::string strUnHexedFluidOpScript = HexToString(verificationWithoutOpCode); + std::string strUnHexedFluidOpScript = stringFromVch(ParseHex(verificationWithoutOpCode)); std::vector vecSplitScript; SeparateString(strUnHexedFluidOpScript, vecSplitScript, "$"); if (vecSplitScript.size() == 0) { @@ -257,7 +257,7 @@ bool CFluid::GenericConsentMessage(const std::string& message, std::string& sign return false; std::string strConvertedMessage = message; - ConvertToString(strConvertedMessage); + strConvertedMessage = stringFromVch(ParseHex(strConvertedMessage)); signedString = StitchString(strConvertedMessage, digest, false); ConvertToHex(signedString); @@ -269,7 +269,7 @@ bool CFluid::GenericConsentMessage(const std::string& message, std::string& sign bool CFluid::ExtractCheckTimestamp(const std::string& strOpCode, const std::string& consentToken, const int64_t& timeStamp) { std::string consentTokenNoScript = GetRidOfScriptStatement(consentToken); - std::string dehexString = HexToString(consentTokenNoScript); + std::string dehexString = stringFromVch(ParseHex(consentTokenNoScript)); std::vector strs, ptrs; SeparateString(dehexString, strs, false); if (strs.size() == 0) @@ -306,7 +306,7 @@ bool CFluid::ProcessFluidToken(const std::string& consentToken, std::vector strs; SeparateString(dehexString, strs, false); @@ -373,7 +373,7 @@ bool CFluid::GenericVerifyInstruction(const std::string& consentToken, CDynamicA messageTokenKey = ""; std::vector strs; - ConvertToString(consentTokenNoScript); + consentTokenNoScript = stringFromVch(ParseHex(consentTokenNoScript)); SeparateString(consentTokenNoScript, strs, false); messageTokenKey = strs.at(0); @@ -598,7 +598,7 @@ bool CFluid::ExtractTimestampWithAddresses(const std::string& strOpCode, const C { std::string fluidOperationString = ScriptToAsmStr(fluidScript); std::string consentTokenNoScript = GetRidOfScriptStatement(fluidOperationString); - std::string strDehexedToken = HexToString(consentTokenNoScript); + std::string strDehexedToken = stringFromVch(ParseHex(consentTokenNoScript)); std::vector strs, ptrs; SeparateString(strDehexedToken, strs, false); if (strs.size() == 0) diff --git a/src/fluid/fluid.h b/src/fluid/fluid.h index a17e64395..6e478f7d0 100644 --- a/src/fluid/fluid.h +++ b/src/fluid/fluid.h @@ -10,6 +10,7 @@ #include "operations.h" #include "script/script.h" #include "utilstrencodings.h" +#include "bdap/utils.h" #include #include diff --git a/src/fluid/fluiddynode.cpp b/src/fluid/fluiddynode.cpp index 1526cf5f3..84fba73f2 100644 --- a/src/fluid/fluiddynode.cpp +++ b/src/fluid/fluiddynode.cpp @@ -19,7 +19,7 @@ bool GetFluidDynodeData(const CScript& scriptPubKey, CFluidDynode& entry) std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); std::vector splitString; HexFunctions hexConvert; - hexConvert.ConvertToString(verificationWithoutOpCode); + verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); SeparateString(verificationWithoutOpCode, splitString, false); std::string messageTokenKey = splitString.at(0); std::vector vecSplitScript; diff --git a/src/fluid/fluidmining.cpp b/src/fluid/fluidmining.cpp index d455a9ca3..5301b0410 100644 --- a/src/fluid/fluidmining.cpp +++ b/src/fluid/fluidmining.cpp @@ -19,7 +19,7 @@ bool GetFluidMiningData(const CScript& scriptPubKey, CFluidMining& entry) std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); std::vector splitString; HexFunctions hexConvert; - hexConvert.ConvertToString(verificationWithoutOpCode); + verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); SeparateString(verificationWithoutOpCode, splitString, false); std::string messageTokenKey = splitString.at(0); std::vector vecSplitScript; diff --git a/src/fluid/fluidmint.cpp b/src/fluid/fluidmint.cpp index 4b08c65a4..5a775cdbd 100644 --- a/src/fluid/fluidmint.cpp +++ b/src/fluid/fluidmint.cpp @@ -20,7 +20,7 @@ bool GetFluidMintData(const CScript& scriptPubKey, CFluidMint& entry) std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); std::vector splitString; HexFunctions hexConvert; - hexConvert.ConvertToString(verificationWithoutOpCode); + verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); SeparateString(verificationWithoutOpCode, splitString, false); std::string messageTokenKey = splitString.at(0); std::vector vecSplitScript; diff --git a/src/fluid/fluidsovereign.cpp b/src/fluid/fluidsovereign.cpp index a9957de4f..b41b7ae96 100644 --- a/src/fluid/fluidsovereign.cpp +++ b/src/fluid/fluidsovereign.cpp @@ -19,7 +19,7 @@ bool GetFluidSovereignData(const CScript& scriptPubKey, CFluidSovereign& entry) std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); std::vector splitString; HexFunctions hexConvert; - hexConvert.ConvertToString(verificationWithoutOpCode); + verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); SeparateString(verificationWithoutOpCode, splitString, false); std::string messageTokenKey = splitString.at(0); std::vector vecSplitScript; diff --git a/src/fluid/operations.h b/src/fluid/operations.h index 4f654593d..3bf699064 100644 --- a/src/fluid/operations.h +++ b/src/fluid/operations.h @@ -30,29 +30,11 @@ class HexFunctions return output; } - std::string HexToString(const std::string& hex) - { - int len = hex.length(); - std::string newString; - for (int i = 0; i < len; i += 2) { - std::string byte = hex.substr(i, 2); - char chr = (char)(int)strtol(byte.c_str(), nullptr, 16); - newString.push_back(chr); - } - - return newString; - } - void ConvertToHex(std::string& input) { std::string output = StringToHex(input); input = output; } - void ConvertToString(std::string& input) - { - std::string output = HexToString(input); - input = output; - } }; void ScrubString(std::string& input, bool forInteger = false); diff --git a/src/rpc/fluid.cpp b/src/rpc/fluid.cpp index 7fe3d5f02..bcfe8e5da 100644 --- a/src/rpc/fluid.cpp +++ b/src/rpc/fluid.cpp @@ -278,7 +278,7 @@ UniValue signtoken(const JSONRPCRequest& request) if (!IsHex(r)) throw std::runtime_error("Hex isn't even valid! Cannot process ahead..."); - fluid.ConvertToString(r); + r = stringFromVch(ParseHex(r)); if (!fluid.GenericSignMessage(r, result, address)) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Message signing failed"); @@ -693,7 +693,7 @@ UniValue readfluidtoken(const JSONRPCRequest& request) if (IsHex(strFluidToken)) { bool fBanAccount = false; HexFunctions fluidFunctions; - std::string strUnHexedFluidOpScript = fluidFunctions.HexToString(strFluidToken); + std::string strUnHexedFluidOpScript = stringFromVch(ParseHex(strFluidToken)); std::vector vecSplitScript; SeparateString(strUnHexedFluidOpScript, vecSplitScript, true); if (vecSplitScript.size() > 1) { From b1f62a75229d82a4f07fccb2dfb7036be9a9186c Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Wed, 18 Aug 2021 22:03:05 +0530 Subject: [PATCH 03/17] fluid: remove hex conversion logic leftovers, drop HexFunctions --- src/fluid/fluid.cpp | 2 +- src/fluid/fluiddynode.cpp | 1 - src/fluid/fluidmining.cpp | 1 - src/fluid/fluidmint.cpp | 1 - src/fluid/fluidsovereign.cpp | 1 - src/fluid/operations.cpp | 2 +- src/fluid/operations.h | 27 +-------------------------- src/rpc/fluid.cpp | 7 +++---- 8 files changed, 6 insertions(+), 36 deletions(-) diff --git a/src/fluid/fluid.cpp b/src/fluid/fluid.cpp index 14e34f8fa..afdb8add3 100644 --- a/src/fluid/fluid.cpp +++ b/src/fluid/fluid.cpp @@ -260,7 +260,7 @@ bool CFluid::GenericConsentMessage(const std::string& message, std::string& sign strConvertedMessage = stringFromVch(ParseHex(strConvertedMessage)); signedString = StitchString(strConvertedMessage, digest, false); - ConvertToHex(signedString); + signedString = HexStr(signedString); return true; } diff --git a/src/fluid/fluiddynode.cpp b/src/fluid/fluiddynode.cpp index 84fba73f2..2b9be336a 100644 --- a/src/fluid/fluiddynode.cpp +++ b/src/fluid/fluiddynode.cpp @@ -18,7 +18,6 @@ bool GetFluidDynodeData(const CScript& scriptPubKey, CFluidDynode& entry) std::string strOperationCode = GetRidOfScriptStatement(fluidOperationString, 0); std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); std::vector splitString; - HexFunctions hexConvert; verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); SeparateString(verificationWithoutOpCode, splitString, false); std::string messageTokenKey = splitString.at(0); diff --git a/src/fluid/fluidmining.cpp b/src/fluid/fluidmining.cpp index 5301b0410..bc551474a 100644 --- a/src/fluid/fluidmining.cpp +++ b/src/fluid/fluidmining.cpp @@ -18,7 +18,6 @@ bool GetFluidMiningData(const CScript& scriptPubKey, CFluidMining& entry) std::string strOperationCode = GetRidOfScriptStatement(fluidOperationString, 0); std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); std::vector splitString; - HexFunctions hexConvert; verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); SeparateString(verificationWithoutOpCode, splitString, false); std::string messageTokenKey = splitString.at(0); diff --git a/src/fluid/fluidmint.cpp b/src/fluid/fluidmint.cpp index 5a775cdbd..38ac7989d 100644 --- a/src/fluid/fluidmint.cpp +++ b/src/fluid/fluidmint.cpp @@ -19,7 +19,6 @@ bool GetFluidMintData(const CScript& scriptPubKey, CFluidMint& entry) std::string strOperationCode = GetRidOfScriptStatement(fluidOperationString, 0); std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); std::vector splitString; - HexFunctions hexConvert; verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); SeparateString(verificationWithoutOpCode, splitString, false); std::string messageTokenKey = splitString.at(0); diff --git a/src/fluid/fluidsovereign.cpp b/src/fluid/fluidsovereign.cpp index b41b7ae96..18b94df21 100644 --- a/src/fluid/fluidsovereign.cpp +++ b/src/fluid/fluidsovereign.cpp @@ -18,7 +18,6 @@ bool GetFluidSovereignData(const CScript& scriptPubKey, CFluidSovereign& entry) std::string strOperationCode = GetRidOfScriptStatement(fluidOperationString, 0); std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); std::vector splitString; - HexFunctions hexConvert; verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); SeparateString(verificationWithoutOpCode, splitString, false); std::string messageTokenKey = splitString.at(0); diff --git a/src/fluid/operations.cpp b/src/fluid/operations.cpp index c51be72af..2849cbf3e 100644 --- a/src/fluid/operations.cpp +++ b/src/fluid/operations.cpp @@ -147,7 +147,7 @@ bool COperations::GenericSignMessage(const std::string& message, std::string& si if (!SignTokenMessage(signer, message, signedString, true)) return false; else - ConvertToHex(signedString); + signedString = HexStr(signedString); return true; } diff --git a/src/fluid/operations.h b/src/fluid/operations.h index 3bf699064..f19ce6a1f 100644 --- a/src/fluid/operations.h +++ b/src/fluid/operations.h @@ -12,31 +12,6 @@ #include #include -class HexFunctions -{ -public: - std::string StringToHex(const std::string& input) - { - static const char* const lut = "0123456789ABCDEF"; - size_t len = input.length(); - std::string output; - output.reserve(2 * len); - for (size_t i = 0; i < len; ++i) { - const unsigned char c = input[i]; - output.push_back(lut[c >> 4]); - output.push_back(lut[c & 15]); - } - - return output; - } - - void ConvertToHex(std::string& input) - { - std::string output = StringToHex(input); - input = output; - } -}; - void ScrubString(std::string& input, bool forInteger = false); void SeparateString(const std::string& input, std::vector& output, bool subDelimiter = false); void SeparateFluidOpString(const std::string& input, std::vector& output); @@ -48,7 +23,7 @@ extern std::string PrimaryDelimiter; extern std::string SubDelimiter; extern std::string SignatureDelimiter; -class COperations : public HexFunctions +class COperations { public: bool VerifyAddressOwnership(const CDynamicAddress& dynamicAddress); diff --git a/src/rpc/fluid.cpp b/src/rpc/fluid.cpp index bcfe8e5da..4118580f0 100644 --- a/src/rpc/fluid.cpp +++ b/src/rpc/fluid.cpp @@ -99,7 +99,7 @@ UniValue maketoken(const JSONRPCRequest& request) } result.pop_back(); - fluid.ConvertToHex(result); + result = HexStr(result); return result; } @@ -140,7 +140,7 @@ UniValue banaccountstoken(const JSONRPCRequest& request) } strResult.pop_back(); - fluid.ConvertToHex(strResult); + strResult = HexStr(strResult); return strResult; } @@ -196,7 +196,7 @@ UniValue burndynamic(const JSONRPCRequest& request) } std::string result = std::to_string(nAmount); - fluid.ConvertToHex(result); + result = HexStr(result); CScript destroyScript = CScript() << OP_RETURN << ParseHex(result); SendBurnTransaction(destroyScript, wtx, nAmount, scriptSendFrom); @@ -692,7 +692,6 @@ UniValue readfluidtoken(const JSONRPCRequest& request) std::string strFluidToken = request.params[0].get_str(); if (IsHex(strFluidToken)) { bool fBanAccount = false; - HexFunctions fluidFunctions; std::string strUnHexedFluidOpScript = stringFromVch(ParseHex(strFluidToken)); std::vector vecSplitScript; SeparateString(strUnHexedFluidOpScript, vecSplitScript, true); From e154a8f51977c812d49129365e16c8b1a75c77d5 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Wed, 18 Aug 2021 22:22:59 +0530 Subject: [PATCH 04/17] fluid: drop unnecessary COperations class, expose functions globally --- src/fluid/fluid.h | 2 +- src/fluid/operations.cpp | 6 +++--- src/fluid/operations.h | 10 +++------- src/rpc/fluid.cpp | 8 ++++---- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/fluid/fluid.h b/src/fluid/fluid.h index 6e478f7d0..b5048bb39 100644 --- a/src/fluid/fluid.h +++ b/src/fluid/fluid.h @@ -26,7 +26,7 @@ struct CBlockTemplate; class CTransaction; /** Fluid Asset Management Framework */ -class CFluid : public COperations +class CFluid { public: static const int FLUID_ACTIVATE_HEIGHT = 10; diff --git a/src/fluid/operations.cpp b/src/fluid/operations.cpp index 2849cbf3e..c667d98d3 100644 --- a/src/fluid/operations.cpp +++ b/src/fluid/operations.cpp @@ -90,7 +90,7 @@ std::string GetRidOfScriptStatement(const std::string& input, const int& positio // ///////////////////////////////////////////////////////////// -bool COperations::VerifyAddressOwnership(const CDynamicAddress& dynamicAddress) +bool VerifyAddressOwnership(const CDynamicAddress& dynamicAddress) { #ifdef ENABLE_WALLET LOCK2(cs_main, pwalletMain ? &pwalletMain->cs_wallet : NULL); @@ -111,7 +111,7 @@ bool COperations::VerifyAddressOwnership(const CDynamicAddress& dynamicAddress) #endif //ENABLE_WALLET } -bool COperations::SignTokenMessage(const CDynamicAddress& address, std::string unsignedMessage, std::string& stitchedMessage, bool stitch) +bool SignTokenMessage(const CDynamicAddress& address, std::string unsignedMessage, std::string& stitchedMessage, bool stitch) { #ifdef ENABLE_WALLET CHashWriter ss(SER_GETHASH, 0); @@ -142,7 +142,7 @@ bool COperations::SignTokenMessage(const CDynamicAddress& address, std::string u #endif //ENABLE_WALLET } -bool COperations::GenericSignMessage(const std::string& message, std::string& signedString, const CDynamicAddress& signer) +bool GenericSignMessage(const std::string& message, std::string& signedString, const CDynamicAddress& signer) { if (!SignTokenMessage(signer, message, signedString, true)) return false; diff --git a/src/fluid/operations.h b/src/fluid/operations.h index f19ce6a1f..e09bc66e5 100644 --- a/src/fluid/operations.h +++ b/src/fluid/operations.h @@ -23,12 +23,8 @@ extern std::string PrimaryDelimiter; extern std::string SubDelimiter; extern std::string SignatureDelimiter; -class COperations -{ -public: - bool VerifyAddressOwnership(const CDynamicAddress& dynamicAddress); - bool SignTokenMessage(const CDynamicAddress& address, std::string unsignedMessage, std::string& stitchedMessage, bool stitch = true); - bool GenericSignMessage(const std::string& message, std::string& signedString, const CDynamicAddress& signer); -}; +bool VerifyAddressOwnership(const CDynamicAddress& dynamicAddress); +bool SignTokenMessage(const CDynamicAddress& address, std::string unsignedMessage, std::string& stitchedMessage, bool stitch = true); +bool GenericSignMessage(const std::string& message, std::string& signedString, const CDynamicAddress& signer); #endif // OPERATIONS_H diff --git a/src/rpc/fluid.cpp b/src/rpc/fluid.cpp index 4118580f0..117d1e836 100644 --- a/src/rpc/fluid.cpp +++ b/src/rpc/fluid.cpp @@ -267,10 +267,10 @@ UniValue signtoken(const JSONRPCRequest& request) if (!address.IsValid()) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Dynamic address"); - if (!fluid.VerifyAddressOwnership(address)) + if (!VerifyAddressOwnership(address)) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Address is not fluid protocol sovereign address"); - if (!fluid.VerifyAddressOwnership(address)) + if (!VerifyAddressOwnership(address)) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Address is not possessed by wallet!"); std::string r = request.params[1].get_str(); @@ -280,7 +280,7 @@ UniValue signtoken(const JSONRPCRequest& request) r = stringFromVch(ParseHex(r)); - if (!fluid.GenericSignMessage(r, result, address)) + if (!GenericSignMessage(r, result, address)) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Message signing failed"); return result; @@ -311,7 +311,7 @@ UniValue consenttoken(const JSONRPCRequest& request) if (!IsSovereignAddress(address)) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Address is not fluid protocol sovereign address"); - if (!fluid.VerifyAddressOwnership(address)) + if (!VerifyAddressOwnership(address)) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Address is not possessed by wallet!"); std::string message; From 36445cda51cf5d72f8232f4f5135b8a0a37b8d17 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Wed, 18 Aug 2021 22:12:55 +0530 Subject: [PATCH 05/17] fluid: move static constants to header --- src/fluid/operations.cpp | 4 ---- src/fluid/operations.h | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/fluid/operations.cpp b/src/fluid/operations.cpp index c667d98d3..62269907f 100644 --- a/src/fluid/operations.cpp +++ b/src/fluid/operations.cpp @@ -20,10 +20,6 @@ extern CWallet* pwalletMain; // ///////////////////////////////////////////////////////////// -std::string SignatureDelimiter = " "; -std::string PrimaryDelimiter = "@"; -std::string SubDelimiter = "$"; - void ScrubString(std::string& input, bool forInteger) { input.erase(std::remove(input.begin(), input.end(), '@'), input.end()); diff --git a/src/fluid/operations.h b/src/fluid/operations.h index e09bc66e5..5645ec1e1 100644 --- a/src/fluid/operations.h +++ b/src/fluid/operations.h @@ -12,6 +12,10 @@ #include #include +static const std::string SignatureDelimiter = " "; +static const std::string PrimaryDelimiter = "@"; +static const std::string SubDelimiter = "$"; + void ScrubString(std::string& input, bool forInteger = false); void SeparateString(const std::string& input, std::vector& output, bool subDelimiter = false); void SeparateFluidOpString(const std::string& input, std::vector& output); @@ -19,10 +23,6 @@ std::string StitchString(const std::string& stringOne, const std::string& string std::string StitchString(const std::string& stringOne, const std::string& stringTwo, const std::string& stringThree, const bool subDelimiter = false); std::string GetRidOfScriptStatement(const std::string& input, const int& position = 1); -extern std::string PrimaryDelimiter; -extern std::string SubDelimiter; -extern std::string SignatureDelimiter; - bool VerifyAddressOwnership(const CDynamicAddress& dynamicAddress); bool SignTokenMessage(const CDynamicAddress& address, std::string unsignedMessage, std::string& stitchedMessage, bool stitch = true); bool GenericSignMessage(const std::string& message, std::string& signedString, const CDynamicAddress& signer); From 254bdc95c81674229f310ccea9ad36b43749a885 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Wed, 18 Aug 2021 22:15:52 +0530 Subject: [PATCH 06/17] fluid: drop redundant prefix from filenames --- src/Makefile.am | 20 +++++++++---------- src/dynode-payments.cpp | 2 +- src/dynode.cpp | 2 +- src/fluid/{fluiddb.cpp => db.cpp} | 12 +++++------ src/fluid/{fluiddb.h => db.h} | 0 src/fluid/{fluiddynode.cpp => dynode.cpp} | 4 ++-- src/fluid/{fluiddynode.h => dynode.h} | 0 src/fluid/fluid.cpp | 2 +- src/fluid/{fluidmining.cpp => mining.cpp} | 4 ++-- src/fluid/{fluidmining.h => mining.h} | 0 src/fluid/{fluidmint.cpp => mint.cpp} | 4 ++-- src/fluid/{fluidmint.h => mint.h} | 0 .../{fluidsovereign.cpp => sovereign.cpp} | 4 ++-- src/fluid/{fluidsovereign.h => sovereign.h} | 0 src/init.cpp | 8 ++++---- src/miner/miner-util.cpp | 6 +++--- src/rpc/fluid.cpp | 10 +++++----- src/rpc/mining.cpp | 4 ++-- src/validation.cpp | 8 ++++---- src/wallet/wallet.cpp | 2 +- 20 files changed, 46 insertions(+), 46 deletions(-) rename src/fluid/{fluiddb.cpp => db.cpp} (97%) rename src/fluid/{fluiddb.h => db.h} (100%) rename src/fluid/{fluiddynode.cpp => dynode.cpp} (99%) rename src/fluid/{fluiddynode.h => dynode.h} (100%) rename src/fluid/{fluidmining.cpp => mining.cpp} (99%) rename src/fluid/{fluidmining.h => mining.h} (100%) rename src/fluid/{fluidmint.cpp => mint.cpp} (99%) rename src/fluid/{fluidmint.h => mint.h} (100%) rename src/fluid/{fluidsovereign.cpp => sovereign.cpp} (99%) rename src/fluid/{fluidsovereign.h => sovereign.h} (100%) diff --git a/src/Makefile.am b/src/Makefile.am index 1e99260b2..00fb045d3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -134,11 +134,11 @@ DYNAMIC_CORE_H = \ flat-database.h \ fluid/banaccount.h \ fluid/fluid.h \ - fluid/fluiddb.h \ - fluid/fluiddynode.h \ - fluid/fluidmining.h \ - fluid/fluidmint.h \ - fluid/fluidsovereign.h \ + fluid/db.h \ + fluid/dynode.h \ + fluid/mining.h \ + fluid/mint.h \ + fluid/sovereign.h \ fluid/operations.h \ governance.h \ governance-classes.h \ @@ -297,11 +297,11 @@ libdynamic_server_a_SOURCES = \ dynodeman.cpp \ fluid/banaccount.cpp \ fluid/fluid.cpp \ - fluid/fluiddb.cpp \ - fluid/fluiddynode.cpp \ - fluid/fluidmining.cpp \ - fluid/fluidmint.cpp \ - fluid/fluidsovereign.cpp \ + fluid/db.cpp \ + fluid/dynode.cpp \ + fluid/mining.cpp \ + fluid/mint.cpp \ + fluid/sovereign.cpp \ fluid/operations.cpp \ governance.cpp \ governance-classes.cpp \ diff --git a/src/dynode-payments.cpp b/src/dynode-payments.cpp index 2ab81c7f9..f123498d0 100644 --- a/src/dynode-payments.cpp +++ b/src/dynode-payments.cpp @@ -10,7 +10,7 @@ #include "consensus/validation.h" #include "dynode-sync.h" #include "dynodeman.h" -#include "fluid/fluiddb.h" +#include "fluid/db.h" #include "governance-classes.h" #include "init.h" #include "messagesigner.h" diff --git a/src/dynode.cpp b/src/dynode.cpp index 2e7de1716..fa97109fc 100644 --- a/src/dynode.cpp +++ b/src/dynode.cpp @@ -12,7 +12,7 @@ #include "dynode-payments.h" #include "dynode-sync.h" #include "dynodeman.h" -#include "fluid/fluiddb.h" +#include "fluid/db.h" #include "init.h" #include "messagesigner.h" #include "netbase.h" diff --git a/src/fluid/fluiddb.cpp b/src/fluid/db.cpp similarity index 97% rename from src/fluid/fluiddb.cpp rename to src/fluid/db.cpp index c96cf5d85..4acfd135f 100644 --- a/src/fluid/fluiddb.cpp +++ b/src/fluid/db.cpp @@ -1,13 +1,13 @@ // Copyright (c) 2019-2021 Duality Blockchain Solutions Developers -#include "fluiddb.h" +#include "fluid/db.h" #include "base58.h" -#include "fluid.h" -#include "fluiddynode.h" -#include "fluidmining.h" -#include "fluidmint.h" -#include "fluidsovereign.h" +#include "fluid/fluid.h" +#include "fluid/dynode.h" +#include "fluid/mining.h" +#include "fluid/mint.h" +#include "fluid/sovereign.h" CAmount GetFluidDynodeReward(const int nHeight) { diff --git a/src/fluid/fluiddb.h b/src/fluid/db.h similarity index 100% rename from src/fluid/fluiddb.h rename to src/fluid/db.h diff --git a/src/fluid/fluiddynode.cpp b/src/fluid/dynode.cpp similarity index 99% rename from src/fluid/fluiddynode.cpp rename to src/fluid/dynode.cpp index 2b9be336a..b53a44ca0 100644 --- a/src/fluid/fluiddynode.cpp +++ b/src/fluid/dynode.cpp @@ -1,10 +1,10 @@ // Copyright (c) 2019-2021 Duality Blockchain Solutions Developers -#include "fluiddynode.h" +#include "fluid/dynode.h" #include "core_io.h" -#include "fluid.h" +#include "fluid/fluid.h" #include "operations.h" #include "script/script.h" diff --git a/src/fluid/fluiddynode.h b/src/fluid/dynode.h similarity index 100% rename from src/fluid/fluiddynode.h rename to src/fluid/dynode.h diff --git a/src/fluid/fluid.cpp b/src/fluid/fluid.cpp index afdb8add3..31ec47e61 100644 --- a/src/fluid/fluid.cpp +++ b/src/fluid/fluid.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2016-2021 Duality Blockchain Solutions Developers -#include "fluid.h" +#include "fluid/fluid.h" #include "bdap/domainentry.h" #include "bdap/domainentrydb.h" diff --git a/src/fluid/fluidmining.cpp b/src/fluid/mining.cpp similarity index 99% rename from src/fluid/fluidmining.cpp rename to src/fluid/mining.cpp index bc551474a..708b6ca3b 100644 --- a/src/fluid/fluidmining.cpp +++ b/src/fluid/mining.cpp @@ -1,10 +1,10 @@ // Copyright (c) 2019-2021 Duality Blockchain Solutions Developers -#include "fluidmining.h" +#include "fluid/mining.h" #include "core_io.h" -#include "fluid.h" +#include "fluid/fluid.h" #include "operations.h" #include "script/script.h" diff --git a/src/fluid/fluidmining.h b/src/fluid/mining.h similarity index 100% rename from src/fluid/fluidmining.h rename to src/fluid/mining.h diff --git a/src/fluid/fluidmint.cpp b/src/fluid/mint.cpp similarity index 99% rename from src/fluid/fluidmint.cpp rename to src/fluid/mint.cpp index 38ac7989d..d04ac1b65 100644 --- a/src/fluid/fluidmint.cpp +++ b/src/fluid/mint.cpp @@ -1,11 +1,11 @@ // Copyright (c) 2017 Duality Blockchain Solutions Developers -#include "fluidmint.h" +#include "fluid/mint.h" #include "base58.h" #include "core_io.h" -#include "fluid.h" +#include "fluid/fluid.h" #include "operations.h" #include "script/script.h" diff --git a/src/fluid/fluidmint.h b/src/fluid/mint.h similarity index 100% rename from src/fluid/fluidmint.h rename to src/fluid/mint.h diff --git a/src/fluid/fluidsovereign.cpp b/src/fluid/sovereign.cpp similarity index 99% rename from src/fluid/fluidsovereign.cpp rename to src/fluid/sovereign.cpp index 18b94df21..4101a6dae 100644 --- a/src/fluid/fluidsovereign.cpp +++ b/src/fluid/sovereign.cpp @@ -1,10 +1,10 @@ // Copyright (c) 2019-2021 Duality Blockchain Solutions Developers -#include "fluidsovereign.h" +#include "fluid/sovereign.h" #include "core_io.h" -#include "fluid.h" +#include "fluid/fluid.h" #include "operations.h" #include "script/script.h" diff --git a/src/fluid/fluidsovereign.h b/src/fluid/sovereign.h similarity index 100% rename from src/fluid/fluidsovereign.h rename to src/fluid/sovereign.h diff --git a/src/init.cpp b/src/init.cpp index b1f6ad2b9..1c285a176 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -31,10 +31,10 @@ #include "dynodeman.h" #include "flat-database.h" #include "fluid/banaccount.h" -#include "fluid/fluiddynode.h" -#include "fluid/fluidmining.h" -#include "fluid/fluidmint.h" -#include "fluid/fluidsovereign.h" +#include "fluid/dynode.h" +#include "fluid/mining.h" +#include "fluid/mint.h" +#include "fluid/sovereign.h" #include "governance.h" #include "httprpc.h" #include "httpserver.h" diff --git a/src/miner/miner-util.cpp b/src/miner/miner-util.cpp index 252f8b718..3634f122c 100644 --- a/src/miner/miner-util.cpp +++ b/src/miner/miner-util.cpp @@ -10,9 +10,9 @@ #include "consensus/merkle.h" #include "consensus/validation.h" #include "dynode-payments.h" -#include "fluid/fluiddb.h" -#include "fluid/fluidmining.h" -#include "fluid/fluidmint.h" +#include "fluid/db.h" +#include "fluid/mining.h" +#include "fluid/mint.h" #include "governance.h" #include "policy/policy.h" #include "pow.h" diff --git a/src/rpc/fluid.cpp b/src/rpc/fluid.cpp index 117d1e836..8aaa3d1d9 100644 --- a/src/rpc/fluid.cpp +++ b/src/rpc/fluid.cpp @@ -8,11 +8,11 @@ #include "dynode-sync.h" #include "fluid/banaccount.h" #include "fluid/fluid.h" -#include "fluid/fluiddb.h" -#include "fluid/fluiddynode.h" -#include "fluid/fluidmining.h" -#include "fluid/fluidmint.h" -#include "fluid/fluidsovereign.h" +#include "fluid/db.h" +#include "fluid/dynode.h" +#include "fluid/mining.h" +#include "fluid/mint.h" +#include "fluid/sovereign.h" #include "init.h" #include "keepass.h" #include "net.h" diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 3a5421b54..4f9926c41 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -15,8 +15,8 @@ #include "consensus/validation.h" #include "core_io.h" #include "fluid/fluid.h" -#include "fluid/fluiddb.h" -#include "fluid/fluidmint.h" +#include "fluid/db.h" +#include "fluid/mint.h" #include "init.h" #include "miner/miner.h" #include "net.h" diff --git a/src/validation.cpp b/src/validation.cpp index 2818dd3b8..35a42ba62 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -29,10 +29,10 @@ #include "dynodeman.h" #include "fluid/banaccount.h" #include "fluid/fluid.h" -#include "fluid/fluiddb.h" -#include "fluid/fluiddynode.h" -#include "fluid/fluidmining.h" -#include "fluid/fluidmint.h" +#include "fluid/db.h" +#include "fluid/dynode.h" +#include "fluid/mining.h" +#include "fluid/mint.h" #include "hash.h" #include "init.h" #include "instantsend.h" diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 86ffdb14a..68f552f49 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -24,7 +24,7 @@ #include "core_io.h" #include "dynode-sync.h" #include "fluid/fluid.h" -#include "fluid/fluiddb.h" +#include "fluid/db.h" #include "governance.h" #include "init.h" #include "instantsend.h" From c31b01d124d8b0d1ab1034ede179fc5b1f1d8417 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Wed, 18 Aug 2021 22:43:52 +0530 Subject: [PATCH 07/17] fluid: use loops when it is practical --- src/fluid/dynode.cpp | 6 +++--- src/fluid/mining.cpp | 6 +++--- src/fluid/mint.cpp | 6 +++--- src/fluid/sovereign.cpp | 8 +++----- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/fluid/dynode.cpp b/src/fluid/dynode.cpp index b53a44ca0..6a9990008 100644 --- a/src/fluid/dynode.cpp +++ b/src/fluid/dynode.cpp @@ -38,9 +38,9 @@ bool GetFluidDynodeData(const CScript& scriptPubKey, CFluidDynode& entry) entry.nTimeStamp = tokenTimeStamp; } entry.SovereignAddresses.clear(); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[2], messageTokenKey).ToString())); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[3], messageTokenKey).ToString())); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[4], messageTokenKey).ToString())); + for (int i = 2; i > 5; i++) { + entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[i], messageTokenKey).ToString())); + } LogPrintf("GetFluidDynodeData: strAmount = %s, strTimeStamp = %d, Addresses1 = %s, Addresses2 = %s, Addresses3 = %s \n", strAmount, entry.nTimeStamp, StringFromCharVector(entry.SovereignAddresses[0]), diff --git a/src/fluid/mining.cpp b/src/fluid/mining.cpp index 708b6ca3b..217f7926a 100644 --- a/src/fluid/mining.cpp +++ b/src/fluid/mining.cpp @@ -38,9 +38,9 @@ bool GetFluidMiningData(const CScript& scriptPubKey, CFluidMining& entry) entry.nTimeStamp = tokenTimeStamp; } entry.SovereignAddresses.clear(); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[2], messageTokenKey).ToString())); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[3], messageTokenKey).ToString())); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[4], messageTokenKey).ToString())); + for (int i = 2; i > 5; i++) { + entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[i], messageTokenKey).ToString())); + } LogPrintf("GetFluidMiningData: strAmount = %s, strTimeStamp = %d, Addresses1 = %s, Addresses2 = %s, Addresses3 = %s \n", strAmount, entry.nTimeStamp, StringFromCharVector(entry.SovereignAddresses[0]), diff --git a/src/fluid/mint.cpp b/src/fluid/mint.cpp index d04ac1b65..3da075dd1 100644 --- a/src/fluid/mint.cpp +++ b/src/fluid/mint.cpp @@ -41,9 +41,9 @@ bool GetFluidMintData(const CScript& scriptPubKey, CFluidMint& entry) std::vector vchDestinationAddress = CharVectorFromString(vecSplitScript[2]); entry.DestinationAddress.insert(entry.DestinationAddress.end(), vchDestinationAddress.begin(), vchDestinationAddress.end()); entry.SovereignAddresses.clear(); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[3], messageTokenKey).ToString())); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[4], messageTokenKey).ToString())); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[5], messageTokenKey).ToString())); + for (int i = 3; i > 6; i++) { + entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[i], messageTokenKey).ToString())); + } LogPrintf("GetFluidMintData: strAmount = %s, strTimeStamp = %d, DestinationAddress = %s, Addresses1 = %s, Addresses2 = %s, Addresses3 = %s \n", strAmount, entry.nTimeStamp, diff --git a/src/fluid/sovereign.cpp b/src/fluid/sovereign.cpp index 4101a6dae..8a482bdfa 100644 --- a/src/fluid/sovereign.cpp +++ b/src/fluid/sovereign.cpp @@ -28,11 +28,9 @@ bool GetFluidSovereignData(const CScript& scriptPubKey, CFluidSovereign& entry) std::vector vchFluidOperation = CharVectorFromString(fluidOperationString); entry.FluidScript.insert(entry.FluidScript.end(), vchFluidOperation.begin(), vchFluidOperation.end()); entry.SovereignAddresses.clear(); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[0], messageTokenKey).ToString())); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[1], messageTokenKey).ToString())); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[2], messageTokenKey).ToString())); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[3], messageTokenKey).ToString())); - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[4], messageTokenKey).ToString())); + for (int i = 0; i > 5; i++) { + entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[i], messageTokenKey).ToString())); + } std::string strTimeStamp = vecSplitScript[5]; int64_t tokenTimeStamp; if (ParseInt64(strTimeStamp, &tokenTimeStamp)) { From 074878d40eaffd037f5461886628c3e3cc57eda8 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Wed, 18 Aug 2021 23:01:24 +0530 Subject: [PATCH 08/17] fluid: remove nullptr check function, make it an assertion --- src/fluid/banaccount.cpp | 16 ++------- src/fluid/banaccount.h | 1 - src/fluid/db.cpp | 73 ++++++++++++++++------------------------ src/fluid/dynode.cpp | 8 ----- src/fluid/dynode.h | 1 - src/fluid/mining.cpp | 8 ----- src/fluid/mining.h | 1 - src/fluid/mint.cpp | 8 ----- src/fluid/mint.h | 1 - src/fluid/sovereign.cpp | 8 ----- src/fluid/sovereign.h | 1 - src/validation.cpp | 27 +++++++-------- 12 files changed, 43 insertions(+), 110 deletions(-) diff --git a/src/fluid/banaccount.cpp b/src/fluid/banaccount.cpp index 6fd3688c9..710398f5a 100644 --- a/src/fluid/banaccount.cpp +++ b/src/fluid/banaccount.cpp @@ -13,27 +13,15 @@ CBanAccountDB* pBanAccountDB = NULL; -bool CheckBanAccountDB() -{ - if (!pBanAccountDB) - return false; - - return true; -} - bool AddBanAccountEntry(const CBanAccount& entry) { - if (!CheckBanAccountDB()) - return false; - + assert(pBanAccountDB); return pBanAccountDB->AddBanAccountEntry(entry); } bool GetAllBanAccountRecords(std::vector& entries) { - if (!CheckBanAccountDB()) - return false; - + assert(pBanAccountDB); return pBanAccountDB->GetAllBanAccountRecords(entries); } diff --git a/src/fluid/banaccount.h b/src/fluid/banaccount.h index 214a52db2..4ce4c11bb 100644 --- a/src/fluid/banaccount.h +++ b/src/fluid/banaccount.h @@ -107,7 +107,6 @@ class CBanAccountDB : public CDBWrapper bool RecordExists(const std::vector& vchFluidScript); }; -bool CheckBanAccountDB(); bool AddBanAccountEntry(const CBanAccount& entry); bool GetAllBanAccountRecords(std::vector& entries); diff --git a/src/fluid/db.cpp b/src/fluid/db.cpp index 4acfd135f..a82713057 100644 --- a/src/fluid/db.cpp +++ b/src/fluid/db.cpp @@ -11,10 +11,9 @@ CAmount GetFluidDynodeReward(const int nHeight) { - if (fluid.FLUID_ACTIVATE_HEIGHT > nHeight) - return GetStandardDynodePayment(nHeight); + assert(pFluidDynodeDB); - if (!CheckFluidDynodeDB()) + if (fluid.FLUID_ACTIVATE_HEIGHT > nHeight) return GetStandardDynodePayment(nHeight); if (pFluidDynodeDB->IsEmpty()) @@ -33,10 +32,9 @@ CAmount GetFluidDynodeReward(const int nHeight) CAmount GetFluidMiningReward(const int nHeight) { - if (fluid.FLUID_ACTIVATE_HEIGHT > nHeight) - return GetStandardPoWBlockPayment(nHeight); + assert(pFluidMiningDB); - if (!CheckFluidMiningDB()) + if (fluid.FLUID_ACTIVATE_HEIGHT > nHeight) return GetStandardPoWBlockPayment(nHeight); if (pFluidMiningDB->IsEmpty()) @@ -55,8 +53,7 @@ CAmount GetFluidMiningReward(const int nHeight) bool GetMintingInstructions(const int nHeight, CFluidMint& fluidMint) { - if (!CheckFluidMintDB()) - return false; + assert(pFluidDynodeDB); if (pFluidMintDB->IsEmpty()) return false; @@ -76,11 +73,9 @@ bool GetMintingInstructions(const int nHeight, CFluidMint& fluidMint) /** Checks if any given address is a current sovereign wallet address (invoked by RPC) */ bool IsSovereignAddress(const CDynamicAddress& inputAddress) { - if (!inputAddress.IsValid()) { - return false; - } + assert(pFluidSovereignDB); - if (!CheckFluidSovereignDB()) { + if (!inputAddress.IsValid()) { return false; } @@ -100,50 +95,42 @@ bool IsSovereignAddress(const CDynamicAddress& inputAddress) bool GetAllFluidDynodeRecords(std::vector& dynodeEntries) { - if (CheckFluidDynodeDB()) { - if (!pFluidDynodeDB->GetAllFluidDynodeRecords(dynodeEntries)) { - return false; - } - } else { - return false; + assert(pFluidDynodeDB); + + if (pFluidDynodeDB->GetAllFluidDynodeRecords(dynodeEntries)) { + return true; } - return true; + return false; } bool GetAllFluidMiningRecords(std::vector& miningEntries) { - if (CheckFluidMiningDB()) { - if (!pFluidMiningDB->GetAllFluidMiningRecords(miningEntries)) { - return false; - } - } else { - return false; + assert(pFluidMiningDB); + + if (!pFluidMiningDB->GetAllFluidMiningRecords(miningEntries)) { + return true; } - return true; + return false; } bool GetAllFluidMintRecords(std::vector& mintEntries) { - if (CheckFluidMintDB()) { - if (!pFluidMintDB->GetAllFluidMintRecords(mintEntries)) { - return false; - } - } else { - return false; + assert(pFluidMintDB); + + if (pFluidMintDB->GetAllFluidMintRecords(mintEntries)) { + return true; } - return true; + return false; } bool GetAllFluidSovereignRecords(std::vector& sovereignEntries) { - if (CheckFluidSovereignDB()) { - if (pFluidSovereignDB->IsEmpty()) { - return false; - } - if (!pFluidSovereignDB->GetAllFluidSovereignRecords(sovereignEntries)) { - return false; - } - } else { + assert(pFluidSovereignDB); + + if (pFluidSovereignDB->IsEmpty()) { + return false; + } + if (!pFluidSovereignDB->GetAllFluidSovereignRecords(sovereignEntries)) { return false; } return true; @@ -151,9 +138,7 @@ bool GetAllFluidSovereignRecords(std::vector& sovereignEntries) bool GetLastFluidSovereignAddressStrings(std::vector& sovereignAddresses) { - if (!CheckFluidSovereignDB()) { - return false; - } + assert(pFluidSovereignDB); CFluidSovereign lastSovereign; if (!pFluidSovereignDB->GetLastFluidSovereignRecord(lastSovereign)) { diff --git a/src/fluid/dynode.cpp b/src/fluid/dynode.cpp index 6a9990008..d53859aa7 100644 --- a/src/fluid/dynode.cpp +++ b/src/fluid/dynode.cpp @@ -185,11 +185,3 @@ bool CFluidDynodeDB::RecordExists(const std::vector& vchFluidScri CFluidDynode fluidDynode; return CDBWrapper::Read(make_pair(std::string("script"), vchFluidScript), fluidDynode); } - -bool CheckFluidDynodeDB() -{ - if (!pFluidDynodeDB) - return false; - - return true; -} diff --git a/src/fluid/dynode.h b/src/fluid/dynode.h index 41057d31b..0699b149a 100644 --- a/src/fluid/dynode.h +++ b/src/fluid/dynode.h @@ -122,7 +122,6 @@ class CFluidDynodeDB : public CDBWrapper bool GetFluidDynodeData(const CScript& scriptPubKey, CFluidDynode& entry); bool GetFluidDynodeData(const CTransaction& tx, CFluidDynode& entry, int& nOut); -bool CheckFluidDynodeDB(); extern CFluidDynodeDB* pFluidDynodeDB; diff --git a/src/fluid/mining.cpp b/src/fluid/mining.cpp index 217f7926a..b7c98b62c 100644 --- a/src/fluid/mining.cpp +++ b/src/fluid/mining.cpp @@ -185,11 +185,3 @@ bool CFluidMiningDB::RecordExists(const std::vector& vchFluidScri CFluidMining fluidMining; return CDBWrapper::Read(make_pair(std::string("script"), vchFluidScript), fluidMining); } - -bool CheckFluidMiningDB() -{ - if (!pFluidMiningDB) - return false; - - return true; -} diff --git a/src/fluid/mining.h b/src/fluid/mining.h index 59facb519..5dd4c2500 100644 --- a/src/fluid/mining.h +++ b/src/fluid/mining.h @@ -122,7 +122,6 @@ class CFluidMiningDB : public CDBWrapper bool GetFluidMiningData(const CScript& scriptPubKey, CFluidMining& entry); bool GetFluidMiningData(const CTransaction& tx, CFluidMining& entry, int& nOut); -bool CheckFluidMiningDB(); extern CFluidMiningDB* pFluidMiningDB; diff --git a/src/fluid/mint.cpp b/src/fluid/mint.cpp index 3da075dd1..bfe7545e1 100644 --- a/src/fluid/mint.cpp +++ b/src/fluid/mint.cpp @@ -191,11 +191,3 @@ bool CFluidMintDB::RecordExists(const std::vector& vchFluidScript CFluidMint fluidMint; return CDBWrapper::Read(make_pair(std::string("script"), vchFluidScript), fluidMint); } - -bool CheckFluidMintDB() -{ - if (!pFluidMintDB) - return false; - - return true; -} diff --git a/src/fluid/mint.h b/src/fluid/mint.h index 52c89687c..c1fcd1782 100644 --- a/src/fluid/mint.h +++ b/src/fluid/mint.h @@ -128,7 +128,6 @@ class CFluidMintDB : public CDBWrapper bool GetFluidMintData(const CScript& scriptPubKey, CFluidMint& entry); bool GetFluidMintData(const CTransaction& tx, CFluidMint& entry, int& nOut); -bool CheckFluidMintDB(); extern CFluidMintDB* pFluidMintDB; diff --git a/src/fluid/sovereign.cpp b/src/fluid/sovereign.cpp index 8a482bdfa..773ee527b 100644 --- a/src/fluid/sovereign.cpp +++ b/src/fluid/sovereign.cpp @@ -193,11 +193,3 @@ bool CFluidSovereignDB::IsEmpty() } return true; } - -bool CheckFluidSovereignDB() -{ - if (!pFluidSovereignDB) - return false; - - return true; -} diff --git a/src/fluid/sovereign.h b/src/fluid/sovereign.h index de9c735ac..c44cd6775 100644 --- a/src/fluid/sovereign.h +++ b/src/fluid/sovereign.h @@ -109,7 +109,6 @@ class CFluidSovereignDB : public CDBWrapper }; bool GetFluidSovereignData(const CScript& scriptPubKey, CFluidSovereign& entry); bool GetFluidSovereignData(const CTransaction& tx, CFluidSovereign& entry, int& nOut); -bool CheckFluidSovereignDB(); extern CFluidSovereignDB* pFluidSovereignDB; diff --git a/src/validation.cpp b/src/validation.cpp index 35a42ba62..dd1910eef 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2966,35 +2966,32 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd if (IsTransactionFluid(tx, scriptFluid)) { int OpCode = GetFluidOpCode(scriptFluid); if (OpCode == OP_REWARD_DYNODE) { + assert(pFluidDynodeDB); CFluidDynode fluidDynode(scriptFluid); fluidDynode.nHeight = pindex->nHeight; fluidDynode.txHash = tx.GetHash(); - if (CheckFluidDynodeDB()) { - if (!CheckSignatureQuorum(fluidDynode.FluidScript, strError)) { - return state.DoS(0, error("ConnectBlock(DYN): %s", strError), REJECT_INVALID, "invalid-fluid-dynode-address-signature"); - } - pFluidDynodeDB->AddFluidDynodeEntry(fluidDynode, OP_REWARD_DYNODE); + if (!CheckSignatureQuorum(fluidDynode.FluidScript, strError)) { + return state.DoS(0, error("ConnectBlock(DYN): %s", strError), REJECT_INVALID, "invalid-fluid-dynode-address-signature"); } + pFluidDynodeDB->AddFluidDynodeEntry(fluidDynode, OP_REWARD_DYNODE); } else if (OpCode == OP_REWARD_MINING) { + assert(pFluidMiningDB); CFluidMining fluidMining(scriptFluid); fluidMining.nHeight = pindex->nHeight; fluidMining.txHash = tx.GetHash(); - if (CheckFluidMiningDB()) { - if (!CheckSignatureQuorum(fluidMining.FluidScript, strError)) { - return state.DoS(0, error("ConnectBlock(DYN): %s", strError), REJECT_INVALID, "invalid-fluid-mining-address-signature"); - } - pFluidMiningDB->AddFluidMiningEntry(fluidMining, OP_REWARD_MINING); + if (!CheckSignatureQuorum(fluidMining.FluidScript, strError)) { + return state.DoS(0, error("ConnectBlock(DYN): %s", strError), REJECT_INVALID, "invalid-fluid-mining-address-signature"); } + pFluidMiningDB->AddFluidMiningEntry(fluidMining, OP_REWARD_MINING); } else if (OpCode == OP_MINT) { + assert(pFluidMintDB); CFluidMint fluidMint(scriptFluid); fluidMint.nHeight = pindex->nHeight; fluidMint.txHash = tx.GetHash(); - if (CheckFluidMintDB()) { - if (!CheckSignatureQuorum(fluidMint.FluidScript, strError)) { - return state.DoS(0, error("ConnectBlock(DYN): %s", strError), REJECT_INVALID, "invalid-fluid-mint-address-signature"); - } - pFluidMintDB->AddFluidMintEntry(fluidMint, OP_MINT); + if (!CheckSignatureQuorum(fluidMint.FluidScript, strError)) { + return state.DoS(0, error("ConnectBlock(DYN): %s", strError), REJECT_INVALID, "invalid-fluid-mint-address-signature"); } + pFluidMintDB->AddFluidMintEntry(fluidMint, OP_MINT); } else if (OpCode == OP_BDAP_REVOKE) { if (!CheckSignatureQuorum(FluidScriptToCharVector(scriptFluid), strError)) return state.DoS(0, error("%s: %s", __func__, strError), REJECT_INVALID, "invalid-fluid-ban-address-signature"); From ae54891bb26c7428922c88d78bc9ab5084ae6d4d Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Thu, 19 Aug 2021 10:23:35 +0530 Subject: [PATCH 09/17] fluid: reserve the entire 0xc* range for Fluid --- src/script/script.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/script/script.h b/src/script/script.h index 27ab08f54..1e542df12 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -194,6 +194,12 @@ enum opcodetype { OP_FREEZE_ADDRESS = 0xc7, OP_RELEASE_ADDRESS = 0xc8, OP_BDAP_REVOKE = 0xc9, // = BDAP delete using fluid protocol + OP_RESERVED_0001 = 0xca, + OP_RESERVED_0002 = 0xcb, + OP_RESERVED_0003 = 0xcc, + OP_RESERVED_0004 = 0xcd, + OP_RESERVED_0005 = 0xce, + OP_RESERVED_0006 = 0xcf, // BDAP directory access, user identity and certificate system OP_BDAP_NEW = 0x01, // = BDAP new entry From 4098dc6669e0272b1fbd140f8468b31bdc754a6a Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Thu, 19 Aug 2021 12:58:56 +0530 Subject: [PATCH 10/17] fluid: move fluid translation tables to its own file, remove internal codes --- src/Makefile.am | 2 ++ src/fluid/fluid.cpp | 23 +++++++---------------- src/fluid/script.cpp | 35 +++++++++++++++++++++++++++++++++++ src/fluid/script.h | 16 ++++++++++++++++ src/rpc/fluid.cpp | 27 ++------------------------- src/script/script.h | 23 ++--------------------- src/utilstrencodings.cpp | 3 ++- src/utilstrencodings.h | 3 ++- 8 files changed, 68 insertions(+), 64 deletions(-) create mode 100644 src/fluid/script.cpp create mode 100644 src/fluid/script.h diff --git a/src/Makefile.am b/src/Makefile.am index 00fb045d3..f2e3da3ec 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -138,6 +138,7 @@ DYNAMIC_CORE_H = \ fluid/dynode.h \ fluid/mining.h \ fluid/mint.h \ + fluid/script.h \ fluid/sovereign.h \ fluid/operations.h \ governance.h \ @@ -301,6 +302,7 @@ libdynamic_server_a_SOURCES = \ fluid/dynode.cpp \ fluid/mining.cpp \ fluid/mint.cpp \ + fluid/script.cpp \ fluid/sovereign.cpp \ fluid/operations.cpp \ governance.cpp \ diff --git a/src/fluid/fluid.cpp b/src/fluid/fluid.cpp index 31ec47e61..415f3a49e 100644 --- a/src/fluid/fluid.cpp +++ b/src/fluid/fluid.cpp @@ -16,6 +16,7 @@ #include "utilmoneystr.h" #include "utiltime.h" #include "validation.h" +#include "fluid/script.h" #include "wallet/wallet.h" #include "wallet/walletdb.h" @@ -28,8 +29,7 @@ extern CWallet* pwalletMain; bool IsTransactionFluid(const CScript& txOut) { - return (txOut.IsProtocolInstruction(MINT_TX) || txOut.IsProtocolInstruction(DYNODE_MODFIY_TX) || txOut.IsProtocolInstruction(MINING_MODIFY_TX) || - txOut.IsProtocolInstruction(BDAP_REVOKE_TX)); + return WithinFluidRange(txOut.GetFlag()); } bool IsTransactionFluid(const CTransaction& tx, CScript& fluidScript) @@ -46,16 +46,7 @@ bool IsTransactionFluid(const CTransaction& tx, CScript& fluidScript) int GetFluidOpCode(const CScript& fluidScript) { - if (fluidScript.IsProtocolInstruction(MINT_TX)) { - return OP_MINT; - } else if (fluidScript.IsProtocolInstruction(DYNODE_MODFIY_TX)) { - return OP_REWARD_DYNODE; - } else if (fluidScript.IsProtocolInstruction(MINING_MODIFY_TX)) { - return OP_REWARD_MINING; - } else if (fluidScript.IsProtocolInstruction(BDAP_REVOKE_TX)) { - return OP_BDAP_REVOKE; - } - return 0; + return fluidScript.GetFlag(); } /** Checks fluid transactoin operation script amount for invalid values. */ @@ -447,7 +438,7 @@ bool CFluid::GetMintingInstructions(const CBlockIndex* pblockindex, CDynamicAddr if (GetFluidBlock(pblockindex, block)) { for (const CTransactionRef& tx : block.vtx) { for (const CTxOut& txout : tx->vout) { - if (txout.scriptPubKey.IsProtocolInstruction(MINT_TX)) { + if (txout.scriptPubKey.GetFlag() == OP_MINT) { std::string message; if (CheckIfQuorumExists(ScriptToAsmStr(txout.scriptPubKey), message)) return ParseMintKey(block.nTime, toMintAddress, mintAmount, ScriptToAsmStr(txout.scriptPubKey)); @@ -518,13 +509,13 @@ bool CFluid::ValidationProcesses(CValidationState& state, const CScript& txOut, return state.DoS(100, false, REJECT_INVALID, "bad-txns-fluid-auth-failure"); } - if (txOut.IsProtocolInstruction(MINT_TX) && + if (txOut.GetFlag() == OP_MINT && !ParseMintKey(0, toMintAddress, mintAmount, ScriptToAsmStr(txOut), true)) { return state.DoS(100, false, REJECT_INVALID, "bad-txns-fluid-mint-auth-failure"); } - if ((txOut.IsProtocolInstruction(DYNODE_MODFIY_TX) || - txOut.IsProtocolInstruction(MINING_MODIFY_TX)) && + if ((txOut.GetFlag() == OP_REWARD_DYNODE || + txOut.GetFlag() == OP_REWARD_MINING) && !GenericParseNumber(ScriptToAsmStr(txOut), 0, mintAmount, true)) { return state.DoS(100, false, REJECT_INVALID, "bad-txns-fluid-modify-parse-failure"); } diff --git a/src/fluid/script.cpp b/src/fluid/script.cpp new file mode 100644 index 000000000..a35be2c60 --- /dev/null +++ b/src/fluid/script.cpp @@ -0,0 +1,35 @@ +// Copyright (c) 2021 Duality Blockchain Solutions + +#include "fluid/script.h" + +#include "utilstrencodings.h" + +bool WithinFluidRange(opcodetype op) +{ + return op >= OP_MINT && op <= OP_RESERVED_0006; +} + +std::string TranslationTable(opcodetype op) +{ + return GetOpName(op); +} + +uint64_t TranslationTable(std::string str) +{ + str = SanitizeString(str, SAFE_CHARS_SCRIPT); // Remove invalid characters + if (str == "OP_MINT") { return OP_MINT; } + else if (str == "OP_REWARD_DYNODE") { return OP_REWARD_DYNODE; } + else if (str == "OP_REWARD_MINING") { return OP_REWARD_MINING; } + else if (str == "OP_SWAP_SOVEREIGN_ADDRESS") { return OP_SWAP_SOVEREIGN_ADDRESS; } + else if (str == "OP_UPDATE_FEES") { return OP_UPDATE_FEES; } + else if (str == "OP_FREEZE_ADDRESS") { return OP_FREEZE_ADDRESS; } + else if (str == "OP_RELEASE_ADDRESS") { return OP_RELEASE_ADDRESS; } + else if (str == "OP_BDAP_REVOKE") { return OP_BDAP_REVOKE; } + else if (str == "OP_RESERVED_0001") { return OP_RESERVED_0001; } + else if (str == "OP_RESERVED_0002") { return OP_RESERVED_0002; } + else if (str == "OP_RESERVED_0003") { return OP_RESERVED_0003; } + else if (str == "OP_RESERVED_0004") { return OP_RESERVED_0004; } + else if (str == "OP_RESERVED_0005") { return OP_RESERVED_0005; } + else if (str == "OP_RESERVED_0006") { return OP_RESERVED_0006; } + else { return OP_INVALIDOPCODE; } +} diff --git a/src/fluid/script.h b/src/fluid/script.h new file mode 100644 index 000000000..bcb19d653 --- /dev/null +++ b/src/fluid/script.h @@ -0,0 +1,16 @@ +// Copyright (c) 2021 Duality Blockchain Solutions + +#ifndef BITCOIN_FLUID_SCRIPT_H +#define BITCOIN_FLUID_SCRIPT_H + +#include "script/script.h" + +#include +#include + +bool WithinFluidRange(opcodetype op); + +std::string TranslationTable(opcodetype op); +uint64_t TranslationTable(std::string str); + +#endif // BITCOIN_FLUID_SCRIPT_H \ No newline at end of file diff --git a/src/rpc/fluid.cpp b/src/rpc/fluid.cpp index 8aaa3d1d9..3b4daef0b 100644 --- a/src/rpc/fluid.cpp +++ b/src/rpc/fluid.cpp @@ -13,6 +13,7 @@ #include "fluid/mining.h" #include "fluid/mint.h" #include "fluid/sovereign.h" +#include "fluid/script.h" #include "init.h" #include "keepass.h" #include "net.h" @@ -56,30 +57,6 @@ struct MiningCompareTimeStamp { } }; -opcodetype getOpcodeFromString(std::string input) -{ - if (input == "OP_MINT") - return OP_MINT; - else if (input == "OP_REWARD_DYNODE") - return OP_REWARD_DYNODE; - else if (input == "OP_REWARD_MINING") - return OP_REWARD_MINING; - else if (input == "OP_SWAP_SOVEREIGN_ADDRESS") - return OP_SWAP_SOVEREIGN_ADDRESS; - else if (input == "OP_UPDATE_FEES") - return OP_UPDATE_FEES; - else if (input == "OP_FREEZE_ADDRESS") - return OP_FREEZE_ADDRESS; - else if (input == "OP_RELEASE_ADDRESS") - return OP_RELEASE_ADDRESS; - else if (input == "OP_BDAP_REVOKE") - return OP_BDAP_REVOKE; - else - return OP_RETURN; - - return OP_RETURN; -}; - UniValue maketoken(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() < 2) { @@ -225,7 +202,7 @@ UniValue sendfluidtransaction(const JSONRPCRequest& request) CScript finalScript; EnsureWalletIsUnlocked(); - opcodetype opcode = getOpcodeFromString(request.params[0].get_str()); + opcodetype opcode = (opcodetype)TranslationTable(request.params[0].get_str()); if (negatif == opcode) throw std::runtime_error("OP_CODE is either not a Fluid OP_CODE or is invalid"); diff --git a/src/script/script.h b/src/script/script.h index 1e542df12..7584eaec1 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -229,9 +229,6 @@ const char* GetOpName(opcodetype opcode); // Identification codes for Fluid and BDAP Transactions enum ProtocolCodes { - MINT_TX = 1, - DYNODE_MODFIY_TX = 2, - MINING_MODIFY_TX = 3, BDAP_NEW_TX = 4, BDAP_DELETE_TX = 5, BDAP_REVOKE_TX = 6, @@ -681,25 +678,9 @@ class CScript : public CScriptBase return (size() > 0 && *begin() == OP_RETURN) || (size() > MAX_SCRIPT_SIZE); } - bool IsProtocolInstruction(const ProtocolCodes& code) const + opcodetype GetFlag() const { - switch (code) { - case MINT_TX: - return (size() > 0 && *begin() == OP_MINT); - break; - case DYNODE_MODFIY_TX: - return (size() > 0 && *begin() == OP_REWARD_DYNODE); - break; - case MINING_MODIFY_TX: - return (size() > 0 && *begin() == OP_REWARD_MINING); - break; - case BDAP_REVOKE_TX: - return (size() > 0 && *begin() == OP_BDAP_REVOKE); - break; - default: - throw std::runtime_error("Protocol code is invalid!"); - } - return false; + return size() > 0 ? static_cast(*begin()) : OP_INVALIDOPCODE; } //TODO: (bdap) test if this is working diff --git a/src/utilstrencodings.cpp b/src/utilstrencodings.cpp index 905dc8a64..aeb9c167f 100644 --- a/src/utilstrencodings.cpp +++ b/src/utilstrencodings.cpp @@ -19,7 +19,8 @@ static const std::string CHARS_ALPHA_NUM = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJ static const std::string SAFE_CHARS[] = { CHARS_ALPHA_NUM + " .,;-_/:?@()", // SAFE_CHARS_DEFAULT - CHARS_ALPHA_NUM + " .,;-_?@" // SAFE_CHARS_UA_COMMENT + CHARS_ALPHA_NUM + " .,;-_?@", // SAFE_CHARS_UA_COMMENT + CHARS_ALPHA_NUM + "_" // SAFE_CHARS_SCRIPT }; std::string SanitizeString(const std::string& str, int rule) diff --git a/src/utilstrencodings.h b/src/utilstrencodings.h index 0e1fd160e..e45d2322f 100644 --- a/src/utilstrencodings.h +++ b/src/utilstrencodings.h @@ -30,7 +30,8 @@ /** Used by SanitizeString() */ enum SafeChars { SAFE_CHARS_DEFAULT, //!< The full set of allowed chars - SAFE_CHARS_UA_COMMENT //!< BIP-0014 subset + SAFE_CHARS_UA_COMMENT,//!< BIP-0014 subset + SAFE_CHARS_SCRIPT //!< Set of characters allowed in a script opcode }; /** From b6a58b50ddf9766a296b0ebcc77f742baf9efcf9 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Thu, 19 Aug 2021 14:17:25 +0530 Subject: [PATCH 11/17] fluid: avoid string comparisons when you can, minor optimizations --- src/fluid/dynode.cpp | 3 +- src/fluid/fluid.cpp | 121 +++++++++++++++++++++++----------------- src/fluid/mining.cpp | 3 +- src/fluid/mint.cpp | 3 +- src/fluid/sovereign.cpp | 3 +- 5 files changed, 74 insertions(+), 59 deletions(-) diff --git a/src/fluid/dynode.cpp b/src/fluid/dynode.cpp index d53859aa7..2b0fd1164 100644 --- a/src/fluid/dynode.cpp +++ b/src/fluid/dynode.cpp @@ -15,7 +15,6 @@ CFluidDynodeDB* pFluidDynodeDB = NULL; bool GetFluidDynodeData(const CScript& scriptPubKey, CFluidDynode& entry) { std::string fluidOperationString = ScriptToAsmStr(scriptPubKey); - std::string strOperationCode = GetRidOfScriptStatement(fluidOperationString, 0); std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); std::vector splitString; verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); @@ -24,7 +23,7 @@ bool GetFluidDynodeData(const CScript& scriptPubKey, CFluidDynode& entry) std::vector vecSplitScript; SeparateFluidOpString(verificationWithoutOpCode, vecSplitScript); - if (vecSplitScript.size() == 5 && strOperationCode == "OP_REWARD_DYNODE") { + if (vecSplitScript.size() == 5 && scriptPubKey.GetFlag() == OP_REWARD_DYNODE) { std::vector vchFluidOperation = CharVectorFromString(fluidOperationString); entry.FluidScript.insert(entry.FluidScript.end(), vchFluidOperation.begin(), vchFluidOperation.end()); std::string strAmount = vecSplitScript[0]; diff --git a/src/fluid/fluid.cpp b/src/fluid/fluid.cpp index 415f3a49e..76fad02a9 100644 --- a/src/fluid/fluid.cpp +++ b/src/fluid/fluid.cpp @@ -54,9 +54,8 @@ bool CFluid::CheckFluidOperationScript(const CScript& fluidScriptPubKey, const i { std::string strFluidOpScript = ScriptToAsmStr(fluidScriptPubKey); std::string verificationWithoutOpCode = GetRidOfScriptStatement(strFluidOpScript); - std::string strOperationCode = GetRidOfScriptStatement(strFluidOpScript, 0); if (!fSkipTimeStampCheck) { - if (!ExtractCheckTimestamp(strOperationCode, strFluidOpScript, timeStamp)) { + if (!ExtractCheckTimestamp(TranslationTable(fluidScriptPubKey.GetFlag()), strFluidOpScript, timeStamp)) { errorMessage = "CheckFluidOperationScript fluid timestamp is too old."; return false; } @@ -65,52 +64,65 @@ bool CFluid::CheckFluidOperationScript(const CScript& fluidScriptPubKey, const i std::string strUnHexedFluidOpScript = stringFromVch(ParseHex(verificationWithoutOpCode)); std::vector vecSplitScript; SeparateString(strUnHexedFluidOpScript, vecSplitScript, "$"); - if (strOperationCode == "OP_MINT" || strOperationCode == "OP_REWARD_MINING" || strOperationCode == "OP_REWARD_DYNODE") { - if (vecSplitScript.size() > 1) { - std::string strAmount = vecSplitScript[0]; - CAmount fluidAmount; - if (ParseFixedPoint(strAmount, 8, &fluidAmount)) { - if ((strOperationCode == "OP_REWARD_MINING" || strOperationCode == "OP_REWARD_DYNODE") && fluidAmount < 0) { - errorMessage = "CheckFluidOperationScript fluid reward amount is less than zero: " + strAmount; - return false; - } else if (strOperationCode == "OP_MINT" && (fluidAmount > FLUID_MAX_FOR_MINT)) { - errorMessage = "CheckFluidOperationScript fluid OP_MINT amount exceeds maximum: " + strAmount; - return false; - } else if (strOperationCode == "OP_REWARD_MINING" && (fluidAmount > FLUID_MAX_REWARD_FOR_MINING)) { - errorMessage = "CheckFluidOperationScript fluid OP_REWARD_MINING amount exceeds maximum: " + strAmount; - return false; - } else if (strOperationCode == "OP_REWARD_DYNODE" && (fluidAmount > FLUID_MAX_REWARD_FOR_DYNODE)) { - errorMessage = "CheckFluidOperationScript fluid OP_REWARD_DYNODE amount exceeds maximum: " + strAmount; - return false; - } + std::string strAmount = vecSplitScript[0]; + CAmount fluidAmount; + switch (fluidScriptPubKey.GetFlag()) { + case OP_MINT: + case OP_REWARD_MINING: + case OP_REWARD_DYNODE: + if (vecSplitScript.size() < 1) { + errorMessage = "CheckFluidOperationScript fluid token invalid. " + strUnHexedFluidOpScript; + return false; } - } else { - errorMessage = "CheckFluidOperationScript fluid token invalid. " + strUnHexedFluidOpScript; - return false; - } - } - else if (strOperationCode == "OP_BDAP_REVOKE") { - if (vecSplitScript.size() > 1) { - if (!fSkipTimeStampCheck) { - for (uint32_t iter = 1; iter != vecSplitScript.size(); iter++) { - CDomainEntry entry; - std::string strBanAccountFQDN = DecodeBase64(vecSplitScript[iter]); - std::vector vchBanAccountFQDN = vchFromString(strBanAccountFQDN); - if (!DomainEntryExists(vchBanAccountFQDN)) { - LogPrintf("%s -- Can't ban %s account because it was not found.\n", __func__, strBanAccountFQDN); - errorMessage = strprintf("Skipping... Can't ban %s account because it was not found.", strBanAccountFQDN); + + if (!ParseFixedPoint(strAmount, 8, &fluidAmount)) { + errorMessage = "Unable to parse " + strAmount + ", not a valid integer!"; + return false; + } + + if (fluidScriptPubKey.GetFlag() == OP_REWARD_MINING || fluidScriptPubKey.GetFlag() == OP_REWARD_DYNODE && fluidAmount < 0) { + errorMessage = "CheckFluidOperationScript fluid reward amount is less than zero: " + strAmount; + return false; + } + + if (fluidScriptPubKey.GetFlag() == OP_MINT && (fluidAmount > FLUID_MAX_FOR_MINT)) { + errorMessage = "CheckFluidOperationScript fluid OP_MINT amount exceeds maximum: " + strAmount; + return false; + } + + if (fluidScriptPubKey.GetFlag() == OP_REWARD_MINING && (fluidAmount > FLUID_MAX_REWARD_FOR_MINING)) { + errorMessage = "CheckFluidOperationScript fluid OP_REWARD_MINING amount exceeds maximum: " + strAmount; + return false; + } + + if (fluidScriptPubKey.GetFlag() == OP_REWARD_DYNODE && (fluidAmount > FLUID_MAX_REWARD_FOR_DYNODE)) { + errorMessage = "CheckFluidOperationScript fluid OP_REWARD_DYNODE amount exceeds maximum: " + strAmount; + return false; + } + break; + case OP_BDAP_REVOKE: + if (vecSplitScript.size() > 1) { + if (!fSkipTimeStampCheck) { + for (uint32_t iter = 1; iter != vecSplitScript.size(); iter++) { + CDomainEntry entry; + std::string strBanAccountFQDN = DecodeBase64(vecSplitScript[iter]); + std::vector vchBanAccountFQDN = vchFromString(strBanAccountFQDN); + if (!DomainEntryExists(vchBanAccountFQDN)) { + LogPrintf("%s -- Can't ban %s account because it was not found.\n", __func__, strBanAccountFQDN); + errorMessage = strprintf("Skipping... Can't ban %s account because it was not found.", strBanAccountFQDN); + } } } } - } - else { - errorMessage = strprintf("CheckFluidOperationScript fluid OP_BDAP_REVOKE incorrect paramaters %d", vecSplitScript.size()); + else { + errorMessage = strprintf("CheckFluidOperationScript fluid OP_BDAP_REVOKE incorrect paramaters %d", vecSplitScript.size()); + return false; + } + break; + default: + errorMessage = strprintf("%s -- %s is an unknown fluid operation", __func__, TranslationTable(fluidScriptPubKey.GetFlag())); return false; - } - } - else { - errorMessage = strprintf("%s -- %s is an unknown fluid operation", __func__, strOperationCode); - return false; + break; } } else { errorMessage = "CheckFluidOperationScript fluid token is not hex. " + verificationWithoutOpCode; @@ -158,7 +170,7 @@ bool CFluid::CheckAccountBanScript(const CScript& fluidScript, const uint256& tx strErrorMessage = "Could not split fluid command script."; return false; } - + for (uint32_t iter = 1; iter != vecSplitScript.size(); iter++) { CDomainEntry entry; std::string strBanAccountFQDN = DecodeBase64(vecSplitScript[iter]); @@ -243,7 +255,7 @@ bool CFluid::GenericConsentMessage(const std::string& message, std::string& sign if (token == "") return false; - + if (!SignTokenMessage(signer, token, digest, false)) return false; @@ -600,12 +612,19 @@ bool CFluid::ExtractTimestampWithAddresses(const std::string& strOpCode, const C return false; std::string strTimeStamp; - if (strOpCode == "OP_MINT" || strOpCode == "OP_REWARD_MINING" || strOpCode == "OP_REWARD_DYNODE") { - strTimeStamp = ptrs.at(1); - } else if (strOpCode == "OP_BDAP_REVOKE") { - strTimeStamp = ptrs.at(0); - } else { - return false; + + switch (fluidScript.GetFlag()) { + case OP_MINT: + case OP_REWARD_MINING: + case OP_REWARD_DYNODE: + strTimeStamp = ptrs.at(1); + break; + case OP_BDAP_REVOKE: + strTimeStamp = ptrs.at(0); + break; + default: + return false; + break; } ScrubString(strTimeStamp, true); diff --git a/src/fluid/mining.cpp b/src/fluid/mining.cpp index b7c98b62c..a98945325 100644 --- a/src/fluid/mining.cpp +++ b/src/fluid/mining.cpp @@ -15,7 +15,6 @@ CFluidMiningDB* pFluidMiningDB = NULL; bool GetFluidMiningData(const CScript& scriptPubKey, CFluidMining& entry) { std::string fluidOperationString = ScriptToAsmStr(scriptPubKey); - std::string strOperationCode = GetRidOfScriptStatement(fluidOperationString, 0); std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); std::vector splitString; verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); @@ -24,7 +23,7 @@ bool GetFluidMiningData(const CScript& scriptPubKey, CFluidMining& entry) std::vector vecSplitScript; SeparateFluidOpString(verificationWithoutOpCode, vecSplitScript); - if (vecSplitScript.size() == 5 && strOperationCode == "OP_REWARD_MINING") { + if (vecSplitScript.size() == 5 && scriptPubKey.GetFlag() == OP_REWARD_MINING) { std::vector vchFluidOperation = CharVectorFromString(fluidOperationString); entry.FluidScript.insert(entry.FluidScript.end(), vchFluidOperation.begin(), vchFluidOperation.end()); std::string strAmount = vecSplitScript[0]; diff --git a/src/fluid/mint.cpp b/src/fluid/mint.cpp index bfe7545e1..fd833f7b1 100644 --- a/src/fluid/mint.cpp +++ b/src/fluid/mint.cpp @@ -16,7 +16,6 @@ CFluidMintDB* pFluidMintDB = NULL; bool GetFluidMintData(const CScript& scriptPubKey, CFluidMint& entry) { std::string fluidOperationString = ScriptToAsmStr(scriptPubKey); - std::string strOperationCode = GetRidOfScriptStatement(fluidOperationString, 0); std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); std::vector splitString; verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); @@ -25,7 +24,7 @@ bool GetFluidMintData(const CScript& scriptPubKey, CFluidMint& entry) std::vector vecSplitScript; SeparateFluidOpString(verificationWithoutOpCode, vecSplitScript); - if (vecSplitScript.size() >= 6 && strOperationCode == "OP_MINT") { + if (vecSplitScript.size() >= 6 && scriptPubKey.GetFlag() == OP_MINT) { std::vector vchFluidOperation = CharVectorFromString(fluidOperationString); entry.FluidScript.insert(entry.FluidScript.end(), vchFluidOperation.begin(), vchFluidOperation.end()); std::string strAmount = vecSplitScript[0]; diff --git a/src/fluid/sovereign.cpp b/src/fluid/sovereign.cpp index 773ee527b..fc6628bb4 100644 --- a/src/fluid/sovereign.cpp +++ b/src/fluid/sovereign.cpp @@ -15,7 +15,6 @@ CFluidSovereignDB* pFluidSovereignDB = NULL; bool GetFluidSovereignData(const CScript& scriptPubKey, CFluidSovereign& entry) { std::string fluidOperationString = ScriptToAsmStr(scriptPubKey); - std::string strOperationCode = GetRidOfScriptStatement(fluidOperationString, 0); std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); std::vector splitString; verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); @@ -24,7 +23,7 @@ bool GetFluidSovereignData(const CScript& scriptPubKey, CFluidSovereign& entry) std::vector vecSplitScript; SeparateFluidOpString(verificationWithoutOpCode, vecSplitScript); - if (vecSplitScript.size() == 5 && strOperationCode == "OP_SWAP_SOVEREIGN_ADDRESS") { + if (vecSplitScript.size() == 5 && scriptPubKey.GetFlag() == OP_SWAP_SOVEREIGN_ADDRESS) { std::vector vchFluidOperation = CharVectorFromString(fluidOperationString); entry.FluidScript.insert(entry.FluidScript.end(), vchFluidOperation.begin(), vchFluidOperation.end()); entry.SovereignAddresses.clear(); From 8d7c1107b08878210f36bf6d690fe589e99dce08 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Fri, 20 Aug 2021 00:02:14 +0530 Subject: [PATCH 12/17] fluid: refactoring, cleanup portions of validation logic --- src/fluid/db.cpp | 4 +- src/fluid/fluid.cpp | 142 +++++++++++++++++------------------------- src/fluid/fluid.h | 20 +++--- src/rpc/fluid.cpp | 14 ++--- src/validation.cpp | 18 +++--- src/wallet/wallet.cpp | 4 +- 6 files changed, 86 insertions(+), 116 deletions(-) diff --git a/src/fluid/db.cpp b/src/fluid/db.cpp index a82713057..091c91628 100644 --- a/src/fluid/db.cpp +++ b/src/fluid/db.cpp @@ -13,7 +13,7 @@ CAmount GetFluidDynodeReward(const int nHeight) { assert(pFluidDynodeDB); - if (fluid.FLUID_ACTIVATE_HEIGHT > nHeight) + if (FLUID_ACTIVATE_HEIGHT > nHeight) return GetStandardDynodePayment(nHeight); if (pFluidDynodeDB->IsEmpty()) @@ -34,7 +34,7 @@ CAmount GetFluidMiningReward(const int nHeight) { assert(pFluidMiningDB); - if (fluid.FLUID_ACTIVATE_HEIGHT > nHeight) + if (FLUID_ACTIVATE_HEIGHT > nHeight) return GetStandardPoWBlockPayment(nHeight); if (pFluidMiningDB->IsEmpty()) diff --git a/src/fluid/fluid.cpp b/src/fluid/fluid.cpp index 76fad02a9..e58904246 100644 --- a/src/fluid/fluid.cpp +++ b/src/fluid/fluid.cpp @@ -50,125 +50,95 @@ int GetFluidOpCode(const CScript& fluidScript) } /** Checks fluid transactoin operation script amount for invalid values. */ -bool CFluid::CheckFluidOperationScript(const CScript& fluidScriptPubKey, const int64_t& timeStamp, std::string& errorMessage, const bool fSkipTimeStampCheck) +bool CFluid::CheckFluidOperationScript(const CScript& fluidScriptPubKey, const int64_t& timeStamp, const bool fSkipTimeStampCheck) { std::string strFluidOpScript = ScriptToAsmStr(fluidScriptPubKey); std::string verificationWithoutOpCode = GetRidOfScriptStatement(strFluidOpScript); if (!fSkipTimeStampCheck) { if (!ExtractCheckTimestamp(TranslationTable(fluidScriptPubKey.GetFlag()), strFluidOpScript, timeStamp)) { - errorMessage = "CheckFluidOperationScript fluid timestamp is too old."; - return false; + return error("%s: Timestamp is too old", __PRETTY_FUNCTION__); } } - if (IsHex(verificationWithoutOpCode)) { - std::string strUnHexedFluidOpScript = stringFromVch(ParseHex(verificationWithoutOpCode)); - std::vector vecSplitScript; - SeparateString(strUnHexedFluidOpScript, vecSplitScript, "$"); - std::string strAmount = vecSplitScript[0]; - CAmount fluidAmount; - switch (fluidScriptPubKey.GetFlag()) { - case OP_MINT: - case OP_REWARD_MINING: - case OP_REWARD_DYNODE: - if (vecSplitScript.size() < 1) { - errorMessage = "CheckFluidOperationScript fluid token invalid. " + strUnHexedFluidOpScript; - return false; - } - if (!ParseFixedPoint(strAmount, 8, &fluidAmount)) { - errorMessage = "Unable to parse " + strAmount + ", not a valid integer!"; - return false; - } + if (!IsHex(verificationWithoutOpCode)) + return error("%s: Not encoded in valid format", __PRETTY_FUNCTION__); - if (fluidScriptPubKey.GetFlag() == OP_REWARD_MINING || fluidScriptPubKey.GetFlag() == OP_REWARD_DYNODE && fluidAmount < 0) { - errorMessage = "CheckFluidOperationScript fluid reward amount is less than zero: " + strAmount; - return false; - } + std::string strUnHexedFluidOpScript = stringFromVch(ParseHex(verificationWithoutOpCode)); + std::vector vecSplitScript; + SeparateString(strUnHexedFluidOpScript, vecSplitScript, "$"); + std::string strAmount = vecSplitScript[0]; + CAmount fluidAmount; + switch (fluidScriptPubKey.GetFlag()) { + case OP_MINT: + case OP_REWARD_MINING: + case OP_REWARD_DYNODE: + if (vecSplitScript.size() < 1) + return error("%s: Token string is an invalid size", __PRETTY_FUNCTION__); - if (fluidScriptPubKey.GetFlag() == OP_MINT && (fluidAmount > FLUID_MAX_FOR_MINT)) { - errorMessage = "CheckFluidOperationScript fluid OP_MINT amount exceeds maximum: " + strAmount; - return false; - } + if (!ParseFixedPoint(strAmount, 8, &fluidAmount)) + return error("%s: Unable to parse \"%s\" as integer", __PRETTY_FUNCTION__, strAmount); - if (fluidScriptPubKey.GetFlag() == OP_REWARD_MINING && (fluidAmount > FLUID_MAX_REWARD_FOR_MINING)) { - errorMessage = "CheckFluidOperationScript fluid OP_REWARD_MINING amount exceeds maximum: " + strAmount; - return false; - } + if (fluidScriptPubKey.GetFlag() == OP_REWARD_MINING || fluidScriptPubKey.GetFlag() == OP_REWARD_DYNODE && fluidAmount < 0) + return error("%s: Reward cannot be less than zero, attempted to set as \"%s\" instead", __PRETTY_FUNCTION__, strAmount); - if (fluidScriptPubKey.GetFlag() == OP_REWARD_DYNODE && (fluidAmount > FLUID_MAX_REWARD_FOR_DYNODE)) { - errorMessage = "CheckFluidOperationScript fluid OP_REWARD_DYNODE amount exceeds maximum: " + strAmount; - return false; - } - break; - case OP_BDAP_REVOKE: - if (vecSplitScript.size() > 1) { - if (!fSkipTimeStampCheck) { - for (uint32_t iter = 1; iter != vecSplitScript.size(); iter++) { - CDomainEntry entry; - std::string strBanAccountFQDN = DecodeBase64(vecSplitScript[iter]); - std::vector vchBanAccountFQDN = vchFromString(strBanAccountFQDN); - if (!DomainEntryExists(vchBanAccountFQDN)) { - LogPrintf("%s -- Can't ban %s account because it was not found.\n", __func__, strBanAccountFQDN); - errorMessage = strprintf("Skipping... Can't ban %s account because it was not found.", strBanAccountFQDN); - } + if (fluidScriptPubKey.GetFlag() == OP_MINT && (fluidAmount > FLUID_MAX_FOR_MINT)) + return error("%s: Reward cannot exceed %s, attempted to set as \"%s\" instead", __PRETTY_FUNCTION__, FLUID_MAX_FOR_MINT, strAmount); + + if (fluidScriptPubKey.GetFlag() == OP_REWARD_MINING && (fluidAmount > FLUID_MAX_REWARD_FOR_MINING)) + return error("%s: Reward cannot exceed %s, attempted to set as \"%s\" instead", __PRETTY_FUNCTION__, FLUID_MAX_REWARD_FOR_MINING, strAmount); + + if (fluidScriptPubKey.GetFlag() == OP_REWARD_DYNODE && (fluidAmount > FLUID_MAX_REWARD_FOR_DYNODE)) + return error("%s: Reward cannot exceed %s, attempted to set as \"%s\" instead", __PRETTY_FUNCTION__, FLUID_MAX_REWARD_FOR_DYNODE, strAmount); + break; + case OP_BDAP_REVOKE: + if (vecSplitScript.size() > 1) { + if (!fSkipTimeStampCheck) { + for (uint32_t iter = 1; iter != vecSplitScript.size(); iter++) { + if (!DomainEntryExists(vchFromString(DecodeBase64(vecSplitScript[iter])))) { + LogPrintf("%s: Unable to ban at index %d, not found\n", __PRETTY_FUNCTION__, iter); } } } - else { - errorMessage = strprintf("CheckFluidOperationScript fluid OP_BDAP_REVOKE incorrect paramaters %d", vecSplitScript.size()); - return false; - } - break; - default: - errorMessage = strprintf("%s -- %s is an unknown fluid operation", __func__, TranslationTable(fluidScriptPubKey.GetFlag())); - return false; - break; - } - } else { - errorMessage = "CheckFluidOperationScript fluid token is not hex. " + verificationWithoutOpCode; - return false; + } + else { + return error("%s: OP_BDAP_REVOKE met with incorrect parameter size %d", __PRETTY_FUNCTION__, vecSplitScript.size()); + } + break; + default: + return error("%s: Invalid opcode \"%s\" called in Fluid routine", __PRETTY_FUNCTION__, TranslationTable(fluidScriptPubKey.GetFlag())); + break; } return true; } /** Checks whether fluid transaction is in the memory pool already */ -bool CFluid::CheckIfExistsInMemPool(const CTxMemPool& pool, const CScript& fluidScriptPubKey, std::string& errorMessage) +bool CFluid::CheckIfExistsInMemPool(const CTxMemPool& pool, const CScript& fluidScriptPubKey) { for (const CTxMemPoolEntry& e : pool.mapTx) { const CTransaction& tx = e.GetTx(); for (const CTxOut& txOut : tx.vout) { if (IsTransactionFluid(txOut.scriptPubKey)) { - std::string strNewFluidScript = ScriptToAsmStr(fluidScriptPubKey); - std::string strMemPoolFluidScript = ScriptToAsmStr(txOut.scriptPubKey); - std::string strNewTxWithoutOpCode = GetRidOfScriptStatement(strNewFluidScript); - std::string strMemPoolTxWithoutOpCode = GetRidOfScriptStatement(strMemPoolFluidScript); - if (strNewTxWithoutOpCode == strMemPoolTxWithoutOpCode) { - errorMessage = "CheckIfExistsInMemPool: fluid transaction is already in the memory pool!"; - LogPrintf("CheckIfExistsInMemPool: fluid transaction, %s is already in the memory pool! %s\n", tx.GetHash().ToString(), strNewTxWithoutOpCode); - return true; - } + return (GetRidOfScriptStatement(ScriptToAsmStr(fluidScriptPubKey)) == GetRidOfScriptStatement(ScriptToAsmStr(txOut.scriptPubKey))); } } } - return false; } -bool CFluid::CheckAccountBanScript(const CScript& fluidScript, const uint256& txHashId, const unsigned int& nHeight, std::vector& vBanAccounts, std::string& strErrorMessage) +bool CFluid::CheckAccountBanScript(const CScript& fluidScript, const uint256& txHashId, const unsigned int& nHeight, std::vector& vBanAccounts) { std::string strFluidOpScript = ScriptToAsmStr(fluidScript); std::string verificationWithoutOpCode = GetRidOfScriptStatement(strFluidOpScript); - if (!IsHex(verificationWithoutOpCode)) { - strErrorMessage = "Fluid token is not a valid hexidecimal value."; - return false; - } + + if (!IsHex(verificationWithoutOpCode)) + return error("%s: Not encoded in valid format", __PRETTY_FUNCTION__); + std::string strUnHexedFluidOpScript = stringFromVch(ParseHex(verificationWithoutOpCode)); std::vector vecSplitScript; SeparateString(strUnHexedFluidOpScript, vecSplitScript, "$"); if (vecSplitScript.size() == 0) { - strErrorMessage = "Could not split fluid command script."; - return false; + return error("%s: Message payload is of invalid length, reported size: %d", vecSplitScript.size());; } for (uint32_t iter = 1; iter != vecSplitScript.size(); iter++) { @@ -179,7 +149,7 @@ bool CFluid::CheckAccountBanScript(const CScript& fluidScript, const uint256& tx vBanAccounts.push_back(entry); } else { - LogPrintf("%s -- Skipping... Can't ban %s account because it was not found.\n", __func__, strBanAccountFQDN); + LogPrintf("%s -- Skipping... Can't ban %s account because it was not found.\n", __PRETTY_FUNCTION__, strBanAccountFQDN); } } @@ -295,7 +265,7 @@ bool CFluid::ExtractCheckTimestamp(const std::string& strOpCode, const std::stri ScrubString(ls, true); int64_t tokenTimeStamp; ParseInt64(ls, &tokenTimeStamp); - if (timeStamp > tokenTimeStamp + fluid.MAX_FLUID_TIME_DISTORT) + if (timeStamp > tokenTimeStamp + MAX_FLUID_TIME_DISTORT) return false; return true; @@ -336,7 +306,7 @@ bool CFluid::GenericParseNumber(const std::string consentToken, const int64_t ti int64_t tokenTimeStamp; ParseInt64(ls, &tokenTimeStamp); - if (timeStamp > tokenTimeStamp + fluid.MAX_FLUID_TIME_DISTORT && !txCheckPurpose) + if (timeStamp > tokenTimeStamp + MAX_FLUID_TIME_DISTORT && !txCheckPurpose) return false; ParseFixedPoint(lr, 8, &coinAmount); @@ -350,7 +320,7 @@ CDynamicAddress CFluid::GetAddressFromDigestSignature(const std::string& digestS std::vector vchSig = DecodeBase64(digestSignature.c_str(), &fInvalid); if (fInvalid) { - LogPrintf("GetAddressFromDigestSignature(): Digest Signature Found Invalid, Signature: %s \n", digestSignature); + LogPrintf("%s: Digest Signature Found Invalid, Signature: %s \n", __PRETTY_FUNCTION__, digestSignature); return nullptr; } @@ -361,7 +331,7 @@ CDynamicAddress CFluid::GetAddressFromDigestSignature(const std::string& digestS CPubKey pubkey; if (!pubkey.RecoverCompact(ss.GetHash(), vchSig)) { - LogPrintf("GetAddressFromDigestSignature(): Public Key Recovery Failed! Hash: %s\n", ss.GetHash().ToString()); + LogPrintf("%s: Public Key recovery failed, hash: %s\n", __PRETTY_FUNCTION__, ss.GetHash().ToString()); return nullptr; } CDynamicAddress newAddress; @@ -409,7 +379,7 @@ bool CFluid::ParseMintKey(const int64_t& nTime, CDynamicAddress& destination, CA int64_t tokenTimeStamp; ParseInt64(ls, &tokenTimeStamp); - if (nTime > tokenTimeStamp + fluid.MAX_FLUID_TIME_DISTORT && !txCheckPurpose) + if (nTime > tokenTimeStamp + MAX_FLUID_TIME_DISTORT && !txCheckPurpose) return false; ParseFixedPoint(lr, 8, &coinAmount); diff --git a/src/fluid/fluid.h b/src/fluid/fluid.h index b5048bb39..6cb0a7d14 100644 --- a/src/fluid/fluid.h +++ b/src/fluid/fluid.h @@ -25,21 +25,21 @@ class CTxMemPool; struct CBlockTemplate; class CTransaction; +static const int FLUID_ACTIVATE_HEIGHT = 10; +static const int64_t MAX_FLUID_TIME_DISTORT = 60 * 60; // Maximum time distort = 1 hour. +static const CAmount FLUID_TRANSACTION_COST = 100000 * COIN; // Cost to send a fluid transaction +static const CAmount FLUID_MAX_REWARD_FOR_DYNODE = 1000 * COIN; // Max dynode block reward using fluid OP_REWARD_DYNODE +static const CAmount FLUID_MAX_REWARD_FOR_MINING = 1000 * COIN; // Max mining block reward using fluid OP_REWARD_MINING +static const CAmount FLUID_MAX_FOR_MINT = 1000000000 * COIN; // Max minting amount per fluid transaction + /** Fluid Asset Management Framework */ class CFluid { public: - static const int FLUID_ACTIVATE_HEIGHT = 10; - static const int64_t MAX_FLUID_TIME_DISTORT = 60 * 60; // Maximum time distort = 1 hour. - static const CAmount FLUID_TRANSACTION_COST = 100000 * COIN; // Cost to send a fluid transaction - static const CAmount FLUID_MAX_REWARD_FOR_DYNODE = 1000 * COIN; // Max dynode block reward using fluid OP_REWARD_DYNODE - static const CAmount FLUID_MAX_REWARD_FOR_MINING = 1000 * COIN; // Max mining block reward using fluid OP_REWARD_MINING - static const CAmount FLUID_MAX_FOR_MINT = 1000000000 * COIN; // Max minting amount per fluid transaction - void ReplaceFluidSovereigns(const CBlockHeader& blockHeader, std::vector& fluidSovereigns); - bool CheckFluidOperationScript(const CScript& fluidScriptPubKey, const int64_t& timeStamp, std::string& errorMessage, const bool fSkipTimeStampCheck = false); - bool CheckIfExistsInMemPool(const CTxMemPool& pool, const CScript& fluidScriptPubKey, std::string& errorMessage); + bool CheckFluidOperationScript(const CScript& fluidScriptPubKey, const int64_t& timeStamp, const bool fSkipTimeStampCheck = false); + bool CheckIfExistsInMemPool(const CTxMemPool& pool, const CScript& fluidScriptPubKey); bool CheckIfQuorumExists(const std::string& consentToken, std::string& message, const bool individual = false); bool CheckNonScriptQuorum(const std::string& consentToken, std::string& message, const bool individual = false); bool CheckTransactionInRecord(const CScript& fluidInstruction, CBlockIndex* pindex = NULL); @@ -60,7 +60,7 @@ class CFluid bool ProvisionalCheckTransaction(const CTransaction& transaction); CDynamicAddress GetAddressFromDigestSignature(const std::string& digestSignature, const std::string& messageTokenKey); - bool CheckAccountBanScript(const CScript& fluidScript, const uint256& txHashId, const unsigned int& nHeight, std::vector& vBanAccounts, std::string& strErrorMessage); + bool CheckAccountBanScript(const CScript& fluidScript, const uint256& txHashId, const unsigned int& nHeight, std::vector& vBanAccounts); bool ExtractTimestampWithAddresses(const std::string& strOpCode, const CScript& fluidScript, int64_t& nTimeStamp, std::vector>& vSovereignAddresses); }; diff --git a/src/rpc/fluid.cpp b/src/rpc/fluid.cpp index 3b4daef0b..3d153778f 100644 --- a/src/rpc/fluid.cpp +++ b/src/rpc/fluid.cpp @@ -218,7 +218,7 @@ UniValue sendfluidtransaction(const JSONRPCRequest& request) if (opcode == OP_MINT || opcode == OP_REWARD_MINING || opcode == OP_REWARD_DYNODE || opcode == OP_BDAP_REVOKE) { CWalletTx wtx; - SendCustomTransaction(finalScript, wtx, fluid.FLUID_TRANSACTION_COST, false); + SendCustomTransaction(finalScript, wtx, FLUID_TRANSACTION_COST, false); return wtx.GetHash().GetHex(); } else { throw std::runtime_error(strprintf("OP_CODE, %s, not implemented yet!", request.params[0].get_str())); @@ -356,7 +356,7 @@ UniValue getfluidhistoryraw(const JSONRPCRequest& request) std::string addLabel = "mint_" + std::to_string(x); oMints.push_back(Pair(addLabel, obj)); totalMintedCoins = totalMintedCoins + mintEntry.MintAmount; - totalFluidTxCost = totalFluidTxCost + fluid.FLUID_TRANSACTION_COST; + totalFluidTxCost = totalFluidTxCost + FLUID_TRANSACTION_COST; x++; nTotal++; } @@ -375,7 +375,7 @@ UniValue getfluidhistoryraw(const JSONRPCRequest& request) obj.push_back(Pair("fluid_script", StringFromCharVector(dynEntry.FluidScript))); std::string addLabel = "reward_update_" + std::to_string(x); oDynodes.push_back(Pair(addLabel, obj)); - totalFluidTxCost = totalFluidTxCost + fluid.FLUID_TRANSACTION_COST; + totalFluidTxCost = totalFluidTxCost + FLUID_TRANSACTION_COST; x++; nTotal++; } @@ -394,7 +394,7 @@ UniValue getfluidhistoryraw(const JSONRPCRequest& request) obj.push_back(Pair("fluid_script", StringFromCharVector(miningEntry.FluidScript))); std::string addLabel = "reward_update_" + std::to_string(x); oMining.push_back(Pair(addLabel, obj)); - totalFluidTxCost = totalFluidTxCost + fluid.FLUID_TRANSACTION_COST; + totalFluidTxCost = totalFluidTxCost + FLUID_TRANSACTION_COST; x++; nTotal++; } @@ -493,7 +493,7 @@ UniValue getfluidhistory(const JSONRPCRequest& request) std::string addLabel = "mint_" + std::to_string(x); oMints.push_back(Pair(addLabel, obj)); totalMintedCoins = totalMintedCoins + mintEntry.MintAmount; - totalFluidTxCost = totalFluidTxCost + fluid.FLUID_TRANSACTION_COST; + totalFluidTxCost = totalFluidTxCost + FLUID_TRANSACTION_COST; x++; nTotal++; } @@ -524,7 +524,7 @@ UniValue getfluidhistory(const JSONRPCRequest& request) } std::string addLabel = "reward_update_" + std::to_string(x); oDynodes.push_back(Pair(addLabel, obj)); - totalFluidTxCost = totalFluidTxCost + fluid.FLUID_TRANSACTION_COST; + totalFluidTxCost = totalFluidTxCost + FLUID_TRANSACTION_COST; x++; nTotal++; } @@ -555,7 +555,7 @@ UniValue getfluidhistory(const JSONRPCRequest& request) } std::string addLabel = "reward_update_" + std::to_string(x); oMining.push_back(Pair(addLabel, obj)); - totalFluidTxCost = totalFluidTxCost + fluid.FLUID_TRANSACTION_COST; + totalFluidTxCost = totalFluidTxCost + FLUID_TRANSACTION_COST; x++; nTotal++; } diff --git a/src/validation.cpp b/src/validation.cpp index dd1910eef..74017e1b4 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -274,14 +274,14 @@ bool IsFinalTx(const CTransaction& tx, int nBlockHeight, int64_t nBlockTime) if ((int64_t)tx.nLockTime < ((int64_t)tx.nLockTime < LOCKTIME_THRESHOLD ? (int64_t)nBlockHeight : nBlockTime)) return true; - if (nBlockHeight >= fluid.FLUID_ACTIVATE_HEIGHT) { + if (nBlockHeight >= FLUID_ACTIVATE_HEIGHT) { if (!fluid.ProvisionalCheckTransaction(tx)) return false; CScript scriptFluid; if (IsTransactionFluid(tx, scriptFluid)) { std::string strErrorMessage; - if (!fluid.CheckFluidOperationScript(scriptFluid, nBlockTime, strErrorMessage)) { + if (!fluid.CheckFluidOperationScript(scriptFluid, nBlockTime)) { return false; } } @@ -574,7 +574,7 @@ bool CheckTransaction(const CTransaction& tx, CValidationState& state) if (!MoneyRange(nValueOut)) return state.DoS(100, false, REJECT_INVALID, "bad-txns-txouttotal-toolarge"); if (IsTransactionFluid(txout.scriptPubKey)) { - if (fluid.FLUID_TRANSACTION_COST > txout.nValue) + if (FLUID_TRANSACTION_COST > txout.nValue) return state.DoS(100, false, REJECT_INVALID, "bad-txns-fluid-vout-amount-toolow"); if (!fluid.ValidationProcesses(state, txout.scriptPubKey, txout.nValue)) return state.DoS(100, false, REJECT_INVALID, "bad-txns-fluid-validate-failure"); @@ -959,7 +959,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C fluidTransaction = true; std::string strErrorMessage; // Check if fluid transaction is already in the mempool - if (fluid.CheckIfExistsInMemPool(pool, txout.scriptPubKey, strErrorMessage)) { + if (fluid.CheckIfExistsInMemPool(pool, txout.scriptPubKey)) { // fluid transaction is already in the mempool. Reject tx. return state.DoS(100, false, REJECT_INVALID, strErrorMessage); } @@ -972,7 +972,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C if (!fluid.ExtractCheckTimestamp(strOperationCode, ScriptToAsmStr(txout.scriptPubKey), GetTime())) { return state.DoS(100, false, REJECT_INVALID, "fluid-tx-timestamp-error"); } - if (!fluid.CheckFluidOperationScript(txout.scriptPubKey, GetTime(), strErrorMessage, true)) { + if (!fluid.CheckFluidOperationScript(txout.scriptPubKey, GetTime(), true)) { return state.DoS(100, false, REJECT_INVALID, strErrorMessage); } } @@ -1750,7 +1750,7 @@ bool AcceptToMemoryPoolWithTime(CTxMemPool& pool, CValidationState& state, const BOOST_FOREACH (const CTxOut& txout, tx->vout) { if (IsTransactionFluid(txout.scriptPubKey)) { std::string strErrorMessage; - if (!fluid.CheckFluidOperationScript(txout.scriptPubKey, GetTime(), strErrorMessage)) { + if (!fluid.CheckFluidOperationScript(txout.scriptPubKey, GetTime())) { fluidTimestampCheck = false; } } @@ -2941,7 +2941,7 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd CAmount newMintIssuance = 0; CDynamicAddress mintAddress; - if (prevIndex->nHeight + 1 >= fluid.FLUID_ACTIVATE_HEIGHT) { + if (prevIndex->nHeight + 1 >= FLUID_ACTIVATE_HEIGHT) { CFluidMint fluidMint; if (GetMintingInstructions(pindex->nHeight, fluidMint)) { newMintIssuance = fluidMint.MintAmount; @@ -3000,7 +3000,7 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd // return state.DoS(0, error("%s: BDAP spork is inactive.", __func__), REJECT_INVALID, "bdap-spork-inactive"); std::vector vBanAccounts; - if (!fluid.CheckAccountBanScript(scriptFluid, tx.GetHash(), pindex->nHeight, vBanAccounts, strError)) + if (!fluid.CheckAccountBanScript(scriptFluid, tx.GetHash(), pindex->nHeight, vBanAccounts)) return state.DoS(0, error("%s -- CheckAccountBanScript failed: %s", __func__, strError), REJECT_INVALID, "fluid-ban-script-invalid"); int64_t nTimeStamp; @@ -4118,7 +4118,7 @@ bool CheckBlock(const CBlock& block, CValidationState& state, const Consensus::P for (const auto& txout : tx->vout) { if (IsTransactionFluid(txout.scriptPubKey)) { std::string strErrorMessage; - if (!fluid.CheckFluidOperationScript(txout.scriptPubKey, block.nTime, strErrorMessage)) { + if (!fluid.CheckFluidOperationScript(txout.scriptPubKey, block.nTime)) { return error("CheckBlock(): %s, Block %s failed with %s", strErrorMessage, tx->GetHash().ToString(), diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 68f552f49..061101f41 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -4064,12 +4064,12 @@ bool CWallet::CreateTransaction(const std::vector& vecSend, CWalletT if (IsTransactionFluid(recipient.scriptPubKey)) { // Check if fluid transaction is already in the mempool - if (fluid.CheckIfExistsInMemPool(mempool, recipient.scriptPubKey, strFailReason)) { + if (fluid.CheckIfExistsInMemPool(mempool, recipient.scriptPubKey)) { // fluid transaction is already in the mempool. Invalid transaction. return false; } // Check the validity of the fluid transaction's public script. - if (!fluid.CheckFluidOperationScript(recipient.scriptPubKey, GetTime(), strFailReason)) { + if (!fluid.CheckFluidOperationScript(recipient.scriptPubKey, GetTime())) { return false; } } From 30f21063a3f8f02e807e8580ffa42a16caea71d6 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Sun, 29 Aug 2021 17:59:50 +0530 Subject: [PATCH 13/17] fluid: remove repetitive scan logic, unify object structures --- src/fluid/dynode.cpp | 35 +------------------- src/fluid/dynode.h | 8 +++++ src/fluid/fluid.cpp | 71 +++++++++++++++++++++++++++++++++++++++- src/fluid/fluid.h | 3 ++ src/fluid/mining.cpp | 35 +------------------- src/fluid/mining.h | 8 +++++ src/fluid/mint.cpp | 38 +-------------------- src/fluid/mint.h | 7 ++++ src/fluid/operations.cpp | 17 ++++++++++ src/fluid/operations.h | 3 ++ src/fluid/sovereign.cpp | 25 +------------- src/fluid/sovereign.h | 7 ++++ 12 files changed, 127 insertions(+), 130 deletions(-) diff --git a/src/fluid/dynode.cpp b/src/fluid/dynode.cpp index 2b0fd1164..6adbf9c4b 100644 --- a/src/fluid/dynode.cpp +++ b/src/fluid/dynode.cpp @@ -14,40 +14,7 @@ CFluidDynodeDB* pFluidDynodeDB = NULL; bool GetFluidDynodeData(const CScript& scriptPubKey, CFluidDynode& entry) { - std::string fluidOperationString = ScriptToAsmStr(scriptPubKey); - std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); - std::vector splitString; - verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); - SeparateString(verificationWithoutOpCode, splitString, false); - std::string messageTokenKey = splitString.at(0); - std::vector vecSplitScript; - SeparateFluidOpString(verificationWithoutOpCode, vecSplitScript); - - if (vecSplitScript.size() == 5 && scriptPubKey.GetFlag() == OP_REWARD_DYNODE) { - std::vector vchFluidOperation = CharVectorFromString(fluidOperationString); - entry.FluidScript.insert(entry.FluidScript.end(), vchFluidOperation.begin(), vchFluidOperation.end()); - std::string strAmount = vecSplitScript[0]; - CAmount fluidAmount; - if (ParseFixedPoint(strAmount, 8, &fluidAmount)) { - entry.DynodeReward = fluidAmount; - } - std::string strTimeStamp = vecSplitScript[1]; - int64_t tokenTimeStamp; - if (ParseInt64(strTimeStamp, &tokenTimeStamp)) { - entry.nTimeStamp = tokenTimeStamp; - } - entry.SovereignAddresses.clear(); - for (int i = 2; i > 5; i++) { - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[i], messageTokenKey).ToString())); - } - - LogPrintf("GetFluidDynodeData: strAmount = %s, strTimeStamp = %d, Addresses1 = %s, Addresses2 = %s, Addresses3 = %s \n", - strAmount, entry.nTimeStamp, StringFromCharVector(entry.SovereignAddresses[0]), - StringFromCharVector(entry.SovereignAddresses[1]), StringFromCharVector(entry.SovereignAddresses[2])); - - return true; - } - return false; + return ParseScript(scriptPubKey, entry); } bool GetFluidDynodeData(const CTransaction& tx, CFluidDynode& entry, int& nOut) diff --git a/src/fluid/dynode.h b/src/fluid/dynode.h index 0699b149a..d4d7650cb 100644 --- a/src/fluid/dynode.h +++ b/src/fluid/dynode.h @@ -24,6 +24,7 @@ class CFluidDynode std::vector > SovereignAddresses; uint256 txHash; unsigned int nHeight; + std::vector DestinationAddress; CFluidDynode() { @@ -42,6 +43,13 @@ class CFluidDynode UnserializeFromScript(fluidScript); } + void Initialise(std::vector _vch, CAmount _amt, int64_t _t) + { + FluidScript = _vch; + DynodeReward = _amt; + nTimeStamp = _t; + } + inline void SetNull() { nVersion = CFluidDynode::CURRENT_VERSION; diff --git a/src/fluid/fluid.cpp b/src/fluid/fluid.cpp index e58904246..ea6ffdcf2 100644 --- a/src/fluid/fluid.cpp +++ b/src/fluid/fluid.cpp @@ -16,7 +16,11 @@ #include "utilmoneystr.h" #include "utiltime.h" #include "validation.h" +#include "fluid/dynode.h" +#include "fluid/mint.h" +#include "fluid/mining.h" #include "fluid/script.h" +#include "fluid/sovereign.h" #include "wallet/wallet.h" #include "wallet/walletdb.h" @@ -611,4 +615,69 @@ bool CFluid::ExtractTimestampWithAddresses(const std::string& strOpCode, const C return false; } return true; -} \ No newline at end of file +} + +template +bool ParseScript(const CScript& scriptPubKey, T1& object) +{ + std::vector ser_fields; + std::string payload; int s, e; + payload = stringFromVch(ParseHex(GetRidOfScriptStatement(ScriptToAsmStr(scriptPubKey)))); + SeparateString(payload, ser_fields, false); + payload = ser_fields.at(0); ser_fields ={}; + SeparateFluidOpString(payload, ser_fields); + + if (ser_fields.size() != 5 && scriptPubKey.GetFlag() != OP_MINT) + return false; + + try { + switch (scriptPubKey.GetFlag()) + { + case OP_MINT: + object.DestinationAddress = CharVectorFromString(ser_fields[2]); + case OP_REWARD_DYNODE: + case OP_REWARD_MINING: + object.Initialise( + CharVectorFromString(ScriptToAsmStr(scriptPubKey)), /* Byte Vector of Script */ + ParseFixedPoint(ser_fields[0]), /* int64_t field one */ + ParseInt64(ser_fields[1]) /* int64_t field two */ + ); + (scriptPubKey.GetFlag() == OP_MINT) ? s = 3, e = 6 : s = 2, e = 5; + break; + case OP_SWAP_SOVEREIGN_ADDRESS: + object.Initialise( + CharVectorFromString(ScriptToAsmStr(scriptPubKey)), /* Byte Vector of Script */ + ParseInt64(ser_fields[5]), /* int64_t field two */ + 0 /* null */ + ); s = 0; e = 5; + break; + default: + return false; + } + } catch (...) { + return false; + } + + for (; s > e; s++) { + object.SovereignAddresses.push_back( + CharVectorFromString( + fluid.GetAddressFromDigestSignature(ser_fields[s], payload).ToString() + ) + ); + } + + // Debug + LogPrintf("%s: vector contents: ", __PRETTY_FUNCTION__); + for (auto& value : ser_fields) { + LogPrintf("%s, ", value); + } + LogPrintf("\n"); + // End Debug + + return object.IsNull(); +} + +template bool ParseScript(const CScript& scriptPubKey, CFluidMint& object); +template bool ParseScript(const CScript& scriptPubKey, CFluidMining& object); +template bool ParseScript(const CScript& scriptPubKey, CFluidDynode& object); +template bool ParseScript(const CScript& scriptPubKey, CFluidSovereign& object); diff --git a/src/fluid/fluid.h b/src/fluid/fluid.h index 6cb0a7d14..ff3d02848 100644 --- a/src/fluid/fluid.h +++ b/src/fluid/fluid.h @@ -79,6 +79,9 @@ std::string StringFromCharVector(const std::vector& vch); std::vector FluidScriptToCharVector(const CScript& fluidScript); bool GetFluidBlock(const CBlockIndex* pblockindex, CBlock& block); +template +bool ParseScript(const CScript& scriptPubKey, T1& object); + extern CFluid fluid; #endif // FLUID_PROTOCOL_H diff --git a/src/fluid/mining.cpp b/src/fluid/mining.cpp index a98945325..7a393d320 100644 --- a/src/fluid/mining.cpp +++ b/src/fluid/mining.cpp @@ -14,40 +14,7 @@ CFluidMiningDB* pFluidMiningDB = NULL; bool GetFluidMiningData(const CScript& scriptPubKey, CFluidMining& entry) { - std::string fluidOperationString = ScriptToAsmStr(scriptPubKey); - std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); - std::vector splitString; - verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); - SeparateString(verificationWithoutOpCode, splitString, false); - std::string messageTokenKey = splitString.at(0); - std::vector vecSplitScript; - SeparateFluidOpString(verificationWithoutOpCode, vecSplitScript); - - if (vecSplitScript.size() == 5 && scriptPubKey.GetFlag() == OP_REWARD_MINING) { - std::vector vchFluidOperation = CharVectorFromString(fluidOperationString); - entry.FluidScript.insert(entry.FluidScript.end(), vchFluidOperation.begin(), vchFluidOperation.end()); - std::string strAmount = vecSplitScript[0]; - CAmount fluidAmount; - if (ParseFixedPoint(strAmount, 8, &fluidAmount)) { - entry.MiningReward = fluidAmount; - } - std::string strTimeStamp = vecSplitScript[1]; - int64_t tokenTimeStamp; - if (ParseInt64(strTimeStamp, &tokenTimeStamp)) { - entry.nTimeStamp = tokenTimeStamp; - } - entry.SovereignAddresses.clear(); - for (int i = 2; i > 5; i++) { - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[i], messageTokenKey).ToString())); - } - - LogPrintf("GetFluidMiningData: strAmount = %s, strTimeStamp = %d, Addresses1 = %s, Addresses2 = %s, Addresses3 = %s \n", - strAmount, entry.nTimeStamp, StringFromCharVector(entry.SovereignAddresses[0]), - StringFromCharVector(entry.SovereignAddresses[1]), StringFromCharVector(entry.SovereignAddresses[2])); - - return true; - } - return false; + return ParseScript(scriptPubKey, entry); } bool GetFluidMiningData(const CTransaction& tx, CFluidMining& entry, int& nOut) diff --git a/src/fluid/mining.h b/src/fluid/mining.h index 5dd4c2500..a9135cc57 100644 --- a/src/fluid/mining.h +++ b/src/fluid/mining.h @@ -24,6 +24,7 @@ class CFluidMining std::vector > SovereignAddresses; uint256 txHash; unsigned int nHeight; + std::vector DestinationAddress; CFluidMining() { @@ -42,6 +43,13 @@ class CFluidMining UnserializeFromScript(fluidScript); } + void Initialise(std::vector _vch, CAmount _amt, int64_t _t) + { + FluidScript = _vch; + MiningReward = _amt; + nTimeStamp = _t; + } + inline void SetNull() { nVersion = CFluidMining::CURRENT_VERSION; diff --git a/src/fluid/mint.cpp b/src/fluid/mint.cpp index fd833f7b1..f8001fadf 100644 --- a/src/fluid/mint.cpp +++ b/src/fluid/mint.cpp @@ -15,43 +15,7 @@ CFluidMintDB* pFluidMintDB = NULL; bool GetFluidMintData(const CScript& scriptPubKey, CFluidMint& entry) { - std::string fluidOperationString = ScriptToAsmStr(scriptPubKey); - std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); - std::vector splitString; - verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); - SeparateString(verificationWithoutOpCode, splitString, false); - std::string messageTokenKey = splitString.at(0); - std::vector vecSplitScript; - SeparateFluidOpString(verificationWithoutOpCode, vecSplitScript); - - if (vecSplitScript.size() >= 6 && scriptPubKey.GetFlag() == OP_MINT) { - std::vector vchFluidOperation = CharVectorFromString(fluidOperationString); - entry.FluidScript.insert(entry.FluidScript.end(), vchFluidOperation.begin(), vchFluidOperation.end()); - std::string strAmount = vecSplitScript[0]; - CAmount fluidAmount; - if (ParseFixedPoint(strAmount, 8, &fluidAmount)) { - entry.MintAmount = fluidAmount; - } - std::string strTimeStamp = vecSplitScript[1]; - int64_t tokenTimeStamp; - if (ParseInt64(strTimeStamp, &tokenTimeStamp)) { - entry.nTimeStamp = tokenTimeStamp; - } - std::vector vchDestinationAddress = CharVectorFromString(vecSplitScript[2]); - entry.DestinationAddress.insert(entry.DestinationAddress.end(), vchDestinationAddress.begin(), vchDestinationAddress.end()); - entry.SovereignAddresses.clear(); - for (int i = 3; i > 6; i++) { - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[i], messageTokenKey).ToString())); - } - - LogPrintf("GetFluidMintData: strAmount = %s, strTimeStamp = %d, DestinationAddress = %s, Addresses1 = %s, Addresses2 = %s, Addresses3 = %s \n", - strAmount, entry.nTimeStamp, - StringFromCharVector(entry.DestinationAddress), StringFromCharVector(entry.SovereignAddresses[0]), - StringFromCharVector(entry.SovereignAddresses[1]), StringFromCharVector(entry.SovereignAddresses[2])); - - return true; - } - return false; + return ParseScript(scriptPubKey, entry); } bool GetFluidMintData(const CTransaction& tx, CFluidMint& entry, int& nOut) diff --git a/src/fluid/mint.h b/src/fluid/mint.h index c1fcd1782..2f1d10f05 100644 --- a/src/fluid/mint.h +++ b/src/fluid/mint.h @@ -44,6 +44,13 @@ class CFluidMint UnserializeFromScript(fluidScript); } + void Initialise(std::vector _vch, CAmount _amt, int64_t _t) + { + FluidScript = _vch; + MintAmount = _amt; + nTimeStamp = _t; + } + inline void SetNull() { nVersion = CFluidMint::CURRENT_VERSION; diff --git a/src/fluid/operations.cpp b/src/fluid/operations.cpp index 62269907f..f6d97654d 100644 --- a/src/fluid/operations.cpp +++ b/src/fluid/operations.cpp @@ -147,3 +147,20 @@ bool GenericSignMessage(const std::string& message, std::string& signedString, c return true; } + +/* Unsafe Parsing Variants */ +CAmount ParseFixedPoint(std::string str) +{ + CAmount val; + if (!ParseFixedPoint(str, 8, &val)) + throw std::runtime_error("Invalid value"); + return val; +} + +CAmount ParseInt64(std::string str) +{ + CAmount val; + if (!ParseInt64(str, &val)) + throw std::runtime_error("Invalid value"); + return val; +} diff --git a/src/fluid/operations.h b/src/fluid/operations.h index 5645ec1e1..ce9d49ad5 100644 --- a/src/fluid/operations.h +++ b/src/fluid/operations.h @@ -27,4 +27,7 @@ bool VerifyAddressOwnership(const CDynamicAddress& dynamicAddress); bool SignTokenMessage(const CDynamicAddress& address, std::string unsignedMessage, std::string& stitchedMessage, bool stitch = true); bool GenericSignMessage(const std::string& message, std::string& signedString, const CDynamicAddress& signer); +CAmount ParseFixedPoint(std::string str); +CAmount ParseInt64(std::string str); + #endif // OPERATIONS_H diff --git a/src/fluid/sovereign.cpp b/src/fluid/sovereign.cpp index fc6628bb4..4b4506379 100644 --- a/src/fluid/sovereign.cpp +++ b/src/fluid/sovereign.cpp @@ -14,30 +14,7 @@ CFluidSovereignDB* pFluidSovereignDB = NULL; bool GetFluidSovereignData(const CScript& scriptPubKey, CFluidSovereign& entry) { - std::string fluidOperationString = ScriptToAsmStr(scriptPubKey); - std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString); - std::vector splitString; - verificationWithoutOpCode = stringFromVch(ParseHex(verificationWithoutOpCode)); - SeparateString(verificationWithoutOpCode, splitString, false); - std::string messageTokenKey = splitString.at(0); - std::vector vecSplitScript; - SeparateFluidOpString(verificationWithoutOpCode, vecSplitScript); - - if (vecSplitScript.size() == 5 && scriptPubKey.GetFlag() == OP_SWAP_SOVEREIGN_ADDRESS) { - std::vector vchFluidOperation = CharVectorFromString(fluidOperationString); - entry.FluidScript.insert(entry.FluidScript.end(), vchFluidOperation.begin(), vchFluidOperation.end()); - entry.SovereignAddresses.clear(); - for (int i = 0; i > 5; i++) { - entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[i], messageTokenKey).ToString())); - } - std::string strTimeStamp = vecSplitScript[5]; - int64_t tokenTimeStamp; - if (ParseInt64(strTimeStamp, &tokenTimeStamp)) { - entry.nTimeStamp = tokenTimeStamp; - } - return true; - } - return false; + return ParseScript(scriptPubKey, entry); } bool GetFluidSovereignData(const CTransaction& tx, CFluidSovereign& entry, int& nOut) diff --git a/src/fluid/sovereign.h b/src/fluid/sovereign.h index c44cd6775..5c6def958 100644 --- a/src/fluid/sovereign.h +++ b/src/fluid/sovereign.h @@ -23,6 +23,7 @@ class CFluidSovereign std::vector > SovereignAddresses; uint256 txHash; unsigned int nHeight; + std::vector DestinationAddress; CFluidSovereign() { @@ -41,6 +42,12 @@ class CFluidSovereign UnserializeFromScript(fluidScript); } + void Initialise(std::vector _vch, int64_t _t, int _n) + { + FluidScript = _vch; + nTimeStamp = _t; + } + inline void SetNull() { nVersion = CFluidSovereign::CURRENT_VERSION; From 08d9939071ae9c39ab6e858965fd276235840186 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Sun, 29 Aug 2021 18:54:46 +0530 Subject: [PATCH 14/17] fluid: create base object structure, remove repetitive logic --- src/fluid/dynode.h | 100 +++++---------------------------- src/fluid/fluid.cpp | 4 +- src/fluid/fluid.h | 125 ++++++++++++++++++++++++++++++++++++++++++ src/fluid/mining.h | 100 +++++---------------------------- src/fluid/mint.h | 105 +++++------------------------------ src/fluid/sovereign.h | 84 +++++----------------------- 6 files changed, 181 insertions(+), 337 deletions(-) diff --git a/src/fluid/dynode.h b/src/fluid/dynode.h index d4d7650cb..2e53db50c 100644 --- a/src/fluid/dynode.h +++ b/src/fluid/dynode.h @@ -6,6 +6,7 @@ #include "amount.h" #include "dbwrapper.h" #include "serialize.h" +#include "fluid/fluid.h" #include "sync.h" #include "uint256.h" @@ -13,103 +14,28 @@ class CScript; class CTransaction; -class CFluidDynode +class CFluidDynode : public DSFluidObject { public: - static const int CURRENT_VERSION = 1; - int nVersion; - std::vector FluidScript; - CAmount DynodeReward; - int64_t nTimeStamp; - std::vector > SovereignAddresses; - uint256 txHash; - unsigned int nHeight; - std::vector DestinationAddress; - - CFluidDynode() - { - SetNull(); - } - - CFluidDynode(const CTransaction& tx) - { - SetNull(); - UnserializeFromTx(tx); - } - - CFluidDynode(const CScript& fluidScript) - { - SetNull(); - UnserializeFromScript(fluidScript); - } - - void Initialise(std::vector _vch, CAmount _amt, int64_t _t) - { - FluidScript = _vch; - DynodeReward = _amt; - nTimeStamp = _t; - } - - inline void SetNull() - { - nVersion = CFluidDynode::CURRENT_VERSION; - FluidScript.clear(); - DynodeReward = -1; - nTimeStamp = 0; - SovereignAddresses.clear(); - txHash.SetNull(); - nHeight = 0; - } + CFluidDynode() = default; + CFluidDynode(const CTransaction& tx) { UnserializeFromTx(tx); } + CFluidDynode(const CScript& fluidScript) { UnserializeFromScript(fluidScript); } + ~CFluidDynode() = default; ADD_SERIALIZE_METHODS; template inline void SerializationOp(Stream& s, Operation ser_action) { - READWRITE(this->nVersion); - READWRITE(FluidScript); - READWRITE(DynodeReward); - READWRITE(VARINT(nTimeStamp)); - READWRITE(SovereignAddresses); - READWRITE(txHash); - READWRITE(VARINT(nHeight)); - } - - inline friend bool operator==(const CFluidDynode& a, const CFluidDynode& b) - { - return (a.FluidScript == b.FluidScript && a.DynodeReward == b.DynodeReward && a.nTimeStamp == b.nTimeStamp); - } - - inline friend bool operator!=(const CFluidDynode& a, const CFluidDynode& b) - { - return !(a == b); - } - - friend bool operator<(const CFluidDynode& a, const CFluidDynode& b) - { - return (a.nTimeStamp < b.nTimeStamp); - } - - friend bool operator>(const CFluidDynode& a, const CFluidDynode& b) - { - return (a.nTimeStamp > b.nTimeStamp); - } - - inline CFluidDynode operator=(const CFluidDynode& b) - { - FluidScript = b.FluidScript; - DynodeReward = b.DynodeReward; - nTimeStamp = b.nTimeStamp; - SovereignAddresses.clear(); //clear out previous entries - for (const std::vector& vchAddress : b.SovereignAddresses) { - SovereignAddresses.push_back(vchAddress); - } - txHash = b.txHash; - nHeight = b.nHeight; - return *this; + READWRITE(this->version); + READWRITE(tx_script); + READWRITE(obj_reward); + READWRITE(VARINT(obj_time)); + READWRITE(obj_sigs); + READWRITE(tx_hash); + READWRITE(VARINT(tx_height)); } - inline bool IsNull() const { return (nTimeStamp == 0); } bool UnserializeFromTx(const CTransaction& tx); bool UnserializeFromScript(const CScript& fluidScript); void Serialize(std::vector& vchData); diff --git a/src/fluid/fluid.cpp b/src/fluid/fluid.cpp index ea6ffdcf2..b2f373376 100644 --- a/src/fluid/fluid.cpp +++ b/src/fluid/fluid.cpp @@ -634,7 +634,7 @@ bool ParseScript(const CScript& scriptPubKey, T1& object) switch (scriptPubKey.GetFlag()) { case OP_MINT: - object.DestinationAddress = CharVectorFromString(ser_fields[2]); + object.obj_address = CharVectorFromString(ser_fields[2]); case OP_REWARD_DYNODE: case OP_REWARD_MINING: object.Initialise( @@ -659,7 +659,7 @@ bool ParseScript(const CScript& scriptPubKey, T1& object) } for (; s > e; s++) { - object.SovereignAddresses.push_back( + object.obj_sigs.insert( CharVectorFromString( fluid.GetAddressFromDigestSignature(ser_fields[s], payload).ToString() ) diff --git a/src/fluid/fluid.h b/src/fluid/fluid.h index ff3d02848..72effb922 100644 --- a/src/fluid/fluid.h +++ b/src/fluid/fluid.h @@ -65,6 +65,131 @@ class CFluid }; +class DSFluidObject +{ + typedef std::vector byte_vec; + static constexpr int CURRENT_VERSION = 1; + + friend class CFluidDynode; + friend class CFluidMining; + friend class CFluidMint; + friend class CFluidSovereign; + +private: + int version; + + uint256 tx_hash; + uint32_t tx_height; + byte_vec tx_script; + + uint64_t obj_reward; + uint64_t obj_time; + +protected: + DSFluidObject Null() + { + DSFluidObject obj; + version = DSFluidObject::CURRENT_VERSION; + tx_hash.SetNull(); + tx_script.clear(); + tx_height = 0; + obj_reward = -1; + obj_time = 0; + obj_sigs.clear(); + obj_address.clear(); + + return obj; + } + +public: + byte_vec obj_address; + std::set obj_sigs; + + DSFluidObject() + { + *this = Null(); + } + + DSFluidObject(DSFluidObject&& obj) + { + std::swap(version, obj.version); + std::swap(tx_hash, obj.tx_hash); + std::swap(tx_script, obj.tx_script); + std::swap(obj_reward, obj.obj_reward); + std::swap(obj_time, obj.obj_time); + std::swap(obj_sigs, obj.obj_sigs); + std::swap(obj_address, obj.obj_address); + } + + DSFluidObject& operator=(DSFluidObject&& obj) + { + std::swap(version, obj.version); + std::swap(tx_hash, obj.tx_hash); + std::swap(tx_script, obj.tx_script); + std::swap(obj_reward, obj.obj_reward); + std::swap(obj_time, obj.obj_time); + std::swap(obj_sigs, obj.obj_sigs); + std::swap(obj_address, obj.obj_address); + return *this; + } + + DSFluidObject(const DSFluidObject& obj) = default; + DSFluidObject& operator=(const DSFluidObject& obj) = default; + + bool operator>(const DSFluidObject& obj) const + { + return obj_time > obj.obj_time; + } + + bool operator<(const DSFluidObject& obj) const + { + return obj_time < obj.obj_time; + } + + bool operator==(const DSFluidObject& obj) const + { + return tx_script == obj.tx_script; + } + + bool operator!=(const DSFluidObject& obj) const + { + return !((*this) == obj); + } + + void Initialise(byte_vec _vch, CAmount _amt, int64_t _t) + { + return InitialiseScriptRewardTime(_vch, _amt, _t); + } + + void InitialiseScriptRewardTime(byte_vec _vch, CAmount _amt, int64_t _t) + { + tx_script = _vch; + obj_reward = _amt; + obj_time = _t; + } + + void InitialiseHeightHash(CAmount _ht, uint256 _hash) + { + tx_height = _ht; + tx_hash = _hash; + } + + void SetAddress(byte_vec _vch) + { + obj_address = _vch; + } + + uint64_t GetTime() const { return obj_time; } + uint64_t GetHeight() const { return tx_height; } + uint64_t GetReward() const { return obj_reward; } + uint256 GetTransactionHash() const { return tx_hash; } + uint32_t GetTransactionHeight() const { return tx_height; } + byte_vec GetTransactionScript() const { return tx_script; } + + bool IsNull() { return *this == Null(); } + void SetNull() const { DSFluidObject(); } +}; + /** Standard Reward Payment Determination Functions */ CAmount GetStandardPoWBlockPayment(const int& nHeight); CAmount GetStandardDynodePayment(const int& nHeight); diff --git a/src/fluid/mining.h b/src/fluid/mining.h index a9135cc57..caa185d92 100644 --- a/src/fluid/mining.h +++ b/src/fluid/mining.h @@ -6,6 +6,7 @@ #include "amount.h" #include "dbwrapper.h" #include "serialize.h" +#include "fluid/fluid.h" #include "sync.h" #include "uint256.h" @@ -13,103 +14,28 @@ class CScript; class CTransaction; -class CFluidMining +class CFluidMining : public DSFluidObject { public: - static const int CURRENT_VERSION = 1; - int nVersion; - std::vector FluidScript; - CAmount MiningReward; - int64_t nTimeStamp; - std::vector > SovereignAddresses; - uint256 txHash; - unsigned int nHeight; - std::vector DestinationAddress; - - CFluidMining() - { - SetNull(); - } - - CFluidMining(const CTransaction& tx) - { - SetNull(); - UnserializeFromTx(tx); - } - - CFluidMining(const CScript& fluidScript) - { - SetNull(); - UnserializeFromScript(fluidScript); - } - - void Initialise(std::vector _vch, CAmount _amt, int64_t _t) - { - FluidScript = _vch; - MiningReward = _amt; - nTimeStamp = _t; - } - - inline void SetNull() - { - nVersion = CFluidMining::CURRENT_VERSION; - FluidScript.clear(); - MiningReward = -1; - nTimeStamp = 0; - SovereignAddresses.clear(); - txHash.SetNull(); - nHeight = 0; - } + CFluidMining() = default; + CFluidMining(const CTransaction& tx) { UnserializeFromTx(tx); } + CFluidMining(const CScript& fluidScript) { UnserializeFromScript(fluidScript); } + ~CFluidMining() = default; ADD_SERIALIZE_METHODS; template inline void SerializationOp(Stream& s, Operation ser_action) { - READWRITE(this->nVersion); - READWRITE(FluidScript); - READWRITE(MiningReward); - READWRITE(VARINT(nTimeStamp)); - READWRITE(SovereignAddresses); - READWRITE(txHash); - READWRITE(VARINT(nHeight)); - } - - inline friend bool operator==(const CFluidMining& a, const CFluidMining& b) - { - return (a.FluidScript == b.FluidScript && a.MiningReward == b.MiningReward && a.nTimeStamp == b.nTimeStamp); - } - - inline friend bool operator!=(const CFluidMining& a, const CFluidMining& b) - { - return !(a == b); - } - - friend bool operator<(const CFluidMining& a, const CFluidMining& b) - { - return (a.nTimeStamp < b.nTimeStamp); - } - - friend bool operator>(const CFluidMining& a, const CFluidMining& b) - { - return (a.nTimeStamp > b.nTimeStamp); - } - - inline CFluidMining operator=(const CFluidMining& b) - { - FluidScript = b.FluidScript; - MiningReward = b.MiningReward; - nTimeStamp = b.nTimeStamp; - SovereignAddresses.clear(); //clear out previous entries - for (const std::vector& vchAddress : b.SovereignAddresses) { - SovereignAddresses.push_back(vchAddress); - } - txHash = b.txHash; - nHeight = b.nHeight; - return *this; + READWRITE(this->version); + READWRITE(tx_script); + READWRITE(obj_reward); + READWRITE(VARINT(obj_time)); + READWRITE(obj_sigs); + READWRITE(tx_hash); + READWRITE(VARINT(tx_height)); } - inline bool IsNull() const { return (nTimeStamp == 0); } bool UnserializeFromTx(const CTransaction& tx); bool UnserializeFromScript(const CScript& fluidScript); void Serialize(std::vector& vchData); diff --git a/src/fluid/mint.h b/src/fluid/mint.h index 2f1d10f05..37b6387a5 100644 --- a/src/fluid/mint.h +++ b/src/fluid/mint.h @@ -6,6 +6,7 @@ #include "amount.h" #include "dbwrapper.h" #include "serialize.h" +#include "fluid/fluid.h" #include "sync.h" #include "uint256.h" @@ -14,109 +15,33 @@ class CDynamicAddress; class CScript; class CTransaction; -class CFluidMint +class CFluidMint : public DSFluidObject { public: - static const int CURRENT_VERSION = 1; - int nVersion; - std::vector FluidScript; - CAmount MintAmount; - std::vector DestinationAddress; - int64_t nTimeStamp; - std::vector > SovereignAddresses; - uint256 txHash; - unsigned int nHeight; - - CFluidMint() - { - SetNull(); - } - - CFluidMint(const CTransaction& tx) - { - SetNull(); - UnserializeFromTx(tx); - } - - CFluidMint(const CScript& fluidScript) - { - SetNull(); - UnserializeFromScript(fluidScript); - } - - void Initialise(std::vector _vch, CAmount _amt, int64_t _t) - { - FluidScript = _vch; - MintAmount = _amt; - nTimeStamp = _t; - } - - inline void SetNull() - { - nVersion = CFluidMint::CURRENT_VERSION; - FluidScript.clear(); - MintAmount = -1; - DestinationAddress.clear(); - nTimeStamp = 0; - SovereignAddresses.clear(); - txHash.SetNull(); - nHeight = 0; - } + CFluidMint() = default; + CFluidMint(const CTransaction& tx) { UnserializeFromTx(tx); } + CFluidMint(const CScript& fluidScript) { UnserializeFromScript(fluidScript); } + ~CFluidMint() = default; ADD_SERIALIZE_METHODS; template inline void SerializationOp(Stream& s, Operation ser_action) { - READWRITE(this->nVersion); - READWRITE(FluidScript); - READWRITE(MintAmount); - READWRITE(DestinationAddress); - READWRITE(VARINT(nTimeStamp)); - READWRITE(SovereignAddresses); - READWRITE(txHash); - READWRITE(VARINT(nHeight)); + READWRITE(this->version); + READWRITE(tx_script); + READWRITE(obj_reward); + READWRITE(obj_address); + READWRITE(VARINT(obj_time)); + READWRITE(obj_sigs); + READWRITE(tx_hash); + READWRITE(VARINT(tx_height)); } - inline friend bool operator==(const CFluidMint& a, const CFluidMint& b) - { - return (a.FluidScript == b.FluidScript && a.MintAmount == b.MintAmount && a.DestinationAddress == b.DestinationAddress && a.nTimeStamp == b.nTimeStamp); - } - - inline friend bool operator!=(const CFluidMint& a, const CFluidMint& b) - { - return !(a == b); - } - - friend bool operator<(const CFluidMint& a, const CFluidMint& b) - { - return (a.nTimeStamp < b.nTimeStamp); - } - - friend bool operator>(const CFluidMint& a, const CFluidMint& b) - { - return (a.nTimeStamp > b.nTimeStamp); - } - - inline CFluidMint operator=(const CFluidMint& b) - { - FluidScript = b.FluidScript; - MintAmount = b.MintAmount; - DestinationAddress = b.DestinationAddress; - nTimeStamp = b.nTimeStamp; - SovereignAddresses.clear(); //clear out previous entries - for (const std::vector& vchAddress : b.SovereignAddresses) { - SovereignAddresses.push_back(vchAddress); - } - txHash = b.txHash; - nHeight = b.nHeight; - return *this; - } - - inline bool IsNull() const { return (nTimeStamp == 0); } bool UnserializeFromTx(const CTransaction& tx); bool UnserializeFromScript(const CScript& fluidScript); void Serialize(std::vector& vchData); + CDynamicAddress GetDestinationAddress() const; }; diff --git a/src/fluid/sovereign.h b/src/fluid/sovereign.h index 5c6def958..6209e4f7e 100644 --- a/src/fluid/sovereign.h +++ b/src/fluid/sovereign.h @@ -6,6 +6,7 @@ #include "amount.h" #include "dbwrapper.h" #include "serialize.h" +#include "fluid/fluid.h" #include "sync.h" #include "uint256.h" @@ -13,90 +14,31 @@ class CScript; class CTransaction; -class CFluidSovereign +class CFluidSovereign : public DSFluidObject { public: - static const int CURRENT_VERSION = 1; - int nVersion; - std::vector FluidScript; - int64_t nTimeStamp; - std::vector > SovereignAddresses; - uint256 txHash; - unsigned int nHeight; - std::vector DestinationAddress; - - CFluidSovereign() - { - SetNull(); - } - - CFluidSovereign(const CTransaction& tx) - { - SetNull(); - UnserializeFromTx(tx); - } - - CFluidSovereign(const CScript& fluidScript) - { - SetNull(); - UnserializeFromScript(fluidScript); - } - - void Initialise(std::vector _vch, int64_t _t, int _n) - { - FluidScript = _vch; - nTimeStamp = _t; - } - - inline void SetNull() - { - nVersion = CFluidSovereign::CURRENT_VERSION; - FluidScript.clear(); - nTimeStamp = 0; - SovereignAddresses.clear(); - txHash.SetNull(); - nHeight = 0; - } + CFluidSovereign() = default; + CFluidSovereign(const CTransaction& tx) { UnserializeFromTx(tx); } + CFluidSovereign(const CScript& fluidScript) { UnserializeFromScript(fluidScript); } + ~CFluidSovereign() = default; ADD_SERIALIZE_METHODS; template inline void SerializationOp(Stream& s, Operation ser_action) { - READWRITE(this->nVersion); - READWRITE(FluidScript); - READWRITE(VARINT(nTimeStamp)); - READWRITE(SovereignAddresses); - READWRITE(txHash); - READWRITE(VARINT(nHeight)); - } - - inline friend bool operator==(const CFluidSovereign& a, const CFluidSovereign& b) - { - return (a.FluidScript == b.FluidScript && a.SovereignAddresses == b.SovereignAddresses && a.nTimeStamp == b.nTimeStamp); - } - - inline friend bool operator!=(const CFluidSovereign& a, const CFluidSovereign& b) - { - return !(a == b); - } - - inline CFluidSovereign operator=(const CFluidSovereign& b) - { - FluidScript = b.FluidScript; - nTimeStamp = b.nTimeStamp; - for (const std::vector& vchAddress : b.SovereignAddresses) { - SovereignAddresses.push_back(vchAddress); - } - txHash = b.txHash; - nHeight = b.nHeight; - return *this; + READWRITE(this->version); + READWRITE(tx_script); + READWRITE(VARINT(obj_time)); + READWRITE(obj_sigs); + READWRITE(tx_hash); + READWRITE(VARINT(tx_height)); } - inline bool IsNull() const { return (nTimeStamp == 0); } bool UnserializeFromTx(const CTransaction& tx); bool UnserializeFromScript(const CScript& fluidScript); void Serialize(std::vector& vchData); + std::vector SovereignAddressesStrings(); }; From 15113395f6c38651a41319292774d74416064504 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Sun, 29 Aug 2021 22:58:12 +0530 Subject: [PATCH 15/17] fluid: general purpose refactor, do not access internal values --- src/fluid/db.cpp | 102 ++++++++++++--------------------------- src/fluid/dynode.cpp | 6 +-- src/fluid/mining.cpp | 6 +-- src/fluid/mint.cpp | 8 ++- src/fluid/sovereign.cpp | 13 ++--- src/miner/miner-util.cpp | 2 +- src/rpc/fluid.cpp | 56 ++++++++++----------- src/validation.cpp | 23 ++++----- 8 files changed, 81 insertions(+), 135 deletions(-) diff --git a/src/fluid/db.cpp b/src/fluid/db.cpp index 091c91628..7bfc5ec80 100644 --- a/src/fluid/db.cpp +++ b/src/fluid/db.cpp @@ -11,44 +11,28 @@ CAmount GetFluidDynodeReward(const int nHeight) { - assert(pFluidDynodeDB); - - if (FLUID_ACTIVATE_HEIGHT > nHeight) - return GetStandardDynodePayment(nHeight); - - if (pFluidDynodeDB->IsEmpty()) - return GetStandardDynodePayment(nHeight); - CFluidDynode lastDynodeRecord; - if (!pFluidDynodeDB->GetLastFluidDynodeRecord(lastDynodeRecord, nHeight)) { - return GetStandardDynodePayment(nHeight); - } - if (lastDynodeRecord.DynodeReward > 0) { - return lastDynodeRecord.DynodeReward; - } else { - return GetStandardDynodePayment(nHeight); + + assert(pFluidDynodeDB); + if (pFluidDynodeDB->GetLastFluidDynodeRecord(lastDynodeRecord, nHeight) && !pFluidDynodeDB->IsEmpty()) { + return (lastDynodeRecord.GetReward() > 0 && FLUID_ACTIVATE_HEIGHT > nHeight) ? + lastDynodeRecord.GetReward() : GetStandardDynodePayment(nHeight); } + + return GetStandardDynodePayment(nHeight); } CAmount GetFluidMiningReward(const int nHeight) { - assert(pFluidMiningDB); - - if (FLUID_ACTIVATE_HEIGHT > nHeight) - return GetStandardPoWBlockPayment(nHeight); - - if (pFluidMiningDB->IsEmpty()) - return GetStandardPoWBlockPayment(nHeight); - CFluidMining lastMiningRecord; - if (!pFluidMiningDB->GetLastFluidMiningRecord(lastMiningRecord, nHeight)) { - return GetStandardPoWBlockPayment(nHeight); - } - if (lastMiningRecord.MiningReward > 0) { - return lastMiningRecord.MiningReward; - } else { - return GetStandardPoWBlockPayment(nHeight); + + assert(pFluidMiningDB); + if (pFluidMiningDB->GetLastFluidMiningRecord(lastMiningRecord, nHeight) && !pFluidMiningDB->IsEmpty()) { + return (lastMiningRecord.GetReward() > 0 && FLUID_ACTIVATE_HEIGHT > nHeight) ? + lastMiningRecord.GetReward() : GetStandardPoWBlockPayment(nHeight); } + + return GetStandardDynodePayment(nHeight); } bool GetMintingInstructions(const int nHeight, CFluidMint& fluidMint) @@ -63,8 +47,8 @@ bool GetMintingInstructions(const int nHeight, CFluidMint& fluidMint) return false; } - if ((int)getFluidMint.nHeight == (nHeight - 1)) { - fluidMint = getFluidMint; + if (getFluidMint.GetHeight() == (nHeight - 1)) { + getFluidMint = fluidMint; return true; } return false; @@ -73,79 +57,57 @@ bool GetMintingInstructions(const int nHeight, CFluidMint& fluidMint) /** Checks if any given address is a current sovereign wallet address (invoked by RPC) */ bool IsSovereignAddress(const CDynamicAddress& inputAddress) { - assert(pFluidSovereignDB); + CFluidSovereign lastSovereign; if (!inputAddress.IsValid()) { return false; } - CFluidSovereign lastSovereign; - if (!pFluidSovereignDB->GetLastFluidSovereignRecord(lastSovereign)) { - return false; - } - - for (const std::vector& vchAddress : lastSovereign.SovereignAddresses) { - CDynamicAddress attemptKey(StringFromCharVector(vchAddress)); - if (attemptKey.IsValid() && inputAddress == attemptKey) { - return true; + assert(pFluidSovereignDB); + if (pFluidSovereignDB->GetLastFluidSovereignRecord(lastSovereign)) { + for (const std::vector& vchAddress : lastSovereign.obj_sigs) { + CDynamicAddress attemptKey(StringFromCharVector(vchAddress)); + return attemptKey.IsValid() && inputAddress == attemptKey; } } + return false; } bool GetAllFluidDynodeRecords(std::vector& dynodeEntries) { assert(pFluidDynodeDB); - - if (pFluidDynodeDB->GetAllFluidDynodeRecords(dynodeEntries)) { - return true; - } - return false; + return pFluidDynodeDB->GetAllFluidDynodeRecords(dynodeEntries); } bool GetAllFluidMiningRecords(std::vector& miningEntries) { assert(pFluidMiningDB); - - if (!pFluidMiningDB->GetAllFluidMiningRecords(miningEntries)) { - return true; - } - return false; + return pFluidMiningDB->GetAllFluidMiningRecords(miningEntries); } bool GetAllFluidMintRecords(std::vector& mintEntries) { assert(pFluidMintDB); - - if (pFluidMintDB->GetAllFluidMintRecords(mintEntries)) { - return true; - } - return false; + return pFluidMintDB->GetAllFluidMintRecords(mintEntries); } bool GetAllFluidSovereignRecords(std::vector& sovereignEntries) { assert(pFluidSovereignDB); - - if (pFluidSovereignDB->IsEmpty()) { - return false; - } - if (!pFluidSovereignDB->GetAllFluidSovereignRecords(sovereignEntries)) { - return false; - } - return true; + return pFluidSovereignDB->GetAllFluidSovereignRecords(sovereignEntries) && !pFluidSovereignDB->IsEmpty(); } bool GetLastFluidSovereignAddressStrings(std::vector& sovereignAddresses) { assert(pFluidSovereignDB); - CFluidSovereign lastSovereign; - if (!pFluidSovereignDB->GetLastFluidSovereignRecord(lastSovereign)) { - return false; + if (pFluidSovereignDB->GetLastFluidSovereignRecord(lastSovereign)) + { + sovereignAddresses = lastSovereign.SovereignAddressesStrings(); + return true; } - sovereignAddresses = lastSovereign.SovereignAddressesStrings(); - return true; + return false; } /** Checks whether 3 of 5 sovereign addresses signed the token in the script to meet the quorum requirements */ diff --git a/src/fluid/dynode.cpp b/src/fluid/dynode.cpp index 6adbf9c4b..e3b35cd8a 100644 --- a/src/fluid/dynode.cpp +++ b/src/fluid/dynode.cpp @@ -35,7 +35,6 @@ bool CFluidDynode::UnserializeFromTx(const CTransaction& tx) { int nOut; if (!GetFluidDynodeData(tx, *this, nOut)) { - SetNull(); return false; } return true; @@ -44,7 +43,6 @@ bool CFluidDynode::UnserializeFromTx(const CTransaction& tx) bool CFluidDynode::UnserializeFromScript(const CScript& fluidScript) { if (!GetFluidDynodeData(fluidScript, *this)) { - SetNull(); return false; } return true; @@ -66,7 +64,7 @@ bool CFluidDynodeDB::AddFluidDynodeEntry(const CFluidDynode& entry, const int op bool writeState = false; { LOCK(cs_fluid_dynode); - writeState = Write(make_pair(std::string("script"), entry.FluidScript), entry) && Write(make_pair(std::string("txid"), entry.txHash), entry.FluidScript); + writeState = Write(make_pair(std::string("script"), entry.GetTransactionScript()), entry) && Write(make_pair(std::string("txid"), entry.GetTransactionHash()), entry.GetTransactionScript()); } return writeState; @@ -88,7 +86,7 @@ bool CFluidDynodeDB::GetLastFluidDynodeRecord(CFluidDynode& returnEntry, const i if (entry.IsNull()) { return false; } - if (entry.nHeight > returnEntry.nHeight && (int)(entry.nHeight + 1) < nHeight) { + if (entry.GetHeight() > returnEntry.GetHeight() && (int)(entry.GetHeight() + 1) < nHeight) { returnEntry = entry; } } diff --git a/src/fluid/mining.cpp b/src/fluid/mining.cpp index 7a393d320..52482d3d1 100644 --- a/src/fluid/mining.cpp +++ b/src/fluid/mining.cpp @@ -35,7 +35,6 @@ bool CFluidMining::UnserializeFromTx(const CTransaction& tx) { int nOut; if (!GetFluidMiningData(tx, *this, nOut)) { - SetNull(); return false; } return true; @@ -44,7 +43,6 @@ bool CFluidMining::UnserializeFromTx(const CTransaction& tx) bool CFluidMining::UnserializeFromScript(const CScript& fluidScript) { if (!GetFluidMiningData(fluidScript, *this)) { - SetNull(); return false; } return true; @@ -66,7 +64,7 @@ bool CFluidMiningDB::AddFluidMiningEntry(const CFluidMining& entry, const int op bool writeState = false; { LOCK(cs_fluid_mining); - writeState = Write(make_pair(std::string("script"), entry.FluidScript), entry) && Write(make_pair(std::string("txid"), entry.txHash), entry.FluidScript); + writeState = Write(make_pair(std::string("script"), entry.GetTransactionScript()), entry) && Write(make_pair(std::string("txid"), entry.GetTransactionHash()), entry.GetTransactionScript()); } return writeState; @@ -88,7 +86,7 @@ bool CFluidMiningDB::GetLastFluidMiningRecord(CFluidMining& returnEntry, const i if (entry.IsNull()) { return false; } - if (entry.nHeight > returnEntry.nHeight && (int)(entry.nHeight + 1) < nHeight) { + if (entry.GetHeight() > returnEntry.GetHeight() && (int)(entry.GetHeight() + 1) < nHeight) { returnEntry = entry; } } diff --git a/src/fluid/mint.cpp b/src/fluid/mint.cpp index f8001fadf..2eee52d21 100644 --- a/src/fluid/mint.cpp +++ b/src/fluid/mint.cpp @@ -36,7 +36,6 @@ bool CFluidMint::UnserializeFromTx(const CTransaction& tx) { int nOut; if (!GetFluidMintData(tx, *this, nOut)) { - SetNull(); return false; } return true; @@ -45,7 +44,6 @@ bool CFluidMint::UnserializeFromTx(const CTransaction& tx) bool CFluidMint::UnserializeFromScript(const CScript& fluidScript) { if (!GetFluidMintData(fluidScript, *this)) { - SetNull(); return false; } return true; @@ -60,7 +58,7 @@ void CFluidMint::Serialize(std::vector& vchData) CDynamicAddress CFluidMint::GetDestinationAddress() const { - return CDynamicAddress(StringFromCharVector(DestinationAddress)); + return CDynamicAddress(StringFromCharVector(obj_address)); } CFluidMintDB::CFluidMintDB(size_t nCacheSize, bool fMemory, bool fWipe, bool obfuscate) : CDBWrapper(GetDataDir() / "blocks" / "fluid-mint", nCacheSize, fMemory, fWipe, obfuscate) @@ -72,7 +70,7 @@ bool CFluidMintDB::AddFluidMintEntry(const CFluidMint& entry, const int op) bool writeState = false; { LOCK(cs_fluid_mint); - writeState = Write(make_pair(std::string("script"), entry.FluidScript), entry) && Write(make_pair(std::string("txid"), entry.txHash), entry.FluidScript); + writeState = Write(make_pair(std::string("script"), entry.GetTransactionScript()), entry) && Write(make_pair(std::string("txid"), entry.GetTransactionHash()), entry.GetTransactionScript()); } return writeState; @@ -91,7 +89,7 @@ bool CFluidMintDB::GetLastFluidMintRecord(CFluidMint& returnEntry) try { if (pcursor->GetKey(key) && key.first == "script") { pcursor->GetValue(entry); - if (entry.nHeight > returnEntry.nHeight) { + if (entry.GetHeight() > returnEntry.GetHeight()) { returnEntry = entry; } } diff --git a/src/fluid/sovereign.cpp b/src/fluid/sovereign.cpp index 4b4506379..cebaa781b 100644 --- a/src/fluid/sovereign.cpp +++ b/src/fluid/sovereign.cpp @@ -35,7 +35,6 @@ bool CFluidSovereign::UnserializeFromTx(const CTransaction& tx) { int nOut; if (!GetFluidSovereignData(tx, *this, nOut)) { - SetNull(); return false; } return true; @@ -44,7 +43,6 @@ bool CFluidSovereign::UnserializeFromTx(const CTransaction& tx) bool CFluidSovereign::UnserializeFromScript(const CScript& fluidScript) { if (!GetFluidSovereignData(fluidScript, *this)) { - SetNull(); return false; } return true; @@ -60,7 +58,7 @@ void CFluidSovereign::Serialize(std::vector& vchData) std::vector CFluidSovereign::SovereignAddressesStrings() { std::vector vchAddressStrings; - for (const std::vector& vchAddress : SovereignAddresses) { + for (const std::vector& vchAddress : obj_sigs) { vchAddressStrings.push_back(StringFromCharVector(vchAddress)); } return vchAddressStrings; @@ -77,13 +75,10 @@ void CFluidSovereignDB::InitEmpty() LOCK(cs_fluid_sovereign); CFluidSovereign fluidSovereign; for (const auto& pk : Params().FluidSignatureKeys()) { - fluidSovereign.SovereignAddresses.push_back( + fluidSovereign.obj_sigs.insert( CharVectorFromString(CDynamicAddress(pk).ToString()) ); } - fluidSovereign.FluidScript = CharVectorFromString("init sovereign"); - fluidSovereign.nTimeStamp = 1; - fluidSovereign.nHeight = 1; if (!AddFluidSovereignEntry(fluidSovereign)) { LogPrintf("CFluidSovereignDB::InitEmpty add failed.\n"); } @@ -95,7 +90,7 @@ bool CFluidSovereignDB::AddFluidSovereignEntry(const CFluidSovereign& entry) bool writeState = false; { LOCK(cs_fluid_sovereign); - writeState = Write(make_pair(std::string("script"), entry.FluidScript), entry) && Write(make_pair(std::string("txid"), entry.txHash), entry.FluidScript); + writeState = Write(make_pair(std::string("script"), entry.GetTransactionScript()), entry) && Write(make_pair(std::string("txid"), entry.GetTransactionHash()), entry.GetTransactionScript()); } return writeState; } @@ -113,7 +108,7 @@ bool CFluidSovereignDB::GetLastFluidSovereignRecord(CFluidSovereign& returnEntry try { if (pcursor->GetKey(key) && key.first == "script") { pcursor->GetValue(entry); - if (entry.nHeight > returnEntry.nHeight) { + if (entry.GetHeight() > returnEntry.GetHeight()) { returnEntry = entry; } } diff --git a/src/miner/miner-util.cpp b/src/miner/miner-util.cpp index 3634f122c..6441b00e3 100644 --- a/src/miner/miner-util.cpp +++ b/src/miner/miner-util.cpp @@ -287,7 +287,7 @@ std::unique_ptr CreateNewBlock(const CChainParams& chainparams, if (areWeMinting) { mintAddress = fluidMint.GetDestinationAddress(); - fluidIssuance = fluidMint.MintAmount; + fluidIssuance = fluidMint.GetReward(); txNew.vout[0].nValue = blockReward + fluidIssuance; } else { txNew.vout[0].nValue = blockReward; diff --git a/src/rpc/fluid.cpp b/src/rpc/fluid.cpp index 3d153778f..68707a8da 100644 --- a/src/rpc/fluid.cpp +++ b/src/rpc/fluid.cpp @@ -39,21 +39,21 @@ extern void SendBurnTransaction(const CScript& burnScript, CWalletTx& wtxNew, co struct DynodeCompareTimeStamp { bool operator()(const CFluidDynode& a, const CFluidDynode& b) { - return (a.nTimeStamp < b.nTimeStamp); + return (a.GetTime() < b.GetTime()); } }; struct MintCompareTimeStamp { bool operator()(const CFluidMint& a, const CFluidMint& b) { - return (a.nTimeStamp < b.nTimeStamp); + return (a.GetTime() < b.GetTime()); } }; struct MiningCompareTimeStamp { bool operator()(const CFluidMining& a, const CFluidMining& b) { - return (a.nTimeStamp < b.nTimeStamp); + return (a.GetTime() < b.GetTime()); } }; @@ -352,10 +352,10 @@ UniValue getfluidhistoryraw(const JSONRPCRequest& request) int x = 1; for (const CFluidMint& mintEntry : mintEntries) { UniValue obj(UniValue::VOBJ); - obj.push_back(Pair("fluid_script", StringFromCharVector(mintEntry.FluidScript))); + obj.push_back(Pair("fluid_script", StringFromCharVector(mintEntry.GetTransactionScript()))); std::string addLabel = "mint_" + std::to_string(x); oMints.push_back(Pair(addLabel, obj)); - totalMintedCoins = totalMintedCoins + mintEntry.MintAmount; + totalMintedCoins = totalMintedCoins + mintEntry.GetReward(); totalFluidTxCost = totalFluidTxCost + FLUID_TRANSACTION_COST; x++; nTotal++; @@ -372,7 +372,7 @@ UniValue getfluidhistoryraw(const JSONRPCRequest& request) int x = 1; for (const CFluidDynode& dynEntry : dynodeEntries) { UniValue obj(UniValue::VOBJ); - obj.push_back(Pair("fluid_script", StringFromCharVector(dynEntry.FluidScript))); + obj.push_back(Pair("fluid_script", StringFromCharVector(dynEntry.GetTransactionScript()))); std::string addLabel = "reward_update_" + std::to_string(x); oDynodes.push_back(Pair(addLabel, obj)); totalFluidTxCost = totalFluidTxCost + FLUID_TRANSACTION_COST; @@ -391,7 +391,7 @@ UniValue getfluidhistoryraw(const JSONRPCRequest& request) int x = 1; for (const CFluidMining& miningEntry : miningEntries) { UniValue obj(UniValue::VOBJ); - obj.push_back(Pair("fluid_script", StringFromCharVector(miningEntry.FluidScript))); + obj.push_back(Pair("fluid_script", StringFromCharVector(miningEntry.GetTransactionScript()))); std::string addLabel = "reward_update_" + std::to_string(x); oMining.push_back(Pair(addLabel, obj)); totalFluidTxCost = totalFluidTxCost + FLUID_TRANSACTION_COST; @@ -478,21 +478,21 @@ UniValue getfluidhistory(const JSONRPCRequest& request) for (const CFluidMint& mintEntry : mintEntries) { UniValue obj(UniValue::VOBJ); obj.push_back(Pair("operation", "Mint")); - obj.push_back(Pair("amount", FormatMoney(mintEntry.MintAmount))); - obj.push_back(Pair("timestamp", mintEntry.nTimeStamp)); - obj.push_back(Pair("display_date", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", mintEntry.nTimeStamp))); - obj.push_back(Pair("block_height", (int)mintEntry.nHeight)); - obj.push_back(Pair("txid", mintEntry.txHash.GetHex())); - obj.push_back(Pair("destination_address", StringFromCharVector(mintEntry.DestinationAddress))); + obj.push_back(Pair("amount", FormatMoney(mintEntry.GetReward()))); + obj.push_back(Pair("timestamp", mintEntry.GetTime())); + obj.push_back(Pair("display_date", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", mintEntry.GetTime()))); + obj.push_back(Pair("block_height", (int)mintEntry.GetHeight())); + obj.push_back(Pair("txid", mintEntry.GetTransactionHash().GetHex())); + obj.push_back(Pair("destination_address", StringFromCharVector(mintEntry.obj_address))); int index = 1; - for (const std::vector& vchAddress : mintEntry.SovereignAddresses) { + for (const std::vector& vchAddress : mintEntry.obj_sigs) { std::string addLabel = "sovereign_address_" + std::to_string(index); obj.push_back(Pair(addLabel, StringFromCharVector(vchAddress))); index++; } std::string addLabel = "mint_" + std::to_string(x); oMints.push_back(Pair(addLabel, obj)); - totalMintedCoins = totalMintedCoins + mintEntry.MintAmount; + totalMintedCoins = totalMintedCoins + mintEntry.GetReward(); totalFluidTxCost = totalFluidTxCost + FLUID_TRANSACTION_COST; x++; nTotal++; @@ -511,13 +511,13 @@ UniValue getfluidhistory(const JSONRPCRequest& request) for (const CFluidDynode& dynEntry : dynodeEntries) { UniValue obj(UniValue::VOBJ); obj.push_back(Pair("operation", "Dynode Reward Update")); - obj.push_back(Pair("amount", FormatMoney(dynEntry.DynodeReward))); - obj.push_back(Pair("timestamp", dynEntry.nTimeStamp)); - obj.push_back(Pair("display_date", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", dynEntry.nTimeStamp))); - obj.push_back(Pair("block_height", (int)dynEntry.nHeight)); - obj.push_back(Pair("txid", dynEntry.txHash.GetHex())); + obj.push_back(Pair("amount", FormatMoney(dynEntry.GetReward()))); + obj.push_back(Pair("timestamp", dynEntry.GetTime())); + obj.push_back(Pair("display_date", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", dynEntry.GetTime()))); + obj.push_back(Pair("block_height", (int)dynEntry.GetHeight())); + obj.push_back(Pair("txid", dynEntry.GetTransactionHash().GetHex())); int index = 1; - for (const std::vector& vchAddress : dynEntry.SovereignAddresses) { + for (const std::vector& vchAddress : dynEntry.obj_sigs) { std::string addLabel = "sovereign_address_" + std::to_string(index); obj.push_back(Pair(addLabel, StringFromCharVector(vchAddress))); index++; @@ -542,13 +542,13 @@ UniValue getfluidhistory(const JSONRPCRequest& request) for (const CFluidMining& miningEntry : miningEntries) { UniValue obj(UniValue::VOBJ); obj.push_back(Pair("operation", "Mining Reward Update")); - obj.push_back(Pair("amount", FormatMoney(miningEntry.MiningReward))); - obj.push_back(Pair("timestamp", miningEntry.nTimeStamp)); - obj.push_back(Pair("display_date", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", miningEntry.nTimeStamp))); - obj.push_back(Pair("block_height", (int)miningEntry.nHeight)); - obj.push_back(Pair("txid", miningEntry.txHash.GetHex())); + obj.push_back(Pair("amount", FormatMoney(miningEntry.GetReward()))); + obj.push_back(Pair("timestamp", miningEntry.GetTime())); + obj.push_back(Pair("display_date", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", miningEntry.GetTime()))); + obj.push_back(Pair("block_height", (int)miningEntry.GetHeight())); + obj.push_back(Pair("txid", miningEntry.GetTransactionHash().GetHex())); int index = 1; - for (const std::vector& vchAddress : miningEntry.SovereignAddresses) { + for (const std::vector& vchAddress : miningEntry.obj_sigs) { std::string addLabel = "sovereign_address_" + std::to_string(index); obj.push_back(Pair(addLabel, StringFromCharVector(vchAddress))); index++; @@ -635,7 +635,7 @@ UniValue getfluidsovereigns(const JSONRPCRequest& request) for (const CFluidSovereign& sovereignEntry : sovereignEntries) { int index = 1; UniValue oEntry(UniValue::VOBJ); - for (const std::vector& vchAddress : sovereignEntry.SovereignAddresses) { + for (const std::vector& vchAddress : sovereignEntry.obj_sigs) { std::string addLabel = "address_" + std::to_string(index); oEntry.push_back(Pair(addLabel, StringFromCharVector(vchAddress))); index++; diff --git a/src/validation.cpp b/src/validation.cpp index 74017e1b4..3f3513dc5 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2944,9 +2944,9 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd if (prevIndex->nHeight + 1 >= FLUID_ACTIVATE_HEIGHT) { CFluidMint fluidMint; if (GetMintingInstructions(pindex->nHeight, fluidMint)) { - newMintIssuance = fluidMint.MintAmount; + newMintIssuance = fluidMint.GetReward(); mintAddress = fluidMint.GetDestinationAddress(); - LogPrintf("ConnectBlock, GetMintingInstructions MintAmount = %u\n", fluidMint.MintAmount); + LogPrintf("ConnectBlock, GetMintingInstructions MintAmount = %u\n", fluidMint.GetReward()); } } nExpectedBlockValue = newMintIssuance + newMiningReward + newDynodeReward; @@ -2961,34 +2961,29 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd } } for (unsigned int i = 0; i < block.vtx.size(); i++) { + assert(pFluidDynodeDB); const CTransaction& tx = *block.vtx[i]; CScript scriptFluid; if (IsTransactionFluid(tx, scriptFluid)) { int OpCode = GetFluidOpCode(scriptFluid); if (OpCode == OP_REWARD_DYNODE) { - assert(pFluidDynodeDB); CFluidDynode fluidDynode(scriptFluid); - fluidDynode.nHeight = pindex->nHeight; - fluidDynode.txHash = tx.GetHash(); - if (!CheckSignatureQuorum(fluidDynode.FluidScript, strError)) { + fluidDynode.InitialiseHeightHash(pindex->nHeight, tx.GetHash()); + if (!CheckSignatureQuorum(fluidDynode.GetTransactionScript(), strError)) { return state.DoS(0, error("ConnectBlock(DYN): %s", strError), REJECT_INVALID, "invalid-fluid-dynode-address-signature"); } pFluidDynodeDB->AddFluidDynodeEntry(fluidDynode, OP_REWARD_DYNODE); } else if (OpCode == OP_REWARD_MINING) { - assert(pFluidMiningDB); CFluidMining fluidMining(scriptFluid); - fluidMining.nHeight = pindex->nHeight; - fluidMining.txHash = tx.GetHash(); - if (!CheckSignatureQuorum(fluidMining.FluidScript, strError)) { + fluidMining.InitialiseHeightHash(pindex->nHeight, tx.GetHash()); + if (!CheckSignatureQuorum(fluidMining.GetTransactionScript(), strError)) { return state.DoS(0, error("ConnectBlock(DYN): %s", strError), REJECT_INVALID, "invalid-fluid-mining-address-signature"); } pFluidMiningDB->AddFluidMiningEntry(fluidMining, OP_REWARD_MINING); } else if (OpCode == OP_MINT) { - assert(pFluidMintDB); CFluidMint fluidMint(scriptFluid); - fluidMint.nHeight = pindex->nHeight; - fluidMint.txHash = tx.GetHash(); - if (!CheckSignatureQuorum(fluidMint.FluidScript, strError)) { + fluidMint.InitialiseHeightHash(pindex->nHeight, tx.GetHash()); + if (!CheckSignatureQuorum(fluidMint.GetTransactionScript(), strError)) { return state.DoS(0, error("ConnectBlock(DYN): %s", strError), REJECT_INVALID, "invalid-fluid-mint-address-signature"); } pFluidMintDB->AddFluidMintEntry(fluidMint, OP_MINT); From 6c3da39e4f019a05c4f79c5bd23a57c054bff524 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Sun, 29 Aug 2021 23:11:16 +0530 Subject: [PATCH 16/17] fluid: remove leftover fragments from refactoring --- src/fluid/dynode.cpp | 12 ++++-------- src/fluid/dynode.h | 3 --- src/fluid/fluid.cpp | 17 ++++++----------- src/fluid/fluid.h | 2 -- src/fluid/mining.cpp | 12 ++++-------- src/fluid/mining.h | 3 --- src/fluid/mint.cpp | 12 ++++-------- src/fluid/mint.h | 3 --- src/fluid/sovereign.cpp | 12 ++++-------- src/fluid/sovereign.h | 2 -- src/qt/transactionrecord.cpp | 7 ++++--- src/validation.cpp | 11 ++++++----- src/wallet/wallet.cpp | 3 ++- 13 files changed, 34 insertions(+), 65 deletions(-) diff --git a/src/fluid/dynode.cpp b/src/fluid/dynode.cpp index e3b35cd8a..c8c29ec1a 100644 --- a/src/fluid/dynode.cpp +++ b/src/fluid/dynode.cpp @@ -5,6 +5,7 @@ #include "core_io.h" #include "fluid/fluid.h" +#include "fluid/script.h" #include "operations.h" #include "script/script.h" @@ -12,19 +13,14 @@ CFluidDynodeDB* pFluidDynodeDB = NULL; -bool GetFluidDynodeData(const CScript& scriptPubKey, CFluidDynode& entry) -{ - return ParseScript(scriptPubKey, entry); -} - bool GetFluidDynodeData(const CTransaction& tx, CFluidDynode& entry, int& nOut) { int n = 0; for (const CTxOut& txout : tx.vout) { CScript txOut = txout.scriptPubKey; - if (IsTransactionFluid(txOut)) { + if (WithinFluidRange(txOut.GetFlag())) { nOut = n; - return GetFluidDynodeData(txOut, entry); + return ParseScript(txOut, entry); } n++; } @@ -42,7 +38,7 @@ bool CFluidDynode::UnserializeFromTx(const CTransaction& tx) bool CFluidDynode::UnserializeFromScript(const CScript& fluidScript) { - if (!GetFluidDynodeData(fluidScript, *this)) { + if (!ParseScript(fluidScript, *this)) { return false; } return true; diff --git a/src/fluid/dynode.h b/src/fluid/dynode.h index 2e53db50c..e1bd80165 100644 --- a/src/fluid/dynode.h +++ b/src/fluid/dynode.h @@ -54,9 +54,6 @@ class CFluidDynodeDB : public CDBWrapper bool RecordExists(const std::vector& vchFluidScript); }; -bool GetFluidDynodeData(const CScript& scriptPubKey, CFluidDynode& entry); -bool GetFluidDynodeData(const CTransaction& tx, CFluidDynode& entry, int& nOut); - extern CFluidDynodeDB* pFluidDynodeDB; #endif // FLUID_DYNODE_H diff --git a/src/fluid/fluid.cpp b/src/fluid/fluid.cpp index b2f373376..79ce9cf1b 100644 --- a/src/fluid/fluid.cpp +++ b/src/fluid/fluid.cpp @@ -31,16 +31,11 @@ CFluid fluid; extern CWallet* pwalletMain; #endif //ENABLE_WALLET -bool IsTransactionFluid(const CScript& txOut) -{ - return WithinFluidRange(txOut.GetFlag()); -} - bool IsTransactionFluid(const CTransaction& tx, CScript& fluidScript) { for (const CTxOut& txout : tx.vout) { CScript txOut = txout.scriptPubKey; - if (IsTransactionFluid(txOut)) { + if (WithinFluidRange(txOut.GetFlag())) { fluidScript = txOut; return true; } @@ -122,7 +117,7 @@ bool CFluid::CheckIfExistsInMemPool(const CTxMemPool& pool, const CScript& fluid for (const CTxMemPoolEntry& e : pool.mapTx) { const CTransaction& tx = e.GetTx(); for (const CTxOut& txOut : tx.vout) { - if (IsTransactionFluid(txOut.scriptPubKey)) { + if (WithinFluidRange(txOut.scriptPubKey.GetFlag())) { return (GetRidOfScriptStatement(ScriptToAsmStr(fluidScriptPubKey)) == GetRidOfScriptStatement(ScriptToAsmStr(txOut.scriptPubKey))); } } @@ -438,7 +433,7 @@ bool CFluid::GetMintingInstructions(const CBlockIndex* pblockindex, CDynamicAddr /* Check if transaction exists in record */ bool CFluid::CheckTransactionInRecord(const CScript& fluidInstruction, CBlockIndex* pindex) { - if (IsTransactionFluid(fluidInstruction)) { + if (WithinFluidRange(fluidInstruction.GetFlag())) { std::string verificationString = ScriptToAsmStr(fluidInstruction); std::vector transactionRecord; std::string verificationWithoutOpCode = GetRidOfScriptStatement(verificationString); @@ -490,7 +485,7 @@ bool CFluid::ValidationProcesses(CValidationState& state, const CScript& txOut, CAmount mintAmount; CDynamicAddress toMintAddress; - if (IsTransactionFluid(txOut)) { + if (WithinFluidRange(txOut.GetFlag())) { if (!CheckIfQuorumExists(ScriptToAsmStr(txOut), message)) { return state.DoS(100, false, REJECT_INVALID, "bad-txns-fluid-auth-failure"); } @@ -515,7 +510,7 @@ bool CFluid::ProvisionalCheckTransaction(const CTransaction& transaction) for (const CTxOut& txout : transaction.vout) { CScript txOut = txout.scriptPubKey; - if (IsTransactionFluid(txOut) && CheckTransactionInRecord(txOut)) { + if (WithinFluidRange(txOut.GetFlag()) && CheckTransactionInRecord(txOut)) { LogPrintf("ProvisionalCheckTransaction(): Fluid Transaction %s has already been executed!\n", transaction.GetHash().ToString()); return false; } @@ -540,7 +535,7 @@ bool CFluid::CheckTransactionToBlock(const CTransaction& transaction, const uint for (const CTxOut& txout : transaction.vout) { CScript txOut = txout.scriptPubKey; - if (IsTransactionFluid(txOut) && CheckTransactionInRecord(txOut, pblockindex)) { + if (WithinFluidRange(txOut.GetFlag()) && CheckTransactionInRecord(txOut, pblockindex)) { LogPrintf("CheckTransactionToBlock(): Fluid Transaction %s has already been executed!\n", transaction.GetHash().ToString()); return false; } diff --git a/src/fluid/fluid.h b/src/fluid/fluid.h index 72effb922..ec14418ad 100644 --- a/src/fluid/fluid.h +++ b/src/fluid/fluid.h @@ -195,14 +195,12 @@ CAmount GetStandardPoWBlockPayment(const int& nHeight); CAmount GetStandardDynodePayment(const int& nHeight); void BuildFluidInformationIndex(CBlockIndex* pindex, CAmount& nExpectedBlockValue, bool fDynodePaid); -bool IsTransactionFluid(const CScript& txOut); bool IsTransactionFluid(const CTransaction& tx, CScript& fluidScript); int GetFluidOpCode(const CScript& fluidScript); std::vector CharVectorFromString(const std::string& str); std::string StringFromCharVector(const std::vector& vch); std::vector FluidScriptToCharVector(const CScript& fluidScript); -bool GetFluidBlock(const CBlockIndex* pblockindex, CBlock& block); template bool ParseScript(const CScript& scriptPubKey, T1& object); diff --git a/src/fluid/mining.cpp b/src/fluid/mining.cpp index 52482d3d1..415861811 100644 --- a/src/fluid/mining.cpp +++ b/src/fluid/mining.cpp @@ -5,6 +5,7 @@ #include "core_io.h" #include "fluid/fluid.h" +#include "fluid/script.h" #include "operations.h" #include "script/script.h" @@ -12,19 +13,14 @@ CFluidMiningDB* pFluidMiningDB = NULL; -bool GetFluidMiningData(const CScript& scriptPubKey, CFluidMining& entry) -{ - return ParseScript(scriptPubKey, entry); -} - bool GetFluidMiningData(const CTransaction& tx, CFluidMining& entry, int& nOut) { int n = 0; for (const CTxOut& txout : tx.vout) { CScript txOut = txout.scriptPubKey; - if (IsTransactionFluid(txOut)) { + if (WithinFluidRange(txOut.GetFlag())) { nOut = n; - return GetFluidMiningData(txOut, entry); + return ParseScript(txOut, entry); } n++; } @@ -42,7 +38,7 @@ bool CFluidMining::UnserializeFromTx(const CTransaction& tx) bool CFluidMining::UnserializeFromScript(const CScript& fluidScript) { - if (!GetFluidMiningData(fluidScript, *this)) { + if (!ParseScript(fluidScript, *this)) { return false; } return true; diff --git a/src/fluid/mining.h b/src/fluid/mining.h index caa185d92..e02a07e68 100644 --- a/src/fluid/mining.h +++ b/src/fluid/mining.h @@ -54,9 +54,6 @@ class CFluidMiningDB : public CDBWrapper bool RecordExists(const std::vector& vchFluidScript); }; -bool GetFluidMiningData(const CScript& scriptPubKey, CFluidMining& entry); -bool GetFluidMiningData(const CTransaction& tx, CFluidMining& entry, int& nOut); - extern CFluidMiningDB* pFluidMiningDB; #endif // FLUID_MINING diff --git a/src/fluid/mint.cpp b/src/fluid/mint.cpp index 2eee52d21..a5ef1010a 100644 --- a/src/fluid/mint.cpp +++ b/src/fluid/mint.cpp @@ -6,6 +6,7 @@ #include "base58.h" #include "core_io.h" #include "fluid/fluid.h" +#include "fluid/script.h" #include "operations.h" #include "script/script.h" @@ -13,19 +14,14 @@ CFluidMintDB* pFluidMintDB = NULL; -bool GetFluidMintData(const CScript& scriptPubKey, CFluidMint& entry) -{ - return ParseScript(scriptPubKey, entry); -} - bool GetFluidMintData(const CTransaction& tx, CFluidMint& entry, int& nOut) { int n = 0; for (const CTxOut& txout : tx.vout) { CScript txOut = txout.scriptPubKey; - if (IsTransactionFluid(txOut)) { + if (WithinFluidRange(txOut.GetFlag())) { nOut = n; - return GetFluidMintData(txOut, entry); + return ParseScript(txOut, entry); } n++; } @@ -43,7 +39,7 @@ bool CFluidMint::UnserializeFromTx(const CTransaction& tx) bool CFluidMint::UnserializeFromScript(const CScript& fluidScript) { - if (!GetFluidMintData(fluidScript, *this)) { + if (!ParseScript(fluidScript, *this)) { return false; } return true; diff --git a/src/fluid/mint.h b/src/fluid/mint.h index 37b6387a5..900a69515 100644 --- a/src/fluid/mint.h +++ b/src/fluid/mint.h @@ -58,9 +58,6 @@ class CFluidMintDB : public CDBWrapper bool RecordExists(const std::vector& vchFluidScript); }; -bool GetFluidMintData(const CScript& scriptPubKey, CFluidMint& entry); -bool GetFluidMintData(const CTransaction& tx, CFluidMint& entry, int& nOut); - extern CFluidMintDB* pFluidMintDB; #endif // FLUID_MINT_H \ No newline at end of file diff --git a/src/fluid/sovereign.cpp b/src/fluid/sovereign.cpp index cebaa781b..b0fe44731 100644 --- a/src/fluid/sovereign.cpp +++ b/src/fluid/sovereign.cpp @@ -5,6 +5,7 @@ #include "core_io.h" #include "fluid/fluid.h" +#include "fluid/script.h" #include "operations.h" #include "script/script.h" @@ -12,19 +13,14 @@ CFluidSovereignDB* pFluidSovereignDB = NULL; -bool GetFluidSovereignData(const CScript& scriptPubKey, CFluidSovereign& entry) -{ - return ParseScript(scriptPubKey, entry); -} - bool GetFluidSovereignData(const CTransaction& tx, CFluidSovereign& entry, int& nOut) { int n = 0; for (const CTxOut& txout : tx.vout) { CScript txOut = txout.scriptPubKey; - if (IsTransactionFluid(txOut)) { + if (WithinFluidRange(txOut.GetFlag())) { nOut = n; - return GetFluidSovereignData(txOut, entry); + return ParseScript(txOut, entry); } n++; } @@ -42,7 +38,7 @@ bool CFluidSovereign::UnserializeFromTx(const CTransaction& tx) bool CFluidSovereign::UnserializeFromScript(const CScript& fluidScript) { - if (!GetFluidSovereignData(fluidScript, *this)) { + if (!ParseScript(fluidScript, *this)) { return false; } return true; diff --git a/src/fluid/sovereign.h b/src/fluid/sovereign.h index 6209e4f7e..b79510b6c 100644 --- a/src/fluid/sovereign.h +++ b/src/fluid/sovereign.h @@ -56,8 +56,6 @@ class CFluidSovereignDB : public CDBWrapper private: void InitEmpty(); }; -bool GetFluidSovereignData(const CScript& scriptPubKey, CFluidSovereign& entry); -bool GetFluidSovereignData(const CTransaction& tx, CFluidSovereign& entry, int& nOut); extern CFluidSovereignDB* pFluidSovereignDB; diff --git a/src/qt/transactionrecord.cpp b/src/qt/transactionrecord.cpp index 17c6ba325..391fac015 100644 --- a/src/qt/transactionrecord.cpp +++ b/src/qt/transactionrecord.cpp @@ -13,6 +13,7 @@ #include "bdap/x509certificate.h" #include "consensus/consensus.h" #include "fluid/fluid.h" +#include "fluid/script.h" #include "instantsend.h" #include "policy/policy.h" #include "privatesend.h" @@ -70,7 +71,7 @@ QList TransactionRecord::decomposeTransaction(const CWallet* sub.type = TransactionRecord::RecvFromOther; sub.address = mapValue["from"]; } - if (IsTransactionFluid(txout.scriptPubKey)) { + if (WithinFluidRange(txout.scriptPubKey.GetFlag())) { // Fluid type sub.type = TransactionRecord::Fluid; } @@ -147,7 +148,7 @@ QList TransactionRecord::decomposeTransaction(const CWallet* sub.type = TransactionRecord::PrivateSendCreateDenominations; break; } - if (IsTransactionFluid(txout.scriptPubKey)) { + if (WithinFluidRange(txout.scriptPubKey.GetFlag())) { sub.type = TransactionRecord::Fluid; break; } @@ -263,7 +264,7 @@ QList TransactionRecord::decomposeTransaction(const CWallet* } } } - if (IsTransactionFluid(txout.scriptPubKey)) { + if (WithinFluidRange(txout.scriptPubKey.GetFlag())) { sub.type = TransactionRecord::Fluid; } else if (mapValue["PS"] == "1") { sub.type = TransactionRecord::PrivateSend; diff --git a/src/validation.cpp b/src/validation.cpp index 3f3513dc5..326ee2ab9 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -33,6 +33,7 @@ #include "fluid/dynode.h" #include "fluid/mining.h" #include "fluid/mint.h" +#include "fluid/script.h" #include "hash.h" #include "init.h" #include "instantsend.h" @@ -573,7 +574,7 @@ bool CheckTransaction(const CTransaction& tx, CValidationState& state) nValueOut += txout.nValue; if (!MoneyRange(nValueOut)) return state.DoS(100, false, REJECT_INVALID, "bad-txns-txouttotal-toolarge"); - if (IsTransactionFluid(txout.scriptPubKey)) { + if (WithinFluidRange(txout.scriptPubKey.GetFlag())) { if (FLUID_TRANSACTION_COST > txout.nValue) return state.DoS(100, false, REJECT_INVALID, "bad-txns-fluid-vout-amount-toolow"); if (!fluid.ValidationProcesses(state, txout.scriptPubKey, txout.nValue)) @@ -955,7 +956,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C return false; for (const CTxOut& txout : tx.vout) { - if (IsTransactionFluid(txout.scriptPubKey)) { + if (WithinFluidRange(txout.scriptPubKey.GetFlag())) { fluidTransaction = true; std::string strErrorMessage; // Check if fluid transaction is already in the mempool @@ -1748,7 +1749,7 @@ bool AcceptToMemoryPoolWithTime(CTxMemPool& pool, CValidationState& state, const return false; BOOST_FOREACH (const CTxOut& txout, tx->vout) { - if (IsTransactionFluid(txout.scriptPubKey)) { + if (WithinFluidRange(txout.scriptPubKey.GetFlag())) { std::string strErrorMessage; if (!fluid.CheckFluidOperationScript(txout.scriptPubKey, GetTime())) { fluidTimestampCheck = false; @@ -2965,7 +2966,7 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd const CTransaction& tx = *block.vtx[i]; CScript scriptFluid; if (IsTransactionFluid(tx, scriptFluid)) { - int OpCode = GetFluidOpCode(scriptFluid); + int OpCode = scriptFluid.GetFlag(); if (OpCode == OP_REWARD_DYNODE) { CFluidDynode fluidDynode(scriptFluid); fluidDynode.InitialiseHeightHash(pindex->nHeight, tx.GetHash()); @@ -4111,7 +4112,7 @@ bool CheckBlock(const CBlock& block, CValidationState& state, const Consensus::P strprintf("Transaction check failed (tx hash %s) %s", tx->GetHash().ToString(), state.GetDebugMessage())); for (const auto& txout : tx->vout) { - if (IsTransactionFluid(txout.scriptPubKey)) { + if (WithinFluidRange(txout.scriptPubKey.GetFlag())) { std::string strErrorMessage; if (!fluid.CheckFluidOperationScript(txout.scriptPubKey, block.nTime)) { return error("CheckBlock(): %s, Block %s failed with %s", diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 061101f41..3b6d768bc 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -25,6 +25,7 @@ #include "dynode-sync.h" #include "fluid/fluid.h" #include "fluid/db.h" +#include "fluid/script.h" #include "governance.h" #include "init.h" #include "instantsend.h" @@ -4062,7 +4063,7 @@ bool CWallet::CreateTransaction(const std::vector& vecSend, CWalletT for (const auto& recipient : vecSend) { CTxOut txout(recipient.nAmount, recipient.scriptPubKey); - if (IsTransactionFluid(recipient.scriptPubKey)) { + if (WithinFluidRange(recipient.scriptPubKey.GetFlag())) { // Check if fluid transaction is already in the mempool if (fluid.CheckIfExistsInMemPool(mempool, recipient.scriptPubKey)) { // fluid transaction is already in the mempool. Invalid transaction. From 1abce9871e7e6576803adb051f3dc8a71068b4cc Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kittywhiskers@users.noreply.github.com> Date: Mon, 30 Aug 2021 00:16:12 +0530 Subject: [PATCH 17/17] fluid: move transaction payload extraction to template --- src/fluid/dynode.cpp | 24 ++---------------------- src/fluid/fluid.cpp | 19 +++++++++++++++++++ src/fluid/fluid.h | 3 +++ src/fluid/mining.cpp | 24 ++---------------------- src/fluid/mint.cpp | 25 ++----------------------- src/fluid/sovereign.cpp | 24 ++---------------------- 6 files changed, 30 insertions(+), 89 deletions(-) diff --git a/src/fluid/dynode.cpp b/src/fluid/dynode.cpp index c8c29ec1a..5930e33ce 100644 --- a/src/fluid/dynode.cpp +++ b/src/fluid/dynode.cpp @@ -13,35 +13,15 @@ CFluidDynodeDB* pFluidDynodeDB = NULL; -bool GetFluidDynodeData(const CTransaction& tx, CFluidDynode& entry, int& nOut) -{ - int n = 0; - for (const CTxOut& txout : tx.vout) { - CScript txOut = txout.scriptPubKey; - if (WithinFluidRange(txOut.GetFlag())) { - nOut = n; - return ParseScript(txOut, entry); - } - n++; - } - return false; -} - bool CFluidDynode::UnserializeFromTx(const CTransaction& tx) { int nOut; - if (!GetFluidDynodeData(tx, *this, nOut)) { - return false; - } - return true; + return ParseData(tx, *this, nOut); } bool CFluidDynode::UnserializeFromScript(const CScript& fluidScript) { - if (!ParseScript(fluidScript, *this)) { - return false; - } - return true; + return ParseScript(fluidScript, *this); } void CFluidDynode::Serialize(std::vector& vchData) diff --git a/src/fluid/fluid.cpp b/src/fluid/fluid.cpp index 79ce9cf1b..6184fe2c6 100644 --- a/src/fluid/fluid.cpp +++ b/src/fluid/fluid.cpp @@ -672,7 +672,26 @@ bool ParseScript(const CScript& scriptPubKey, T1& object) return object.IsNull(); } +template +bool ParseData(const CTransaction& tx, T1& entry, int& nOut) +{ + nOut = 0; + for (const CTxOut& txout : tx.vout) { + CScript txOut = txout.scriptPubKey; + if (WithinFluidRange(txOut.GetFlag())) { + return ParseScript(txOut, entry); + } + nOut++; + } + return false; +} + template bool ParseScript(const CScript& scriptPubKey, CFluidMint& object); template bool ParseScript(const CScript& scriptPubKey, CFluidMining& object); template bool ParseScript(const CScript& scriptPubKey, CFluidDynode& object); template bool ParseScript(const CScript& scriptPubKey, CFluidSovereign& object); + +template bool ParseData(const CTransaction& tx, CFluidMint& entry, int& nOut); +template bool ParseData(const CTransaction& tx, CFluidMining& entry, int& nOut); +template bool ParseData(const CTransaction& tx, CFluidDynode& entry, int& nOut); +template bool ParseData(const CTransaction& tx, CFluidSovereign& entry, int& nOut); diff --git a/src/fluid/fluid.h b/src/fluid/fluid.h index ec14418ad..1197c740e 100644 --- a/src/fluid/fluid.h +++ b/src/fluid/fluid.h @@ -205,6 +205,9 @@ std::vector FluidScriptToCharVector(const CScript& fluidScript); template bool ParseScript(const CScript& scriptPubKey, T1& object); +template +bool ParseData(const CTransaction& tx, T1& entry, int& nOut); + extern CFluid fluid; #endif // FLUID_PROTOCOL_H diff --git a/src/fluid/mining.cpp b/src/fluid/mining.cpp index 415861811..c92368488 100644 --- a/src/fluid/mining.cpp +++ b/src/fluid/mining.cpp @@ -13,35 +13,15 @@ CFluidMiningDB* pFluidMiningDB = NULL; -bool GetFluidMiningData(const CTransaction& tx, CFluidMining& entry, int& nOut) -{ - int n = 0; - for (const CTxOut& txout : tx.vout) { - CScript txOut = txout.scriptPubKey; - if (WithinFluidRange(txOut.GetFlag())) { - nOut = n; - return ParseScript(txOut, entry); - } - n++; - } - return false; -} - bool CFluidMining::UnserializeFromTx(const CTransaction& tx) { int nOut; - if (!GetFluidMiningData(tx, *this, nOut)) { - return false; - } - return true; + return ParseData(tx, *this, nOut); } bool CFluidMining::UnserializeFromScript(const CScript& fluidScript) { - if (!ParseScript(fluidScript, *this)) { - return false; - } - return true; + return ParseScript(fluidScript, *this); } void CFluidMining::Serialize(std::vector& vchData) diff --git a/src/fluid/mint.cpp b/src/fluid/mint.cpp index a5ef1010a..0db9316a6 100644 --- a/src/fluid/mint.cpp +++ b/src/fluid/mint.cpp @@ -14,35 +14,15 @@ CFluidMintDB* pFluidMintDB = NULL; -bool GetFluidMintData(const CTransaction& tx, CFluidMint& entry, int& nOut) -{ - int n = 0; - for (const CTxOut& txout : tx.vout) { - CScript txOut = txout.scriptPubKey; - if (WithinFluidRange(txOut.GetFlag())) { - nOut = n; - return ParseScript(txOut, entry); - } - n++; - } - return false; -} - bool CFluidMint::UnserializeFromTx(const CTransaction& tx) { int nOut; - if (!GetFluidMintData(tx, *this, nOut)) { - return false; - } - return true; + return ParseData(tx, *this, nOut); } bool CFluidMint::UnserializeFromScript(const CScript& fluidScript) { - if (!ParseScript(fluidScript, *this)) { - return false; - } - return true; + return ParseScript(fluidScript, *this); } void CFluidMint::Serialize(std::vector& vchData) @@ -68,7 +48,6 @@ bool CFluidMintDB::AddFluidMintEntry(const CFluidMint& entry, const int op) LOCK(cs_fluid_mint); writeState = Write(make_pair(std::string("script"), entry.GetTransactionScript()), entry) && Write(make_pair(std::string("txid"), entry.GetTransactionHash()), entry.GetTransactionScript()); } - return writeState; } diff --git a/src/fluid/sovereign.cpp b/src/fluid/sovereign.cpp index b0fe44731..b284e76f3 100644 --- a/src/fluid/sovereign.cpp +++ b/src/fluid/sovereign.cpp @@ -13,35 +13,15 @@ CFluidSovereignDB* pFluidSovereignDB = NULL; -bool GetFluidSovereignData(const CTransaction& tx, CFluidSovereign& entry, int& nOut) -{ - int n = 0; - for (const CTxOut& txout : tx.vout) { - CScript txOut = txout.scriptPubKey; - if (WithinFluidRange(txOut.GetFlag())) { - nOut = n; - return ParseScript(txOut, entry); - } - n++; - } - return false; -} - bool CFluidSovereign::UnserializeFromTx(const CTransaction& tx) { int nOut; - if (!GetFluidSovereignData(tx, *this, nOut)) { - return false; - } - return true; + return ParseData(tx, *this, nOut); } bool CFluidSovereign::UnserializeFromScript(const CScript& fluidScript) { - if (!ParseScript(fluidScript, *this)) { - return false; - } - return true; + return ParseScript(fluidScript, *this); } void CFluidSovereign::Serialize(std::vector& vchData)