Skip to content

Commit e6b9730

Browse files
committed
Do not expose invalidity from IsMine
1 parent d6cf4bd commit e6b9730

File tree

3 files changed

+35
-83
lines changed

3 files changed

+35
-83
lines changed

src/script/ismine.cpp

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ enum class IsMineResult
3838
NO = 0, //! Not ours
3939
WATCH_ONLY = 1, //! Included in watch-only balance
4040
SPENDABLE = 2, //! Included in all balances
41-
INVALID = 3, //! Not spendable by anyone
41+
INVALID = 3, //! Not spendable by anyone (uncompressed pubkey in segwit, P2SH inside P2SH or witness, witness inside witness)
4242
};
4343

4444
bool PermitsUncompressed(IsMineSigVersion sigversion)
@@ -173,12 +173,10 @@ IsMineResult IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey,
173173

174174
} // namespace
175175

176-
isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey, bool& isInvalid)
176+
isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey)
177177
{
178-
isInvalid = false;
179178
switch (IsMineInner(keystore, scriptPubKey, IsMineSigVersion::TOP)) {
180179
case IsMineResult::INVALID:
181-
isInvalid = true;
182180
case IsMineResult::NO:
183181
return ISMINE_NO;
184182
case IsMineResult::WATCH_ONLY:
@@ -189,12 +187,6 @@ isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey, bool&
189187
assert(false);
190188
}
191189

192-
isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey)
193-
{
194-
bool isInvalid = false;
195-
return IsMine(keystore, scriptPubKey, isInvalid);
196-
}
197-
198190
isminetype IsMine(const CKeyStore& keystore, const CTxDestination& dest)
199191
{
200192
CScript script = GetScriptForDestination(dest);

src/script/ismine.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,6 @@ enum isminetype
2424
/** used for bitflags of isminetype */
2525
typedef uint8_t isminefilter;
2626

27-
/* isInvalid becomes true when the script is found invalid by consensus or policy. This will terminate the recursion
28-
* and return ISMINE_NO immediately, as an invalid script should never be considered as "mine". This is needed as
29-
* different SIGVERSION may have different network rules. Currently the only use of isInvalid is indicate uncompressed
30-
* keys in SigVersion::WITNESS_V0 script, but could also be used in similar cases in the future
31-
*/
32-
isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey, bool& isInvalid);
3327
isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey);
3428
isminetype IsMine(const CKeyStore& keystore, const CTxDestination& dest);
3529

src/test/script_standard_tests.cpp

Lines changed: 33 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,6 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
398398

399399
CScript scriptPubKey;
400400
isminetype result;
401-
bool isInvalid;
402401

403402
// P2PK compressed
404403
{
@@ -407,15 +406,13 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
407406
scriptPubKey << ToByteVector(pubkeys[0]) << OP_CHECKSIG;
408407

409408
// Keystore does not have key
410-
result = IsMine(keystore, scriptPubKey, isInvalid);
409+
result = IsMine(keystore, scriptPubKey);
411410
BOOST_CHECK_EQUAL(result, ISMINE_NO);
412-
BOOST_CHECK(!isInvalid);
413411

414412
// Keystore has key
415413
keystore.AddKey(keys[0]);
416-
result = IsMine(keystore, scriptPubKey, isInvalid);
414+
result = IsMine(keystore, scriptPubKey);
417415
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
418-
BOOST_CHECK(!isInvalid);
419416
}
420417

421418
// P2PK uncompressed
@@ -425,15 +422,13 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
425422
scriptPubKey << ToByteVector(uncompressedPubkey) << OP_CHECKSIG;
426423

427424
// Keystore does not have key
428-
result = IsMine(keystore, scriptPubKey, isInvalid);
425+
result = IsMine(keystore, scriptPubKey);
429426
BOOST_CHECK_EQUAL(result, ISMINE_NO);
430-
BOOST_CHECK(!isInvalid);
431427

432428
// Keystore has key
433429
keystore.AddKey(uncompressedKey);
434-
result = IsMine(keystore, scriptPubKey, isInvalid);
430+
result = IsMine(keystore, scriptPubKey);
435431
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
436-
BOOST_CHECK(!isInvalid);
437432
}
438433

