mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-19 06:43:45 +01:00
Implement BIP173 addresses and tests
This commit is contained in:
@@ -30,6 +30,7 @@ const char* GetTxnOutputType(txnouttype t)
|
||||
case TX_NULL_DATA: return "nulldata";
|
||||
case TX_WITNESS_V0_KEYHASH: return "witness_v0_keyhash";
|
||||
case TX_WITNESS_V0_SCRIPTHASH: return "witness_v0_scripthash";
|
||||
case TX_WITNESS_UNKNOWN: return "witness_unknown";
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
@@ -75,6 +76,12 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, std::vector<std::v
|
||||
vSolutionsRet.push_back(witnessprogram);
|
||||
return true;
|
||||
}
|
||||
if (witnessversion != 0) {
|
||||
typeRet = TX_WITNESS_UNKNOWN;
|
||||
vSolutionsRet.push_back(std::vector<unsigned char>{(unsigned char)witnessversion});
|
||||
vSolutionsRet.push_back(std::move(witnessprogram));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -198,6 +205,23 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
||||
{
|
||||
addressRet = CScriptID(uint160(vSolutions[0]));
|
||||
return true;
|
||||
} else if (whichType == TX_WITNESS_V0_KEYHASH) {
|
||||
WitnessV0KeyHash hash;
|
||||
std::copy(vSolutions[0].begin(), vSolutions[0].end(), hash.begin());
|
||||
addressRet = hash;
|
||||
return true;
|
||||
} else if (whichType == TX_WITNESS_V0_SCRIPTHASH) {
|
||||
WitnessV0ScriptHash hash;
|
||||
std::copy(vSolutions[0].begin(), vSolutions[0].end(), hash.begin());
|
||||
addressRet = hash;
|
||||
return true;
|
||||
} else if (whichType == TX_WITNESS_UNKNOWN) {
|
||||
WitnessUnknown unk;
|
||||
unk.version = vSolutions[0][0];
|
||||
std::copy(vSolutions[1].begin(), vSolutions[1].end(), unk.program);
|
||||
unk.length = vSolutions[1].size();
|
||||
addressRet = unk;
|
||||
return true;
|
||||
}
|
||||
// Multisig txns have more than one address...
|
||||
return false;
|
||||
@@ -268,6 +292,27 @@ public:
|
||||
*script << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator()(const WitnessV0KeyHash& id) const
|
||||
{
|
||||
script->clear();
|
||||
*script << OP_0 << ToByteVector(id);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator()(const WitnessV0ScriptHash& id) const
|
||||
{
|
||||
script->clear();
|
||||
*script << OP_0 << ToByteVector(id);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator()(const WitnessUnknown& id) const
|
||||
{
|
||||
script->clear();
|
||||
*script << CScript::EncodeOP_N(id.version) << std::vector<unsigned char>(id.program, id.program + id.length);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
} // namespace
|
||||
|
||||
|
||||
Reference in New Issue
Block a user