Various improvements to the proposal system

- Proposal scripts are now checked correctly
- Fee transactions are created correctly for IX and non-IX types
This commit is contained in:
Evan Duffield 2015-07-12 14:02:39 -07:00
parent 2885f9e6ca
commit 304ab6c7ab
5 changed files with 22 additions and 71 deletions

View File

@ -57,7 +57,9 @@ void ProcessMessageInstantX(CNode* pfrom, std::string& strCommand, CDataStream&
}
BOOST_FOREACH(const CTxOut o, tx.vout){
if(!o.scriptPubKey.IsNormalPaymentScript()){
// IX supports normal scripts and unspendable scripts (used in DS collateral and Budget collateral).
// TODO: Look into other script types that are normal and can be included
if(!o.scriptPubKey.IsNormalPaymentScript() && !o.scriptPubKey.IsUnspendable()){
LogPrintf("ProcessMessageInstantX::ix - Invalid Script %s\n", tx.ToString().c_str());
return;
}

View File

@ -32,10 +32,8 @@ int GetBudgetPaymentCycleBlocks(){
return 50;
}
bool IsBudgetCollateralValid(uint256 nTxCollateralHash, std::string& strError)
bool IsBudgetCollateralValid(uint256 nTxCollateralHash, uint256 nExpectedHash, std::string& strError)
{
return true;
CTransaction txCollateral;
uint256 hash;
if(!GetTransaction(nTxCollateralHash, txCollateral, hash, true)){
@ -46,56 +44,23 @@ bool IsBudgetCollateralValid(uint256 nTxCollateralHash, std::string& strError)
if(txCollateral.vout.size() < 1) return false;
if(txCollateral.nLockTime != 0) return false;
int64_t nValueIn = 0;
int64_t nValueOut = 0;
bool missingTx = false;
CScript findScript;
findScript << OP_RETURN << ToByteVector(nExpectedHash);
bool foundOpReturn = false;
BOOST_FOREACH(const CTxOut o, txCollateral.vout){
nValueOut += o.nValue;
if(!o.scriptPubKey.IsNormalPaymentScript()){
if(!o.scriptPubKey.IsNormalPaymentScript() && !o.scriptPubKey.IsUnspendable()){
LogPrintf ("CBudgetProposalBroadcast::FeeTXValid - Invalid Script %s\n", txCollateral.ToString().c_str());
return false;
}
}
if(o.scriptPubKey == findScript && o.nValue >= BUDGET_FEE_TX) foundOpReturn = true;
bool foundOpReturn = false;
BOOST_FOREACH(const CTxIn i, txCollateral.vin){
CTransaction tx2;
uint256 hash;
if(GetTransaction(i.prevout.hash, tx2, hash, true)){
if(tx2.vout.size() > i.prevout.n) {
nValueIn += tx2.vout[i.prevout.n].nValue;
}
} else{
missingTx = true;
}
}
if(!foundOpReturn){
}
if(missingTx){
if(fDebug) LogPrintf ("CBudgetProposalBroadcast::FeeTXValid - Unknown inputs in collateral transaction - %s\n", txCollateral.ToString().c_str());
LogPrintf ("CBudgetProposalBroadcast::IsBudgetCollateralValid - Couldn't find opReturn %s\n", txCollateral.ToString().c_str());
return false;
}
//collateral transactions are required to pay out BUDGET_FEE_TX as a fee to the miners
if(nValueIn - nValueOut < BUDGET_FEE_TX) {
if(fDebug) LogPrintf ("CBudgetProposalBroadcast::FeeTXValid - did not include enough fees in transaction %d\n%s\n", nValueOut-nValueIn, txCollateral.ToString().c_str());
return false;
}
if(fDebug) LogPrintf("CBudgetProposalBroadcast::FeeTXValid %s\n", txCollateral.ToString().c_str());
CValidationState state;
if(!AcceptableInputs(mempool, state, txCollateral, true, NULL)){
if(fDebug) LogPrintf ("CBudgetProposalBroadcast::FeeTXValid - didn't pass IsAcceptable\n");
return false;
}
return true;
return true;
}
@ -734,7 +699,7 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData
budgetProposalBroadcast.nTime = GetAdjustedTime();
std::string strError = "";
if(!IsBudgetCollateralValid(budgetProposalBroadcast.nFeeTXHash, strError)){
if(!IsBudgetCollateralValid(budgetProposalBroadcast.nFeeTXHash, budgetProposalBroadcast.GetHash(), strError)){
LogPrintf("Proposal FeeTX is not valid - %s - %s\n", budgetProposalBroadcast.nFeeTXHash.ToString(), strError);
return;
}
@ -794,7 +759,7 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData
}
std::string strError = "";
if(!IsBudgetCollateralValid(finalizedBudgetBroadcast.nFeeTXHash, strError)){
if(!IsBudgetCollateralValid(finalizedBudgetBroadcast.nFeeTXHash, finalizedBudgetBroadcast.GetHash(), strError)){
LogPrintf("Finalized Budget FeeTX is not valid - %s - %s\n", finalizedBudgetBroadcast.nFeeTXHash.ToString(), strError);
return;
}

View File

@ -44,7 +44,7 @@ void DumpBudgets();
int GetBudgetPaymentCycleBlocks();
//Check the collateral transaction for the budget proposal/finalized budget
bool IsBudgetCollateralValid(uint256 nTxCollateralHash, std::string& strError);
bool IsBudgetCollateralValid(uint256 nTxCollateralHash, uint256 nExpectedHash, std::string& strError);
/** Save Budget Manager (budget.dat)
*/

View File

@ -88,27 +88,21 @@ Value mnbudget(const Array& params, bool fHelp)
// Parse Dash address
CScript scriptPubKey = GetScriptForDestination(address.Get());
CAmount nAmount = AmountFromValue(params[6]);
CPubKey pubKeyMasternode;
CKey keyMasternode;
std::string errorMessage;
if(!darkSendSigner.SetKey(strMasterNodePrivKey, errorMessage, keyMasternode, pubKeyMasternode))
return(" Error upon calling SetKey");
//*************************************************************************
CBudgetProposalBroadcast budgetProposalBroadcast(strProposalName, strURL, nPaymentCount, scriptPubKey, nAmount, nBlockStart, 0);
std::string strCommand = "tx";
std::string cmd = "tx";
bool useIX = true;
if (params.size() > 7)
if (params.size() > 7){
useIX = (params[7].get_str() == "true" ? true : false);
}
if(useIX)
{
strCommand = "ix";
cmd = "ix";
}
CWalletTx wtx;
@ -117,7 +111,7 @@ Value mnbudget(const Array& params, bool fHelp)
// make our change address
CReserveKey reservekey(pwalletMain);
//send the tx to the network
pwalletMain->CommitTransaction(wtx, reservekey, strCommand);
pwalletMain->CommitTransaction(wtx, reservekey, cmd);
return wtx.GetHash().ToString().c_str();
@ -172,23 +166,14 @@ Value mnbudget(const Array& params, bool fHelp)
// Parse Dash address
CScript scriptPubKey = GetScriptForDestination(address.Get());
CAmount nAmount = AmountFromValue(params[6]);
CPubKey pubKeyMasternode;
CKey keyMasternode;
std::string errorMessage;
if(!darkSendSigner.SetKey(strMasterNodePrivKey, errorMessage, keyMasternode, pubKeyMasternode))
return(" Error upon calling SetKey");
uint256 hash = ParseHashV(params[7], "parameter 1");
//create the proposal incase we're the first to make it
CBudgetProposalBroadcast budgetProposalBroadcast(strProposalName, strURL, nPaymentCount, scriptPubKey, nAmount, nBlockStart, hash);
std::string strError = "";
if(!IsBudgetCollateralValid(hash ,strError)){
if(!IsBudgetCollateralValid(hash, budgetProposalBroadcast.GetHash(), strError)){
return "Proposal FeeTX is not valid - " + hash.ToString() + " - " + strError;
}
@ -500,7 +485,7 @@ Value mnfinalbudget(const Array& params, bool fHelp)
std::string errorMessage;
if(!darkSendSigner.SetKey(strMasterNodePrivKey, errorMessage, keyMasternode, pubKeyMasternode))
return(" Error upon calling SetKey");
return("Masternode signing error, could not set key correctly");
//create transaction
uint256 hash = 0;
@ -555,7 +540,7 @@ Value mnfinalbudget(const Array& params, bool fHelp)
CKey keyMasternode;
if(!darkSendSigner.SetKey(mne.getPrivKey(), errorMessage, keyMasternode, pubKeyMasternode)){
printf(" Error upon calling SetKey for %s\n", mne.getAlias().c_str());
printf(" Masternode signing error, could not set key correctly %s\n", mne.getAlias().c_str());
failed++;
continue;
}

View File

@ -4,7 +4,6 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "script.h"
#include "tinyformat.h"
#include "utilstrencodings.h"