merkle.cpp
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 }