mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-19 23:03:45 +01:00
Do not use CScript for tapleaf scripts until the tapleaf version is known
Prevents use of CScript methods until the tapleaf is known to be a tapscript.
This commit is contained in:
@@ -443,14 +443,14 @@ void TaprootBuilder::Insert(TaprootBuilder::NodeInfo&& node, int depth)
|
||||
return branch.size() == 0 || (branch.size() == 1 && branch[0]);
|
||||
}
|
||||
|
||||
TaprootBuilder& TaprootBuilder::Add(int depth, const CScript& script, int leaf_version, bool track)
|
||||
TaprootBuilder& TaprootBuilder::Add(int depth, Span<const unsigned char> script, int leaf_version, bool track)
|
||||
{
|
||||
assert((leaf_version & ~TAPROOT_LEAF_MASK) == 0);
|
||||
if (!IsValid()) return *this;
|
||||
/* Construct NodeInfo object with leaf hash and (if track is true) also leaf information. */
|
||||
NodeInfo node;
|
||||
node.hash = (HashWriter{HASHER_TAPLEAF} << uint8_t(leaf_version) << script).GetSHA256();
|
||||
if (track) node.leaves.emplace_back(LeafInfo{script, leaf_version, {}});
|
||||
node.hash = ComputeTapleafHash(leaf_version, script);
|
||||
if (track) node.leaves.emplace_back(LeafInfo{std::vector<unsigned char>(script.begin(), script.end()), leaf_version, {}});
|
||||
/* Insert into the branch. */
|
||||
Insert(std::move(node), depth);
|
||||
return *this;
|
||||
@@ -506,13 +506,13 @@ TaprootSpendData TaprootBuilder::GetSpendData() const
|
||||
return spd;
|
||||
}
|
||||
|
||||
std::optional<std::vector<std::tuple<int, CScript, int>>> InferTaprootTree(const TaprootSpendData& spenddata, const XOnlyPubKey& output)
|
||||
std::optional<std::vector<std::tuple<int, std::vector<unsigned char>, int>>> InferTaprootTree(const TaprootSpendData& spenddata, const XOnlyPubKey& output)
|
||||
{
|
||||
// Verify that the output matches the assumed Merkle root and internal key.
|
||||
auto tweak = spenddata.internal_key.CreateTapTweak(spenddata.merkle_root.IsNull() ? nullptr : &spenddata.merkle_root);
|
||||
if (!tweak || tweak->first != output) return std::nullopt;
|
||||
// If the Merkle root is 0, the tree is empty, and we're done.
|
||||
std::vector<std::tuple<int, CScript, int>> ret;
|
||||
std::vector<std::tuple<int, std::vector<unsigned char>, int>> ret;
|
||||
if (spenddata.merkle_root.IsNull()) return ret;
|
||||
|
||||
/** Data structure to represent the nodes of the tree we're going to build. */
|
||||
@@ -523,7 +523,7 @@ std::optional<std::vector<std::tuple<int, CScript, int>>> InferTaprootTree(const
|
||||
std::unique_ptr<TreeNode> sub[2];
|
||||
/** If this is known to be a leaf node, a pointer to the (script, leaf_ver) pair.
|
||||
* nullptr otherwise. */
|
||||
const std::pair<CScript, int>* leaf = nullptr;
|
||||
const std::pair<std::vector<unsigned char>, int>* leaf = nullptr;
|
||||
/** Whether or not this node has been explored (is known to be a leaf, or known to have children). */
|
||||
bool explored = false;
|
||||
/** Whether or not this node is an inner node (unknown until explored = true). */
|
||||
@@ -641,10 +641,10 @@ std::optional<std::vector<std::tuple<int, CScript, int>>> InferTaprootTree(const
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::vector<std::tuple<uint8_t, uint8_t, CScript>> TaprootBuilder::GetTreeTuples() const
|
||||
std::vector<std::tuple<uint8_t, uint8_t, std::vector<unsigned char>>> TaprootBuilder::GetTreeTuples() const
|
||||
{
|
||||
assert(IsComplete());
|
||||
std::vector<std::tuple<uint8_t, uint8_t, CScript>> tuples;
|
||||
std::vector<std::tuple<uint8_t, uint8_t, std::vector<unsigned char>>> tuples;
|
||||
if (m_branch.size()) {
|
||||
const auto& leaves = m_branch[0]->leaves;
|
||||
for (const auto& leaf : leaves) {
|
||||
|
||||
Reference in New Issue
Block a user