/tmp/bitcoin/src/consensus/merkle.cpp
Line | Count | Source |
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> |
10 | | #include <primitives/transaction.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 | | |
54 | 351k | uint256 ComputeMerkleRoot(std::vector<uint256> hashes, bool* mutated) { |
55 | 351k | bool mutation = false; |
56 | 386k | while (hashes.size() > 1) { |
57 | 34.5k | if (mutated) { |
58 | 256k | for (size_t pos = 0; pos + 1 < hashes.size(); pos += 2) { |
59 | 237k | if (hashes[pos] == hashes[pos + 1]) mutation = true; |
60 | 237k | } |
61 | 18.8k | } |
62 | 34.5k | if (hashes.size() & 1) { |
63 | 9.22k | hashes.push_back(hashes.back()); |
64 | 9.22k | } |
65 | 34.5k | SHA256D64(hashes[0].begin(), hashes[0].begin(), hashes.size() / 2); |
66 | 34.5k | hashes.resize(hashes.size() / 2); |
67 | 34.5k | } |
68 | 351k | if (mutated) *mutated = mutation; |
69 | 351k | if (hashes.size() == 0) return uint256(); |
70 | 351k | return hashes[0]; |
71 | 351k | } |
72 | | |
73 | | |
74 | | uint256 BlockMerkleRoot(const CBlock& block, bool* mutated) |
75 | 196k | { |
76 | 196k | std::vector<uint256> leaves; |
77 | 196k | leaves.reserve((block.vtx.size() + 1) & ~1ULL); // capacity rounded up to even |
78 | 648k | for (size_t s = 0; s < block.vtx.size(); s++) { |
79 | 451k | leaves.push_back(block.vtx[s]->GetHash().ToUint256()); |
80 | 451k | } |
81 | 196k | return ComputeMerkleRoot(std::move(leaves), mutated); |
82 | 196k | } |
83 | | |
84 | | uint256 BlockWitnessMerkleRoot(const CBlock& block) |
85 | 155k | { |
86 | 155k | std::vector<uint256> leaves; |
87 | 155k | leaves.reserve((block.vtx.size() + 1) & ~1ULL); // capacity rounded up to even |
88 | 155k | leaves.emplace_back(); // The witness hash of the coinbase is 0. |
89 | 194k | for (size_t s = 1; s < block.vtx.size(); s++) { |
90 | 39.6k | leaves.push_back(block.vtx[s]->GetWitnessHash().ToUint256()); |
91 | 39.6k | } |
92 | 155k | return ComputeMerkleRoot(std::move(leaves)); |
93 | 155k | } |
94 | | |
95 | | /* This implements a constant-space merkle path calculator, limited to 2^32 leaves. */ |
96 | | static void MerkleComputation(const std::vector<uint256>& leaves, uint32_t leaf_pos, std::vector<uint256>& path) |
97 | 377 | { |
98 | 377 | path.clear(); |
99 | 377 | Assume(leaves.size() <= UINT32_MAX); |
100 | 377 | if (leaves.size() == 0) { |
101 | 1 | return; |
102 | 1 | } |
103 | | // count is the number of leaves processed so far. |
104 | 376 | 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 | 376 | uint256 inner[32]; |
111 | | // Which position in inner is a hash that depends on the matching leaf. |
112 | 376 | int matchlevel = -1; |
113 | | // First process all leaves into 'inner' values. |
114 | 360k | while (count < leaves.size()) { |
115 | 360k | uint256 h = leaves[count]; |
116 | 360k | bool matchh = count == leaf_pos; |
117 | 360k | count++; |
118 | 360k | 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 | 718k | for (level = 0; !(count & ((uint32_t{1}) << level)); level++) { |
123 | 358k | if (matchh) { |
124 | 1.29k | path.push_back(inner[level]); |
125 | 357k | } else if (matchlevel == level) { |
126 | 1.25k | path.push_back(h); |
127 | 1.25k | matchh = true; |
128 | 1.25k | } |
129 | 358k | h = Hash(inner[level], h); |
130 | 358k | } |
131 | | // Store the resulting hash at inner position level. |
132 | 360k | inner[level] = h; |
133 | 360k | if (matchh) { |
134 | 1.63k | matchlevel = level; |
135 | 1.63k | } |
136 | 360k | } |
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 | 376 | 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 | 800 | while (!(count & ((uint32_t{1}) << level))) { |
144 | 424 | level++; |
145 | 424 | } |
146 | 376 | uint256 h = inner[level]; |
147 | 376 | bool matchh = matchlevel == level; |
148 | 1.75k | 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 | 1.37k | if (matchh) { |
153 | 68 | path.push_back(h); |
154 | 68 | } |
155 | 1.37k | h = Hash(h, h); |
156 | | // Increment count to the value it would have if two entries at this |
157 | | // level had existed. |
158 | 1.37k | count += ((uint32_t{1}) << level); |
159 | 1.37k | level++; |
160 | | // And propagate the result upwards accordingly. |
161 | 2.63k | while (!(count & ((uint32_t{1}) << level))) { |
162 | 1.25k | if (matchh) { |
163 | 113 | path.push_back(inner[level]); |
164 | 1.13k | } else if (matchlevel == level) { |
165 | 327 | path.push_back(h); |
166 | 327 | matchh = true; |
167 | 327 | } |
168 | 1.25k | h = Hash(inner[level], h); |
169 | 1.25k | level++; |
170 | 1.25k | } |
171 | 1.37k | } |
172 | 376 | } |
173 | | |
174 | 377 | static std::vector<uint256> ComputeMerklePath(const std::vector<uint256>& leaves, uint32_t position) { |
175 | 377 | std::vector<uint256> ret; |
176 | 377 | MerkleComputation(leaves, position, ret); |
177 | 377 | return ret; |
178 | 377 | } |
179 | | |
180 | | std::vector<uint256> TransactionMerklePath(const CBlock& block, uint32_t position) |
181 | 377 | { |
182 | 377 | std::vector<uint256> leaves; |
183 | 377 | leaves.resize(block.vtx.size()); |
184 | 360k | for (size_t s = 0; s < block.vtx.size(); s++) { |
185 | 360k | leaves[s] = block.vtx[s]->GetHash().ToUint256(); |
186 | 360k | } |
187 | 377 | return ComputeMerklePath(leaves, position); |
188 | 377 | } |