mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-10 22:18:54 +01:00
Add PubKeyDestination for P2PK scripts
P2PK scripts are not PKHash destinations, they should have their own type. This also results in no longer showing a p2pkh address for p2pk outputs. However for backwards compatibility, ListCoinst will still do this conversion.
This commit is contained in:
@@ -54,11 +54,12 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
||||
switch (whichType) {
|
||||
case TxoutType::PUBKEY: {
|
||||
CPubKey pubKey(vSolutions[0]);
|
||||
if (!pubKey.IsValid())
|
||||
return false;
|
||||
|
||||
addressRet = PKHash(pubKey);
|
||||
return true;
|
||||
if (!pubKey.IsValid()) {
|
||||
addressRet = CNoDestination(scriptPubKey);
|
||||
} else {
|
||||
addressRet = PubKeyDestination(pubKey);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case TxoutType::PUBKEYHASH: {
|
||||
addressRet = PKHash(uint160(vSolutions[0]));
|
||||
@@ -108,6 +109,11 @@ public:
|
||||
return dest.GetScript();
|
||||
}
|
||||
|
||||
CScript operator()(const PubKeyDestination& dest) const
|
||||
{
|
||||
return CScript() << ToByteVector(dest.GetPubKey()) << OP_CHECKSIG;
|
||||
}
|
||||
|
||||
CScript operator()(const PKHash& keyID) const
|
||||
{
|
||||
return CScript() << OP_DUP << OP_HASH160 << ToByteVector(keyID) << OP_EQUALVERIFY << OP_CHECKSIG;
|
||||
@@ -138,6 +144,19 @@ public:
|
||||
return CScript() << CScript::EncodeOP_N(id.GetWitnessVersion()) << id.GetWitnessProgram();
|
||||
}
|
||||
};
|
||||
|
||||
class ValidDestinationVisitor
|
||||
{
|
||||
public:
|
||||
bool operator()(const CNoDestination& dest) const { return false; }
|
||||
bool operator()(const PubKeyDestination& dest) const { return false; }
|
||||
bool operator()(const PKHash& dest) const { return true; }
|
||||
bool operator()(const ScriptHash& dest) const { return true; }
|
||||
bool operator()(const WitnessV0KeyHash& dest) const { return true; }
|
||||
bool operator()(const WitnessV0ScriptHash& dest) const { return true; }
|
||||
bool operator()(const WitnessV1Taproot& dest) const { return true; }
|
||||
bool operator()(const WitnessUnknown& dest) const { return true; }
|
||||
};
|
||||
} // namespace
|
||||
|
||||
CScript GetScriptForDestination(const CTxDestination& dest)
|
||||
@@ -146,5 +165,5 @@ CScript GetScriptForDestination(const CTxDestination& dest)
|
||||
}
|
||||
|
||||
bool IsValidDestination(const CTxDestination& dest) {
|
||||
return dest.index() != 0;
|
||||
return std::visit(ValidDestinationVisitor(), dest);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user