Improve witness destination types and use them more
This commit is contained in:
parent
cbe197470e
commit
985c79552c
2 changed files with 19 additions and 10 deletions
|
@ -348,19 +348,14 @@ CScript GetScriptForWitness(const CScript& redeemscript)
|
||||||
std::vector<std::vector<unsigned char> > vSolutions;
|
std::vector<std::vector<unsigned char> > vSolutions;
|
||||||
if (Solver(redeemscript, typ, vSolutions)) {
|
if (Solver(redeemscript, typ, vSolutions)) {
|
||||||
if (typ == TX_PUBKEY) {
|
if (typ == TX_PUBKEY) {
|
||||||
unsigned char h160[20];
|
return GetScriptForDestination(WitnessV0KeyHash(Hash160(vSolutions[0].begin(), vSolutions[0].end())));
|
||||||
CHash160().Write(&vSolutions[0][0], vSolutions[0].size()).Finalize(h160);
|
|
||||||
ret << OP_0 << std::vector<unsigned char>(&h160[0], &h160[20]);
|
|
||||||
return ret;
|
|
||||||
} else if (typ == TX_PUBKEYHASH) {
|
} else if (typ == TX_PUBKEYHASH) {
|
||||||
ret << OP_0 << vSolutions[0];
|
return GetScriptForDestination(WitnessV0KeyHash(vSolutions[0]));
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
uint256 hash;
|
uint256 hash;
|
||||||
CSHA256().Write(&redeemscript[0], redeemscript.size()).Finalize(hash.begin());
|
CSHA256().Write(&redeemscript[0], redeemscript.size()).Finalize(hash.begin());
|
||||||
ret << OP_0 << ToByteVector(hash);
|
return GetScriptForDestination(WitnessV0ScriptHash(hash));
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsValidDestination(const CTxDestination& dest) {
|
bool IsValidDestination(const CTxDestination& dest) {
|
||||||
|
|
|
@ -73,8 +73,19 @@ public:
|
||||||
friend bool operator<(const CNoDestination &a, const CNoDestination &b) { return true; }
|
friend bool operator<(const CNoDestination &a, const CNoDestination &b) { return true; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct WitnessV0ScriptHash : public uint256 {};
|
struct WitnessV0ScriptHash : public uint256
|
||||||
struct WitnessV0KeyHash : public uint160 {};
|
{
|
||||||
|
WitnessV0ScriptHash() : uint256() {}
|
||||||
|
explicit WitnessV0ScriptHash(const uint256& hash) : uint256(hash) {}
|
||||||
|
using uint256::uint256;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WitnessV0KeyHash : public uint160
|
||||||
|
{
|
||||||
|
WitnessV0KeyHash() : uint160() {}
|
||||||
|
explicit WitnessV0KeyHash(const uint160& hash) : uint160(hash) {}
|
||||||
|
using uint160::uint160;
|
||||||
|
};
|
||||||
|
|
||||||
//! CTxDestination subtype to encode any future Witness version
|
//! CTxDestination subtype to encode any future Witness version
|
||||||
struct WitnessUnknown
|
struct WitnessUnknown
|
||||||
|
@ -164,6 +175,9 @@ CScript GetScriptForMultisig(int nRequired, const std::vector<CPubKey>& keys);
|
||||||
* Generate a pay-to-witness script for the given redeem script. If the redeem
|
* Generate a pay-to-witness script for the given redeem script. If the redeem
|
||||||
* script is P2PK or P2PKH, this returns a P2WPKH script, otherwise it returns a
|
* script is P2PK or P2PKH, this returns a P2WPKH script, otherwise it returns a
|
||||||
* P2WSH script.
|
* P2WSH script.
|
||||||
|
*
|
||||||
|
* TODO: replace calls to GetScriptForWitness with GetScriptForDestination using
|
||||||
|
* the various witness-specific CTxDestination subtypes.
|
||||||
*/
|
*/
|
||||||
CScript GetScriptForWitness(const CScript& redeemscript);
|
CScript GetScriptForWitness(const CScript& redeemscript);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue