mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-15 12:51:00 +02:00
Merge #20211: Use -Wswitch for TxoutType where possible
fa650ca7f1Use -Wswitch for TxoutType where possible (MarcoFalke)fa59e0b5bdtest: Add missing script_standard_Solver_success cases (MarcoFalke) Pull request description: This removes unused `default:` cases for all `switch` statements on `TxoutType` and adds the cases (`MULTISIG`, `NULL_DATA`, `NONSTANDARD`) to `ExtractDestination` for clarity. Also, the compiler is now able to use `-Wswitch`. ACKs for top commit: practicalswift: cr ACKfa650ca7f1: patch looks correct and `assert(false);` is better than UB :) hebasto: ACKfa650ca7f1, I have reviewed the code and it looks OK, I agree it can be merged. Tree-SHA512: 282458b6523bd8923a0c0f5c423d1db2dce2a2d1b1d1dae455415c6fc995bb41ce82c1f9b0a1c0dcc6d874d171e04c30eca585f147582f52c7048c140358630a
This commit is contained in:
commit
e498aeffbe
5 changed files with 42 additions and 23 deletions
|
|
@ -106,8 +106,7 @@ static bool SignStep(const SigningProvider& provider, const BaseSignatureCreator
|
||||||
std::vector<valtype> vSolutions;
|
std::vector<valtype> vSolutions;
|
||||||
whichTypeRet = Solver(scriptPubKey, vSolutions);
|
whichTypeRet = Solver(scriptPubKey, vSolutions);
|
||||||
|
|
||||||
switch (whichTypeRet)
|
switch (whichTypeRet) {
|
||||||
{
|
|
||||||
case TxoutType::NONSTANDARD:
|
case TxoutType::NONSTANDARD:
|
||||||
case TxoutType::NULL_DATA:
|
case TxoutType::NULL_DATA:
|
||||||
case TxoutType::WITNESS_UNKNOWN:
|
case TxoutType::WITNESS_UNKNOWN:
|
||||||
|
|
@ -173,10 +172,8 @@ static bool SignStep(const SigningProvider& provider, const BaseSignatureCreator
|
||||||
// Could not find witnessScript, add to missing
|
// Could not find witnessScript, add to missing
|
||||||
sigdata.missing_witness_script = uint256(vSolutions[0]);
|
sigdata.missing_witness_script = uint256(vSolutions[0]);
|
||||||
return false;
|
return false;
|
||||||
|
} // no default case, so the compiler can warn about missing cases
|
||||||
default:
|
assert(false);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static CScript PushAll(const std::vector<valtype>& values)
|
static CScript PushAll(const std::vector<valtype>& values)
|
||||||
|
|
|
||||||
|
|
@ -45,8 +45,7 @@ WitnessV0ScriptHash::WitnessV0ScriptHash(const CScript& in)
|
||||||
|
|
||||||
std::string GetTxnOutputType(TxoutType t)
|
std::string GetTxnOutputType(TxoutType t)
|
||||||
{
|
{
|
||||||
switch (t)
|
switch (t) {
|
||||||
{
|
|
||||||
case TxoutType::NONSTANDARD: return "nonstandard";
|
case TxoutType::NONSTANDARD: return "nonstandard";
|
||||||
case TxoutType::PUBKEY: return "pubkey";
|
case TxoutType::PUBKEY: return "pubkey";
|
||||||
case TxoutType::PUBKEYHASH: return "pubkeyhash";
|
case TxoutType::PUBKEYHASH: return "pubkeyhash";
|
||||||
|
|
@ -182,7 +181,8 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
||||||
std::vector<valtype> vSolutions;
|
std::vector<valtype> vSolutions;
|
||||||
TxoutType whichType = Solver(scriptPubKey, vSolutions);
|
TxoutType whichType = Solver(scriptPubKey, vSolutions);
|
||||||
|
|
||||||
if (whichType == TxoutType::PUBKEY) {
|
switch (whichType) {
|
||||||
|
case TxoutType::PUBKEY: {
|
||||||
CPubKey pubKey(vSolutions[0]);
|
CPubKey pubKey(vSolutions[0]);
|
||||||
if (!pubKey.IsValid())
|
if (!pubKey.IsValid())
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -190,26 +190,28 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
||||||
addressRet = PKHash(pubKey);
|
addressRet = PKHash(pubKey);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (whichType == TxoutType::PUBKEYHASH)
|
case TxoutType::PUBKEYHASH: {
|
||||||
{
|
|
||||||
addressRet = PKHash(uint160(vSolutions[0]));
|
addressRet = PKHash(uint160(vSolutions[0]));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (whichType == TxoutType::SCRIPTHASH)
|
case TxoutType::SCRIPTHASH: {
|
||||||
{
|
|
||||||
addressRet = ScriptHash(uint160(vSolutions[0]));
|
addressRet = ScriptHash(uint160(vSolutions[0]));
|
||||||
return true;
|
return true;
|
||||||
} else if (whichType == TxoutType::WITNESS_V0_KEYHASH) {
|
}
|
||||||
|
case TxoutType::WITNESS_V0_KEYHASH: {
|
||||||
WitnessV0KeyHash hash;
|
WitnessV0KeyHash hash;
|
||||||
std::copy(vSolutions[0].begin(), vSolutions[0].end(), hash.begin());
|
std::copy(vSolutions[0].begin(), vSolutions[0].end(), hash.begin());
|
||||||
addressRet = hash;
|
addressRet = hash;
|
||||||
return true;
|
return true;
|
||||||
} else if (whichType == TxoutType::WITNESS_V0_SCRIPTHASH) {
|
}
|
||||||
|
case TxoutType::WITNESS_V0_SCRIPTHASH: {
|
||||||
WitnessV0ScriptHash hash;
|
WitnessV0ScriptHash hash;
|
||||||
std::copy(vSolutions[0].begin(), vSolutions[0].end(), hash.begin());
|
std::copy(vSolutions[0].begin(), vSolutions[0].end(), hash.begin());
|
||||||
addressRet = hash;
|
addressRet = hash;
|
||||||
return true;
|
return true;
|
||||||
} else if (whichType == TxoutType::WITNESS_UNKNOWN || whichType == TxoutType::WITNESS_V1_TAPROOT) {
|
}
|
||||||
|
case TxoutType::WITNESS_UNKNOWN:
|
||||||
|
case TxoutType::WITNESS_V1_TAPROOT: {
|
||||||
WitnessUnknown unk;
|
WitnessUnknown unk;
|
||||||
unk.version = vSolutions[0][0];
|
unk.version = vSolutions[0][0];
|
||||||
std::copy(vSolutions[1].begin(), vSolutions[1].end(), unk.program);
|
std::copy(vSolutions[1].begin(), vSolutions[1].end(), unk.program);
|
||||||
|
|
@ -217,8 +219,13 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
||||||
addressRet = unk;
|
addressRet = unk;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// Multisig txns have more than one address...
|
case TxoutType::MULTISIG:
|
||||||
return false;
|
// Multisig txns have more than one address...
|
||||||
|
case TxoutType::NULL_DATA:
|
||||||
|
case TxoutType::NONSTANDARD:
|
||||||
|
return false;
|
||||||
|
} // no default case, so the compiler can warn about missing cases
|
||||||
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ExtractDestinations(const CScript& scriptPubKey, TxoutType& typeRet, std::vector<CTxDestination>& addressRet, int& nRequiredRet)
|
bool ExtractDestinations(const CScript& scriptPubKey, TxoutType& typeRet, std::vector<CTxDestination>& addressRet, int& nRequiredRet)
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,22 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_success)
|
||||||
BOOST_CHECK_EQUAL(solutions.size(), 1U);
|
BOOST_CHECK_EQUAL(solutions.size(), 1U);
|
||||||
BOOST_CHECK(solutions[0] == ToByteVector(scriptHash));
|
BOOST_CHECK(solutions[0] == ToByteVector(scriptHash));
|
||||||
|
|
||||||
|
// TxoutType::WITNESS_V1_TAPROOT
|
||||||
|
s.clear();
|
||||||
|
s << OP_1 << ToByteVector(uint256::ZERO);
|
||||||
|
BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::WITNESS_V1_TAPROOT);
|
||||||
|
BOOST_CHECK_EQUAL(solutions.size(), 2U);
|
||||||
|
BOOST_CHECK(solutions[0] == std::vector<unsigned char>{1});
|
||||||
|
BOOST_CHECK(solutions[1] == ToByteVector(uint256::ZERO));
|
||||||
|
|
||||||
|
// TxoutType::WITNESS_UNKNOWN
|
||||||
|
s.clear();
|
||||||
|
s << OP_16 << ToByteVector(uint256::ONE);
|
||||||
|
BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::WITNESS_UNKNOWN);
|
||||||
|
BOOST_CHECK_EQUAL(solutions.size(), 2U);
|
||||||
|
BOOST_CHECK(solutions[0] == std::vector<unsigned char>{16});
|
||||||
|
BOOST_CHECK(solutions[1] == ToByteVector(uint256::ONE));
|
||||||
|
|
||||||
// TxoutType::NONSTANDARD
|
// TxoutType::NONSTANDARD
|
||||||
s.clear();
|
s.clear();
|
||||||
s << OP_9 << OP_ADD << OP_11 << OP_EQUAL;
|
s << OP_9 << OP_ADD << OP_11 << OP_EQUAL;
|
||||||
|
|
|
||||||
|
|
@ -934,9 +934,9 @@ static std::string RecurseImportData(const CScript& script, ImportData& import_d
|
||||||
case TxoutType::NONSTANDARD:
|
case TxoutType::NONSTANDARD:
|
||||||
case TxoutType::WITNESS_UNKNOWN:
|
case TxoutType::WITNESS_UNKNOWN:
|
||||||
case TxoutType::WITNESS_V1_TAPROOT:
|
case TxoutType::WITNESS_V1_TAPROOT:
|
||||||
default:
|
|
||||||
return "unrecognized script";
|
return "unrecognized script";
|
||||||
}
|
} // no default case, so the compiler can warn about missing cases
|
||||||
|
CHECK_NONFATAL(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniValue ProcessImportLegacy(ImportData& import_data, std::map<CKeyID, CPubKey>& pubkey_map, std::map<CKeyID, CKey>& privkey_map, std::set<CScript>& script_pub_keys, bool& have_solving_data, const UniValue& data, std::vector<CKeyID>& ordered_pubkeys)
|
static UniValue ProcessImportLegacy(ImportData& import_data, std::map<CKeyID, CPubKey>& pubkey_map, std::map<CKeyID, CKey>& privkey_map, std::set<CScript>& script_pub_keys, bool& have_solving_data, const UniValue& data, std::vector<CKeyID>& ordered_pubkeys)
|
||||||
|
|
|
||||||
|
|
@ -94,8 +94,7 @@ IsMineResult IsMineInner(const LegacyScriptPubKeyMan& keystore, const CScript& s
|
||||||
TxoutType whichType = Solver(scriptPubKey, vSolutions);
|
TxoutType whichType = Solver(scriptPubKey, vSolutions);
|
||||||
|
|
||||||
CKeyID keyID;
|
CKeyID keyID;
|
||||||
switch (whichType)
|
switch (whichType) {
|
||||||
{
|
|
||||||
case TxoutType::NONSTANDARD:
|
case TxoutType::NONSTANDARD:
|
||||||
case TxoutType::NULL_DATA:
|
case TxoutType::NULL_DATA:
|
||||||
case TxoutType::WITNESS_UNKNOWN:
|
case TxoutType::WITNESS_UNKNOWN:
|
||||||
|
|
@ -194,7 +193,7 @@ IsMineResult IsMineInner(const LegacyScriptPubKeyMan& keystore, const CScript& s
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} // no default case, so the compiler can warn about missing cases
|
||||||
|
|
||||||
if (ret == IsMineResult::NO && keystore.HaveWatchOnly(scriptPubKey)) {
|
if (ret == IsMineResult::NO && keystore.HaveWatchOnly(scriptPubKey)) {
|
||||||
ret = std::max(ret, IsMineResult::WATCH_ONLY);
|
ret = std::max(ret, IsMineResult::WATCH_ONLY);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue