Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 15 additions & 95 deletions src/governance-classes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

//#define ENABLE_DASH_DEBUG

#include "governance-classes.h"
#include "core_io.h"
#include "init.h"
Expand Down Expand Up @@ -36,8 +34,6 @@ std::vector<std::string> SplitBy(const std::string& strCommand, const std::strin

CAmount ParsePaymentAmount(const std::string& strAmount)
{
DBG(std::cout << "ParsePaymentAmount Start: strAmount = " << strAmount << std::endl;);

CAmount nAmount = 0;
if (strAmount.empty()) {
std::ostringstream ostr;
Expand Down Expand Up @@ -91,8 +87,6 @@ CAmount ParsePaymentAmount(const std::string& strAmount)
throw std::runtime_error(ostr.str());
}

DBG(std::cout << "ParsePaymentAmount Returning true nAmount = " << nAmount << std::endl;);

return nAmount;
}

Expand All @@ -102,17 +96,12 @@ CAmount ParsePaymentAmount(const std::string& strAmount)

bool CGovernanceTriggerManager::AddNewTrigger(uint256 nHash)
{
DBG(std::cout << "CGovernanceTriggerManager::AddNewTrigger: Start" << std::endl;);
AssertLockHeld(governance.cs);

// IF WE ALREADY HAVE THIS HASH, RETURN
if (mapTrigger.count(nHash)) {
DBG(
std::cout << "CGovernanceTriggerManager::AddNewTrigger: Already have hash"
<< ", nHash = " << nHash.GetHex()
<< ", count = " << mapTrigger.count(nHash)
<< ", mapTrigger.size() = " << mapTrigger.size()
<< std::endl;);
LogPrint("gobject", "CGovernanceTriggerManager::AddNewTrigger -- Already have hash, nHash = %s, count = %d, size = %s\n",
nHash.GetHex(), mapTrigger.count(nHash), mapTrigger.size());
return false;
}

Expand All @@ -121,24 +110,17 @@ bool CGovernanceTriggerManager::AddNewTrigger(uint256 nHash)
CSuperblock_sptr pSuperblockTmp(new CSuperblock(nHash));
pSuperblock = pSuperblockTmp;
} catch (std::exception& e) {
DBG(std::cout << "CGovernanceTriggerManager::AddNewTrigger Error creating superblock"
<< ", e.what() = " << e.what()
<< std::endl;);
LogPrintf("CGovernanceTriggerManager::AddNewTrigger -- Error creating superblock: %s\n", e.what());
return false;
} catch (...) {
LogPrintf("CGovernanceTriggerManager::AddNewTrigger: Unknown Error creating superblock\n");
DBG(std::cout << "CGovernanceTriggerManager::AddNewTrigger Error creating superblock catchall" << std::endl;);
return false;
}

pSuperblock->SetStatus(SEEN_OBJECT_IS_VALID);

DBG(std::cout << "CGovernanceTriggerManager::AddNewTrigger: Inserting trigger" << std::endl;);
mapTrigger.insert(std::make_pair(nHash, pSuperblock));

DBG(std::cout << "CGovernanceTriggerManager::AddNewTrigger: End" << std::endl;);

return true;
}

Expand All @@ -150,12 +132,9 @@ bool CGovernanceTriggerManager::AddNewTrigger(uint256 nHash)

