Bitcoin Core 31.99.0
P2P Digital Currency
merkle.cpp
Go to the documentation of this file.
1// Copyright (c) 2015-present The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <consensus/merkle.h>
6
7#include <crypto/sha256.h>
8#include <hash.h>
9#include <primitives/block.h>
11#include <util/check.h>
12
13#include <cstddef>
14#include <memory>
15#include <utility>
16
17/* WARNING! If you're reading this because you're learning about crypto
18 and/or designing a new system that will use merkle trees, keep in mind
19 that the following merkle tree algorithm has a serious flaw related to
20 duplicate txids, resulting in a vulnerability (CVE-2012-2459).
21
22 The reason is that if the number of hashes in the list at a given level
23 is odd, the last one is duplicated before computing the next level (which
24 is unusual in Merkle trees). This results in certain sequences of
25 transactions leading to the same merkle root. For example, these two
26 trees:
27
28 A A
29 / \ / \
30 B C B C
31 / \ | / \ / \
32 D E F D E F F
33 / \ / \ / \ / \ / \ / \ / \
34 1 2 3 4 5 6 1 2 3 4 5 6 5 6
35
36 for transaction lists [1,2,3,4,5,6] and [1,2,3,4,5,6,5,6] (where 5 and
37 6 are repeated) result in the same root hash A (because the hash of both
38 of (F) and (F,F) is C).
39
40 The vulnerability results from being able to send a block with such a
41 transaction list, with the same merkle root, and the same block hash as
42 the original without duplication, resulting in failed validation. If the
43 receiving node proceeds to mark that block as permanently invalid
44 however, it will fail to accept further unmodified (and thus potentially
45 valid) versions of the same block. We defend against this by detecting
46 the case where we would hash two identical hashes at the end of the list
47 together, and treating that identically to the block having an invalid
48 merkle root. Assuming no double-SHA256 collisions, this will detect all
49 known ways of changing the transactions without affecting the merkle
50 root.
51*/
52uint256 ComputeMerkleRoot(std::vector<uint256> hashes, bool* mutated) {
53 bool mutation = false;
54 while (hashes.size() > 1) {
55 if (mutated) {
56 // Check every level because equal pairs can appear above the leaves,
57 // as in the [1,2,3,4,5,6,5,6] construction described above.
58 // Continuing after finding one is redundant, but mutated blocks should
59 // not propagate through the network anyway, and the total number of
60 // comparisons is the same as for an unmutated input of the same length.
61 for (size_t pos = 0; pos + 1 < hashes.size(); pos += 2) {
62 if (hashes[pos] == hashes[pos + 1]) mutation = true;
63 }
64 }
65 if (hashes.size() & 1) {
66 hashes.push_back(hashes.back());
67 }
68 SHA256D64(hashes[0].begin(), hashes[0].begin(), hashes.size() / 2);
69 hashes.resize(hashes.size() / 2);
70 }
71 if (mutated) *mutated = mutation;
72 if (hashes.size() == 0) return uint256();
73 return hashes[0];
74}
75
76
77uint256 BlockMerkleRoot(const CBlock& block, bool* mutated)
78{
79 std::vector<uint256> leaves;
80 leaves.reserve((block.vtx.size() + 1) & ~1ULL); // capacity rounded up to even
81 for (size_t s = 0; s < block.vtx.size(); s++) {
82 leaves.push_back(block.vtx[s]->GetHash().ToUint256());
83 }
84 return ComputeMerkleRoot(std::move(leaves), mutated);
85}
86
88{
89 std::vector<uint256> leaves;
90 leaves.reserve((block.vtx.size() + 1) & ~1ULL); // capacity rounded up to even
91 leaves.emplace_back(); // The witness hash of the coinbase is 0.
92 for (size_t s = 1; s < block.vtx.size(); s++) {
93 leaves.push_back(block.vtx[s]->GetWitnessHash().ToUint256());
94 }
95 return ComputeMerkleRoot(std::move(leaves));
96}
97
98/* This implements a constant-space merkle path calculator, limited to 2^32 leaves. */
99static void MerkleComputation(const std::vector<uint256>& leaves, uint32_t leaf_pos, std::vector<uint256>& path)
100{
101 path.clear();
102 Assume(leaves.size() <= UINT32_MAX);
103 if (leaves.size() == 0) {
104 return;
105 }
106 // count is the number of leaves processed so far.
107 uint32_t count = 0;
108 // inner is an array of eagerly computed subtree hashes, indexed by tree
109 // level (0 being the leaves).
110 // For example, when count is 25 (11001 in binary), inner[4] is the hash of
111 // the first 16 leaves, inner[3] of the next 8 leaves, and inner[0] equal to
112 // the last leaf. The other inner entries are undefined.
113 uint256 inner[32];
114 // Which position in inner is a hash that depends on the matching leaf.
115 int matchlevel = -1;
116 // First process all leaves into 'inner' values.
117 while (count < leaves.size()) {
118 uint256 h = leaves[count];
119 bool matchh = count == leaf_pos;
120 count++;
121 int level;
122 // For each of the lower bits in count that are 0, do 1 step. Each
123 // corresponds to an inner value that existed before processing the
124 // current leaf, and each needs a hash to combine it.
125 for (level = 0; !(count & ((uint32_t{1}) << level)); level++) {
126 if (matchh) {
127 path.push_back(inner[level]);
128 } else if (matchlevel == level) {
129 path.push_back(h);
130 matchh = true;
131 }
132 h = Hash(inner[level], h);
133 }
134 // Store the resulting hash at inner position level.
135 inner[level] = h;
136 if (matchh) {
137 matchlevel = level;
138 }
139 }
140 // Do a final 'sweep' over the rightmost branch of the tree to process
141 // odd levels, and reduce everything to a single top value.
142 // Level is the level (counted from the bottom) up to which we've sweeped.
143 int level = 0;
144 // As long as bit number level in count is zero, skip it. It means there
145 // is nothing left at this level.
146 while (!(count & ((uint32_t{1}) << level))) {
147 level++;
148 }
149 uint256 h = inner[level];
150 bool matchh = matchlevel == level;
151 while (count != ((uint32_t{1}) << level)) {
152 // If we reach this point, h is an inner value that is not the top.
153 // We combine it with itself (Bitcoin's special rule for odd levels in
154 // the tree) to produce a higher level one.
155 if (matchh) {
156 path.push_back(h);
157 }
158 h = Hash(h, h);
159 // Increment count to the value it would have if two entries at this
160 // level had existed.
161 count += ((uint32_t{1}) << level);
162 level++;
163 // And propagate the result upwards accordingly.
164 while (!(count & ((uint32_t{1}) << level))) {
165 if (matchh) {
166 path.push_back(inner[level]);
167 } else if (matchlevel == level) {
168 path.push_back(h);
169 matchh = true;
170 }
171 h = Hash(inner[level], h);
172 level++;
173 }
174 }
175}
176
177static std::vector<uint256> ComputeMerklePath(const std::vector<uint256>& leaves, uint32_t position) {
178 std::vector<uint256> ret;
179 MerkleComputation(leaves, position, ret);
180 return ret;
181}
182
183std::vector<uint256> TransactionMerklePath(const CBlock& block, uint32_t position)
184{
185 std::vector<uint256> leaves;
186 leaves.resize(block.vtx.size());
187 for (size_t s = 0; s < block.vtx.size(); s++) {
188 leaves[s] = block.vtx[s]->GetHash().ToUint256();
189 }
190 return ComputeMerklePath(leaves, position);
191}
int ret
#define Assume(val)
Assume is the identity function.
Definition: check.h:128
Definition: block.h:74
std::vector< CTransactionRef > vtx
Definition: block.h:77
256-bit opaque blob.
Definition: uint256.h:196
uint256 ComputeMerkleRoot(std::vector< uint256 > hashes, bool *mutated)
Compute a Merkle root from the provided leaf hashes.
Definition: merkle.cpp:52
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Definition: merkle.cpp:77
static std::vector< uint256 > ComputeMerklePath(const std::vector< uint256 > &leaves, uint32_t position)
Definition: merkle.cpp:177
static void MerkleComputation(const std::vector< uint256 > &leaves, uint32_t leaf_pos, std::vector< uint256 > &path)
Definition: merkle.cpp:99
std::vector< uint256 > TransactionMerklePath(const CBlock &block, uint32_t position)
Compute merkle path to the specified transaction.
Definition: merkle.cpp:183
uint256 BlockWitnessMerkleRoot(const CBlock &block)
Definition: merkle.cpp:87
uint256 Hash(const T &in1)
Compute the 256-bit hash of an object.
Definition: hash.h:83
void SHA256D64(unsigned char *out, const unsigned char *in, size_t blocks)
Compute multiple double-SHA256's of 64-byte blobs.
Definition: sha256.cpp:749
static int count