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:
Pieter Wuille 2018-04-16 17:18:34 -07:00
parent 08f3228654
commit 9c2a8b8d34
3 changed files with 19 additions and 5 deletions

View file

@ -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

View file

@ -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);
} }

View file

@ -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: