Class CheckpointManager
- java.lang.Object
 - 
- org.bitcoinj.core.CheckpointManager
 
 
- 
public class CheckpointManager extends java.lang.ObjectVends hard-coded
StoredBlocks for blocks throughout the chain. Checkpoints serve two purposes:- They act as a safety mechanism against huge re-orgs that could rewrite large chunks of history, thus constraining the block chain to be a consensus mechanism only for recent parts of the timeline.
 - They allow synchronization to the head of the chain for new wallets/users much faster than syncing all headers from the genesis block.
 
Checkpoints are used by the SPV
BlockChainto initialize freshSPVBlockStores. They are not used by fully validating mode, which instead has a different concept of checkpoints that are used to hard-code the validity of blocks that violate BIP30 (duplicate coinbase transactions). Those "checkpoints" can be found in NetworkParameters.The file format consists of the string "CHECKPOINTS 1", followed by a uint32 containing the number of signatures to read. The value may not be larger than 256 (so it could have been a byte but isn't for historical reasons). If the number of signatures is larger than zero, each 65 byte ECDSA secp256k1 signature then follows. The signatures sign the hash of all bytes that follow the last signature.
After the signatures come an int32 containing the number of checkpoints in the file. Then each checkpoint follows one after the other. A checkpoint is 12 bytes for the total work done field, 4 bytes for the height, 80 bytes for the block header and then 1 zero byte at the end (i.e. number of transactions in the block: always zero).
 
- 
- 
Field Summary
Fields Modifier and Type Field Description static com.google.common.io.BaseEncodingBASE64protected java.util.TreeMap<java.lang.Long,StoredBlock>checkpointsprotected Sha256HashdataHashprotected NetworkParametersparams 
- 
Constructor Summary
Constructors Constructor Description CheckpointManager(Context context)Loads the default checkpoints bundled with bitcoinjCheckpointManager(NetworkParameters params, java.io.InputStream inputStream)Loads the checkpoints from the given stream 
- 
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static voidcheckpoint(NetworkParameters params, java.io.InputStream checkpoints, BlockStore store, long timeSecs)Convenience method that creates a CheckpointManager, loads the given data, gets the checkpoint for the given time, then inserts it into the store and sets that to be the chain head.StoredBlockgetCheckpointBefore(long timeSecs)Returns aStoredBlockrepresenting the last checkpoint before the given time, for example, normally you would want to know the checkpoint before the earliest wallet birthday.Sha256HashgetDataHash()Returns a hash of the concatenated checkpoint data.intnumCheckpoints()Returns the number of checkpoints that were loaded.static java.io.InputStreamopenStream(NetworkParameters params)Returns a checkpoints stream pointing to inside the bitcoinj JAR 
 - 
 
- 
- 
Field Detail
- 
checkpoints
protected final java.util.TreeMap<java.lang.Long,StoredBlock> checkpoints
 
- 
params
protected final NetworkParameters params
 
- 
dataHash
protected final Sha256Hash dataHash
 
- 
BASE64
public static final com.google.common.io.BaseEncoding BASE64
 
 - 
 
- 
Constructor Detail
- 
CheckpointManager
public CheckpointManager(Context context) throws java.io.IOException
Loads the default checkpoints bundled with bitcoinj- Throws:
 java.io.IOException
 
- 
CheckpointManager
public CheckpointManager(NetworkParameters params, @Nullable java.io.InputStream inputStream) throws java.io.IOException
Loads the checkpoints from the given stream- Throws:
 java.io.IOException
 
 - 
 
- 
Method Detail
- 
openStream
public static java.io.InputStream openStream(NetworkParameters params)
Returns a checkpoints stream pointing to inside the bitcoinj JAR 
- 
getCheckpointBefore
public StoredBlock getCheckpointBefore(long timeSecs)
Returns aStoredBlockrepresenting the last checkpoint before the given time, for example, normally you would want to know the checkpoint before the earliest wallet birthday. 
- 
numCheckpoints
public int numCheckpoints()
Returns the number of checkpoints that were loaded. 
- 
getDataHash
public Sha256Hash getDataHash()
Returns a hash of the concatenated checkpoint data. 
- 
checkpoint
public static void checkpoint(NetworkParameters params, java.io.InputStream checkpoints, BlockStore store, long timeSecs) throws java.io.IOException, BlockStoreException
Convenience method that creates a CheckpointManager, loads the given data, gets the checkpoint for the given time, then inserts it into the store and sets that to be the chain head. Useful when you have just created a new store from scratch and want to use configure it all in one go.
Note that timeSecs is adjusted backwards by a week to account for possible clock drift in the block headers.
- Throws:
 java.io.IOExceptionBlockStoreException
 
 - 
 
 -