42
42
root.
43
43
*/
44
44
45
- /* This implements a constant-space merkle root/path calculator, limited to 2^32 leaves. */
46
- static void MerkleComputation (const std::vector<uint256>& leaves, uint256* proot, bool * pmutated, uint32_t branchpos, std::vector<uint256>* pbranch) {
47
- if (pbranch) pbranch->clear ();
48
- if (leaves.size () == 0 ) {
49
- if (pmutated) *pmutated = false ;
50
- if (proot) *proot = uint256 ();
51
- return ;
52
- }
53
- bool mutated = false ;
54
- // count is the number of leaves processed so far.
55
- uint32_t count = 0 ;
56
- // inner is an array of eagerly computed subtree hashes, indexed by tree
57
- // level (0 being the leaves).
58
- // For example, when count is 25 (11001 in binary), inner[4] is the hash of
59
- // the first 16 leaves, inner[3] of the next 8 leaves, and inner[0] equal to
60
- // the last leaf. The other inner entries are undefined.
61
- uint256 inner[32 ];
62
- // Which position in inner is a hash that depends on the matching leaf.
63
- int matchlevel = -1 ;
64
- // First process all leaves into 'inner' values.
65
- while (count < leaves.size ()) {
66
- uint256 h = leaves[count];
67
- bool matchh = count == branchpos;
68
- count++;
69
- int level;
70
- // For each of the lower bits in count that are 0, do 1 step. Each
71
- // corresponds to an inner value that existed before processing the
72
- // current leaf, and each needs a hash to combine it.
73
- for (level = 0 ; !(count & (((uint32_t )1 ) << level)); level++) {
74
- if (pbranch) {
75
- if (matchh) {
76
- pbranch->push_back (inner[level]);
77
- } else if (matchlevel == level) {
78
- pbranch->push_back (h);
79
- matchh = true ;
80
- }
81
- }
82
- mutated |= (inner[level] == h);
83
- CHash256 ().Write (inner[level].begin (), 32 ).Write (h.begin (), 32 ).Finalize (h.begin ());
84
- }
85
- // Store the resulting hash at inner position level.
86
- inner[level] = h;
87
- if (matchh) {
88
- matchlevel = level;
89
- }
90
- }
91
- // Do a final 'sweep' over the rightmost branch of the tree to process
92
- // odd levels, and reduce everything to a single top value.
93
- // Level is the level (counted from the bottom) up to which we've sweeped.
94
- int level = 0 ;
95
- // As long as bit number level in count is zero, skip it. It means there
96
- // is nothing left at this level.
97
- while (!(count & (((uint32_t )1 ) << level))) {
98
- level++;
99
- }
100
- uint256 h = inner[level];
101
- bool matchh = matchlevel == level;
102
- while (count != (((uint32_t )1 ) << level)) {
103
- // If we reach this point, h is an inner value that is not the top.
104
- // We combine it with itself (Bitcoin's special rule for odd levels in
105
- // the tree) to produce a higher level one.
106
- if (pbranch && matchh) {
107
- pbranch->push_back (h);
108
- }
109
- CHash256 ().Write (h.begin (), 32 ).Write (h.begin (), 32 ).Finalize (h.begin ());
110
- // Increment count to the value it would have if two entries at this
111
- // level had existed.
112
- count += (((uint32_t )1 ) << level);
113
- level++;
114
- // And propagate the result upwards accordingly.
115
- while (!(count & (((uint32_t )1 ) << level))) {
116
- if (pbranch) {
117
- if (matchh) {
118
- pbranch->push_back (inner[level]);
119
- } else if (matchlevel == level) {
120
- pbranch->push_back (h);
121
- matchh = true ;
122
- }
123
- }
124
- CHash256 ().Write (inner[level].begin (), 32 ).Write (h.begin (), 32 ).Finalize (h.begin ());
125
- level++;
126
- }
127
- }
128
- // Return result.
129
- if (pmutated) *pmutated = mutated;
130
- if (proot) *proot = h;
131
- }
132
45
133
46
uint256 ComputeMerkleRoot (std::vector<uint256> hashes, bool * mutated) {
134
47
bool mutation = false ;
@@ -149,24 +62,6 @@ uint256 ComputeMerkleRoot(std::vector<uint256> hashes, bool* mutated) {
149
62
return hashes[0 ];
150
63
}
151
64
152
- std::vector<uint256> ComputeMerkleBranch (const std::vector<uint256>& leaves, uint32_t position) {
153
- std::vector<uint256> ret;
154
- MerkleComputation (leaves, nullptr , nullptr , position, &ret);
155
- return ret;
156
- }
157
-
158
- uint256 ComputeMerkleRootFromBranch (const uint256& leaf, const std::vector<uint256>& vMerkleBranch, uint32_t nIndex) {
159
- uint256 hash = leaf;
160
- for (std::vector<uint256>::const_iterator it = vMerkleBranch.begin (); it != vMerkleBranch.end (); ++it) {
161
- if (nIndex & 1 ) {
162
- hash = Hash (BEGIN (*it), END (*it), BEGIN (hash), END (hash));
163
- } else {
164
- hash = Hash (BEGIN (hash), END (hash), BEGIN (*it), END (*it));
165
- }
166
- nIndex >>= 1 ;
167
- }
168
- return hash;
169
- }
170
65
171
66
uint256 BlockMerkleRoot (const CBlock& block, bool * mutated)
172
67
{
@@ -189,12 +84,3 @@ uint256 BlockWitnessMerkleRoot(const CBlock& block, bool* mutated)
189
84
return ComputeMerkleRoot (std::move (leaves), mutated);
190
85
}
191
86
192
- std::vector<uint256> BlockMerkleBranch (const CBlock& block, uint32_t position)
193
- {
194
- std::vector<uint256> leaves;
195
- leaves.resize (block.vtx .size ());
196
- for (size_t s = 0 ; s < block.vtx .size (); s++) {
197
- leaves[s] = block.vtx [s]->GetHash ();
198
- }
199
- return ComputeMerkleBranch (leaves, position);
200
- }
0 commit comments