com.google.bitcoin.core
Class FullPrunedBlockChain

java.lang.Object
  extended by com.google.bitcoin.core.AbstractBlockChain
      extended by com.google.bitcoin.core.FullPrunedBlockChain

public class FullPrunedBlockChain
extends AbstractBlockChain

A FullPrunedBlockChain works in conjunction with a FullPrunedBlockStore to verify all the rules of the Bitcoin system, with the downside being a larg cost in system resources. Fully verifying means all unspent transaction outputs are stored. Once a transaction output is spent and that spend is buried deep enough, the data related to it is deleted to ensure disk space usage doesn't grow forever. For this reason a pruning node cannot serve the full block chain to other clients, but it nevertheless provides the same security guarantees as a regular Satoshi client does.


Nested Class Summary
 
Nested classes/interfaces inherited from class com.google.bitcoin.core.AbstractBlockChain
AbstractBlockChain.NewBlockType
 
Field Summary
protected  FullPrunedBlockStore blockStore
          Keeps a map of block hashes to StoredBlocks.
 
Fields inherited from class com.google.bitcoin.core.AbstractBlockChain
chainHead, FP_ESTIMATOR_ALPHA, FP_ESTIMATOR_BETA, lock, params
 
Constructor Summary
FullPrunedBlockChain(NetworkParameters params, FullPrunedBlockStore blockStore)
          Constructs a BlockChain that has no wallet at all.
FullPrunedBlockChain(NetworkParameters params, List<BlockChainListener> listeners, FullPrunedBlockStore blockStore)
          Constructs a BlockChain connected to the given list of wallets and a store.
FullPrunedBlockChain(NetworkParameters params, Wallet wallet, FullPrunedBlockStore blockStore)
          Constructs a BlockChain connected to the given wallet and store.
 
Method Summary
protected  StoredBlock addToBlockStore(StoredBlock storedPrev, Block block)
          Adds/updates the given Block with the block store.
protected  StoredBlock addToBlockStore(StoredBlock storedPrev, Block header, TransactionOutputChanges txOutChanges)
          Adds/updates the given StoredBlock with the block store.
protected  TransactionOutputChanges connectTransactions(int height, Block block)
          Connect each transaction in block.transactions, verifying them as we go and removing spent outputs If an error is encountered in a transaction, no changes should be made to the underlying BlockStore.
protected  TransactionOutputChanges connectTransactions(StoredBlock newBlock)
          Load newBlock from BlockStore and connect its transactions, returning changes to the set of unspent transactions.
protected  void disconnectTransactions(StoredBlock oldBlock)
          This is broken for blocks that do not pass BIP30, so all BIP30-failing blocks which are allowed to fail BIP30 must be checkpointed.
protected  void doSetChainHead(StoredBlock chainHead)
          Called before setting chain head in memory.
protected  StoredBlock getStoredBlockInCurrentScope(Sha256Hash hash)
          For a standard BlockChain, this should return blockStore.get(hash), for a FullPrunedBlockChain blockStore.getOnceUndoableStoredBlock(hash)
