bool GetStakeParams(const CTransaction &stakeTx, CStakeParams &stakeParams);
bool ValidateMatchingStake(const CTransaction &ccTx, uint32_t voutNum, const CTransaction &stakeTx, bool &cheating);
+bool ValidateStakeTransaction(const CTransaction &stakeTx, CStakeParams &stakeParams, bool validateSig = true);
// for now, we will ignore slowFlag in the interest of keeping success/fail simpler for security purposes
bool verusCheckPOSBlock(int32_t slowflag, CBlock *pblock, int32_t height)
strcpy(cbaddr, CBitcoinAddress(cbaddress).ToString().c_str());
if (newPOSEnforcement)
{
- if (!strcmp(destaddr,voutaddr))
+ if (!strcmp(destaddr, voutaddr))
{
// allow delegation of stake, but require all ouputs to be
// crypto conditions
CStakeParams p;
- if (GetStakeParams(pblock->vtx[txn_count-1], p))
+ // validatestake transaction sets the pubkey of the stake output
+ // if it has no override into the pubkey
+ if (ValidateStakeTransaction(pblock->vtx[txn_count-1], p, false))
{
COptCCParams cpp;
// loop through all outputs to make sure they are sent to the proper pubkey
// if this is a timelocked transaction, get the destination behind the time lock
if (tx.IsCoinBase() && tx.vout.size() == 2 && voutNum == 0 &&
spk.IsPayToScriptHash(&scriptHash) &&
- tx.vout[1].scriptPubKey.size() >= 7 && // minimum for any possible future to prevent out of bounds
- tx.vout[1].scriptPubKey[0] == OP_RETURN)
+ tx.vout[1].scriptPubKey.IsOpReturn())
{
opcodetype op;
std::vector<uint8_t> opretData = std::vector<uint8_t>();
if (vParams.size())
{
COptCCParams cp = COptCCParams(vParams[0]);
- if (cp.IsValid() && vParams.size() > cp.n)
+ if (cp.IsValid())
{
- // all addresses that should be there must be 33 byte pub keys
- for (int i = 1; i <= cp.n; i++)
+ for (auto k : cp.vKeys)
{
- if (vParams[i].size() != 33)
- {
- // we accept no errors
- return false;
- }
+ vSolutionsRet.push_back(std::vector<unsigned char>(k.begin(), k.end()));
}
}
}