9 #include "validation.h"
13 #include <boost/test/unit_test.hpp>
15 #define SKIPLIST_LENGTH 300000
24 vIndex[i].nHeight = i;
25 vIndex[i].pprev = (i == 0) ?
nullptr : &vIndex[i - 1];
26 vIndex[i].BuildSkip();
31 BOOST_CHECK(vIndex[i].pskip == &vIndex[vIndex[i].pskip->nHeight]);
38 for (
int i=0; i < 1000; i++) {
40 int to = InsecureRandRange(from + 1);
43 BOOST_CHECK(vIndex[from].GetAncestor(to) == &vIndex[to]);
44 BOOST_CHECK(vIndex[from].GetAncestor(0) == vIndex.data());
51 std::vector<uint256> vHashMain(100000);
52 std::vector<CBlockIndex> vBlocksMain(100000);
53 for (
unsigned int i=0; i<vBlocksMain.size(); i++) {
55 vBlocksMain[i].nHeight = i;
56 vBlocksMain[i].pprev = i ? &vBlocksMain[i - 1] :
nullptr;
57 vBlocksMain[i].phashBlock = &vHashMain[i];
58 vBlocksMain[i].BuildSkip();
60 BOOST_CHECK(vBlocksMain[i].pprev ==
nullptr || vBlocksMain[i].nHeight == vBlocksMain[i].pprev->nHeight + 1);
64 std::vector<uint256> vHashSide(50000);
65 std::vector<CBlockIndex> vBlocksSide(50000);
66 for (
unsigned int i=0; i<vBlocksSide.size(); i++) {
68 vBlocksSide[i].nHeight = i + 50000;
69 vBlocksSide[i].pprev = i ? &vBlocksSide[i - 1] : (vBlocksMain.data()+49999);
70 vBlocksSide[i].phashBlock = &vHashSide[i];
71 vBlocksSide[i].BuildSkip();
73 BOOST_CHECK(vBlocksSide[i].pprev ==
nullptr || vBlocksSide[i].nHeight == vBlocksSide[i].pprev->nHeight + 1);
78 chain.
SetTip(&vBlocksMain.back());
81 for (
int n=0; n<100; n++) {
82 int r = InsecureRandRange(150000);
83 CBlockIndex* tip = (r < 100000) ? &vBlocksMain[r] : &vBlocksSide[r - 100000];
91 for (
unsigned int i = 1; i < 12 && i < locator.
vHave.size() - 1; i++) {
96 unsigned int dist = 2;
97 for (
unsigned int i = 12; i < locator.
vHave.size() - 1; i++) {
106 std::vector<uint256> vHashMain(100000);
107 std::vector<CBlockIndex> vBlocksMain(100000);
108 for (
unsigned int i=0; i<vBlocksMain.size(); i++) {
110 vBlocksMain[i].nHeight = i;
111 vBlocksMain[i].pprev = i ? &vBlocksMain[i - 1] :
nullptr;
112 vBlocksMain[i].phashBlock = &vHashMain[i];
113 vBlocksMain[i].BuildSkip();
115 vBlocksMain[i].nTime = i;
116 vBlocksMain[i].nTimeMax = i;
119 int64_t medianTimePast = vBlocksMain[i].GetMedianTimePast();
120 int r = InsecureRandRange(medianTimePast);
121 vBlocksMain[i].nTime = r + medianTimePast;
122 vBlocksMain[i].nTimeMax = std::max(vBlocksMain[i].nTime, vBlocksMain[i-1].nTimeMax);
126 unsigned int curTimeMax = 0;
127 for (
unsigned int i=0; i<vBlocksMain.size(); ++i) {
128 curTimeMax = std::max(curTimeMax, vBlocksMain[i].nTime);
129 BOOST_CHECK(curTimeMax == vBlocksMain[i].nTimeMax);
134 chain.
SetTip(&vBlocksMain.back());
137 for (
unsigned int i=0; i<10000; ++i) {
139 int r = InsecureRandRange(vBlocksMain.size());
140 int64_t test_time = vBlocksMain[r].nTime;
arith_uint256 UintToArith256(const uint256 &a)
uint256 ArithToUint256(const arith_uint256 &a)
const arith_uint256 ARITH_UINT256_ONE
The block chain is a tree shaped structure starting with the genesis block at the root,...
CBlockIndex * pprev
pointer to the index of the predecessor of this block
unsigned int nTimeMax
(memory only) Maximum nTime in the chain upto and including this block.
uint256 GetBlockHash() const
int nHeight
height of the entry in the chain. The genesis block has height 0
An in-memory indexed chain of blocks.
CBlockLocator GetLocator(const CBlockIndex *pindex=nullptr) const
Return a CBlockLocator that refers to a block in this chain (by default the tip).
void SetTip(CBlockIndex *pindex)
Set/initialize a chain with a given tip.
CBlockIndex * FindEarliestAtLeast(int64_t nTime) const
Find the earliest block with timestamp equal or greater than the given.
uint64_t GetLow64() const
BOOST_AUTO_TEST_SUITE_END()
#define BOOST_FIXTURE_TEST_SUITE(a, b)
#define BOOST_CHECK_EQUAL(v1, v2)
#define BOOST_CHECK(expr)
BOOST_AUTO_TEST_CASE(skiplist_test)
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
std::vector< uint256 > vHave