Changeset View
Changeset View
Standalone View
Standalone View
src/test/script_standard_tests.cpp
Show First 20 Lines • Show All 439 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(script_standard_IsMine) { | ||||
} | } | ||||
CKey uncompressedKey; | CKey uncompressedKey; | ||||
uncompressedKey.MakeNewKey(false); | uncompressedKey.MakeNewKey(false); | ||||
CPubKey uncompressedPubkey = uncompressedKey.GetPubKey(); | CPubKey uncompressedPubkey = uncompressedKey.GetPubKey(); | ||||
CScript scriptPubKey; | CScript scriptPubKey; | ||||
isminetype result; | isminetype result; | ||||
bool isInvalid; | |||||
// P2PK compressed | // P2PK compressed | ||||
{ | { | ||||
CBasicKeyStore keystore; | CBasicKeyStore keystore; | ||||
scriptPubKey.clear(); | scriptPubKey = GetScriptForRawPubKey(pubkeys[0]); | ||||
scriptPubKey << ToByteVector(pubkeys[0]) << OP_CHECKSIG; | |||||
// Keystore does not have key | // Keystore does not have key | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
// Keystore has key | // Keystore has key | ||||
keystore.AddKey(keys[0]); | keystore.AddKey(keys[0]); | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE); | BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE); | ||||
BOOST_CHECK(!isInvalid); | |||||
} | } | ||||
// P2PK uncompressed | // P2PK uncompressed | ||||
{ | { | ||||
CBasicKeyStore keystore; | CBasicKeyStore keystore; | ||||
scriptPubKey.clear(); | scriptPubKey = GetScriptForRawPubKey(uncompressedPubkey); | ||||
scriptPubKey << ToByteVector(uncompressedPubkey) << OP_CHECKSIG; | |||||
// Keystore does not have key | // Keystore does not have key | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
// Keystore has key | // Keystore has key | ||||
keystore.AddKey(uncompressedKey); | keystore.AddKey(uncompressedKey); | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE); | BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE); | ||||
BOOST_CHECK(!isInvalid); | |||||
} | } | ||||
// P2PKH compressed | // P2PKH compressed | ||||
{ | { | ||||
CBasicKeyStore keystore; | CBasicKeyStore keystore; | ||||
scriptPubKey.clear(); | scriptPubKey = GetScriptForDestination(pubkeys[0].GetID()); | ||||
scriptPubKey << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) | |||||
<< OP_EQUALVERIFY << OP_CHECKSIG; | |||||
// Keystore does not have key | // Keystore does not have key | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
// Keystore has key | // Keystore has key | ||||
keystore.AddKey(keys[0]); | keystore.AddKey(keys[0]); | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE); | BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE); | ||||
BOOST_CHECK(!isInvalid); | |||||
} | } | ||||
// P2PKH uncompressed | // P2PKH uncompressed | ||||
{ | { | ||||
CBasicKeyStore keystore; | CBasicKeyStore keystore; | ||||
scriptPubKey.clear(); | scriptPubKey = GetScriptForDestination(uncompressedPubkey.GetID()); | ||||
scriptPubKey << OP_DUP << OP_HASH160 | |||||
<< ToByteVector(uncompressedPubkey.GetID()) | |||||
<< OP_EQUALVERIFY << OP_CHECKSIG; | |||||
// Keystore does not have key | // Keystore does not have key | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
// Keystore has key | // Keystore has key | ||||
keystore.AddKey(uncompressedKey); | keystore.AddKey(uncompressedKey); | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE); | BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE); | ||||
BOOST_CHECK(!isInvalid); | |||||
} | } | ||||
// P2SH | // P2SH | ||||
{ | { | ||||
CBasicKeyStore keystore; | CBasicKeyStore keystore; | ||||
CScript redeemScript; | CScript redeemScript = GetScriptForDestination(pubkeys[0].GetID()); | ||||
redeemScript << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) | scriptPubKey = GetScriptForDestination(CScriptID(redeemScript)); | ||||
<< OP_EQUALVERIFY << OP_CHECKSIG; | |||||
scriptPubKey.clear(); | |||||
scriptPubKey << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) | |||||
<< OP_EQUAL; | |||||
// Keystore does not have redeemScript or key | // Keystore does not have redeemScript or key | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
// Keystore has redeemScript but no key | // Keystore has redeemScript but no key | ||||
keystore.AddCScript(redeemScript); | keystore.AddCScript(redeemScript); | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
// Keystore has redeemScript and key | // Keystore has redeemScript and key | ||||
keystore.AddKey(keys[0]); | keystore.AddKey(keys[0]); | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE); | BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE); | ||||
BOOST_CHECK(!isInvalid); | } | ||||
// (P2PKH inside) P2SH inside P2SH (invalid) | |||||
{ | |||||
CBasicKeyStore keystore; | |||||
CScript redeemscript_inner = | |||||
GetScriptForDestination(pubkeys[0].GetID()); | |||||
CScript redeemscript = | |||||
GetScriptForDestination(CScriptID(redeemscript_inner)); | |||||
scriptPubKey = GetScriptForDestination(CScriptID(redeemscript)); | |||||
keystore.AddCScript(redeemscript); | |||||
keystore.AddCScript(redeemscript_inner); | |||||
keystore.AddCScript(scriptPubKey); | |||||
keystore.AddKey(keys[0]); | |||||
result = IsMine(keystore, scriptPubKey); | |||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | |||||
} | } | ||||
// scriptPubKey multisig | // scriptPubKey multisig | ||||
{ | { | ||||
CBasicKeyStore keystore; | CBasicKeyStore keystore; | ||||
scriptPubKey.clear(); | scriptPubKey = | ||||
scriptPubKey << OP_2 << ToByteVector(uncompressedPubkey) | GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]}); | ||||
<< ToByteVector(pubkeys[1]) << OP_2 << OP_CHECKMULTISIG; | |||||
// Keystore does not have any keys | // Keystore does not have any keys | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
// Keystore has 1/2 keys | // Keystore has 1/2 keys | ||||
keystore.AddKey(uncompressedKey); | keystore.AddKey(uncompressedKey); | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
// Keystore has 2/2 keys | // Keystore has 2/2 keys | ||||
keystore.AddKey(keys[1]); | keystore.AddKey(keys[1]); | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
// Keystore has 2/2 keys and the script | // Keystore has 2/2 keys and the script | ||||
keystore.AddCScript(scriptPubKey); | keystore.AddCScript(scriptPubKey); | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
} | } | ||||
// P2SH multisig | // P2SH multisig | ||||
{ | { | ||||
CBasicKeyStore keystore; | CBasicKeyStore keystore; | ||||
keystore.AddKey(uncompressedKey); | keystore.AddKey(uncompressedKey); | ||||
keystore.AddKey(keys[1]); | keystore.AddKey(keys[1]); | ||||
CScript redeemScript; | CScript redeemScript = | ||||
redeemScript << OP_2 << ToByteVector(uncompressedPubkey) | GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]}); | ||||
<< ToByteVector(pubkeys[1]) << OP_2 << OP_CHECKMULTISIG; | scriptPubKey = GetScriptForDestination(CScriptID(redeemScript)); | ||||
scriptPubKey.clear(); | |||||
scriptPubKey << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) | |||||
<< OP_EQUAL; | |||||
// Keystore has no redeemScript | // Keystore has no redeemScript | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
// Keystore has redeemScript | // Keystore has redeemScript | ||||
keystore.AddCScript(redeemScript); | keystore.AddCScript(redeemScript); | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE); | BOOST_CHECK_EQUAL(result, ISMINE_SPENDABLE); | ||||
BOOST_CHECK(!isInvalid); | |||||
} | } | ||||
// OP_RETURN | // OP_RETURN | ||||
{ | { | ||||
CBasicKeyStore keystore; | CBasicKeyStore keystore; | ||||
keystore.AddKey(keys[0]); | keystore.AddKey(keys[0]); | ||||
scriptPubKey.clear(); | scriptPubKey.clear(); | ||||
scriptPubKey << OP_RETURN << ToByteVector(pubkeys[0]); | scriptPubKey << OP_RETURN << ToByteVector(pubkeys[0]); | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
} | } | ||||
// Nonstandard | // Nonstandard | ||||
{ | { | ||||
CBasicKeyStore keystore; | CBasicKeyStore keystore; | ||||
keystore.AddKey(keys[0]); | keystore.AddKey(keys[0]); | ||||
scriptPubKey.clear(); | scriptPubKey.clear(); | ||||
scriptPubKey << OP_9 << OP_ADD << OP_11 << OP_EQUAL; | scriptPubKey << OP_9 << OP_ADD << OP_11 << OP_EQUAL; | ||||
result = IsMine(keystore, scriptPubKey, isInvalid); | result = IsMine(keystore, scriptPubKey); | ||||
BOOST_CHECK_EQUAL(result, ISMINE_NO); | BOOST_CHECK_EQUAL(result, ISMINE_NO); | ||||
BOOST_CHECK(!isInvalid); | |||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |