2016-04-08 19:47:00 +02:00
// Copyright (c) 2014-2016 The Dash Core developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
2016-04-14 00:41:40 +02:00
# include "core_io.h"
# include "main.h"
# include "init.h"
# include "flat-database.h"
# include "governance.h"
# include "masternode.h"
2016-04-15 04:54:11 +02:00
# include "governance.h"
2016-04-14 00:41:40 +02:00
# include "darksend.h"
# include "masternodeman.h"
# include "masternode-sync.h"
# include "util.h"
# include "addrman.h"
# include <boost/lexical_cast.hpp>
2016-05-23 19:53:05 +02:00
CGovernanceVote : : CGovernanceVote ( )
2016-04-08 19:47:00 +02:00
{
2016-04-26 19:45:06 +02:00
vinMasternode = CTxIn ( ) ;
nParentHash = uint256 ( ) ;
2016-05-23 19:53:05 +02:00
nVoteSignal = VOTE_SIGNAL_NONE ;
2016-04-26 06:08:36 +02:00
nVoteOutcome = VOTE_OUTCOME_NONE ;
2016-04-08 19:47:00 +02:00
nTime = 0 ;
fValid = true ;
fSynced = false ;
2016-04-26 19:45:06 +02:00
vchSig . clear ( ) ;
2016-04-08 19:47:00 +02:00
}
2016-05-23 19:53:05 +02:00
CGovernanceVote : : CGovernanceVote ( CTxIn vinMasternodeIn , uint256 nParentHashIn , int nVoteSignalIn , int nVoteOutcomeIn )
2016-04-08 19:47:00 +02:00
{
2016-04-26 19:45:06 +02:00
vinMasternode = vinMasternodeIn ;
nParentHash = nParentHashIn ;
2016-05-23 19:53:05 +02:00
nVoteSignal = nVoteSignalIn ;
2016-04-26 06:08:36 +02:00
nVoteOutcome = nVoteOutcomeIn ;
2016-04-08 19:47:00 +02:00
nTime = GetAdjustedTime ( ) ;
fValid = true ;
fSynced = false ;
}
2016-05-23 19:53:05 +02:00
void CGovernanceVote : : Relay ( )
2016-04-08 19:47:00 +02:00
{
2016-06-08 08:57:16 +02:00
CInv inv ( MSG_GOVERNANCE_VOTE , GetHash ( ) ) ;
RelayInv ( inv , MSG_GOVERNANCE_PEER_PROTO_VERSION ) ;
2016-04-08 19:47:00 +02:00
}
2016-05-23 19:53:05 +02:00
bool CGovernanceVote : : Sign ( CKey & keyMasternode , CPubKey & pubKeyMasternode )
2016-04-08 19:47:00 +02:00
{
// Choose coins to use
CPubKey pubKeyCollateralAddress ;
CKey keyCollateralAddress ;
std : : string errorMessage ;
2016-04-26 19:45:06 +02:00
std : : string strMessage = vinMasternode . prevout . ToStringShort ( ) + " | " + nParentHash . ToString ( ) + " | " +
2016-05-23 19:53:05 +02:00
boost : : lexical_cast < std : : string > ( nVoteSignal ) + " | " + boost : : lexical_cast < std : : string > ( nVoteOutcome ) + " | " + boost : : lexical_cast < std : : string > ( nTime ) ;
2016-04-08 19:47:00 +02:00
2016-04-26 19:45:06 +02:00
if ( ! darkSendSigner . SignMessage ( strMessage , errorMessage , vchSig , keyMasternode ) ) {
2016-05-23 19:53:05 +02:00
LogPrintf ( " CGovernanceVote::Sign - Error upon calling SignMessage " ) ;
2016-04-26 19:45:06 +02:00
return false ;
}
2016-04-08 19:47:00 +02:00
2016-04-26 19:45:06 +02:00
if ( ! darkSendSigner . VerifyMessage ( pubKeyMasternode , vchSig , strMessage , errorMessage ) ) {
2016-05-23 19:53:05 +02:00
LogPrintf ( " CGovernanceVote::Sign - Error upon calling VerifyMessage " ) ;
2016-04-26 19:45:06 +02:00
return false ;
}
2016-04-08 19:47:00 +02:00
return true ;
}
2016-05-23 19:53:05 +02:00
bool CGovernanceVote : : IsValid ( bool fSignatureCheck )
2016-04-08 19:47:00 +02:00
{
if ( nTime > GetTime ( ) + ( 60 * 60 ) ) {
2016-05-23 19:53:05 +02:00
LogPrint ( " mngovernance " , " CGovernanceVote::IsValid() - vote is too far ahead of current time - %s - nTime %lli - Max Time %lli \n " , GetHash ( ) . ToString ( ) , nTime , GetTime ( ) + ( 60 * 60 ) ) ;
2016-04-08 19:47:00 +02:00
return false ;
}
2016-04-26 06:08:36 +02:00
// support up to 50 actions (implemented in sentinel)
2016-05-23 19:53:05 +02:00
if ( nVoteSignal > 50 )
2016-04-26 06:08:36 +02:00
{
2016-05-23 19:53:05 +02:00
LogPrint ( " mngovernance " , " CGovernanceVote::IsValid() - Client attempted to vote on invalid action(%d) - %s \n " , nVoteSignal , GetHash ( ) . ToString ( ) ) ;
2016-04-26 06:08:36 +02:00
return false ;
}
2016-04-14 00:41:40 +02:00
2016-04-26 06:08:36 +02:00
// 0=none, 1=yes, 2=no, 3=abstain. Beyond that reject votes
if ( nVoteOutcome > 3 )
{
2016-05-23 19:53:05 +02:00
LogPrint ( " mngovernance " , " CGovernanceVote::IsValid() - Client attempted to vote on invalid outcome(%d) - %s \n " , nVoteSignal , GetHash ( ) . ToString ( ) ) ;
2016-04-26 06:08:36 +02:00
return false ;
}
2016-04-26 19:45:06 +02:00
CMasternode * pmn = mnodeman . Find ( vinMasternode ) ;
if ( pmn = = NULL )
{
2016-05-23 19:53:05 +02:00
LogPrint ( " mngovernance " , " CGovernanceVote::IsValid() - Unknown Masternode - %s \n " , vinMasternode . ToString ( ) ) ;
2016-04-26 19:45:06 +02:00
return false ;
}
2016-04-08 19:47:00 +02:00
if ( ! fSignatureCheck ) return true ;
std : : string errorMessage ;
2016-04-26 19:45:06 +02:00
std : : string strMessage = vinMasternode . prevout . ToStringShort ( ) + " | " + nParentHash . ToString ( ) + " | " +
2016-05-23 19:53:05 +02:00
boost : : lexical_cast < std : : string > ( nVoteSignal ) + " | " + boost : : lexical_cast < std : : string > ( nVoteOutcome ) + " | " + boost : : lexical_cast < std : : string > ( nTime ) ;
2016-04-08 19:47:00 +02:00
2016-04-26 19:45:06 +02:00
if ( ! darkSendSigner . VerifyMessage ( pmn - > pubkey2 , vchSig , strMessage , errorMessage ) ) {
2016-05-23 19:53:05 +02:00
LogPrintf ( " CGovernanceVote::IsValid() - Verify message failed - Error: %s \n " , errorMessage ) ;
2016-04-26 19:45:06 +02:00
return false ;
}
2016-04-08 19:47:00 +02:00
return true ;
2016-04-14 00:41:40 +02:00
}