mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 14:38:29 +01:00
Merge #19114: scripted-diff: TxoutType C++11 scoped enum class
fa32adf9dcscripted-diff: TxoutType C++11 scoped enum class (MarcoFalke)fa95a694c4doc: Update outdated txnouttype documentation (MarcoFalke)fa58469c77rpc: Properly use underlying type in GetAllOutputTypes (MarcoFalke)fa41c65702rpc: Simplify GetAllOutputTypes with the Join helper (MarcoFalke) Pull request description: Non-scoped enums can accidentally and silently decay into an integral type. Also, the symbol names of the keys are exported to the surrounding (usually global) namespace. Fix both issues by switching to an `enum class TxoutType` in a (mostly) scripted-diff. ACKs for top commit: practicalswift: ACKfa32adf9dc-- patch looks correct hebasto: re-ACKfa32adf9dc, since fa5997bd6fc82e16b597ea96e3c5c665f1f174ab (https://github.com/bitcoin/bitcoin/pull/19114#pullrequestreview-421425198) rebased only (verified with `git range-diff`). Tree-SHA512: f42a9db47f9be89fa4bdd8d2fb05a16726286d8b12e3d87327b67d723f91c7d5a57deb4b2ddae9e1d16fee7a5f8c00828b6dc8909c5db680fc5e0a3cf07cd465
This commit is contained in:
@@ -511,12 +511,12 @@ static UniValue decoderawtransaction(const JSONRPCRequest& request)
|
||||
|
||||
static std::string GetAllOutputTypes()
|
||||
{
|
||||
std::string ret;
|
||||
for (int i = TX_NONSTANDARD; i <= TX_WITNESS_UNKNOWN; ++i) {
|
||||
if (i != TX_NONSTANDARD) ret += ", ";
|
||||
ret += GetTxnOutputType(static_cast<txnouttype>(i));
|
||||
std::vector<std::string> ret;
|
||||
using U = std::underlying_type<TxoutType>::type;
|
||||
for (U i = (U)TxoutType::NONSTANDARD; i <= (U)TxoutType::WITNESS_UNKNOWN; ++i) {
|
||||
ret.emplace_back(GetTxnOutputType(static_cast<TxoutType>(i)));
|
||||
}
|
||||
return ret;
|
||||
return Join(ret, ", ");
|
||||
}
|
||||
|
||||
static UniValue decodescript(const JSONRPCRequest& request)
|
||||
@@ -580,10 +580,10 @@ static UniValue decodescript(const JSONRPCRequest& request)
|
||||
// is a witness program, don't return addresses for a segwit programs.
|
||||
if (type.get_str() == "pubkey" || type.get_str() == "pubkeyhash" || type.get_str() == "multisig" || type.get_str() == "nonstandard") {
|
||||
std::vector<std::vector<unsigned char>> solutions_data;
|
||||
txnouttype which_type = Solver(script, solutions_data);
|
||||
TxoutType which_type = Solver(script, solutions_data);
|
||||
// Uncompressed pubkeys cannot be used with segwit checksigs.
|
||||
// If the script contains an uncompressed pubkey, skip encoding of a segwit program.
|
||||
if ((which_type == TX_PUBKEY) || (which_type == TX_MULTISIG)) {
|
||||
if ((which_type == TxoutType::PUBKEY) || (which_type == TxoutType::MULTISIG)) {
|
||||
for (const auto& solution : solutions_data) {
|
||||
if ((solution.size() != 1) && !CPubKey(solution).IsCompressed()) {
|
||||
return r;
|
||||
@@ -592,9 +592,9 @@ static UniValue decodescript(const JSONRPCRequest& request)
|
||||
}
|
||||
UniValue sr(UniValue::VOBJ);
|
||||
CScript segwitScr;
|
||||
if (which_type == TX_PUBKEY) {
|
||||
if (which_type == TxoutType::PUBKEY) {
|
||||
segwitScr = GetScriptForDestination(WitnessV0KeyHash(Hash160(solutions_data[0].begin(), solutions_data[0].end())));
|
||||
} else if (which_type == TX_PUBKEYHASH) {
|
||||
} else if (which_type == TxoutType::PUBKEYHASH) {
|
||||
segwitScr = GetScriptForDestination(WitnessV0KeyHash(uint160{solutions_data[0]}));
|
||||
} else {
|
||||
// Scripts that are not fit for P2WPKH are encoded as P2WSH.
|
||||
|
||||
Reference in New Issue
Block a user