Track difference between scriptPubKey and P2SH execution in IsMine
Inside IsMine we care about the distinction between scriptPubKey execution and P2SH redeemScript execution. The consensus code does not care about this distinction, and thus SigVersion does not have a field for P2SH. As the IsMine code will care, it uses a separate enum with more fields.
This commit is contained in:
parent
36f067bb95
commit
84b4bdbb51
|
@ -15,11 +15,23 @@
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is an enum that tracks the execution context of a script, similar to
|
||||||
|
* SigVersion in script/interpreter. It is separate however because we want to
|
||||||
|
* distinguish between top-level scriptPubKey execution and P2SH redeemScript
|
||||||
|
* execution (a distinction that has no impact on consensus rules).
|
||||||
|
*/
|
||||||
enum class IsMineSigVersion
|
enum class IsMineSigVersion
|
||||||
{
|
{
|
||||||
BASE = 0
|
TOP = 0, //! scriptPubKey execution
|
||||||
|
P2SH = 1, //! P2SH redeemScript
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static bool PermitsUncompressed(IsMineSigVersion sigversion)
|
||||||
|
{
|
||||||
|
return sigversion == IsMineSigVersion::TOP || sigversion == IsMineSigVersion::P2SH;
|
||||||
|
}
|
||||||
|
|
||||||
typedef vector<unsigned char> valtype;
|
typedef vector<unsigned char> valtype;
|
||||||
|
|
||||||
unsigned int HaveKeys(const vector<valtype>& pubkeys, const CKeyStore& keystore)
|
unsigned int HaveKeys(const vector<valtype>& pubkeys, const CKeyStore& keystore)
|
||||||
|
@ -65,7 +77,7 @@ static isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPu
|
||||||
CScriptID scriptID = CScriptID(uint160(vSolutions[0]));
|
CScriptID scriptID = CScriptID(uint160(vSolutions[0]));
|
||||||
CScript subscript;
|
CScript subscript;
|
||||||
if (keystore.GetCScript(scriptID, subscript)) {
|
if (keystore.GetCScript(scriptID, subscript)) {
|
||||||
isminetype ret = IsMineInner(keystore, subscript, IsMineSigVersion::BASE);
|
isminetype ret = IsMineInner(keystore, subscript, IsMineSigVersion::P2SH);
|
||||||
if (ret == ISMINE_SPENDABLE)
|
if (ret == ISMINE_SPENDABLE)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -96,7 +108,7 @@ static isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPu
|
||||||
|
|
||||||
isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey)
|
isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey)
|
||||||
{
|
{
|
||||||
return IsMineInner(keystore, scriptPubKey, IsMineSigVersion::BASE);
|
return IsMineInner(keystore, scriptPubKey, IsMineSigVersion::TOP);
|
||||||
}
|
}
|
||||||
|
|
||||||
isminetype IsMine(const CKeyStore& keystore, const CTxDestination& dest)
|
isminetype IsMine(const CKeyStore& keystore, const CTxDestination& dest)
|
||||||
|
|
Loading…
Reference in New Issue