439434
// P2PKH compressed
@@ -443,15 +438,13 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
443438
scriptPubKey << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
444439

445440
// Keystore does not have key
446-
result = IsMine(keystore, scriptPubKey, isInvalid);
441+
result = IsMine(keystore, scriptPubKey);
447442
BOOST_CHECK_EQUAL(result, ISMINE_NO);
448-
BOOST_CHECK(!isInvalid);
449443

450444
// Keystore has key
451445
keystore.AddKey(keys[0]);
452-
result = IsMine(keystore, scriptPubKey, isInvalid);
446+
result = IsMine(keystore, scriptPubKey);
453447
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
454-
BOOST_CHECK(!isInvalid);
455448
}
456449

457450
// P2PKH uncompressed
@@ -461,15 +454,13 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
461454
scriptPubKey << OP_DUP << OP_HASH160 << ToByteVector(uncompressedPubkey.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
462455

463456
// Keystore does not have key
464-
result = IsMine(keystore, scriptPubKey, isInvalid);
457+
result = IsMine(keystore, scriptPubKey);
465458
BOOST_CHECK_EQUAL(result, ISMINE_NO);
466-
BOOST_CHECK(!isInvalid);
467459

468460
// Keystore has key
469461
keystore.AddKey(uncompressedKey);
470-
result = IsMine(keystore, scriptPubKey, isInvalid);
462+
result = IsMine(keystore, scriptPubKey);
471463
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
472-
BOOST_CHECK(!isInvalid);
473464
}
474465

475466
// P2SH
@@ -483,21 +474,18 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
483474
scriptPubKey << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
484475

485476
// Keystore does not have redeemScript or key
486-
result = IsMine(keystore, scriptPubKey, isInvalid);
477+
result = IsMine(keystore, scriptPubKey);
487478
BOOST_CHECK_EQUAL(result, ISMINE_NO);
488-
BOOST_CHECK(!isInvalid);
489479

490480
// Keystore has redeemScript but no key
491481
keystore.AddCScript(redeemScript);
492-
result = IsMine(keystore, scriptPubKey, isInvalid);
482+
result = IsMine(keystore, scriptPubKey);
493483
BOOST_CHECK_EQUAL(result, ISMINE_NO);
494-
BOOST_CHECK(!isInvalid);
495484

496485
// Keystore has redeemScript and key
497486
keystore.AddKey(keys[0]);
498-
result = IsMine(keystore, scriptPubKey, isInvalid);
487+
result = IsMine(keystore, scriptPubKey);
499488
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
500-
BOOST_CHECK(!isInvalid);
501489
}
502490

503491
// P2WPKH compressed
@@ -510,9 +498,8 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
510498

511499
// Keystore implicitly has key and P2SH redeemScript
512500
keystore.AddCScript(scriptPubKey);
513-
result = IsMine(keystore, scriptPubKey, isInvalid);
501+
result = IsMine(keystore, scriptPubKey);
514502
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
515-
BOOST_CHECK(!isInvalid);
516503
}
517504

518505
// P2WPKH uncompressed
@@ -524,15 +511,13 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
524511
scriptPubKey << OP_0 << ToByteVector(uncompressedPubkey.GetID());
525512

526513
// Keystore has key, but no P2SH redeemScript
527-
result = IsMine(keystore, scriptPubKey, isInvalid);
514+
result = IsMine(keystore, scriptPubKey);
528515
BOOST_CHECK_EQUAL(result, ISMINE_NO);
529-
BOOST_CHECK(!isInvalid);
530516

531517
// Keystore has key and P2SH redeemScript
532518
keystore.AddCScript(scriptPubKey);
533-
result = IsMine(keystore, scriptPubKey, isInvalid);
519+
result = IsMine(keystore, scriptPubKey);
534520
BOOST_CHECK_EQUAL(result, ISMINE_NO);
535-
BOOST_CHECK(isInvalid);
536521
}
537522

