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