Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
consensus
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
76
uint256
BlockWitnessMerkleRoot
(
const
CBlock
& block)
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
}
ret
int ret
Definition
bitcoin-cli.cpp:1350
check.h
Assume
#define Assume(val)
Assume is the identity function.
Definition
check.h:125
CBlock
Definition
block.h:74
CBlock::vtx
std::vector< CTransactionRef > vtx
Definition
block.h:77
uint256
256-bit opaque blob.
Definition
uint256.h:195
ComputeMerkleRoot
uint256 ComputeMerkleRoot(std::vector< uint256 > hashes, bool *mutated)
Definition
merkle.cpp:46
BlockMerkleRoot
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Definition
merkle.cpp:66
ComputeMerklePath
static std::vector< uint256 > ComputeMerklePath(const std::vector< uint256 > &leaves, uint32_t position)
Definition
merkle.cpp:166
MerkleComputation
static void MerkleComputation(const std::vector< uint256 > &leaves, uint32_t leaf_pos, std::vector< uint256 > &path)
Definition
merkle.cpp:88
TransactionMerklePath
std::vector< uint256 > TransactionMerklePath(const CBlock &block, uint32_t position)
Compute merkle path to the specified transaction.
Definition
merkle.cpp:172
BlockWitnessMerkleRoot
uint256 BlockWitnessMerkleRoot(const CBlock &block)
Definition
merkle.cpp:76
Hash
uint256 Hash(const T &in1)
Compute the 256-bit hash of an object.
Definition
hash.h:75
merkle.h
SHA256D64
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
count
static int count
Definition
tests_exhaustive.c:34
Generated on
for Bitcoin Core by
1.17.0