538523
// scriptPubKey multisig
@@ -546,30 +531,26 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
546531
OP_2 << OP_CHECKMULTISIG;
547532

548533
// Keystore does not have any keys
549-
result = IsMine(keystore, scriptPubKey, isInvalid);
534+
result = IsMine(keystore, scriptPubKey);
550535
BOOST_CHECK_EQUAL(result, ISMINE_NO);
551-
BOOST_CHECK(!isInvalid);
552536

553537
// Keystore has 1/2 keys
554538
keystore.AddKey(uncompressedKey);
555539

556-
result = IsMine(keystore, scriptPubKey, isInvalid);
540+
result = IsMine(keystore, scriptPubKey);
557541
BOOST_CHECK_EQUAL(result, ISMINE_NO);
558-
BOOST_CHECK(!isInvalid);
559542

560543
// Keystore has 2/2 keys
561544
keystore.AddKey(keys[1]);
562545

563-
result = IsMine(keystore, scriptPubKey, isInvalid);
546+
result = IsMine(keystore, scriptPubKey);
564547
BOOST_CHECK_EQUAL(result, ISMINE_NO);
565-
BOOST_CHECK(!isInvalid);
566548

567549
// Keystore has 2/2 keys and the script
568550
keystore.AddCScript(scriptPubKey);
569551

570-
result = IsMine(keystore, scriptPubKey, isInvalid);
552+
result = IsMine(keystore, scriptPubKey);
571553
BOOST_CHECK_EQUAL(result, ISMINE_NO);
572-
BOOST_CHECK(!isInvalid);
573554
}
574555

575556
// P2SH multisig
@@ -588,15 +569,13 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
588569
scriptPubKey << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
589570

590571
// Keystore has no redeemScript
591-
result = IsMine(keystore, scriptPubKey, isInvalid);
572+
result = IsMine(keystore, scriptPubKey);
592573
BOOST_CHECK_EQUAL(result, ISMINE_NO);
593-
BOOST_CHECK(!isInvalid);
594574

595575
// Keystore has redeemScript
596576
keystore.AddCScript(redeemScript);
597-
result = IsMine(keystore, scriptPubKey, isInvalid);
577+
result = IsMine(keystore, scriptPubKey);
598578
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
599-
BOOST_CHECK(!isInvalid);
600579
}
601580

602581
// P2WSH multisig with compressed keys
@@ -619,21 +598,18 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
619598
scriptPubKey << OP_0 << ToByteVector(scriptHash);
620599

621600
// Keystore has keys, but no witnessScript or P2SH redeemScript
622-
result = IsMine(keystore, scriptPubKey, isInvalid);
601+
result = IsMine(keystore, scriptPubKey);
623602
BOOST_CHECK_EQUAL(result, ISMINE_NO);
624-
BOOST_CHECK(!isInvalid);
625603

626604
// Keystore has keys and witnessScript, but no P2SH redeemScript
627605
keystore.AddCScript(witnessScript);
628-
result = IsMine(keystore, scriptPubKey, isInvalid);
606+
result = IsMine(keystore, scriptPubKey);
629607
BOOST_CHECK_EQUAL(result, ISMINE_NO);
630-
BOOST_CHECK(!isInvalid);
631608

632609
// Keystore has keys, witnessScript, P2SH redeemScript
633610
keystore.AddCScript(scriptPubKey);
634-
result = IsMine(keystore, scriptPubKey, isInvalid);
611+
result = IsMine(keystore, scriptPubKey);
635612
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
636-
BOOST_CHECK(!isInvalid);
637613
}
638614

639615
// P2WSH multisig with uncompressed key
@@ -656,21 +632,18 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
656632
scriptPubKey << OP_0 << ToByteVector(scriptHash);
657633

658634
// Keystore has keys, but no witnessScript or P2SH redeemScript
659-
result = IsMine(keystore, scriptPubKey, isInvalid);
635+
result = IsMine(keystore, scriptPubKey);
660636
BOOST_CHECK_EQUAL(result, ISMINE_NO);
661-
BOOST_CHECK(!isInvalid);
662637

