Master Core  v0.0.9 - 2abfd2849db8ba7a83957c64eb976b406713c123
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
checkpoints.cpp
Go to the documentation of this file.
1 // Copyright (c) 2009-2014 The Bitcoin developers
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include "checkpoints.h"
6 
7 #include "main.h"
8 #include "uint256.h"
9 
10 #include <stdint.h>
11 
12 #include <boost/assign/list_of.hpp> // for 'map_list_of()'
13 #include <boost/foreach.hpp>
14 
15 namespace Checkpoints
16 {
17  typedef std::map<int, uint256> MapCheckpoints;
18 
19  // How many times we expect transactions after the last checkpoint to
20  // be slower. This number is a compromise, as it can't be accurate for
21  // every system. When reindexing from a fast disk with a slow CPU, it
22  // can be up to 20, while when downloading from a slow network with a
23  // fast multicore CPU, it won't be much higher than 1.
24  static const double SIGCHECK_VERIFICATION_FACTOR = 5.0;
25 
26  struct CCheckpointData {
27  const MapCheckpoints *mapCheckpoints;
31  };
32 
33  bool fEnabled = true;
34 
35  // What makes a good checkpoint block?
36  // + Is surrounded by blocks with reasonable timestamps
37  // (no blocks before with a timestamp after, none after with
38  // timestamp before)
39  // + Contains no strange transactions
40  static MapCheckpoints mapCheckpoints =
41  boost::assign::map_list_of
42  ( 11111, uint256("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d"))
43  ( 33333, uint256("0x000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6"))
44  ( 74000, uint256("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20"))
45  (105000, uint256("0x00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97"))
46  (134444, uint256("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe"))
47  (168000, uint256("0x000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763"))
48  (193000, uint256("0x000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317"))
49  (210000, uint256("0x000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e"))
50  (216116, uint256("0x00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e"))
51  (225430, uint256("0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932"))
52  (250000, uint256("0x000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214"))
53  (279000, uint256("0x0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40"))
54  (295000, uint256("0x00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983"))
55  ;
56  static const CCheckpointData data = {
58  1397080064, // * UNIX timestamp of last checkpoint block
59  36544669, // * total number of transactions between genesis and last checkpoint
60  // (the tx=... number in the SetBestChain debug.log lines)
61  60000.0 // * estimated number of transactions per day after checkpoint
62  };
63 
64  static MapCheckpoints mapCheckpointsTestnet =
65  boost::assign::map_list_of
66  ( 546, uint256("000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70"))
67  ;
68  static const CCheckpointData dataTestnet = {
70  1338180505,
71  16341,
72  300
73  };
74 
75  static MapCheckpoints mapCheckpointsRegtest =
76  boost::assign::map_list_of
77  ( 0, uint256("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"))
78  ;
79  static const CCheckpointData dataRegtest = {
81  0,
82  0,
83  0
84  };
85 
87  if (Params().NetworkID() == CChainParams::TESTNET)
88  return dataTestnet;
89  else if (Params().NetworkID() == CChainParams::MAIN)
90  return data;
91  else
92  return dataRegtest;
93  }
94 
95  bool CheckBlock(int nHeight, const uint256& hash)
96  {
97  if (!fEnabled)
98  return true;
99 
100  const MapCheckpoints& checkpoints = *Checkpoints().mapCheckpoints;
101 
102  MapCheckpoints::const_iterator i = checkpoints.find(nHeight);
103  if (i == checkpoints.end()) return true;
104  return hash == i->second;
105  }
106 
107  // Guess how far we are in the verification process at the given block index
108  double GuessVerificationProgress(CBlockIndex *pindex, bool fSigchecks) {
109  if (pindex==NULL)
110  return 0.0;
111 
112  int64_t nNow = time(NULL);
113 
114  double fSigcheckVerificationFactor = fSigchecks ? SIGCHECK_VERIFICATION_FACTOR : 1.0;
115  double fWorkBefore = 0.0; // Amount of work done before pindex
116  double fWorkAfter = 0.0; // Amount of work left after pindex (estimated)
117  // Work is defined as: 1.0 per transaction before the last checkpoint, and
118  // fSigcheckVerificationFactor per transaction after.
119 
120  const CCheckpointData &data = Checkpoints();
121 
122  if (pindex->nChainTx <= data.nTransactionsLastCheckpoint) {
123  double nCheapBefore = pindex->nChainTx;
124  double nCheapAfter = data.nTransactionsLastCheckpoint - pindex->nChainTx;
125  double nExpensiveAfter = (nNow - data.nTimeLastCheckpoint)/86400.0*data.fTransactionsPerDay;
126  fWorkBefore = nCheapBefore;
127  fWorkAfter = nCheapAfter + nExpensiveAfter*fSigcheckVerificationFactor;
128  } else {
129  double nCheapBefore = data.nTransactionsLastCheckpoint;
130  double nExpensiveBefore = pindex->nChainTx - data.nTransactionsLastCheckpoint;
131  double nExpensiveAfter = (nNow - pindex->nTime)/86400.0*data.fTransactionsPerDay;
132  fWorkBefore = nCheapBefore + nExpensiveBefore*fSigcheckVerificationFactor;
133  fWorkAfter = nExpensiveAfter*fSigcheckVerificationFactor;
134  }
135 
136  return fWorkBefore / (fWorkBefore + fWorkAfter);
137  }
138 
140  {
141  if (!fEnabled)
142  return 0;
143 
144  const MapCheckpoints& checkpoints = *Checkpoints().mapCheckpoints;
145 
146  return checkpoints.rbegin()->first;
147  }
148 
149  CBlockIndex* GetLastCheckpoint(const std::map<uint256, CBlockIndex*>& mapBlockIndex)
150  {
151  if (!fEnabled)
152  return NULL;
153 
154  const MapCheckpoints& checkpoints = *Checkpoints().mapCheckpoints;
155 
156  BOOST_REVERSE_FOREACH(const MapCheckpoints::value_type& i, checkpoints)
157  {
158  const uint256& hash = i.second;
159  std::map<uint256, CBlockIndex*>::const_iterator t = mapBlockIndex.find(hash);
160  if (t != mapBlockIndex.end())
161  return t->second;
162  }
163  return NULL;
164  }
165 }
static MapCheckpoints mapCheckpointsTestnet
Definition: checkpoints.cpp:64
CBlockIndex * GetLastCheckpoint(const std::map< uint256, CBlockIndex * > &mapBlockIndex)
std::map< int, uint256 > MapCheckpoints
Definition: checkpoints.cpp:17
const MapCheckpoints * mapCheckpoints
Definition: checkpoints.cpp:27
unsigned int nChainTx
Definition: main.h:717
static const CCheckpointData dataTestnet
Definition: checkpoints.cpp:68
static MapCheckpoints mapCheckpointsRegtest
Definition: checkpoints.cpp:75
Block-chain checkpoints are compiled-in sanity checks.
Definition: checkpoints.cpp:15
unsigned int nTime
Definition: main.h:725
const CCheckpointData & Checkpoints()
Definition: checkpoints.cpp:86
int GetTotalBlocksEstimate()
static const CCheckpointData dataRegtest
Definition: checkpoints.cpp:79
bool CheckBlock(int nHeight, const uint256 &hash)
Definition: checkpoints.cpp:95
double GuessVerificationProgress(CBlockIndex *pindex, bool fSigchecks)
256-bit unsigned integer
Definition: uint256.h:531
static const double SIGCHECK_VERIFICATION_FACTOR
Definition: checkpoints.cpp:24
The block chain is a tree shaped structure starting with the genesis block at the root...
Definition: main.h:688
const CChainParams & Params()
Return the currently selected parameters.
static MapCheckpoints mapCheckpoints
Definition: checkpoints.cpp:40
static const CCheckpointData data
Definition: checkpoints.cpp:56
map< uint256, CBlockIndex * > mapBlockIndex
Definition: main.cpp:47