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*/
52
53
54uint256 ComputeMerkleRoot(std::vector<uint256> hashes, bool* mutated) {
55 bool mutation = false;
56 while (hashes.size() > 1) {
57 if (mutated) {
58 for (size_t pos = 0; pos + 1 < hashes.size(); pos += 2) {
59 if (hashes[pos] == hashes[pos + 1]) mutation = true;
60 }
61 }
62 if (hashes.size() & 1) {
63 hashes.push_back(hashes.back());
64 }
65 SHA256D64(hashes[0].begin(), hashes[0].begin(), hashes.size() / 2);
66 hashes.resize(hashes.size() / 2);
67 }
68 if (mutated) *mutated = mutation;
69 if (hashes.size() == 0) return uint256();
70 return hashes[0];
71}
72
73
74uint256 BlockMerkleRoot(const CBlock& block, bool* mutated)
75{
76 std::vector<uint256> leaves;
77 leaves.reserve((block.vtx.size() + 1) & ~1ULL); // capacity rounded up to even
78 for (size_t s = 0; s < block.vtx.size(); s++) {
79 leaves.push_back(block.vtx[s]->GetHash().ToUint256());
80 }
81 return ComputeMerkleRoot(std::move(leaves), mutated);
82}
83
85{
86 std::vector<uint256> leaves;
87 leaves.reserve((block.vtx.size() + 1) & ~1ULL); // capacity rounded up to even
88 leaves.emplace_back(); // The witness hash of the coinbase is 0.
89 for (size_t s = 1; s < block.vtx.size(); s++) {
90 leaves.push_back(block.vtx[s]->GetWitnessHash().ToUint256());
91 }
92 return ComputeMerkleRoot(std::move(leaves));
93}
94
95/* This implements a constant-space merkle path calculator, limited to 2^32 leaves. */
96static void MerkleComputation(const std::vector<uint256>& leaves, uint32_t leaf_pos, std::vector<uint256>& path)
97{
98 path.clear();
99 Assume(leaves.size() <= UINT32_MAX);
100 if (leaves.size() == 0) {
101 return;
102 }
103 // count is the number of leaves processed so far.
104 uint32_t count = 0;
105 // inner is an array of eagerly computed subtree hashes, indexed by tree
106 // level (0 being the leaves).
107 // For example, when count is 25 (11001 in binary), inner[4] is the hash of
108 // the first 16 leaves, inner[3] of the next 8 leaves, and inner[0] equal to
109 // the last leaf. The other inner entries are undefined.
110 uint256 inner[32];
111 // Which position in inner is a hash that depends on the matching leaf.
112 int matchlevel = -1;
113 // First process all leaves into 'inner' values.
114 while (count < leaves.size()) {
115 uint256 h = leaves[count];
116 bool matchh = count == leaf_pos;
117 count++;
118 int level;
119 // For each of the lower bits in count that are 0, do 1 step. Each
120 // corresponds to an inner value that existed before processing the
121 // current leaf, and each needs a hash to combine it.
122 for (level = 0; !(count & ((uint32_t{1}) << level)); level++) {
123 if (matchh) {
124 path.push_back(inner[level]);
125 } else if (matchlevel == level) {
126 path.push_back(h);
127 matchh = true;
128 }
129 h = Hash(inner[level], h);
130 }
131 // Store the resulting hash at inner position level.
132 inner[level] = h;
133 if (matchh) {
134 matchlevel = level;
135 }
136 }
137 // Do a final 'sweep' over the rightmost branch of the tree to process
138 // odd levels, and reduce everything to a single top value.
139 // Level is the level (counted from the bottom) up to which we've sweeped.
140 int level = 0;
141 // As long as bit number level in count is zero, skip it. It means there
142 // is nothing left at this level.
143 while (!(count & ((uint32_t{1}) << level))) {
144 level++;
145 }
146 uint256 h = inner[level];
147 bool matchh = matchlevel == level;
148 while (count != ((uint32_t{1}) << level)) {
149 // If we reach this point, h is an inner value that is not the top.
150 // We combine it with itself (Bitcoin's special rule for odd levels in
151 // the tree) to produce a higher level one.
152 if (matchh) {
153 path.push_back(h);
154 }
155 h = Hash(h, h);
156 // Increment count to the value it would have if two entries at this
157 // level had existed.
158 count += ((uint32_t{1}) << level);
159 level++;
160 // And propagate the result upwards accordingly.
161 while (!(count & ((uint32_t{1}) << level))) {
162 if (matchh) {
163 path.push_back(inner[level]);
164 } else if (matchlevel == level) {
165 path.push_back(h);
166 matchh = true;
167 }
168 h = Hash(inner[level], h);
169 level++;
170 }
171 }
172}
173
174static std::vector<uint256> ComputeMerklePath(const std::vector<uint256>& leaves, uint32_t position) {
175 std::vector<uint256> ret;
176 MerkleComputation(leaves, position, ret);
177 return ret;
178}
179
180std::vector<uint256> TransactionMerklePath(const CBlock& block, uint32_t position)
181{
182 std::vector<uint256> leaves;
183 leaves.resize(block.vtx.size());
184 for (size_t s = 0; s < block.vtx.size(); s++) {
185 leaves[s] = block.vtx[s]->GetHash().ToUint256();
186 }
187 return ComputeMerklePath(leaves, position);
188}
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)
Definition: merkle.cpp:54
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Definition: merkle.cpp:74
static std::vector< uint256 > ComputeMerklePath(const std::vector< uint256 > &leaves, uint32_t position)
Definition: merkle.cpp:174
static void MerkleComputation(const std::vector< uint256 > &leaves, uint32_t leaf_pos, std::vector< uint256 > &path)
Definition: merkle.cpp:96
std::vector< uint256 > TransactionMerklePath(const CBlock &block, uint32_t position)
Compute merkle path to the specified transaction.
Definition: merkle.cpp:180
uint256 BlockWitnessMerkleRoot(const CBlock &block)
Definition: merkle.cpp:84
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