]> Git Repo - VerusCoin.git/blame - src/checkpoints.cpp
Merge pull request #3211
[VerusCoin.git] / src / checkpoints.cpp
CommitLineData
db0e8ccd 1// Copyright (c) 2009-2013 The Bitcoin developers
eb5fff9e 2// Distributed under the MIT/X11 software license, see the accompanying
3a25a2b9 3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
eb5fff9e 4
eb5fff9e 5#include <boost/assign/list_of.hpp> // for 'map_list_of()'
10fd7f66
GA
6#include <boost/foreach.hpp>
7
10fd7f66 8#include "checkpoints.h"
eb5fff9e 9
ed6d0b5f
PW
10#include "main.h"
11#include "uint256.h"
12
eb5fff9e
GA
13namespace Checkpoints
14{
15 typedef std::map<int, uint256> MapCheckpoints;
16
9f2467ad 17 // How many times we expect transactions after the last checkpoint to
92a12998
PW
18 // be slower. This number is a compromise, as it can't be accurate for
19 // every system. When reindexing from a fast disk with a slow CPU, it
20 // can be up to 20, while when downloading from a slow network with a
21 // fast multicore CPU, it won't be much higher than 1.
22 static const double fSigcheckVerificationFactor = 5.0;
9f2467ad
PW
23
24 struct CCheckpointData {
25 const MapCheckpoints *mapCheckpoints;
26 int64 nTimeLastCheckpoint;
27 int64 nTransactionsLastCheckpoint;
28 double fTransactionsPerDay;
29 };
30
f0d8a52c
JG
31 bool fEnabled = true;
32
10fd7f66
GA
33 // What makes a good checkpoint block?
34 // + Is surrounded by blocks with reasonable timestamps
35 // (no blocks before with a timestamp after, none after with
36 // timestamp before)
37 // + Contains no strange transactions
eb5fff9e
GA
38 static MapCheckpoints mapCheckpoints =
39 boost::assign::map_list_of
40 ( 11111, uint256("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d"))
41 ( 33333, uint256("0x000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6"))
eb5fff9e
GA
42 ( 74000, uint256("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20"))
43 (105000, uint256("0x00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97"))
eb5fff9e 44 (134444, uint256("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe"))
8c12851e 45 (168000, uint256("0x000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763"))
80cfc3a4 46 (193000, uint256("0x000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317"))
5d32d3f8 47 (210000, uint256("0x000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e"))
a53465a6 48 (216116, uint256("0x00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e"))
f817c496 49 (225430, uint256("0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932"))
bb237705 50 (250000, uint256("0x000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214"))
eb5fff9e 51 ;
9f2467ad
PW
52 static const CCheckpointData data = {
53 &mapCheckpoints,
bb237705
GA
54 1375533383, // * UNIX timestamp of last checkpoint block
55 21491097, // * total number of transactions between genesis and last checkpoint
9f2467ad 56 // (the tx=... number in the SetBestChain debug.log lines)
92a12998 57 60000.0 // * estimated number of transactions per day after checkpoint
9f2467ad 58 };
eb5fff9e 59
0e4b3175 60 static MapCheckpoints mapCheckpointsTestnet =
c87c8cd1
GA
61 boost::assign::map_list_of
62 ( 546, uint256("000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70"))
63 ;
9f2467ad
PW
64 static const CCheckpointData dataTestnet = {
65 &mapCheckpointsTestnet,
66 1338180505,
67 16341,
68 300
69 };
70
d9ace8ab
MC
71 static MapCheckpoints mapCheckpointsRegtest =
72 boost::assign::map_list_of
73 ( 0, uint256("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"))
74 ;
75 static const CCheckpointData dataRegtest = {
76 &mapCheckpointsRegtest,
77 0,
78 0,
79 0
80 };
81
9f2467ad 82 const CCheckpointData &Checkpoints() {
d9ace8ab 83 if (Params().NetworkID() == CChainParams::TESTNET)
9f2467ad 84 return dataTestnet;
d9ace8ab 85 else if (Params().NetworkID() == CChainParams::MAIN)
9f2467ad 86 return data;
d9ace8ab
MC
87 else
88 return dataRegtest;
9f2467ad 89 }
c87c8cd1 90
eb5fff9e
GA
91 bool CheckBlock(int nHeight, const uint256& hash)
92 {
f0d8a52c 93 if (!fEnabled)
857b3ad9
JG
94 return true;
95
9f2467ad 96 const MapCheckpoints& checkpoints = *Checkpoints().mapCheckpoints;
eb5fff9e 97
c87c8cd1
GA
98 MapCheckpoints::const_iterator i = checkpoints.find(nHeight);
99 if (i == checkpoints.end()) return true;
eb5fff9e
GA
100 return hash == i->second;
101 }
102
9f2467ad
PW
103 // Guess how far we are in the verification process at the given block index
104 double GuessVerificationProgress(CBlockIndex *pindex) {
105 if (pindex==NULL)
106 return 0.0;
107
108 int64 nNow = time(NULL);
109
110 double fWorkBefore = 0.0; // Amount of work done before pindex
111 double fWorkAfter = 0.0; // Amount of work left after pindex (estimated)
112 // Work is defined as: 1.0 per transaction before the last checkoint, and
113 // fSigcheckVerificationFactor per transaction after.
114
115 const CCheckpointData &data = Checkpoints();
116
117 if (pindex->nChainTx <= data.nTransactionsLastCheckpoint) {
118 double nCheapBefore = pindex->nChainTx;
119 double nCheapAfter = data.nTransactionsLastCheckpoint - pindex->nChainTx;
120 double nExpensiveAfter = (nNow - data.nTimeLastCheckpoint)/86400.0*data.fTransactionsPerDay;
121 fWorkBefore = nCheapBefore;
122 fWorkAfter = nCheapAfter + nExpensiveAfter*fSigcheckVerificationFactor;
123 } else {
124 double nCheapBefore = data.nTransactionsLastCheckpoint;
125 double nExpensiveBefore = pindex->nChainTx - data.nTransactionsLastCheckpoint;
126 double nExpensiveAfter = (nNow - pindex->nTime)/86400.0*data.fTransactionsPerDay;
127 fWorkBefore = nCheapBefore + nExpensiveBefore*fSigcheckVerificationFactor;
128 fWorkAfter = nExpensiveAfter*fSigcheckVerificationFactor;
129 }
130
131 return fWorkBefore / (fWorkBefore + fWorkAfter);
132 }
133
eb5fff9e
GA
134 int GetTotalBlocksEstimate()
135 {
f0d8a52c 136 if (!fEnabled)
857b3ad9
JG
137 return 0;
138
9f2467ad 139 const MapCheckpoints& checkpoints = *Checkpoints().mapCheckpoints;
eb5fff9e 140
c87c8cd1 141 return checkpoints.rbegin()->first;
eb5fff9e 142 }
10fd7f66
GA
143
144 CBlockIndex* GetLastCheckpoint(const std::map<uint256, CBlockIndex*>& mapBlockIndex)
145 {
f0d8a52c 146 if (!fEnabled)
857b3ad9
JG
147 return NULL;
148
9f2467ad 149 const MapCheckpoints& checkpoints = *Checkpoints().mapCheckpoints;
10fd7f66 150
c87c8cd1 151 BOOST_REVERSE_FOREACH(const MapCheckpoints::value_type& i, checkpoints)
10fd7f66
GA
152 {
153 const uint256& hash = i.second;
154 std::map<uint256, CBlockIndex*>::const_iterator t = mapBlockIndex.find(hash);
155 if (t != mapBlockIndex.end())
156 return t->second;
157 }
158 return NULL;
159 }
eb5fff9e 160}
This page took 0.118073 seconds and 4 git commands to generate.