Skip to content

Commit

Permalink
ShieldStake object + ShieldStake network upgrade
Browse files Browse the repository at this point in the history
  • Loading branch information
panleone committed Apr 7, 2023
1 parent 6e50e49 commit af30a31
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 10 deletions.
4 changes: 4 additions & 0 deletions src/chainparams.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include "chainparamsseeds.h"
#include "consensus/merkle.h"
#include "consensus/params.h"
#include "tinyformat.h"
#include "utilstrencodings.h"

Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions src/consensus/params.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
31 changes: 21 additions & 10 deletions src/kernel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include "kernel.h"

#include "consensus/params.h"
#include "db.h"
#include "legacy/stakemodifier.h"
#include "policy/policy.h"
Expand All @@ -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
Expand Down
9 changes: 9 additions & 0 deletions src/stakeinput.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

#include "stakeinput.h"

#include "amount.h"
#include "chain.h"
#include "streams.h"
#include "txdb.h"
#include "validation.h"

Expand Down Expand Up @@ -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;
}
19 changes: 19 additions & 0 deletions src/stakeinput.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#ifndef PIVX_STAKEINPUT_H
#define PIVX_STAKEINPUT_H

#include "amount.h"
#include "chain.h"
#include "streams.h"
#include "uint256.h"
Expand All @@ -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;
};

Expand All @@ -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
1 change: 1 addition & 0 deletions src/zpiv/zpos.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit af30a31

Please sign in to comment.