14 typedef std::vector<unsigned char>
valtype;
46 return sigversion == IsMineSigVersion::TOP || sigversion == IsMineSigVersion::P2SH;
49 bool HaveKeys(
const std::vector<valtype>& pubkeys,
const CKeyStore& keystore)
51 for (
const valtype& pubkey : pubkeys) {
53 if (!keystore.
HaveKey(keyID))
return false;
62 std::vector<valtype> vSolutions;
74 if (!PermitsUncompressed(sigversion) && vSolutions[0].size() != 33) {
75 return IsMineResult::INVALID;
78 ret = std::max(
ret, IsMineResult::SPENDABLE);
83 if (sigversion == IsMineSigVersion::WITNESS_V0) {
85 return IsMineResult::INVALID;
98 if (!PermitsUncompressed(sigversion)) {
101 return IsMineResult::INVALID;
105 ret = std::max(
ret, IsMineResult::SPENDABLE);
110 if (sigversion != IsMineSigVersion::TOP) {
112 return IsMineResult::INVALID;
116 if (keystore.
GetCScript(scriptID, subscript)) {
117 ret = std::max(
ret, IsMineInner(keystore, subscript, IsMineSigVersion::P2SH));
123 if (sigversion == IsMineSigVersion::WITNESS_V0) {
125 return IsMineResult::INVALID;
134 if (keystore.
GetCScript(scriptID, subscript)) {
135 ret = std::max(
ret, IsMineInner(keystore, subscript, IsMineSigVersion::WITNESS_V0));
143 if (sigversion == IsMineSigVersion::TOP) {
152 std::vector<valtype> keys(vSolutions.begin()+1, vSolutions.begin()+vSolutions.size()-1);
153 if (!PermitsUncompressed(sigversion)) {
154 for (
size_t i = 0; i < keys.size(); i++) {
155 if (keys[i].size() != 33) {
156 return IsMineResult::INVALID;
160 if (HaveKeys(keys, keystore)) {
161 ret = std::max(
ret, IsMineResult::SPENDABLE);
168 ret = std::max(
ret, IsMineResult::WATCH_ONLY);
177 switch (IsMineInner(keystore, scriptPubKey, IsMineSigVersion::TOP)) {
178 case IsMineResult::INVALID:
179 case IsMineResult::NO:
181 case IsMineResult::WATCH_ONLY:
183 case IsMineResult::SPENDABLE:
192 return IsMine(keystore, script);
unspendable OP_RETURN script that carries data
IsMineSigVersion
This is an enum that tracks the execution context of a script, similar to SigVersion in script/interp...
std::vector< unsigned char > valtype
UniValue ret(UniValue::VARR)
txnouttype Solver(const CScript &scriptPubKey, std::vector< std::vector< unsigned char >> &vSolutionsRet)
Parse a scriptPubKey and identify script type for standard scripts.
IsMineResult
This is an internal representation of isminetype + invalidity.
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
virtual bool HaveCScript(const CScriptID &hash) const =0
Only for Witness versions not already defined above.
virtual bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const
isminetype
IsMine() return codes.
boost::variant< CNoDestination, CKeyID, CScriptID, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessUnknown > CTxDestination
A txout script template with a specific destination.
virtual bool HaveKey(const CKeyID &address) const =0
Check whether a key corresponding to a given address is present in the store.
An encapsulated public key.
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
virtual bool GetCScript(const CScriptID &scriptid, CScript &script) const
CRIPEMD160 & Write(const unsigned char *data, size_t len)
virtual bool HaveWatchOnly(const CScript &dest) const =0
Serialized script, used inside transaction inputs and outputs.
A virtual base class for key stores.
isminetype IsMine(const CKeyStore &keystore, const CScript &scriptPubKey)
A reference to a CKey: the Hash360 of its serialized public key.
std::vector< unsigned char > valtype
A reference to a CScript: the Hash360 of its serialization (see script.h)
void Finalize(unsigned char hash[OUTPUT_SIZE])
A hasher class for RIPEMD-160.
bool IsCompressed() const
Check whether this is a compressed public key.