diff --git a/src/chainparams.cpp b/src/chainparams.cpp index a37f88a1687290..3e4acf7b1ecf35 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -9,6 +9,7 @@ #include "chainparamsseeds.h" #include "consensus/merkle.h" +#include "consensus/params.h" #include "tinyformat.h" #include "utilstrencodings.h" @@ -295,6 +296,7 @@ class CMainParams : public CChainParams consensus.vUpgrades[Consensus::UPGRADE_V5_5].nActivationHeight = 3715200; consensus.vUpgrades[Consensus::UPGRADE_V6_0].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; + consensus.vUpgrades[Consensus::UPGRADE_SHIELD_STAKING].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; consensus.vUpgrades[Consensus::UPGRADE_ZC].hashActivationBlock = uint256S("0x5b2482eca24caf2a46bb22e0545db7b7037282733faa3a42ec20542509999a64"); @@ -451,6 +453,7 @@ class CTestNetParams : public CChainParams consensus.vUpgrades[Consensus::UPGRADE_V5_5].nActivationHeight = 925056; consensus.vUpgrades[Consensus::UPGRADE_V6_0].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; + consensus.vUpgrades[Consensus::UPGRADE_SHIELD_STAKING].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; /** * The message start string is designed to be unlikely to occur in normal data. @@ -599,6 +602,7 @@ class CRegTestParams : public CChainParams consensus.vUpgrades[Consensus::UPGRADE_V5_5].nActivationHeight = 576; consensus.vUpgrades[Consensus::UPGRADE_V6_0].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; + consensus.vUpgrades[Consensus::UPGRADE_SHIELD_STAKING].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; /** * The message start string is designed to be unlikely to occur in normal data. diff --git a/src/consensus/params.h b/src/consensus/params.h index bfb6203b24839b..cd145686ec4294 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -38,6 +38,7 @@ enum UpgradeIndex : uint32_t { UPGRADE_V5_3, UPGRADE_V5_5, UPGRADE_V6_0, + UPGRADE_SHIELD_STAKING, UPGRADE_TESTDUMMY, // NOTE: Also add new upgrades to NetworkUpgradeInfo in upgrades.cpp MAX_NETWORK_UPGRADES diff --git a/src/kernel.cpp b/src/kernel.cpp index c78896c387dd46..3d4458ec364d69 100644 --- a/src/kernel.cpp +++ b/src/kernel.cpp @@ -7,6 +7,7 @@ #include "kernel.h" +#include "consensus/params.h" #include "db.h" #include "legacy/stakemodifier.h" #include "policy/policy.h" @@ -32,18 +33,28 @@ CStakeKernel::CStakeKernel(const CBlockIndex* const pindexPrev, CStakeInput* sta stakeValue(stakeInput->GetValue()) { // Set kernel stake modifier - if (!Params().GetConsensus().NetworkUpgradeActive(pindexPrev->nHeight + 1, Consensus::UPGRADE_V3_4)) { - uint64_t nStakeModifier = 0; - if (!GetOldStakeModifier(stakeInput, nStakeModifier)) - LogPrintf("%s : ERROR: Failed to get kernel stake modifier\n", __func__); - // Modifier v1 - stakeModifier << nStakeModifier; + if (!stakeInput->IsShieldPIV()) { + if (!Params().GetConsensus().NetworkUpgradeActive(pindexPrev->nHeight + 1, Consensus::UPGRADE_V3_4)) { + uint64_t nStakeModifier = 0; + if (!GetOldStakeModifier(stakeInput, nStakeModifier)) + LogPrintf("%s : ERROR: Failed to get kernel stake modifier\n", __func__); + // Modifier v1 + stakeModifier << nStakeModifier; + } else { + // Modifier v2 + stakeModifier << pindexPrev->GetStakeModifierV2(); + } + const CBlockIndex* pindexFrom = stakeInput->GetIndexFrom(); + nTimeBlockFrom = pindexFrom->nTime; } else { - // Modifier v2 - stakeModifier << pindexPrev->GetStakeModifierV2(); + if (!Params().GetConsensus().NetworkUpgradeActive(pindexPrev->nHeight + 1, Consensus::UPGRADE_SHIELD_STAKING)) { + LogPrintf("%s : ShieldStaking is not yet active!", __func__); + } else { + stakeModifier << pindexPrev->GetStakeModifierV2(); + } + // For ShieldStaking we have no knowledge on the note block, so we just set the time to 0 + nTimeBlockFrom = 0; } - const CBlockIndex* pindexFrom = stakeInput->GetIndexFrom(); - nTimeBlockFrom = pindexFrom->nTime; } // Return stake kernel hash diff --git a/src/stakeinput.cpp b/src/stakeinput.cpp index 44360dfb6c4e1a..a9eafb231dacd3 100644 --- a/src/stakeinput.cpp +++ b/src/stakeinput.cpp @@ -4,7 +4,9 @@ #include "stakeinput.h" +#include "amount.h" #include "chain.h" +#include "streams.h" #include "txdb.h" #include "validation.h" @@ -95,3 +97,10 @@ const CBlockIndex* CPivStake::GetIndexFrom() const return pindexFrom; } +// A Unique identifier of a shield note +CDataStream CShieldStake::GetUniqueness() const +{ + CDataStream ss(SER_NETWORK, 0); + ss << this->nullifier; + return ss; +} \ No newline at end of file diff --git a/src/stakeinput.h b/src/stakeinput.h index 45a56b83192b11..1843c00ec5060f 100644 --- a/src/stakeinput.h +++ b/src/stakeinput.h @@ -5,6 +5,7 @@ #ifndef PIVX_STAKEINPUT_H #define PIVX_STAKEINPUT_H +#include "amount.h" #include "chain.h" #include "streams.h" #include "uint256.h" @@ -25,6 +26,7 @@ class CStakeInput virtual bool GetTxOutFrom(CTxOut& out) const = 0; virtual CAmount GetValue() const = 0; virtual bool IsZPIV() const = 0; + virtual bool IsShieldPIV() const = 0; virtual CDataStream GetUniqueness() const = 0; }; @@ -47,7 +49,24 @@ class CPivStake : public CStakeInput CDataStream GetUniqueness() const override; CTxIn GetTxIn() const; bool IsZPIV() const override { return false; } + bool IsShieldPIV() const override { return false; }; }; +class CShieldStake : public CStakeInput +{ +private: + const CAmount noteValue; + const uint256 nullifier; + +public: + CShieldStake(uint64_t _noteValue, uint256 _nullifier) : CStakeInput(nullptr), noteValue(_noteValue), nullifier(_nullifier) {} + CAmount GetValue() const override { return noteValue; }; + CDataStream GetUniqueness() const override; + + const CBlockIndex* GetIndexFrom() const override { throw std::runtime_error("Cannot find the BlockIndex for a shield note"); }; + bool GetTxOutFrom(CTxOut& out) const override { throw std::runtime_error("Cannot find the Outpoint for a shield note"); }; + bool IsZPIV() const override { return false; } + bool IsShieldPIV() const override { return true; }; +}; #endif //PIVX_STAKEINPUT_H diff --git a/src/zpiv/zpos.h b/src/zpiv/zpos.h index 424e9288886f4b..4c6e199352c218 100644 --- a/src/zpiv/zpos.h +++ b/src/zpiv/zpos.h @@ -26,6 +26,7 @@ class CLegacyZPivStake : public CStakeInput static CLegacyZPivStake* NewZPivStake(const CTxIn& txin, int nHeight); bool IsZPIV() const override { return true; } + bool IsShieldPIV() const override { return false; }; uint32_t GetChecksum() const { return nChecksum; } const CBlockIndex* GetIndexFrom() const override; CAmount GetValue() const override;