void CGovernanceTriggerManager::CleanAndRemove()
{
LogPrint("gobject", "CGovernanceTriggerManager::CleanAndRemove -- Start\n");
DBG(std::cout << "CGovernanceTriggerManager::CleanAndRemove: Start" << std::endl;);
AssertLockHeld(governance.cs);

// Remove triggers that are invalid or expired
DBG(std::cout << "CGovernanceTriggerManager::CleanAndRemove: mapTrigger.size() = " << mapTrigger.size() << std::endl;);
LogPrint("gobject", "CGovernanceTriggerManager::CleanAndRemove -- mapTrigger.size() = %d\n", mapTrigger.size());

trigger_m_it it = mapTrigger.begin();
Expand All @@ -164,18 +143,15 @@ void CGovernanceTriggerManager::CleanAndRemove()
CGovernanceObject* pObj = nullptr;
CSuperblock_sptr& pSuperblock = it->second;
if (!pSuperblock) {
DBG(std::cout << "CGovernanceTriggerManager::CleanAndRemove: NULL superblock marked for removal" << std::endl;);
LogPrint("gobject", "CGovernanceTriggerManager::CleanAndRemove -- NULL superblock marked for removal\n");
remove = true;
} else {
pObj = governance.FindGovernanceObject(it->first);
if (!pObj || pObj->GetObjectType() != GOVERNANCE_OBJECT_TRIGGER) {
DBG(std::cout << "CGovernanceTriggerManager::CleanAndRemove: Unknown or non-trigger superblock" << std::endl;);
LogPrint("gobject", "CGovernanceTriggerManager::CleanAndRemove -- Unknown or non-trigger superblock\n");
pSuperblock->SetStatus(SEEN_OBJECT_ERROR_INVALID);
}

DBG(std::cout << "CGovernanceTriggerManager::CleanAndRemove: superblock status = " << pSuperblock->GetStatus() << std::endl;);
LogPrint("gobject", "CGovernanceTriggerManager::CleanAndRemove -- superblock status = %d\n", pSuperblock->GetStatus());
switch (pSuperblock->GetStatus()) {
case SEEN_OBJECT_ERROR_INVALID:
Expand All @@ -194,15 +170,11 @@ void CGovernanceTriggerManager::CleanAndRemove()
LogPrint("gobject", "CGovernanceTriggerManager::CleanAndRemove -- %smarked for removal\n", remove ? "" : "NOT ");

if (remove) {
DBG(
std::string strDataAsPlainString = "NULL";
if (pObj) {
strDataAsPlainString = pObj->GetDataAsPlainString();
}
std::cout << "CGovernanceTriggerManager::CleanAndRemove: Removing object: "
<< strDataAsPlainString
<< std::endl;);
LogPrint("gobject", "CGovernanceTriggerManager::CleanAndRemove -- Removing trigger object\n");
std::string strDataAsPlainString = "NULL";
if (pObj) {
strDataAsPlainString = pObj->GetDataAsPlainString();
}
LogPrint("gobject", "CGovernanceTriggerManager::CleanAndRemove -- Removing trigger object %s\n", strDataAsPlainString);
// mark corresponding object for deletion
if (pObj) {
pObj->fCachedDelete = true;
Expand All @@ -216,8 +188,6 @@ void CGovernanceTriggerManager::CleanAndRemove()
++it;
}
}

DBG(std::cout << "CGovernanceTriggerManager::CleanAndRemove: End" << std::endl;);
}

/**
Expand All @@ -232,19 +202,14 @@ std::vector<CSuperblock_sptr> CGovernanceTriggerManager::GetActiveTriggers()
AssertLockHeld(governance.cs);
std::vector<CSuperblock_sptr> vecResults;

DBG(std::cout << "GetActiveTriggers: mapTrigger.size() = " << mapTrigger.size() << std::endl;);

// LOOK AT THESE OBJECTS AND COMPILE A VALID LIST OF TRIGGERS
for (const auto& pair : mapTrigger) {
CGovernanceObject* pObj = governance.FindGovernanceObject(pair.first);
if (pObj) {
DBG(std::cout << "GetActiveTriggers: pObj->GetDataAsPlainString() = " << pObj->GetDataAsPlainString() << std::endl;);
vecResults.push_back(pair.second);
}
}

DBG(std::cout << "GetActiveTriggers: vecResults.size() = " << vecResults.size() << std::endl;);

return vecResults;
}

Expand All @@ -267,20 +232,16 @@ bool CSuperblockManager::IsSuperblockTriggered(int nBlockHeight)

LogPrint("gobject", "CSuperblockManager::IsSuperblockTriggered -- vecTriggers.size() = %d\n", vecTriggers.size());

DBG(std::cout << "IsSuperblockTriggered Number triggers = " << vecTriggers.size() << std::endl;);

for (const auto& pSuperblock : vecTriggers) {
if (!pSuperblock) {
LogPrintf("CSuperblockManager::IsSuperblockTriggered -- Non-superblock found, continuing\n");
DBG(std::cout << "IsSuperblockTriggered Not a superblock, continuing " << std::endl;);
continue;
}

CGovernanceObject* pObj = pSuperblock->GetGovernanceObject();

if (!pObj) {
LogPrintf("CSuperblockManager::IsSuperblockTriggered -- pObj == nullptr, continuing\n");
DBG(std::cout << "IsSuperblockTriggered pObj is NULL, continuing" << std::endl;);
continue;
}

Expand All @@ -292,10 +253,6 @@ bool CSuperblockManager::IsSuperblockTriggered(int nBlockHeight)
LogPrint("gobject", "CSuperblockManager::IsSuperblockTriggered -- block height doesn't match nBlockHeight = %d, blockStart = %d, continuing\n",
nBlockHeight,
pSuperblock->GetBlockHeight());
DBG(std::cout << "IsSuperblockTriggered Not the target block, continuing"
<< ", nBlockHeight = " << nBlockHeight
<< ", superblock->GetBlockHeight() = " << pSuperblock->GetBlockHeight()
<< std::endl;);
continue;
}

Expand All @@ -305,11 +262,9 @@ bool CSuperblockManager::IsSuperblockTriggered(int nBlockHeight)

if (pObj->IsSetCachedFunding()) {
LogPrint("gobject", "CSuperblockManager::IsSuperblockTriggered -- fCacheFunding = true, returning true\n");
DBG(std::cout << "IsSuperblockTriggered returning true" << std::endl;);
return true;
} else {
LogPrint("gobject", "CSuperblockManager::IsSuperblockTriggered -- fCacheFunding = false, continuing\n");
DBG(std::cout << "IsSuperblockTriggered No fCachedFunding, continuing" << std::endl;);
}
}

Expand All @@ -328,31 +283,22 @@ bool CSuperblockManager::GetBestSuperblock(CSuperblock_sptr& pSuperblockRet, int
int nYesCount = 0;

for (const auto& pSuperblock : vecTriggers) {
if (!pSuperblock) {
DBG(std::cout << "GetBestSuperblock Not a superblock, continuing" << std::endl;);
if (!pSuperblock || nBlockHeight != pSuperblock->GetBlockHeight()) {
continue;
}

CGovernanceObject* pObj = pSuperblock->GetGovernanceObject();

if (!pObj) {
DBG(std::cout << "GetBestSuperblock pObj is NULL, continuing" << std::endl;);
continue;
}

if (nBlockHeight != pSuperblock->GetBlockHeight()) {
DBG(std::cout << "GetBestSuperblock Not the target block, continuing" << std::endl;);
continue;
}

// DO WE HAVE A NEW WINNER?

int nTempYesCount = pObj->GetAbsoluteYesCount(VOTE_SIGNAL_FUNDING);
DBG(std::cout << "GetBestSuperblock nTempYesCount = " << nTempYesCount << std::endl;);
if (nTempYesCount > nYesCount) {
nYesCount = nTempYesCount;
pSuperblockRet = pSuperblock;
DBG(std::cout << "GetBestSuperblock Valid superblock found, pSuperblock set" << std::endl;);
}
}

Expand All @@ -367,16 +313,13 @@ bool CSuperblockManager::GetBestSuperblock(CSuperblock_sptr& pSuperblockRet, int

bool CSuperblockManager::GetSuperblockPayments(int nBlockHeight, std::vector<CTxOut>& voutSuperblockRet)
{
DBG(std::cout << "CSuperblockManager::GetSuperblockPayments Start" << std::endl;);

LOCK(governance.cs);

// GET THE BEST SUPERBLOCK FOR THIS BLOCK HEIGHT

CSuperblock_sptr pSuperblock;
if (!CSuperblockManager::GetBestSuperblock(pSuperblock, nBlockHeight)) {
LogPrint("gobject", "CSuperblockManager::GetSuperblockPayments -- Can't find superblock for height %d\n", nBlockHeight);
DBG(std::cout << "CSuperblockManager::GetSuperblockPayments Failed to get superblock for height, returning" << std::endl;);
return false;
}

Expand All @@ -386,17 +329,14 @@ bool CSuperblockManager::GetSuperblockPayments(int nBlockHeight, std::vector<CTx
// GET SUPERBLOCK OUTPUTS

// Superblock payments will be appended to the end of the coinbase vout vector
DBG(std::cout << "CSuperblockManager::GetSuperblockPayments Number payments: " << pSuperblock->CountPayments() << std::endl;);

// TODO: How many payments can we add before things blow up?
// Consider at least following limits:
// - max coinbase tx size
// - max "budget" available
for (int i = 0; i < pSuperblock->CountPayments(); i++) {
CGovernancePayment payment;
DBG(std::cout << "CSuperblockManager::GetSuperblockPayments i = " << i << std::endl;);
if (pSuperblock->GetPayment(i, payment)) {
DBG(std::cout << "CSuperblockManager::GetSuperblockPayments Payment found " << std::endl;);
// SET COINBASE OUTPUT TO SUPERBLOCK SETTING

CTxOut txout = CTxOut(payment.nAmount, payment.script);
Expand All @@ -410,16 +350,13 @@ bool CSuperblockManager::GetSuperblockPayments(int nBlockHeight, std::vector<CTx

// TODO: PRINT NICE N.N DASH OUTPUT

DBG(std::cout << "CSuperblockManager::GetSuperblockPayments Before LogPrintf call, nAmount = " << payment.nAmount << std::endl;);
LogPrintf("NEW Superblock : output %d (addr %s, amount %d)\n", i, address2.ToString(), payment.nAmount);
DBG(std::cout << "CSuperblockManager::GetSuperblockPayments After LogPrintf call " << std::endl;);
LogPrint("gobject", "CSuperblockManager::GetSuperblockPayments -- NEW Superblock: output %d (addr %s, amount %lld)\n",
i, address2.ToString(), payment.nAmount);
} else {
DBG(std::cout << "CSuperblockManager::GetSuperblockPayments Payment not found " << std::endl;);
LogPrint("gobject", "CSuperblockManager::GetSuperblockPayments -- Payment not found\n");
}
}

DBG(std::cout << "CSuperblockManager::GetSuperblockPayments End" << std::endl;);

return true;
}

Expand Down Expand Up @@ -464,22 +401,16 @@ CSuperblock::
nStatus(SEEN_OBJECT_UNKNOWN),
vecPayments()
{
DBG(std::cout << "CSuperblock Constructor Start" << std::endl;);

CGovernanceObject* pGovObj = GetGovernanceObject();

if (!pGovObj) {
DBG(std::cout << "CSuperblock Constructor pGovObjIn is NULL, returning" << std::endl;);
throw std::runtime_error("CSuperblock: Failed to find Governance Object");
}

DBG(std::cout << "CSuperblock Constructor pGovObj : "
<< pGovObj->GetDataAsPlainString()
<< ", nObjectType = " << pGovObj->GetObjectType()
<< std::endl;);
LogPrint("gobject", "CSuperblock -- Constructor pGovObj: %s, nObjectType = %d\n",
pGovObj->GetDataAsPlainString(), pGovObj->GetObjectType());

if (pGovObj->GetObjectType() != GOVERNANCE_OBJECT_TRIGGER) {
DBG(std::cout << "CSuperblock Constructor pGovObj not a trigger, returning" << std::endl;);
throw std::runtime_error("CSuperblock: Governance Object not a trigger");
}

Expand All @@ -495,8 +426,6 @@ CSuperblock::

LogPrint("gobject", "CSuperblock -- nBlockHeight = %d, strAddresses = %s, strAmounts = %s, vecPayments.size() = %d\n",
nBlockHeight, strAddresses, strAmounts, vecPayments.size());

DBG(std::cout << "CSuperblock Constructor End" << std::endl;);
}

/**
Expand Down Expand Up @@ -580,8 +509,6 @@ void CSuperblock::ParsePaymentSchedule(const std::string& strPaymentAddresses, c
AMOUNTS = [AMOUNT1|2|3|4|5|6]
*/

DBG(std::cout << "CSuperblock::ParsePaymentSchedule vecParsed1.size() = " << vecParsed1.size() << std::endl;);

for (int i = 0; i < (int)vecParsed1.size(); i++) {
CBitcoinAddress address(vecParsed1[i]);
if (!address.IsValid()) {
Expand All @@ -603,16 +530,9 @@ void CSuperblock::ParsePaymentSchedule(const std::string& strPaymentAddresses, c
throw std::runtime_error(ostr.str());
}

DBG(std::cout << "CSuperblock::ParsePaymentSchedule i = " << i
<< ", vecParsed2[i] = " << vecParsed2[i]
<< std::endl;);

CAmount nAmount = ParsePaymentAmount(vecParsed2[i]);

DBG(std::cout << "CSuperblock::ParsePaymentSchedule: "
<< "amount string = " << vecParsed2[i]
<< ", nAmount = " << nAmount
<< std::endl;);
LogPrint("gobject", "CSuperblock::ParsePaymentSchedule -- i = %d, amount string = %s, nAmount = %lld\n", i, vecParsed2[i], nAmount);

CGovernancePayment payment(address, nAmount);
if (payment.IsValid()) {
Expand Down Expand Up @@ -676,7 +596,7 @@ bool CSuperblock::IsValid(const CTransaction& txNew, int nBlockHeight, CAmount b
int nPayments = CountPayments();
int nMinerAndMasternodePayments = nOutputs - nPayments;

LogPrint("gobject", "CSuperblock::IsValid nOutputs = %d, nPayments = %d, GetDataAsHexString = %s\n",
LogPrint("gobject", "CSuperblock::IsValid -- nOutputs = %d, nPayments = %d, GetDataAsHexString = %s\n",
nOutputs, nPayments, GetGovernanceObject()->GetDataAsHexString());

// We require an exact match (including order) between the expected
Expand Down
2 changes: 0 additions & 2 deletions src/governance-classes.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
#ifndef GOVERNANCE_CLASSES_H
#define GOVERNANCE_CLASSES_H

//#define ENABLE_DASH_DEBUG

#include "base58.h"
#include "governance.h"
#include "key.h"
Expand Down
Loading