Improve witness destination types and use them more

This commit is contained in:
Pieter Wuille 2017-11-30 16:48:38 -08:00
parent cbe197470e
commit 985c79552c
2 changed files with 19 additions and 10 deletions

View file

@ -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) {

View file

@ -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);