@@ -249,4 +249,104 @@ BOOST_AUTO_TEST_CASE(merkle_test)
249
249
}
250
250
}
251
251
252
+
253
+ BOOST_AUTO_TEST_CASE (merkle_test_empty_block)
254
+ {
255
+ bool mutated = false ;
256
+ CBlock block;
257
+ uint256 root = BlockMerkleRoot (block, &mutated);
258
+
259
+ BOOST_CHECK_EQUAL (root.IsNull (), true );
260
+ BOOST_CHECK_EQUAL (mutated, false );
261
+ }
262
+
263
+ BOOST_AUTO_TEST_CASE (merkle_test_oneTx_block)
264
+ {
265
+ bool mutated = false ;
266
+ CBlock block;
267
+
268
+ block.vtx .resize (1 );
269
+ CMutableTransaction mtx;
270
+ mtx.nLockTime = 0 ;
271
+ block.vtx [0 ] = MakeTransactionRef (std::move (mtx));
272
+ uint256 root = BlockMerkleRoot (block, &mutated);
273
+ BOOST_CHECK_EQUAL (root, block.vtx [0 ]->GetHash ());
274
+ BOOST_CHECK_EQUAL (mutated, false );
275
+ }
276
+
277
+ BOOST_AUTO_TEST_CASE (merkle_test_OddTxWithRepeatedLastTx_block)
278
+ {
279
+ bool mutated;
280
+ CBlock block, blockWithRepeatedLastTx;
281
+
282
+ block.vtx .resize (3 );
283
+
284
+ for (std::size_t pos = 0 ; pos < block.vtx .size (); pos++) {
285
+ CMutableTransaction mtx;
286
+ mtx.nLockTime = pos;
287
+ block.vtx [pos] = MakeTransactionRef (std::move (mtx));
288
+ }
289
+
290
+ blockWithRepeatedLastTx = block;
291
+ blockWithRepeatedLastTx.vtx .push_back (blockWithRepeatedLastTx.vtx .back ());
292
+
293
+ uint256 rootofBlock = BlockMerkleRoot (block, &mutated);
294
+ BOOST_CHECK_EQUAL (mutated, false );
295
+
296
+ uint256 rootofBlockWithRepeatedLastTx = BlockMerkleRoot (blockWithRepeatedLastTx, &mutated);
297
+ BOOST_CHECK_EQUAL (rootofBlock, rootofBlockWithRepeatedLastTx);
298
+ BOOST_CHECK_EQUAL (mutated, true );
299
+ }
300
+
301
+ BOOST_AUTO_TEST_CASE (merkle_test_LeftSubtreeRightSubtree)
302
+ {
303
+ CBlock block, leftSubtreeBlock, rightSubtreeBlock;
304
+
305
+ block.vtx .resize (4 );
306
+ std::size_t pos;
307
+ for (pos = 0 ; pos < block.vtx .size (); pos++) {
308
+ CMutableTransaction mtx;
309
+ mtx.nLockTime = pos;
310
+ block.vtx [pos] = MakeTransactionRef (std::move (mtx));
311
+ }
312
+
313
+ for (pos = 0 ; pos < block.vtx .size () / 2 ; pos++)
314
+ leftSubtreeBlock.vtx .push_back (block.vtx [pos]);
315
+
316
+ for (pos = block.vtx .size () / 2 ; pos < block.vtx .size (); pos++)
317
+ rightSubtreeBlock.vtx .push_back (block.vtx [pos]);
318
+
319
+ uint256 root = BlockMerkleRoot (block);
320
+ uint256 rootOfLeftSubtree = BlockMerkleRoot (leftSubtreeBlock);
321
+ uint256 rootOfRightSubtree = BlockMerkleRoot (rightSubtreeBlock);
322
+ std::vector<uint256> leftRight;
323
+ leftRight.push_back (rootOfLeftSubtree);
324
+ leftRight.push_back (rootOfRightSubtree);
325
+ uint256 rootOfLR = ComputeMerkleRoot (leftRight);
326
+
327
+ BOOST_CHECK_EQUAL (root, rootOfLR);
328
+ }
329
+
330
+ BOOST_AUTO_TEST_CASE (merkle_test_BlockWitness)
331
+ {
332
+ CBlock block;
333
+
334
+ block.vtx .resize (2 );
335
+ for (std::size_t pos = 0 ; pos < block.vtx .size (); pos++) {
336
+ CMutableTransaction mtx;
337
+ mtx.nLockTime = pos;
338
+ block.vtx [pos] = MakeTransactionRef (std::move (mtx));
339
+ }
340
+
341
+ uint256 blockWitness = BlockWitnessMerkleRoot (block);
342
+
343
+ std::vector<uint256> hashes;
344
+ hashes.resize (block.vtx .size ());
345
+ hashes[0 ].SetNull ();
346
+ hashes[1 ] = block.vtx [1 ]->GetHash ();
347
+
348
+ uint256 merkelRootofHashes = ComputeMerkleRoot (hashes);
349
+
350
+ BOOST_CHECK_EQUAL (merkelRootofHashes, blockWitness);
351
+ }
252
352
BOOST_AUTO_TEST_SUITE_END ()
0 commit comments