have verifytxoutproof check the number of txns in proof structure
This commit is contained in:
parent
a607d23ae8
commit
ed82f17000
|
@ -115,6 +115,12 @@ public:
|
||||||
* returns the merkle root, or 0 in case of failure
|
* returns the merkle root, or 0 in case of failure
|
||||||
*/
|
*/
|
||||||
uint256 ExtractMatches(std::vector<uint256> &vMatch, std::vector<unsigned int> &vnIndex);
|
uint256 ExtractMatches(std::vector<uint256> &vMatch, std::vector<unsigned int> &vnIndex);
|
||||||
|
|
||||||
|
/** Get number of transactions the merkle proof is indicating for cross-reference with
|
||||||
|
* local blockchain knowledge.
|
||||||
|
*/
|
||||||
|
unsigned int GetNumTransactions() const { return nTransactions; };
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -307,7 +307,7 @@ static UniValue verifytxoutproof(const JSONRPCRequest& request)
|
||||||
"\nArguments:\n"
|
"\nArguments:\n"
|
||||||
"1. \"proof\" (string, required) The hex-encoded proof generated by gettxoutproof\n"
|
"1. \"proof\" (string, required) The hex-encoded proof generated by gettxoutproof\n"
|
||||||
"\nResult:\n"
|
"\nResult:\n"
|
||||||
"[\"txid\"] (array, strings) The txid(s) which the proof commits to, or empty array if the proof is invalid\n"
|
"[\"txid\"] (array, strings) The txid(s) which the proof commits to, or empty array if the proof can not be validated.\n"
|
||||||
);
|
);
|
||||||
|
|
||||||
CDataStream ssMB(ParseHexV(request.params[0], "proof"), SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS);
|
CDataStream ssMB(ParseHexV(request.params[0], "proof"), SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS);
|
||||||
|
@ -324,12 +324,17 @@ static UniValue verifytxoutproof(const JSONRPCRequest& request)
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
|
|
||||||
const CBlockIndex* pindex = LookupBlockIndex(merkleBlock.header.GetHash());
|
const CBlockIndex* pindex = LookupBlockIndex(merkleBlock.header.GetHash());
|
||||||
if (!pindex || !chainActive.Contains(pindex)) {
|
if (!pindex || !chainActive.Contains(pindex) || pindex->nTx == 0) {
|
||||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found in chain");
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found in chain");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const uint256& hash : vMatch)
|
// Check if proof is valid, only add results if so
|
||||||
res.push_back(hash.GetHex());
|
if (pindex->nTx == merkleBlock.txn.GetNumTransactions()) {
|
||||||
|
for (const uint256& hash : vMatch) {
|
||||||
|
res.push_back(hash.GetHex());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue