1 // Copyright (c) 2015-2017 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.
5 #include <consensus/merkle.h>
6 #include <test/test_bitcoin.h>
8 #include <boost/test/unit_test.hpp>
10 BOOST_FIXTURE_TEST_SUITE(merkle_tests
, TestingSetup
)
12 // Older version of the merkle root computation code, for comparison.
13 static uint256
BlockBuildMerkleTree(const CBlock
& block
, bool* fMutated
, std::vector
<uint256
>& vMerkleTree
)
16 vMerkleTree
.reserve(block
.vtx
.size() * 2 + 16); // Safe upper bound for the number of total nodes.
17 for (std::vector
<CTransactionRef
>::const_iterator
it(block
.vtx
.begin()); it
!= block
.vtx
.end(); ++it
)
18 vMerkleTree
.push_back((*it
)->GetHash());
21 for (int nSize
= block
.vtx
.size(); nSize
> 1; nSize
= (nSize
+ 1) / 2)
23 for (int i
= 0; i
< nSize
; i
+= 2)
25 int i2
= std::min(i
+1, nSize
-1);
26 if (i2
== i
+ 1 && i2
+ 1 == nSize
&& vMerkleTree
[j
+i
] == vMerkleTree
[j
+i2
]) {
27 // Two identical hashes at the end of the list at a particular level.
30 vMerkleTree
.push_back(Hash(vMerkleTree
[j
+i
].begin(), vMerkleTree
[j
+i
].end(),
31 vMerkleTree
[j
+i2
].begin(), vMerkleTree
[j
+i2
].end()));
38 return (vMerkleTree
.empty() ? uint256() : vMerkleTree
.back());
41 // Older version of the merkle branch computation code, for comparison.
42 static std::vector
<uint256
> BlockGetMerkleBranch(const CBlock
& block
, const std::vector
<uint256
>& vMerkleTree
, int nIndex
)
44 std::vector
<uint256
> vMerkleBranch
;
46 for (int nSize
= block
.vtx
.size(); nSize
> 1; nSize
= (nSize
+ 1) / 2)
48 int i
= std::min(nIndex
^1, nSize
-1);
49 vMerkleBranch
.push_back(vMerkleTree
[j
+i
]);
56 static inline int ctz(uint32_t i
) {
66 BOOST_AUTO_TEST_CASE(merkle_test
)
68 for (int i
= 0; i
< 32; i
++) {
69 // Try 32 block sizes: all sizes from 0 to 16 inclusive, and then 15 random sizes.
70 int ntx
= (i
<= 16) ? i
: 17 + (InsecureRandRange(4000));
71 // Try up to 3 mutations.
72 for (int mutate
= 0; mutate
<= 3; mutate
++) {
73 int duplicate1
= mutate
>= 1 ? 1 << ctz(ntx
) : 0; // The last how many transactions to duplicate first.
74 if (duplicate1
>= ntx
) break; // Duplication of the entire tree results in a different root (it adds a level).
75 int ntx1
= ntx
+ duplicate1
; // The resulting number of transactions after the first duplication.
76 int duplicate2
= mutate
>= 2 ? 1 << ctz(ntx1
) : 0; // Likewise for the second mutation.
77 if (duplicate2
>= ntx1
) break;
78 int ntx2
= ntx1
+ duplicate2
;
79 int duplicate3
= mutate
>= 3 ? 1 << ctz(ntx2
) : 0; // And for the third mutation.
80 if (duplicate3
>= ntx2
) break;
81 int ntx3
= ntx2
+ duplicate3
;
82 // Build a block with ntx different transactions.
84 block
.vtx
.resize(ntx
);
85 for (int j
= 0; j
< ntx
; j
++) {
86 CMutableTransaction mtx
;
88 block
.vtx
[j
] = MakeTransactionRef(std::move(mtx
));
90 // Compute the root of the block before mutating it.
91 bool unmutatedMutated
= false;
92 uint256 unmutatedRoot
= BlockMerkleRoot(block
, &unmutatedMutated
);
93 BOOST_CHECK(unmutatedMutated
== false);
94 // Optionally mutate by duplicating the last transactions, resulting in the same merkle root.
95 block
.vtx
.resize(ntx3
);
96 for (int j
= 0; j
< duplicate1
; j
++) {
97 block
.vtx
[ntx
+ j
] = block
.vtx
[ntx
+ j
- duplicate1
];
99 for (int j
= 0; j
< duplicate2
; j
++) {
100 block
.vtx
[ntx1
+ j
] = block
.vtx
[ntx1
+ j
- duplicate2
];
102 for (int j
= 0; j
< duplicate3
; j
++) {
103 block
.vtx
[ntx2
+ j
] = block
.vtx
[ntx2
+ j
- duplicate3
];
105 // Compute the merkle root and merkle tree using the old mechanism.
106 bool oldMutated
= false;
107 std::vector
<uint256
> merkleTree
;
108 uint256 oldRoot
= BlockBuildMerkleTree(block
, &oldMutated
, merkleTree
);
109 // Compute the merkle root using the new mechanism.
110 bool newMutated
= false;
111 uint256 newRoot
= BlockMerkleRoot(block
, &newMutated
);
112 BOOST_CHECK(oldRoot
== newRoot
);
113 BOOST_CHECK(newRoot
== unmutatedRoot
);
114 BOOST_CHECK((newRoot
== uint256()) == (ntx
== 0));
115 BOOST_CHECK(oldMutated
== newMutated
);
116 BOOST_CHECK(newMutated
== !!mutate
);
117 // If no mutation was done (once for every ntx value), try up to 16 branches.
119 for (int loop
= 0; loop
< std::min(ntx
, 16); loop
++) {
120 // If ntx <= 16, try all branches. Otherwise, try 16 random ones.
123 mtx
= InsecureRandRange(ntx
);
125 std::vector
<uint256
> newBranch
= BlockMerkleBranch(block
, mtx
);
126 std::vector
<uint256
> oldBranch
= BlockGetMerkleBranch(block
, merkleTree
, mtx
);
127 BOOST_CHECK(oldBranch
== newBranch
);
128 BOOST_CHECK(ComputeMerkleRootFromBranch(block
.vtx
[mtx
]->GetHash(), newBranch
, mtx
) == oldRoot
);
135 BOOST_AUTO_TEST_SUITE_END()