663638
// Keystore has keys and witnessScript, but no P2SH redeemScript
664639
keystore.AddCScript(witnessScript);
665-
result = IsMine(keystore, scriptPubKey, isInvalid);
640+
result = IsMine(keystore, scriptPubKey);
666641
BOOST_CHECK_EQUAL(result, ISMINE_NO);
667-
BOOST_CHECK(!isInvalid);
668642

669643
// Keystore has keys, witnessScript, P2SH redeemScript
670644
keystore.AddCScript(scriptPubKey);
671-
result = IsMine(keystore, scriptPubKey, isInvalid);
645+
result = IsMine(keystore, scriptPubKey);
672646
BOOST_CHECK_EQUAL(result, ISMINE_NO);
673-
BOOST_CHECK(isInvalid);
674647
}
675648

676649
// P2WSH multisig wrapped in P2SH
@@ -694,23 +667,20 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
694667
scriptPubKey << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
695668

696669
// Keystore has no witnessScript, P2SH redeemScript, or keys
697-
result = IsMine(keystore, scriptPubKey, isInvalid);
670+
result = IsMine(keystore, scriptPubKey);
698671
BOOST_CHECK_EQUAL(result, ISMINE_NO);
699-
BOOST_CHECK(!isInvalid);
700672

701673
// Keystore has witnessScript and P2SH redeemScript, but no keys
702674
keystore.AddCScript(redeemScript);
703675
keystore.AddCScript(witnessScript);
704-
result = IsMine(keystore, scriptPubKey, isInvalid);
676+
result = IsMine(keystore, scriptPubKey);
705677
BOOST_CHECK_EQUAL(result, ISMINE_NO);
706-
BOOST_CHECK(!isInvalid);
707678

708679
// Keystore has keys, witnessScript, P2SH redeemScript
709680
keystore.AddKey(keys[0]);
710681
keystore.AddKey(keys[1]);
711-
result = IsMine(keystore, scriptPubKey, isInvalid);
682+
result = IsMine(keystore, scriptPubKey);
712683
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE);
713-
BOOST_CHECK(!isInvalid);
714684
}
715685

716686
// OP_RETURN
@@ -721,9 +691,8 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
721691
scriptPubKey.clear();
722692
scriptPubKey << OP_RETURN << ToByteVector(pubkeys[0]);
723693

724-
result = IsMine(keystore, scriptPubKey, isInvalid);
694+
result = IsMine(keystore, scriptPubKey);
725695
BOOST_CHECK_EQUAL(result, ISMINE_NO);
726-
BOOST_CHECK(!isInvalid);
727696
}
728697

729698
// witness unspendable
@@ -734,9 +703,8 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
734703
scriptPubKey.clear();
735704
scriptPubKey << OP_0 << ToByteVector(ParseHex("aabb"));
736705

737-
result = IsMine(keystore, scriptPubKey, isInvalid);
706+
result = IsMine(keystore, scriptPubKey);
738707
BOOST_CHECK_EQUAL(result, ISMINE_NO);
739-
BOOST_CHECK(!isInvalid);
740708
}
741709

742710
// witness unknown
@@ -747,9 +715,8 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
747715
scriptPubKey.clear();
748716
scriptPubKey << OP_16 << ToByteVector(ParseHex("aabb"));
749717

750-
result = IsMine(keystore, scriptPubKey, isInvalid);
718+
result = IsMine(keystore, scriptPubKey);
751719
BOOST_CHECK_EQUAL(result, ISMINE_NO);
752-
BOOST_CHECK(!isInvalid);
753720
}
754721

755722
// Nonstandard
@@ -760,9 +727,8 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
760727
scriptPubKey.clear();
761728
scriptPubKey << OP_9 << OP_ADD << OP_11 << OP_EQUAL;
762729

763-
result = IsMine(keystore, scriptPubKey, isInvalid);
730+
result = IsMine(keystore, scriptPubKey);
764731
BOOST_CHECK_EQUAL(result, ISMINE_NO);
765-
BOOST_CHECK(!isInvalid);
766732
}
767733
}
768734

0 commit comments

Comments
 (0)