Skip to content

Commit 7a5c02a

Browse files
committed
[Refactor] Don't re-hash proposals in CFinalizedBudget::CheckProposals
1 parent b454d60 commit 7a5c02a

File tree

2 files changed

+39
-43
lines changed

2 files changed

+39
-43
lines changed

src/masternode-budget.cpp

Lines changed: 38 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,16 @@ void CBudgetManager::VoteOnFinalizedBudgets()
711711
}
712712

713713
std::vector<CBudgetProposal> vBudget = GetBudget();
714-
// Vector containing the hash of finalized budgets to save
714+
if (vBudget.empty()) {
715+
LogPrint(BCLog::MNBUDGET,"%s: No proposal can be finalized\n", __func__);
716+
return;
717+
}
718+
719+
std::map<uint256, CBudgetProposal> mapWinningProposals;
720+
for (const CBudgetProposal& p: vBudget) {
721+
mapWinningProposals.emplace(p.GetHash(), p);
722+
}
723+
// Vector containing the hash of finalized budgets to sign
715724
std::vector<uint256> vBudgetHashes;
716725
{
717726
LOCK(cs_budgets);
@@ -722,8 +731,8 @@ void CBudgetManager::VoteOnFinalizedBudgets()
722731
pfb->SetAutoChecked(true);
723732
//only vote for exact matches
724733
if (strBudgetMode == "auto") {
725-
// sort proposals and payments by votes and compare.
726-
if (!pfb->CheckProposals(vBudget)) {
734+
// compare budget payements with winning proposals
735+
if (!pfb->CheckProposals(mapWinningProposals)) {
727736
continue;
728737
}
729738
}
@@ -1938,63 +1947,50 @@ struct sortProposalsByHash {
19381947
}
19391948
};
19401949

1941-
bool CFinalizedBudget::CheckProposals(std::vector<CBudgetProposal>& vBudget) const
1950+
bool CFinalizedBudget::CheckProposals(const std::map<uint256, CBudgetProposal>& mapWinningProposals) const
19421951
{
1943-
// Sort proposals by hash
1944-
std::sort(vBudget.begin(), vBudget.end(), std::greater<CBudgetProposal>());
1945-
1946-
// Sort copy payments by hash (descending)
1947-
std::vector<CTxBudgetPayment> vecBudgetPaymentsSortedByHash(vecBudgetPayments);
1948-
std::sort(vecBudgetPaymentsSortedByHash.begin(), vecBudgetPaymentsSortedByHash.end(), std::greater<CTxBudgetPayment>());
1949-
1950-
for (unsigned int i = 0; i < vecBudgetPaymentsSortedByHash.size(); i++) {
1951-
LogPrint(BCLog::MNBUDGET,"%s: Budget-Payments - nProp %d %s\n", __func__, i, vecBudgetPaymentsSortedByHash[i].nProposalHash.ToString());
1952-
LogPrint(BCLog::MNBUDGET,"%s: Budget-Payments - Payee %d %s\n", __func__, i, HexStr(vecBudgetPaymentsSortedByHash[i].payee));
1953-
LogPrint(BCLog::MNBUDGET,"%s: Budget-Payments - nAmount %d %lli\n", __func__, i, vecBudgetPaymentsSortedByHash[i].nAmount);
1954-
}
1955-
1956-
for (unsigned int i = 0; i < vBudget.size(); i++) {
1957-
LogPrint(BCLog::MNBUDGET,"%s: Budget-Proposals - nProp %d %s\n", __func__, i, vBudget[i].GetHash().ToString());
1958-
LogPrint(BCLog::MNBUDGET,"%s: Budget-Proposals - Payee %d %s\n", __func__, i, HexStr(vBudget[i].GetPayee()));
1959-
LogPrint(BCLog::MNBUDGET,"%s: Budget-Proposals - nAmount %d %lli\n", __func__, i, vBudget[i].GetAmount());
1960-
}
1961-
1962-
if (vBudget.size() == 0) {
1952+
if (mapWinningProposals.empty()) {
19631953
LogPrint(BCLog::MNBUDGET,"%s: No Budget-Proposals found, aborting\n", __func__);
19641954
return false;
19651955
}
19661956

1967-
if (vBudget.size() != vecBudgetPaymentsSortedByHash.size()) {
1968-
LogPrint(BCLog::MNBUDGET,"%s: Budget-Proposal length (%ld) doesn't match Budget-Payment length (%ld).\n", __func__,
1969-
vBudget.size(), vecBudgetPaymentsSortedByHash.size());
1957+
if (mapWinningProposals.size() != vecBudgetPayments.size()) {
1958+
LogPrint(BCLog::MNBUDGET,"%s: Budget-Proposal length (%ld) doesn't match Budget-Payment length (%ld).\n",
1959+
__func__, mapWinningProposals.size(), vecBudgetPayments.size());
19701960
return false;
19711961
}
19721962

1973-
for (unsigned int i = 0; i < vecBudgetPaymentsSortedByHash.size(); i++) {
1974-
if (i > vBudget.size() - 1) {
1975-
LogPrint(BCLog::MNBUDGET,"%s: Proposal size mismatch, i=%d > (vBudgetProposals.size() - 1)=%d\n",
1976-
__func__, i, vBudget.size() - 1);
1977-
return false;
1978-
}
1963+
for (unsigned int i = 0; i < vecBudgetPayments.size(); i++) {
1964+
LogPrint(BCLog::MNBUDGET,"%s: Budget-Payments - nProp %d %s\n", __func__, i, vecBudgetPayments[i].nProposalHash.ToString());
1965+
LogPrint(BCLog::MNBUDGET,"%s: Budget-Payments - Payee %d %s\n", __func__, i, HexStr(vecBudgetPayments[i].payee));
1966+
LogPrint(BCLog::MNBUDGET,"%s: Budget-Payments - nAmount %d %lli\n", __func__, i, vecBudgetPayments[i].nAmount);
1967+
}
1968+
1969+
for (const auto& it: mapWinningProposals) {
1970+
LogPrint(BCLog::MNBUDGET,"%s: Budget-Proposals - nProp %s\n", __func__, (it.first).ToString());
1971+
LogPrint(BCLog::MNBUDGET,"%s: Budget-Proposals - Payee %s\n", __func__, HexStr((it.second).GetPayee()));
1972+
LogPrint(BCLog::MNBUDGET,"%s: Budget-Proposals - nAmount %lli\n", __func__, (it.second).GetAmount());
1973+
}
19791974

1980-
if (vecBudgetPaymentsSortedByHash[i].nProposalHash != vBudget[i].GetHash()) {
1981-
LogPrint(BCLog::MNBUDGET,"%s: item #%d doesn't match %s %s\n", __func__,
1982-
i, vecBudgetPaymentsSortedByHash[i].nProposalHash.ToString(), vBudget[i].GetHash().ToString());
1975+
for (const CTxBudgetPayment& p: vecBudgetPayments) {
1976+
const auto& it = mapWinningProposals.find(p.nProposalHash);
1977+
if (it == mapWinningProposals.end()) {
1978+
LogPrint(BCLog::MNBUDGET,"%s: Proposal %s not found\n", __func__, p.nProposalHash.ToString());
19831979
return false;
19841980
}
19851981

1986-
if (HexStr(vecBudgetPaymentsSortedByHash[i].payee) != HexStr(vBudget[i].GetPayee())) {
1987-
LogPrint(BCLog::MNBUDGET,"%s: item #%d payee doesn't match %s %s\n", __func__,
1988-
i, HexStr(vecBudgetPaymentsSortedByHash[i].payee), HexStr(vBudget[i].GetPayee()));
1982+
const CBudgetProposal& prop = it->second;
1983+
if (p.payee != prop.GetPayee()) {
1984+
LogPrint(BCLog::MNBUDGET,"%s: payee doesn't match %s != %s\n", __func__, HexStr(p.payee), HexStr(prop.GetPayee()));
19891985
return false;
19901986
}
19911987

1992-
if (vecBudgetPaymentsSortedByHash[i].nAmount != vBudget[i].GetAmount()) {
1993-
LogPrint(BCLog::MNBUDGET,"%s: item #%d payee doesn't match %lli %lli\n", __func__,
1994-
i, vecBudgetPaymentsSortedByHash[i].nAmount, vBudget[i].GetAmount());
1988+
if (p.nAmount != prop.GetAmount()) {
1989+
LogPrint(BCLog::MNBUDGET,"%s: payee amount doesn't match %lli != %lli\n", __func__, p.nAmount, prop.GetAmount());
19951990
return false;
19961991
}
19971992
}
1993+
19981994
LogPrint(BCLog::MNBUDGET,"%s: Finalized Budget Matches! Submitting Vote.\n", __func__);
19991995
return true;
20001996
}

src/masternode-budget.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ class CFinalizedBudget
460460
bool GetPayeeAndAmount(int64_t nBlockHeight, CScript& payee, CAmount& nAmount) const;
461461

462462
// Check finalized budget proposals. Masternodes only (when voting on finalized budgets)
463-
bool CheckProposals(std::vector<CBudgetProposal>& vBudget) const;
463+
bool CheckProposals(const std::map<uint256, CBudgetProposal>& mapWinningProposals) const;
464464
// Total amount paid out by this budget
465465
CAmount GetTotalPayout() const;
466466

0 commit comments

Comments
 (0)