Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F10907552
checkpoints.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
6 KB
Subscribers
None
checkpoints.cpp
View Options
// Copyright (c) 2009-2014 The Bitcoin developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include
"checkpoints.h"
#include
"main.h"
#include
"uint256.h"
#include
<stdint.h>
#include
<boost/assign/list_of.hpp>
// for 'map_list_of()'
#include
<boost/foreach.hpp>
namespace
Checkpoints
{
typedef
std
::
map
<
int
,
uint256
>
MapCheckpoints
;
// How many times we expect transactions after the last checkpoint to
// be slower. This number is a compromise, as it can't be accurate for
// every system. When reindexing from a fast disk with a slow CPU, it
// can be up to 20, while when downloading from a slow network with a
// fast multicore CPU, it won't be much higher than 1.
static
const
double
SIGCHECK_VERIFICATION_FACTOR
=
5.0
;
struct
CCheckpointData
{
const
MapCheckpoints
*
mapCheckpoints
;
int64_t
nTimeLastCheckpoint
;
int64_t
nTransactionsLastCheckpoint
;
double
fTransactionsPerDay
;
};
bool
fEnabled
=
true
;
// What makes a good checkpoint block?
// + Is surrounded by blocks with reasonable timestamps
// (no blocks before with a timestamp after, none after with
// timestamp before)
// + Contains no strange transactions
static
MapCheckpoints
mapCheckpoints
=
boost
::
assign
::
map_list_of
(
11111
,
uint256
(
"0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d"
))
(
33333
,
uint256
(
"0x000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6"
))
(
74000
,
uint256
(
"0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20"
))
(
105000
,
uint256
(
"0x00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97"
))
(
134444
,
uint256
(
"0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe"
))
(
168000
,
uint256
(
"0x000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763"
))
(
193000
,
uint256
(
"0x000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317"
))
(
210000
,
uint256
(
"0x000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e"
))
(
216116
,
uint256
(
"0x00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e"
))
(
225430
,
uint256
(
"0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932"
))
(
250000
,
uint256
(
"0x000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214"
))
(
279000
,
uint256
(
"0x0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40"
))
;
static
const
CCheckpointData
data
=
{
&
mapCheckpoints
,
1389047471
,
// * UNIX timestamp of last checkpoint block
30549816
,
// * total number of transactions between genesis and last checkpoint
// (the tx=... number in the SetBestChain debug.log lines)
60000.0
// * estimated number of transactions per day after checkpoint
};
static
MapCheckpoints
mapCheckpointsTestnet
=
boost
::
assign
::
map_list_of
(
546
,
uint256
(
"000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70"
))
;
static
const
CCheckpointData
dataTestnet
=
{
&
mapCheckpointsTestnet
,
1338180505
,
16341
,
300
};
static
MapCheckpoints
mapCheckpointsRegtest
=
boost
::
assign
::
map_list_of
(
0
,
uint256
(
"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"
))
;
static
const
CCheckpointData
dataRegtest
=
{
&
mapCheckpointsRegtest
,
0
,
0
,
0
};
const
CCheckpointData
&
Checkpoints
()
{
if
(
Params
().
NetworkID
()
==
CChainParams
::
TESTNET
)
return
dataTestnet
;
else
if
(
Params
().
NetworkID
()
==
CChainParams
::
MAIN
)
return
data
;
else
return
dataRegtest
;
}
bool
CheckBlock
(
int
nHeight
,
const
uint256
&
hash
)
{
if
(
!
fEnabled
)
return
true
;
const
MapCheckpoints
&
checkpoints
=
*
Checkpoints
().
mapCheckpoints
;
MapCheckpoints
::
const_iterator
i
=
checkpoints
.
find
(
nHeight
);
if
(
i
==
checkpoints
.
end
())
return
true
;
return
hash
==
i
->
second
;
}
// Guess how far we are in the verification process at the given block index
double
GuessVerificationProgress
(
CBlockIndex
*
pindex
,
bool
fSigchecks
)
{
if
(
pindex
==
NULL
)
return
0.0
;
int64_t
nNow
=
time
(
NULL
);
double
fSigcheckVerificationFactor
=
fSigchecks
?
SIGCHECK_VERIFICATION_FACTOR
:
1.0
;
double
fWorkBefore
=
0.0
;
// Amount of work done before pindex
double
fWorkAfter
=
0.0
;
// Amount of work left after pindex (estimated)
// Work is defined as: 1.0 per transaction before the last checkpoint, and
// fSigcheckVerificationFactor per transaction after.
const
CCheckpointData
&
data
=
Checkpoints
();
if
(
pindex
->
nChainTx
<=
data
.
nTransactionsLastCheckpoint
)
{
double
nCheapBefore
=
pindex
->
nChainTx
;
double
nCheapAfter
=
data
.
nTransactionsLastCheckpoint
-
pindex
->
nChainTx
;
double
nExpensiveAfter
=
(
nNow
-
data
.
nTimeLastCheckpoint
)
/
86400.0
*
data
.
fTransactionsPerDay
;
fWorkBefore
=
nCheapBefore
;
fWorkAfter
=
nCheapAfter
+
nExpensiveAfter
*
fSigcheckVerificationFactor
;
}
else
{
double
nCheapBefore
=
data
.
nTransactionsLastCheckpoint
;
double
nExpensiveBefore
=
pindex
->
nChainTx
-
data
.
nTransactionsLastCheckpoint
;
double
nExpensiveAfter
=
(
nNow
-
pindex
->
nTime
)
/
86400.0
*
data
.
fTransactionsPerDay
;
fWorkBefore
=
nCheapBefore
+
nExpensiveBefore
*
fSigcheckVerificationFactor
;
fWorkAfter
=
nExpensiveAfter
*
fSigcheckVerificationFactor
;
}
return
fWorkBefore
/
(
fWorkBefore
+
fWorkAfter
);
}
int
GetTotalBlocksEstimate
()
{
if
(
!
fEnabled
)
return
0
;
const
MapCheckpoints
&
checkpoints
=
*
Checkpoints
().
mapCheckpoints
;
return
checkpoints
.
rbegin
()
->
first
;
}
CBlockIndex
*
GetLastCheckpoint
(
const
std
::
map
<
uint256
,
CBlockIndex
*>&
mapBlockIndex
)
{
if
(
!
fEnabled
)
return
NULL
;
const
MapCheckpoints
&
checkpoints
=
*
Checkpoints
().
mapCheckpoints
;
BOOST_REVERSE_FOREACH
(
const
MapCheckpoints
::
value_type
&
i
,
checkpoints
)
{
const
uint256
&
hash
=
i
.
second
;
std
::
map
<
uint256
,
CBlockIndex
*>::
const_iterator
t
=
mapBlockIndex
.
find
(
hash
);
if
(
t
!=
mapBlockIndex
.
end
())
return
t
->
second
;
}
return
NULL
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-c++
Expires
Mon, Nov 25, 08:03 (1 d, 17 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4520712
Default Alt Text
checkpoints.cpp (6 KB)
Attached To
rSTAGING Bitcoin ABC staging
Event Timeline
Log In to Comment