uint256 CGovernanceObject::GetHash() const { // Note: doesn't match serialization // CREATE HASH OF ALL IMPORTANT PIECES OF DATA CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); ss << nHashParent; ss << nRevision; ss << nTime; ss << GetDataAsHexString(); ss << masternodeOutpoint << uint8_t{} << 0xffffffff; // adding dummy values here to match old hashing ss << vchSig; // fee_tx is left out on purpose DBG( printf("CGovernanceObject::GetHash %i %lli %s\n", nRevision, nTime, GetDataAsHexString().c_str()); );
uint256 CGovernanceObject::GetHash() const { // Note: doesn't match serialization // CREATE HASH OF ALL IMPORTANT PIECES OF DATA CHashWriter ss(SER_GETHASH, MIN_PEER_PROTO_VERSION); ss << nHashParent; ss << nRevision; ss << nTime; ss << GetDataAsHexString(); ss << masternodeOutpoint; ss << vchSig; // fee_tx is left out on purpose DBG( printf("CGovernanceObject::GetHash %i %li %s\n", nRevision, nTime, GetDataAsHexString().c_str()); );
std::string CGovernanceObject::GetSignatureMessage() const { LOCK(cs); std::string strMessage = nHashParent.ToString() + "|" + boost::lexical_cast<std::string>(nRevision) + "|" + boost::lexical_cast<std::string>(nTime) + "|" + GetDataAsHexString() + "|" + masternodeOutpoint.ToStringShort() + "|" + nCollateralHash.ToString(); return strMessage; }
bool CGovernanceObject::IsValidLocally(std::string& strError, bool& fMissingMasternode, bool& fMissingConfirmations, bool fCheckCollateral) const { fMissingMasternode = false; fMissingConfirmations = false; if (fUnparsable) { strError = "Object data unparseable"; return false; } switch (nObjectType) { case GOVERNANCE_OBJECT_PROPOSAL: { CProposalValidator validator(GetDataAsHexString(), true); // Note: It's ok to have expired proposals // they are going to be cleared by CGovernanceManager::UpdateCachesAndClean() // TODO: should they be tagged as "expired" to skip vote downloading? if (!validator.Validate(false)) { strError = strprintf("Invalid proposal data, error messages: %s", validator.GetErrorMessages()); return false; } if (fCheckCollateral && !IsCollateralValid(strError, fMissingConfirmations)) { strError = "Invalid proposal collateral"; return false; } return true; } case GOVERNANCE_OBJECT_TRIGGER: { if (!fCheckCollateral) { // nothing else we can check here (yet?) return true; } auto mnList = deterministicMNManager->GetListAtChainTip(); std::string strOutpoint = masternodeOutpoint.ToStringShort(); auto dmn = mnList.GetMNByCollateral(masternodeOutpoint); if (!dmn) { strError = "Failed to find Masternode by UTXO, missing masternode=" + strOutpoint; return false; } if (!mnList.IsMNValid(dmn)) { if (mnList.IsMNPoSeBanned(dmn)) { strError = "Masternode is POSE_BANNED, masternode=" + strOutpoint; } else { strError = "Masternode is invalid for unknown reason, masternode=" + strOutpoint; } return false; } // Check that we have a valid MN signature if (!CheckSignature(dmn->pdmnState->pubKeyOperator)) { strError = "Invalid masternode signature for: " + strOutpoint + ", pubkey = " + dmn->pdmnState->pubKeyOperator.ToString(); return false; } return true; } default: { strError = strprintf("Invalid object type %d", nObjectType); return false; } } }