Skip to content

Commit

Permalink
[Spork] Define SporkId enum (with its serialization)
Browse files Browse the repository at this point in the history
  • Loading branch information
random-zebra committed Sep 23, 2019
1 parent 41effbf commit 4df1046
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 49 deletions.
1 change: 1 addition & 0 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ BITCOIN_CORE_H = \
serialize.h \
spork.h \
sporkdb.h \
sporkid.h \
stakeinput.h \
streams.h \
support/cleanse.h \
Expand Down
13 changes: 8 additions & 5 deletions src/rpc/misc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -289,23 +289,26 @@ class DescribeAddressVisitor : public boost::static_visitor<UniValue>
*/
UniValue spork(const UniValue& params, bool fHelp)
{
SporkId nSporkID;
if (params.size() == 1 && params[0].get_str() == "show") {
UniValue ret(UniValue::VOBJ);
for (int nSporkID = SPORK_START; nSporkID <= SPORK_END; nSporkID++) {
if (sporkManager.GetSporkNameByID(nSporkID) != "Unknown")
for (int i = SPORK_START; i <= SPORK_END; i++) {
nSporkID = (SporkId) i;
if (sporkManager.GetSporkNameByID((SporkId) nSporkID) != "Unknown")
ret.push_back(Pair(sporkManager.GetSporkNameByID(nSporkID), sporkManager.GetSporkValue(nSporkID)));
}
return ret;
} else if (params.size() == 1 && params[0].get_str() == "active") {
UniValue ret(UniValue::VOBJ);
for (int nSporkID = SPORK_START; nSporkID <= SPORK_END; nSporkID++) {
for (int i = SPORK_START; i <= SPORK_END; i++) {
nSporkID = (SporkId) i;
if (sporkManager.GetSporkNameByID(nSporkID) != "Unknown")
ret.push_back(Pair(sporkManager.GetSporkNameByID(nSporkID), sporkManager.IsSporkActive(nSporkID)));
}
return ret;
} else if (params.size() == 2) {
int nSporkID = sporkManager.GetSporkIDByName(params[0].get_str());
if (nSporkID == -1) {
nSporkID = sporkManager.GetSporkIDByName(params[0].get_str());
if (nSporkID == SPORK_INVALID) {
return "Invalid spork name";
}

Expand Down
18 changes: 18 additions & 0 deletions src/serialize.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <vector>
#include "libzerocoin/Denominations.h"
#include "libzerocoin/SpendType.h"
#include "sporkid.h"

class CScript;

Expand Down Expand Up @@ -290,6 +291,23 @@ inline void Unserialize(Stream& s, libzerocoin::SpendType & a, int, int = 0)
a = static_cast<libzerocoin::SpendType>(f);
}

// Serialization for SporkId
inline unsigned int GetSerializeSize(SporkId sporkID, int, int = 0) { return sizeof(SporkId); }
template <typename Stream>
inline void Serialize(Stream& s, SporkId sporkID, int, int = 0)
{
int32_t f = static_cast<int32_t>(sporkID);
WRITEDATA(s, f);
}

template <typename Stream>
inline void Unserialize(Stream& s, SporkId& sporkID, int, int = 0)
{
int32_t f=0;
READDATA(s, f);
sporkID = (SporkId) f;
}


/**
* Compact Size
Expand Down
18 changes: 10 additions & 8 deletions src/spork.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,16 @@ void CSporkManager::Clear()
// PIVX: on startup load spork values from previous session if they exist in the sporkDB
void CSporkManager::LoadSporksFromDB()
{
SporkId id;
for (int i = SPORK_START; i <= SPORK_END; ++i) {
id = (SporkId) i;
// Since not all spork IDs are in use, we have to exclude undefined IDs
std::string strSpork = sporkManager.GetSporkNameByID(i);
std::string strSpork = sporkManager.GetSporkNameByID(id);
if (strSpork == "Unknown") continue;

// attempt to read spork from sporkDB
CSporkMessage spork;
if (!pSporkDB->ReadSpork(i, spork)) {
if (!pSporkDB->ReadSpork(id, spork)) {
LogPrintf("%s : no previous value for %s found in database\n", __func__, strSpork);
continue;
}
Expand Down Expand Up @@ -124,7 +126,7 @@ void CSporkManager::ProcessSpork(CNode* pfrom, std::string& strCommand, CDataStr
}
}

bool CSporkManager::UpdateSpork(int nSporkID, int64_t nValue)
bool CSporkManager::UpdateSpork(SporkId nSporkID, int64_t nValue)
{

CSporkMessage spork = CSporkMessage(nSporkID, nValue, GetTime());
Expand All @@ -141,15 +143,15 @@ bool CSporkManager::UpdateSpork(int nSporkID, int64_t nValue)
}

// grab the spork value, and see if it's off
bool CSporkManager::IsSporkActive(int nSporkID)
bool CSporkManager::IsSporkActive(SporkId nSporkID)
{
int64_t r = GetSporkValue(nSporkID);
if (r == -1) return false;
return r < GetAdjustedTime();
}

// grab the value of the spork on the network, or the default
int64_t CSporkManager::GetSporkValue(int nSporkID)
int64_t CSporkManager::GetSporkValue(SporkId nSporkID)
{
LOCK(cs);
int64_t r = -1;
Expand All @@ -174,7 +176,7 @@ int64_t CSporkManager::GetSporkValue(int nSporkID)
return r;
}

int CSporkManager::GetSporkIDByName(std::string strName)
SporkId CSporkManager::GetSporkIDByName(std::string strName)
{
if (strName == "SPORK_2_SWIFTTX") return SPORK_2_SWIFTTX;
if (strName == "SPORK_3_SWIFTTX_BLOCK_FILTERING") return SPORK_3_SWIFTTX_BLOCK_FILTERING;
Expand All @@ -187,10 +189,10 @@ int CSporkManager::GetSporkIDByName(std::string strName)
if (strName == "SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2") return SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2;
if (strName == "SPORK_16_ZEROCOIN_MAINTENANCE_MODE") return SPORK_16_ZEROCOIN_MAINTENANCE_MODE;

return -1;
return SPORK_INVALID;
}

std::string CSporkManager::GetSporkNameByID(int id)
std::string CSporkManager::GetSporkNameByID(SporkId id)
{
if (id == SPORK_2_SWIFTTX) return "SPORK_2_SWIFTTX";
if (id == SPORK_3_SWIFTTX_BLOCK_FILTERING) return "SPORK_3_SWIFTTX_BLOCK_FILTERING";
Expand Down
40 changes: 10 additions & 30 deletions src/spork.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,13 @@
#include "key.h"
#include "main.h"
#include "net.h"
#include "sporkid.h"
#include "sync.h"
#include "util.h"

#include "obfuscation.h"
#include "protocol.h"


/*
Don't ever reuse these IDs for other sporks
- This would result in old clients getting confused about which spork is for what
Sporks 11,12, and 16 to be removed with 1st zerocoin release
*/
#define SPORK_START 10001
#define SPORK_END 10015

#define SPORK_2_SWIFTTX 10001
#define SPORK_3_SWIFTTX_BLOCK_FILTERING 10002
#define SPORK_5_MAX_VALUE 10004
#define SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT 10007
#define SPORK_9_MASTERNODE_BUDGET_ENFORCEMENT 10008
#define SPORK_10_MASTERNODE_PAY_UPDATED_NODES 10009
#define SPORK_13_ENABLE_SUPERBLOCKS 10012
#define SPORK_14_NEW_PROTOCOL_ENFORCEMENT 10013
#define SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2 10014
#define SPORK_16_ZEROCOIN_MAINTENANCE_MODE 10015

#define SPORK_2_SWIFTTX_DEFAULT 978307200 //2001-1-1
#define SPORK_3_SWIFTTX_BLOCK_FILTERING_DEFAULT 1424217600 //2015-2-18
#define SPORK_5_MAX_VALUE_DEFAULT 1000 //1000 PIV
Expand Down Expand Up @@ -67,12 +47,12 @@ class CSporkMessage

public:
std::vector<unsigned char> vchSig;
int nSporkID;
SporkId nSporkID;
int64_t nValue;
int64_t nTimeSigned;

CSporkMessage(int nSporkID, int64_t nValue, int64_t nTimeSigned) : nSporkID(nSporkID), nValue(nValue), nTimeSigned(nTimeSigned) {}
CSporkMessage() : nSporkID(0), nValue(0), nTimeSigned(0) {}
CSporkMessage(SporkId nSporkID, int64_t nValue, int64_t nTimeSigned) : nSporkID(nSporkID), nValue(nValue), nTimeSigned(nTimeSigned) {}
CSporkMessage() : nSporkID((SporkId)0), nValue(0), nTimeSigned(0) {}

uint256 GetHash() { return HashQuark(BEGIN(nSporkID), END(nTimeSigned)); }
bool Sign(std::string strSignKey);
Expand Down Expand Up @@ -115,13 +95,13 @@ class CSporkManager
void LoadSporksFromDB();

void ProcessSpork(CNode* pfrom, std::string& strCommand, CDataStream& vRecv);
int64_t GetSporkValue(int nSporkID);
void ExecuteSpork(int nSporkID, int nValue);
bool UpdateSpork(int nSporkID, int64_t nValue);
int64_t GetSporkValue(SporkId nSporkID);
void ExecuteSpork(SporkId nSporkID, int nValue);
bool UpdateSpork(SporkId nSporkID, int64_t nValue);

bool IsSporkActive(int nSporkID);
std::string GetSporkNameByID(int id);
int GetSporkIDByName(std::string strName);
bool IsSporkActive(SporkId nSporkID);
std::string GetSporkNameByID(SporkId id);
SporkId GetSporkIDByName(std::string strName);

bool SetPrivKey(std::string strPrivKey);
std::string ToString() const;
Expand Down
6 changes: 3 additions & 3 deletions src/sporkdb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@

CSporkDB::CSporkDB(size_t nCacheSize, bool fMemory, bool fWipe) : CLevelDBWrapper(GetDataDir() / "sporks", nCacheSize, fMemory, fWipe) {}

bool CSporkDB::WriteSpork(const int nSporkId, const CSporkMessage& spork)
bool CSporkDB::WriteSpork(const SporkId nSporkId, const CSporkMessage& spork)
{
LogPrintf("Wrote spork %s to database\n", sporkManager.GetSporkNameByID(nSporkId));
return Write(nSporkId, spork);

}

bool CSporkDB::ReadSpork(const int nSporkId, CSporkMessage& spork)
bool CSporkDB::ReadSpork(const SporkId nSporkId, CSporkMessage& spork)
{
return Read(nSporkId, spork);
}

bool CSporkDB::SporkExists(const int nSporkId)
bool CSporkDB::SporkExists(const SporkId nSporkId)
{
return Exists(nSporkId);
}
6 changes: 3 additions & 3 deletions src/sporkdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ class CSporkDB : public CLevelDBWrapper
void operator=(const CSporkDB&);

public:
bool WriteSpork(const int nSporkId, const CSporkMessage& spork);
bool ReadSpork(const int nSporkId, CSporkMessage& spork);
bool SporkExists(const int nSporkId);
bool WriteSpork(const SporkId nSporkId, const CSporkMessage& spork);
bool ReadSpork(const SporkId nSporkId, CSporkMessage& spork);
bool SporkExists(const SporkId nSporkId);
};


Expand Down
31 changes: 31 additions & 0 deletions src/sporkid.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (c) 2014-2016 The Dash developers
// Copyright (c) 2016-2019 The PIVX developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#ifndef SPORKID_H
#define SPORKID_H

/*
Don't ever reuse these IDs for other sporks
- This would result in old clients getting confused about which spork is for what
*/

enum SporkId : int32_t {
SPORK_2_SWIFTTX = 10001,
SPORK_3_SWIFTTX_BLOCK_FILTERING = 10002,
SPORK_5_MAX_VALUE = 10004,
SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT = 10007,
SPORK_9_MASTERNODE_BUDGET_ENFORCEMENT = 10008,
SPORK_10_MASTERNODE_PAY_UPDATED_NODES = 10009,
SPORK_13_ENABLE_SUPERBLOCKS = 10012,
SPORK_14_NEW_PROTOCOL_ENFORCEMENT = 10013,
SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2 = 10014,
SPORK_16_ZEROCOIN_MAINTENANCE_MODE = 10015,

SPORK_START = SPORK_2_SWIFTTX,
SPORK_END = SPORK_16_ZEROCOIN_MAINTENANCE_MODE,
SPORK_INVALID = -1
};

#endif

0 comments on commit 4df1046

Please sign in to comment.