Bitcoin Core 29.99.0
P2P Digital Currency
outputtype.cpp
Go to the documentation of this file.
1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2009-present The Bitcoin Core developers
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#include <outputtype.h>
7
8#include <pubkey.h>
9#include <script/script.h>
10#include <script/sign.h>
12
13#include <cassert>
14#include <optional>
15#include <string>
16
17static const std::string OUTPUT_TYPE_STRING_LEGACY = "legacy";
18static const std::string OUTPUT_TYPE_STRING_P2SH_SEGWIT = "p2sh-segwit";
19static const std::string OUTPUT_TYPE_STRING_BECH32 = "bech32";
20static const std::string OUTPUT_TYPE_STRING_BECH32M = "bech32m";
21static const std::string OUTPUT_TYPE_STRING_UNKNOWN = "unknown";
22
23std::optional<OutputType> ParseOutputType(const std::string& type)
24{
25 if (type == OUTPUT_TYPE_STRING_LEGACY) {
26 return OutputType::LEGACY;
27 } else if (type == OUTPUT_TYPE_STRING_P2SH_SEGWIT) {
29 } else if (type == OUTPUT_TYPE_STRING_BECH32) {
30 return OutputType::BECH32;
31 } else if (type == OUTPUT_TYPE_STRING_BECH32M) {
33 }
34 return std::nullopt;
35}
36
37const std::string& FormatOutputType(OutputType type)
38{
39 switch (type) {
45 } // no default case, so the compiler can warn about missing cases
46 assert(false);
47}
48
50{
51 return util::Join(OUTPUT_TYPES, ", ", [](const auto& i) { return "\"" + FormatOutputType(i) + "\""; });
52}
53
55{
56 // Add script to keystore
57 keystore.scripts.emplace(CScriptID(script), script);
58
59 switch (type) {
61 return ScriptHash(script);
63 case OutputType::BECH32: {
65 CScript witprog = GetScriptForDestination(witdest);
66 // Add the redeemscript, so that P2WSH and P2SH-P2WSH outputs are recognized as ours.
67 keystore.scripts.emplace(CScriptID(witprog), witprog);
68 if (type == OutputType::BECH32) {
69 return witdest;
70 } else {
71 return ScriptHash(witprog);
72 }
73 }
75 case OutputType::UNKNOWN: {} // This function should not be used for BECH32M or UNKNOWN, so let it assert
76 } // no default case, so the compiler can warn about missing cases
77 assert(false);
78}
79
80std::optional<OutputType> OutputTypeFromDestination(const CTxDestination& dest) {
81 if (std::holds_alternative<PKHash>(dest) ||
82 std::holds_alternative<ScriptHash>(dest)) {
83 return OutputType::LEGACY;
84 }
85 if (std::holds_alternative<WitnessV0KeyHash>(dest) ||
86 std::holds_alternative<WitnessV0ScriptHash>(dest)) {
87 return OutputType::BECH32;
88 }
89 if (std::holds_alternative<WitnessV1Taproot>(dest) ||
90 std::holds_alternative<WitnessUnknown>(dest)) {
92 }
93 return std::nullopt;
94}
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
Definition: addresstype.h:143
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:413
A reference to a CScript: the Hash160 of its serialization.
Definition: script.h:602
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
Definition: string.h:204
static const std::string OUTPUT_TYPE_STRING_BECH32
Definition: outputtype.cpp:19
CTxDestination AddAndGetDestinationForScript(FlatSigningProvider &keystore, const CScript &script, OutputType type)
Get a destination of the requested type (if possible) to the specified script.
Definition: outputtype.cpp:54
static const std::string OUTPUT_TYPE_STRING_BECH32M
Definition: outputtype.cpp:20
std::optional< OutputType > OutputTypeFromDestination(const CTxDestination &dest)
Get the OutputType for a CTxDestination.
Definition: outputtype.cpp:80
std::string FormatAllOutputTypes()
Definition: outputtype.cpp:49
static const std::string OUTPUT_TYPE_STRING_LEGACY
Definition: outputtype.cpp:17
static const std::string OUTPUT_TYPE_STRING_P2SH_SEGWIT
Definition: outputtype.cpp:18
std::optional< OutputType > ParseOutputType(const std::string &type)
Definition: outputtype.cpp:23
const std::string & FormatOutputType(OutputType type)
Definition: outputtype.cpp:37
static const std::string OUTPUT_TYPE_STRING_UNKNOWN
Definition: outputtype.cpp:21
OutputType
Definition: outputtype.h:17
static constexpr auto OUTPUT_TYPES
Definition: outputtype.h:25
std::map< CScriptID, CScript > scripts
assert(!tx.IsCoinBase())