Do not treat bare multisig as IsMine
Such outputs can still be watched, and signed for, but they aren't treated as valid payments. That means they won't cause transactions to appear in listtransactions, their outputs to be shown under listunspent, or affect balances.
This commit is contained in:
parent
08f3228654
commit
9c2a8b8d34
3 changed files with 19 additions and 5 deletions
|
@ -123,6 +123,9 @@ static isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPu
|
||||||
|
|
||||||
case TX_MULTISIG:
|
case TX_MULTISIG:
|
||||||
{
|
{
|
||||||
|
// Never treat bare multisig outputs as ours (they can still be made watchonly-though)
|
||||||
|
if (sigversion == IsMineSigVersion::TOP) break;
|
||||||
|
|
||||||
// Only consider transactions "mine" if we own ALL the
|
// Only consider transactions "mine" if we own ALL the
|
||||||
// keys involved. Multi-signature transactions that are
|
// keys involved. Multi-signature transactions that are
|
||||||
// partially owned (somebody else has a key that can spend
|
// partially owned (somebody else has a key that can spend
|
||||||
|
|
|
@ -561,7 +561,14 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
|
||||||
keystore.AddKey(keys[1]);
|
keystore.AddKey(keys[1]);
|
||||||
|
|
||||||
result = IsMine(keystore, scriptPubKey, isInvalid);
|
result = IsMine(keystore, scriptPubKey, isInvalid);
|
||||||
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
|
BOOST_CHECK_EQUAL(result, ISMINE_NO);
|
||||||
|
BOOST_CHECK(!isInvalid);
|
||||||
|
|
||||||
|
// Keystore has 2/2 keys and the script
|
||||||
|
keystore.AddCScript(scriptPubKey);
|
||||||
|
|
||||||
|
result = IsMine(keystore, scriptPubKey, isInvalid);
|
||||||
|
BOOST_CHECK_EQUAL(result, ISMINE_NO);
|
||||||
BOOST_CHECK(!isInvalid);
|
BOOST_CHECK(!isInvalid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -311,8 +311,10 @@ class SegWitTest(BitcoinTestFramework):
|
||||||
v = self.nodes[0].getaddressinfo(i)
|
v = self.nodes[0].getaddressinfo(i)
|
||||||
if (v['isscript']):
|
if (v['isscript']):
|
||||||
[bare, p2sh, p2wsh, p2sh_p2wsh] = self.p2sh_address_to_script(v)
|
[bare, p2sh, p2wsh, p2sh_p2wsh] = self.p2sh_address_to_script(v)
|
||||||
# bare and p2sh multisig with compressed keys should always be spendable
|
# p2sh multisig with compressed keys should always be spendable
|
||||||
spendable_anytime.extend([bare, p2sh])
|
spendable_anytime.extend([p2sh])
|
||||||
|
# bare multisig can be watched and signed, but is not treated as ours
|
||||||
|
solvable_after_importaddress.extend([bare])
|
||||||
# P2WSH and P2SH(P2WSH) multisig with compressed keys are spendable after direct importaddress
|
# P2WSH and P2SH(P2WSH) multisig with compressed keys are spendable after direct importaddress
|
||||||
spendable_after_importaddress.extend([p2wsh, p2sh_p2wsh])
|
spendable_after_importaddress.extend([p2wsh, p2sh_p2wsh])
|
||||||
else:
|
else:
|
||||||
|
@ -328,8 +330,10 @@ class SegWitTest(BitcoinTestFramework):
|
||||||
v = self.nodes[0].getaddressinfo(i)
|
v = self.nodes[0].getaddressinfo(i)
|
||||||
if (v['isscript']):
|
if (v['isscript']):
|
||||||
[bare, p2sh, p2wsh, p2sh_p2wsh] = self.p2sh_address_to_script(v)
|
[bare, p2sh, p2wsh, p2sh_p2wsh] = self.p2sh_address_to_script(v)
|
||||||
# bare and p2sh multisig with uncompressed keys should always be spendable
|
# p2sh multisig with uncompressed keys should always be spendable
|
||||||
spendable_anytime.extend([bare, p2sh])
|
spendable_anytime.extend([p2sh])
|
||||||
|
# bare multisig can be watched and signed, but is not treated as ours
|
||||||
|
solvable_after_importaddress.extend([bare])
|
||||||
# P2WSH and P2SH(P2WSH) multisig with uncompressed keys are never seen
|
# P2WSH and P2SH(P2WSH) multisig with uncompressed keys are never seen
|
||||||
unseen_anytime.extend([p2wsh, p2sh_p2wsh])
|
unseen_anytime.extend([p2wsh, p2sh_p2wsh])
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in a new issue