Class DatabaseFullPrunedBlockStore
- All Implemented Interfaces:
UTXOProvider
,BlockStore
,FullPrunedBlockStore
- Direct Known Subclasses:
H2FullPrunedBlockStore
,MySQLFullPrunedBlockStore
,PostgresFullPrunedBlockStore
A generic full pruned block store for a relational database. This generic class requires certain table structures for the block store.
The following are the tables and field names/types that are assumed:
Field Name | Type (generic) |
---|---|
name | string |
value | binary |
Field Name | Type (generic) |
---|---|
hash | binary |
chainwork | binary |
height | integer |
header | binary |
wasundoable | boolean |
Field Name | Type (generic) |
---|---|
hash | binary |
height | integer |
txoutchanges | binary |
transactions | binary |
Field Name | Type (generic) |
---|---|
hash | binary |
index | integer |
height | integer |
value | integer |
scriptbytes | binary |
toaddress | string |
addresstargetable | integer |
coinbase | boolean |
-
Field Summary
Modifier and TypeFieldDescriptionprotected List<Connection>
protected StoredBlock
protected Sha256Hash
protected ThreadLocal<Connection>
protected String
protected int
protected NetworkParameters
protected String
protected String
protected String
protected StoredBlock
protected Sha256Hash
-
Constructor Summary
ConstructorDescriptionDatabaseFullPrunedBlockStore
(NetworkParameters params, String connectionURL, int fullStoreDepth, String username, String password, String schemaName) Create a new DatabaseFullPrunedBlockStore, using the full connection URL instead of a hostname and password, and optionally allowing a schema to be specified. -
Method Summary
Modifier and TypeMethodDescriptionvoid
void
Adds aUTXO
to the list of unspent TransactionOutputsvoid
Begins/Commits/Aborts a database transaction.calculateBalanceForAddress
(Address address) Calculate the balance for a coinbase, to-address, or p2sh address.void
close()
Closes the store.void
void
Deletes the store by deleting the tables within the database.void
Dumps information about the size of actual data in the database to standard output The only truly useless data counted is printed in the form "N in id indexes" This does not take database indexes into account.get
(Sha256Hash hash) Returns the StoredBlock given a hash.get
(Sha256Hash hash, boolean wasUndoableOnly) protected String
Get the SQL to select the total balance for a given address.Returns theStoredBlock
that represents the top of the chain of greatest total work.int
Get the height of the chain head.Get the SQL statements to check if the database is compatible.Get the SQL statements that create the indexes (DDL).Get the SQL statements that create the schema (DDL).Get the SQL statements that create the tables (DDL).protected abstract String
Get the database driver class,protected String
Get the SQL to delete a openoutputs record.protected String
Get the SQL to delete a undoableblocks record.Get the SQL to drop all the tables (DDL).protected abstract String
Get the database specific error code that indicated a duplicate key error when inserting a record.protected String
Get the SQL to insert a headers record.protected String
Get the SQL to insert a openoutputs record.protected String
Get the SQL to insert a settings record.protected String
Get the SQL to insert a undoableblocks record.Returns the StoredBlock that was added as a StoredUndoableBlock given a hash.getOpenTransactionOutputs
(List<ECKey> keys) Get the list ofUTXO
's for given keys.Get theNetworkParameters
of this store.protected String
Get the SQL to select the headers dump fields for sizing/statistics.protected String
Get the SQL to select a headers record.protected String
Get the SQL to select count of openoutputs.protected String
Get the SQL to select the openoutouts dump fields for sizing/statistics.protected String
Get the SQL to select a openoutputs record.protected String
Get the SQL to select the setting dump fields for sizing/statistics.protected String
Get the SQL to select a setting value.protected String
Get the SQL to select the undoableblocks dump fields for sizing/statistics.protected String
Get the SQL to select an undoableblocks record.protected String
Get the SQL statement that checks if tables exist.getTransactionOutput
(Sha256Hash hash, long index) Gets aUTXO
with the given hash and index, or null if none is foundprotected String
Get the SQL to select the transaction outputs for a given address.getUndoBlock
(Sha256Hash hash) Returns aStoredUndoableBlock
whose block.getHash() method will be equal to the parameter.protected String
Get the SQL to update a headers record.protected String
Get the SQL to update a setting value.protected String
Get the SQL to update a undoableblocks record.Returns theStoredBlock
that represents the top of the chain of greatest total work that has been fully verified and the point in the chain at which the unspent transaction output set in this store represents.boolean
hasUnspentOutputs
(Sha256Hash hash, int numOutputs) True if this store has any unspent outputs from a transaction with a hash equal to the first parameterprotected final void
If there isn't a connection on theThreadLocal
then create and store it.void
put
(StoredBlock storedBlock) Saves the given block header+extra data.void
put
(StoredBlock storedBlock, StoredUndoableBlock undoableBlock) Saves the givenStoredUndoableBlock
andStoredBlock
.protected void
putUpdateStoredBlock
(StoredBlock storedBlock, boolean wasUndoable) void
Removes aUTXO
from the list of unspent TransactionOutputs Note that the coinbase of the genesis block should NEVER be spendable and thus never in the list.void
Resets the store by deleting the contents of the tables and reinitialising them.void
setChainHead
(StoredBlock chainHead) Sets theStoredBlock
that represents the top of the chain of greatest total work.void
setVerifiedChainHead
(StoredBlock chainHead) Sets theStoredBlock
that represents the top of the chain of greatest total work that has been fully verified.
-
Field Details
-
chainHeadHash
-
chainHeadBlock
-
verifiedChainHeadHash
-
verifiedChainHeadBlock
-
params
-
conn
-
allConnections
-
connectionURL
-
fullStoreDepth
protected int fullStoreDepth -
username
-
password
-
schemaName
-
-
Constructor Details
-
DatabaseFullPrunedBlockStore
public DatabaseFullPrunedBlockStore(NetworkParameters params, String connectionURL, int fullStoreDepth, @Nullable String username, @Nullable String password, @Nullable String schemaName) throws BlockStoreException Create a new DatabaseFullPrunedBlockStore, using the full connection URL instead of a hostname and password, and optionally allowing a schema to be specified.
- Parameters:
params
- A copy of the NetworkParameters used.connectionURL
- The jdbc url to connect to the database.fullStoreDepth
- The number of blocks of history stored in full (something like 1000 is pretty safe).username
- The database username.password
- The password to the database.schemaName
- The name of the schema to put the tables in. May be null if no schema is being used.- Throws:
BlockStoreException
- If there is a failure to connect and/or initialise the database.
-
-
Method Details
-
getDatabaseDriverClass
Get the database driver class,i.e org.postgresql.Driver.
- Returns:
- The fully qualified database driver class.
-
getCreateSchemeSQL
Get the SQL statements that create the schema (DDL).- Returns:
- The list of SQL statements.
-
getCreateTablesSQL
Get the SQL statements that create the tables (DDL).- Returns:
- The list of SQL statements.
-
getCreateIndexesSQL
Get the SQL statements that create the indexes (DDL).- Returns:
- The list of SQL statements.
-
getDuplicateKeyErrorCode
Get the database specific error code that indicated a duplicate key error when inserting a record.This is the code returned by
SQLException.getSQLState()
- Returns:
- The database duplicate error code.
-
getBalanceSelectSQL
Get the SQL to select the total balance for a given address.- Returns:
- The SQL prepared statement.
-
getTablesExistSQL
Get the SQL statement that checks if tables exist.- Returns:
- The SQL prepared statement.
-
getCompatibilitySQL
Get the SQL statements to check if the database is compatible.- Returns:
- The SQL prepared statements.
-
getTransactionOutputSelectSQL
Get the SQL to select the transaction outputs for a given address.- Returns:
- The SQL prepared statement.
-
getDropTablesSQL
Get the SQL to drop all the tables (DDL).- Returns:
- The SQL drop statements.
-
getSelectSettingsSQL
Get the SQL to select a setting value.- Returns:
- The SQL select statement.
-
getInsertSettingsSQL
Get the SQL to insert a settings record.- Returns:
- The SQL insert statement.
-
getUpdateSettingsSLQ
Get the SQL to update a setting value.- Returns:
- The SQL update statement.
-
getSelectHeadersSQL
Get the SQL to select a headers record.- Returns:
- The SQL select statement.
-
getInsertHeadersSQL
Get the SQL to insert a headers record.- Returns:
- The SQL insert statement.
-
getUpdateHeadersSQL
Get the SQL to update a headers record.- Returns:
- The SQL update statement.
-
getSelectUndoableBlocksSQL
Get the SQL to select an undoableblocks record.- Returns:
- The SQL select statement.
-
getInsertUndoableBlocksSQL
Get the SQL to insert a undoableblocks record.- Returns:
- The SQL insert statement.
-
getUpdateUndoableBlocksSQL
Get the SQL to update a undoableblocks record.- Returns:
- The SQL update statement.
-
getDeleteUndoableBlocksSQL
Get the SQL to delete a undoableblocks record.- Returns:
- The SQL delete statement.
-
getSelectOpenoutputsSQL
Get the SQL to select a openoutputs record.- Returns:
- The SQL select statement.
-
getSelectOpenoutputsCountSQL
Get the SQL to select count of openoutputs.- Returns:
- The SQL select statement.
-
getInsertOpenoutputsSQL
Get the SQL to insert a openoutputs record.- Returns:
- The SQL insert statement.
-
getDeleteOpenoutputsSQL
Get the SQL to delete a openoutputs record.- Returns:
- The SQL delete statement.
-
getSelectSettingsDumpSQL
Get the SQL to select the setting dump fields for sizing/statistics.- Returns:
- The SQL select statement.
-
getSelectHeadersDumpSQL
Get the SQL to select the headers dump fields for sizing/statistics.- Returns:
- The SQL select statement.
-
getSelectUndoableblocksDumpSQL
Get the SQL to select the undoableblocks dump fields for sizing/statistics.- Returns:
- The SQL select statement.
-
getSelectopenoutputsDumpSQL
Get the SQL to select the openoutouts dump fields for sizing/statistics.- Returns:
- The SQL select statement.
-
maybeConnect
If there isn't a connection on the
ThreadLocal
then create and store it.This will also automatically set up the schema if it does not exist within the DB.
- Throws:
BlockStoreException
- if successful connection to the DB couldn't be made.
-
close
public void close()Description copied from interface:BlockStore
Closes the store.- Specified by:
close
in interfaceBlockStore
-
putUpdateStoredBlock
protected void putUpdateStoredBlock(StoredBlock storedBlock, boolean wasUndoable) throws SQLException - Throws:
SQLException
-
put
Description copied from interface:BlockStore
Saves the given block header+extra data. The key isn't specified explicitly as it can be calculated from the StoredBlock directly. Can throw if there is a problem with the underlying storage layer such as running out of disk space.- Specified by:
put
in interfaceBlockStore
- Throws:
BlockStoreException
-
put
public void put(StoredBlock storedBlock, StoredUndoableBlock undoableBlock) throws BlockStoreException Description copied from interface:FullPrunedBlockStore
Saves the given
StoredUndoableBlock
andStoredBlock
. Calculates keys from theStoredBlock
Though not required for proper function of a FullPrunedBlockStore, any user of a FullPrunedBlockStore should ensure that a StoredUndoableBlock for each block up to the fully verified chain head has been added to this block store using this function (not put(StoredBlock)), so that the ability to perform reorgs is maintained.
- Specified by:
put
in interfaceFullPrunedBlockStore
- Throws:
BlockStoreException
- if there is a problem with the underlying storage layer, such as running out of disk space.
-
get
- Throws:
BlockStoreException
-
get
Description copied from interface:BlockStore
Returns the StoredBlock given a hash. The returned values block.getHash() method will be equal to the parameter. If no such block is found, returns null.- Specified by:
get
in interfaceBlockStore
- Throws:
BlockStoreException
-
getOnceUndoableStoredBlock
Description copied from interface:FullPrunedBlockStore
Returns the StoredBlock that was added as a StoredUndoableBlock given a hash. The returned values block.getHash() method will be equal to the parameter. If no such block is found, returns null.- Specified by:
getOnceUndoableStoredBlock
in interfaceFullPrunedBlockStore
- Throws:
BlockStoreException
-
getUndoBlock
Description copied from interface:FullPrunedBlockStore
Returns aStoredUndoableBlock
whose block.getHash() method will be equal to the parameter. If no such block is found, returns null. Note that this may return null more often than get(Sha256Hash hash) as not allStoredBlock
s have aStoredUndoableBlock
copy stored as well.- Specified by:
getUndoBlock
in interfaceFullPrunedBlockStore
- Throws:
BlockStoreException
-
getChainHead
Description copied from interface:BlockStore
Returns theStoredBlock
that represents the top of the chain of greatest total work. Note that this can be arbitrarily expensive, you probably should useAbstractBlockChain.getChainHead()
or perhapsAbstractBlockChain.getBestChainHeight()
which will run in constant time and not take any heavyweight locks.- Specified by:
getChainHead
in interfaceBlockStore
- Throws:
BlockStoreException
-
setChainHead
Description copied from interface:BlockStore
Sets theStoredBlock
that represents the top of the chain of greatest total work.- Specified by:
setChainHead
in interfaceBlockStore
- Throws:
BlockStoreException
-
getVerifiedChainHead
Description copied from interface:FullPrunedBlockStore
Returns theStoredBlock
that represents the top of the chain of greatest total work that has been fully verified and the point in the chain at which the unspent transaction output set in this store represents.- Specified by:
getVerifiedChainHead
in interfaceFullPrunedBlockStore
- Throws:
BlockStoreException
-
setVerifiedChainHead
Description copied from interface:FullPrunedBlockStore
Sets theStoredBlock
that represents the top of the chain of greatest total work that has been fully verified. It should generally be set after a batch of updates to the transaction unspent output set, before a call to commitDatabaseBatchWrite. If chainHead has a greater height than the non-verified chain head (ie that set withBlockStore.setChainHead(org.bitcoinj.core.StoredBlock)
) the non-verified chain head should be set to the one set here. In this way a class using a FullPrunedBlockStore only in full-verification mode can ignore the regularBlockStore
functions implemented as a part of a FullPrunedBlockStore.- Specified by:
setVerifiedChainHead
in interfaceFullPrunedBlockStore
- Throws:
BlockStoreException
-
getTransactionOutput
Description copied from interface:FullPrunedBlockStore
Gets aUTXO
with the given hash and index, or null if none is found- Specified by:
getTransactionOutput
in interfaceFullPrunedBlockStore
- Throws:
BlockStoreException
-
addUnspentTransactionOutput
Description copied from interface:FullPrunedBlockStore
Adds aUTXO
to the list of unspent TransactionOutputs- Specified by:
addUnspentTransactionOutput
in interfaceFullPrunedBlockStore
- Throws:
BlockStoreException
-
removeUnspentTransactionOutput
Description copied from interface:FullPrunedBlockStore
Removes aUTXO
from the list of unspent TransactionOutputs Note that the coinbase of the genesis block should NEVER be spendable and thus never in the list.- Specified by:
removeUnspentTransactionOutput
in interfaceFullPrunedBlockStore
- Throws:
BlockStoreException
- if there is an underlying storage issue, or out was not in the list.
-
beginDatabaseBatchWrite
Description copied from interface:FullPrunedBlockStore
Begins/Commits/Aborts a database transaction.
If abortDatabaseBatchWrite() is called by the same thread that called beginDatabaseBatchWrite(), any data writes between this call and abortDatabaseBatchWrite() made by the same thread should be discarded.
Furthermore, any data written after a call to beginDatabaseBatchWrite() should not be readable by any other threads until commitDatabaseBatchWrite() has been called by this thread. Multiple calls to beginDatabaseBatchWrite() in any given thread should be ignored and treated as one call.
- Specified by:
beginDatabaseBatchWrite
in interfaceFullPrunedBlockStore
- Throws:
BlockStoreException
-
commitDatabaseBatchWrite
- Specified by:
commitDatabaseBatchWrite
in interfaceFullPrunedBlockStore
- Throws:
BlockStoreException
-
abortDatabaseBatchWrite
- Specified by:
abortDatabaseBatchWrite
in interfaceFullPrunedBlockStore
- Throws:
BlockStoreException
-
hasUnspentOutputs
Description copied from interface:FullPrunedBlockStore
True if this store has any unspent outputs from a transaction with a hash equal to the first parameter- Specified by:
hasUnspentOutputs
in interfaceFullPrunedBlockStore
numOutputs
- the number of outputs the given transaction has- Throws:
BlockStoreException
-
getParams
Description copied from interface:BlockStore
Get theNetworkParameters
of this store.- Specified by:
getParams
in interfaceBlockStore
- Specified by:
getParams
in interfaceUTXOProvider
- Returns:
- The network params.
-
getChainHeadHeight
Description copied from interface:UTXOProvider
Get the height of the chain head.- Specified by:
getChainHeadHeight
in interfaceUTXOProvider
- Returns:
- The chain head height.
- Throws:
UTXOProviderException
- If there is an error.
-
resetStore
Resets the store by deleting the contents of the tables and reinitialising them.- Throws:
BlockStoreException
- If the tables couldn't be cleared and initialised.
-
deleteStore
Deletes the store by deleting the tables within the database.- Throws:
BlockStoreException
- If tables couldn't be deleted.
-
calculateBalanceForAddress
Calculate the balance for a coinbase, to-address, or p2sh address.The balance
getBalanceSelectSQL()
returns the balance (summed) as an number, then use calculateClientSide=falseThe balance
getBalanceSelectSQL()
returns the all the openoutputs as stored in the DB (binary), then use calculateClientSide=true- Parameters:
address
- The address to calculate the balance of- Returns:
- The balance of the address supplied. If the address has not been seen, or there are no outputs open for this address, the return value is 0.
- Throws:
BlockStoreException
- If there is an error getting the balance.
-
getOpenTransactionOutputs
Description copied from interface:UTXOProvider
Get the list ofUTXO
's for given keys.- Specified by:
getOpenTransactionOutputs
in interfaceUTXOProvider
- Parameters:
keys
- List of keys.- Returns:
- The list of transaction outputs.
- Throws:
UTXOProviderException
- If there is an error.
-
dumpSizes
Dumps information about the size of actual data in the database to standard output The only truly useless data counted is printed in the form "N in id indexes" This does not take database indexes into account.- Throws:
SQLException
BlockStoreException
-