protected  void notSettingChainHead()
          Called if we (possibly) previously called disconnectTransaction/connectTransactions, but will not be calling preSetChainHead as a block failed verification.
 void setRunScripts(boolean value)
          Whether or not to run scripts whilst accepting blocks (i.e.
protected  boolean shouldVerifyTransactions()
          Whether or not we are maintaining a set of unspent outputs and are verifying all transactions.
 
Methods inherited from class com.google.bitcoin.core.AbstractBlockChain
add, add, addListener, addListener, addWallet, estimateBlockTime, getBestChainHeight, getBlockStore, getChainHead, getFalsePositiveRate, getHeightFuture, getOrphanRoot, isOrphan, removeListener, removeWallet, resetFalsePositiveEstimate, setChainHead, trackFilteredTransactions
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

blockStore

protected final FullPrunedBlockStore blockStore
Keeps a map of block hashes to StoredBlocks.

Constructor Detail

FullPrunedBlockChain

public FullPrunedBlockChain(NetworkParameters params,
                            Wallet wallet,
                            FullPrunedBlockStore blockStore)
                     throws BlockStoreException
Constructs a BlockChain connected to the given wallet and store. To obtain a Wallet you can construct one from scratch, or you can deserialize a saved wallet from disk using Wallet.loadFromFile(java.io.File)

Throws:
BlockStoreException

FullPrunedBlockChain

public FullPrunedBlockChain(NetworkParameters params,
                            FullPrunedBlockStore blockStore)
                     throws BlockStoreException
Constructs a BlockChain that has no wallet at all. This is helpful when you don't actually care about sending and receiving coins but rather, just want to explore the network data structures.

Throws:
BlockStoreException

FullPrunedBlockChain

public FullPrunedBlockChain(NetworkParameters params,
                            List<BlockChainListener> listeners,
                            FullPrunedBlockStore blockStore)
                     throws BlockStoreException
Constructs a BlockChain connected to the given list of wallets and a store.

Throws:
BlockStoreException
Method Detail

addToBlockStore

protected StoredBlock addToBlockStore(StoredBlock storedPrev,
                                      Block header,
                                      TransactionOutputChanges txOutChanges)
                               throws BlockStoreException,
                                      VerificationException
Description copied from class: AbstractBlockChain
Adds/updates the given StoredBlock with the block store. This version is used when the transactions have already been verified to properly spend txOutputChanges.

Specified by:
addToBlockStore in class AbstractBlockChain
Parameters:
storedPrev - The StoredBlock which immediately precedes block.
header - The StoredBlock to add/update.
txOutChanges - The total sum of all changes made by this block to the set of open transaction outputs (from a call to connectTransactions), if in fully verifying mode (null otherwise).
Returns:
the newly created StoredBlock
Throws:
BlockStoreException
VerificationException

addToBlockStore

protected StoredBlock addToBlockStore(StoredBlock storedPrev,
                                      Block block)
                               throws BlockStoreException,
                                      VerificationException
Description copied from class: AbstractBlockChain
Adds/updates the given Block with the block store. This version is used when the transactions have not been verified.

Specified by:
addToBlockStore in class AbstractBlockChain
Parameters:
storedPrev - The StoredBlock which immediately precedes block.
block - The Block to add/update.
Returns:
the newly created StoredBlock
Throws:
BlockStoreException
VerificationException

shouldVerifyTransactions

protected boolean shouldVerifyTransactions()
Description copied from class: AbstractBlockChain
Whether or not we are maintaining a set of unspent outputs and are verifying all transactions. Also indicates that all calls to add() should provide a block containing transactions

Specified by:
shouldVerifyTransactions in class AbstractBlockChain

setRunScripts

public void setRunScripts(boolean value)
Whether or not to run scripts whilst accepting blocks (i.e. checking signatures, for most transactions). If you're accepting data from an untrusted node, such as one found via the P2P network, this should be set to true (which is the default). If you're downloading a chain from a node you control, script execution is redundant because you know the connected node won't relay bad data to you. In that case it's safe to set this to false and obtain a significant speedup.


connectTransactions

protected TransactionOutputChanges connectTransactions(int height,
                                                       Block block)
                                                throws VerificationException,
                                                       BlockStoreException
Description copied from class: AbstractBlockChain
Connect each transaction in block.transactions, verifying them as we go and removing spent outputs If an error is encountered in a transaction, no changes should be made to the underlying BlockStore. and a VerificationException should be thrown. Only called if(shouldVerifyTransactions())

Specified by:
connectTransactions in class AbstractBlockChain
Returns:
The full set of all changes made to the set of open transaction outputs.
Throws:
VerificationException - if an attempt was made to spend an already-spent output, or if a transaction incorrectly solved an output script.
BlockStoreException - if the block store had an underlying error.

connectTransactions

protected TransactionOutputChanges connectTransactions(StoredBlock newBlock)
                                                throws VerificationException,
                                                       BlockStoreException,
                                                       PrunedException
Description copied from class: AbstractBlockChain
Load newBlock from BlockStore and connect its transactions, returning changes to the set of unspent transactions. If an error is encountered in a transaction, no changes should be made to the underlying BlockStore. Only called if(shouldVerifyTransactions())

Specified by:
connectTransactions in class AbstractBlockChain
Returns:
The full set of all changes made to the set of open transaction outputs.
Throws:
VerificationException - if an attempt was made to spend an already-spent output, or if a transaction incorrectly solved an output script.
BlockStoreException - if the block store had an underlying error or newBlock does not exist in the block store at all.
PrunedException - if newBlock does not exist as a StoredUndoableBlock in the block store.

disconnectTransactions

protected void disconnectTransactions(StoredBlock oldBlock)
                               throws PrunedException,
                                      BlockStoreException
This is broken for blocks that do not pass BIP30, so all BIP30-failing blocks which are allowed to fail BIP30 must be checkpointed.

Specified by:
disconnectTransactions in class AbstractBlockChain
Throws:
PrunedException - if block does not exist as a StoredUndoableBlock in the block store.
BlockStoreException - if the block store had an underlying error or block does not exist in the block store at all.

doSetChainHead

protected void doSetChainHead(StoredBlock chainHead)
                       throws BlockStoreException
Description copied from class: AbstractBlockChain
Called before setting chain head in memory. Should write the new head to block store and then commit any database transactions that were started by disconnectTransactions/connectTransactions.

Specified by:
doSetChainHead in class AbstractBlockChain
Throws:
BlockStoreException

notSettingChainHead

protected void notSettingChainHead()
                            throws BlockStoreException
Description copied from class: AbstractBlockChain
Called if we (possibly) previously called disconnectTransaction/connectTransactions, but will not be calling preSetChainHead as a block failed verification. Can be used to abort database transactions that were started by disconnectTransactions/connectTransactions.

Specified by:
notSettingChainHead in class AbstractBlockChain
Throws:
BlockStoreException

getStoredBlockInCurrentScope

protected StoredBlock getStoredBlockInCurrentScope(Sha256Hash hash)
                                            throws BlockStoreException
Description copied from class: AbstractBlockChain
For a standard BlockChain, this should return blockStore.get(hash), for a FullPrunedBlockChain blockStore.getOnceUndoableStoredBlock(hash)

Specified by:
getStoredBlockInCurrentScope in class AbstractBlockChain
Throws:
BlockStoreException


Copyright © 2014. All rights reserved.