Bitcoin Core 30.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#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
46uint256 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
66uint256 BlockMerkleRoot(const CBlock& block, bool* mutated)
67{
68 std::vector<uint256> leaves;
69 leaves.resize(block.vtx.size());
70 for (size_t s = 0; s < block.vtx.size(); s++) {
71 leaves[s] = block.vtx[s]->GetHash().ToUint256();
72 }
73 return ComputeMerkleRoot(std::move(leaves), mutated);
74}
75
77{
78 std::vector<uint256> leaves;
79 leaves.resize(block.vtx.size());
80 leaves[0].SetNull(); // The witness hash of the coinbase is 0.
81 for (size_t s = 1; s < block.vtx.size(); s++) {
82 leaves[s] = 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. */
88static 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
166static 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
172std::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
#define Assume(val)
Assume is the identity function.
Definition: check.h:125
Definition: block.h:69
std::vector< CTransactionRef > vtx
Definition: block.h:72
constexpr void SetNull()
Definition: uint256.h:55
256-bit opaque blob.
Definition: uint256.h:195
uint256 ComputeMerkleRoot(std::vector< uint256 > hashes, bool *mutated)
Definition: merkle.cpp:46
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Definition: merkle.cpp:66
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
std::vector< uint256 > TransactionMerklePath(const CBlock &block, uint32_t position)
Compute merkle path to the specified transaction.
Definition: merkle.cpp:172
uint256 BlockWitnessMerkleRoot(const CBlock &block)
Definition: merkle.cpp:76
uint256 Hash(const T &in1)
Compute the 256-bit hash of an object.
Definition: hash.h:75
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