dcrpg

package
v1.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 15, 2017 License: ISC Imports: 23 Imported by: 0

README

package dcrpg

The dcrpg provides functions to manipulate PostgreSQL tables storing blocks, transactions, inputs, and outputs.

Performance and Bulk Loading

When performing a bulk data import, it is wise to first drop any existing indexes and create them again after insertion is completed. Functions are provided to create and drop the indexes.

PostgreSQL performance will be poor, particuarly during bulk import, unless synchronous transaction commits are disabled via the synchronous_commit = off configuration setting in your postgresql.conf. There are numerous PostreSQL tuning settings, but a quick suggestion for your system can be provided by PgTune. During initial table population, it is also OK to turn off autovacuum, full page writes, and possibly fsync. Remember to change settings back to production ready values.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Connect

func Connect(host, port, user, pass, dbname string) (*sql.DB, error)

Connect opens a connection to a PostgreSQL database. The caller is responsible for calling Close() on the returned db when finished using it. The input host may be an IP address for TCP connection, or an absolute path to a UNIX domain socket. An empty string should be provided for UNIX sockets.

func CreateTable

func CreateTable(db *sql.DB, tableName string) error

CreateTable creates one of the known tables by name

func CreateTables

func CreateTables(db *sql.DB) error

func CreateTypes

func CreateTypes(db *sql.DB) error

func DeindexAddressTableOnAddress

func DeindexAddressTableOnAddress(db *sql.DB) (err error)

func DeindexAddressTableOnTxHash

func DeindexAddressTableOnTxHash(db *sql.DB) (err error)

func DeindexAddressTableOnVoutID

func DeindexAddressTableOnVoutID(db *sql.DB) (err error)

func DeindexBlockTableOnHash

func DeindexBlockTableOnHash(db *sql.DB) (err error)

func DeindexTransactionTableOnBlockIn

func DeindexTransactionTableOnBlockIn(db *sql.DB) (err error)

func DeindexTransactionTableOnHashes

func DeindexTransactionTableOnHashes(db *sql.DB) (err error)

func DeindexVinTableOnPrevOuts

func DeindexVinTableOnPrevOuts(db *sql.DB) (err error)

func DeindexVinTableOnVins

func DeindexVinTableOnVins(db *sql.DB) (err error)

func DeindexVoutTableOnTxHash

func DeindexVoutTableOnTxHash(db *sql.DB) (err error)

func DeindexVoutTableOnTxHashIdx

func DeindexVoutTableOnTxHashIdx(db *sql.DB) (err error)

func DisableLog

func DisableLog()

DisableLog disables all library log output. Logging output is disabled by default until UseLogger is called.

func DropTables

func DropTables(db *sql.DB)

func IndexAddressTableOnAddress

func IndexAddressTableOnAddress(db *sql.DB) (err error)

func IndexAddressTableOnTxHash

func IndexAddressTableOnTxHash(db *sql.DB) (err error)

func IndexAddressTableOnVoutID

func IndexAddressTableOnVoutID(db *sql.DB) (err error)

func IndexBlockTableOnHash

func IndexBlockTableOnHash(db *sql.DB) (err error)

func IndexTransactionTableOnBlockIn

func IndexTransactionTableOnBlockIn(db *sql.DB) (err error)

func IndexTransactionTableOnHashes

func IndexTransactionTableOnHashes(db *sql.DB) (err error)

func IndexVinTableOnPrevOuts

func IndexVinTableOnPrevOuts(db *sql.DB) (err error)

func IndexVinTableOnVins

func IndexVinTableOnVins(db *sql.DB) (err error)

func IndexVoutTableOnTxHash

func IndexVoutTableOnTxHash(db *sql.DB) (err error)

func IndexVoutTableOnTxHashIdx

func IndexVoutTableOnTxHashIdx(db *sql.DB) (err error)

func InsertAddressOut

func InsertAddressOut(db *sql.DB, dbA *dbtypes.AddressRow) (uint64, error)

func InsertAddressOuts

func InsertAddressOuts(db *sql.DB, dbAs []*dbtypes.AddressRow) ([]uint64, error)

func InsertBlock

func InsertBlock(db *sql.DB, dbBlock *dbtypes.Block, isValid, checked bool) (uint64, error)

func InsertBlockPrevNext

func InsertBlockPrevNext(db *sql.DB, blockDbID uint64,
	hash, prev, next string) error

func InsertTx

func InsertTx(db *sql.DB, dbTx *dbtypes.Tx, checked bool) (uint64, error)

func InsertTxns

func InsertTxns(db *sql.DB, dbTxns []*dbtypes.Tx, checked bool) ([]uint64, error)

func InsertVin

func InsertVin(db *sql.DB, dbVin dbtypes.VinTxProperty) (id uint64, err error)

func InsertVins

func InsertVins(db *sql.DB, dbVins dbtypes.VinTxPropertyARRAY) ([]uint64, error)

func InsertVout

func InsertVout(db *sql.DB, dbVout *dbtypes.Vout, checked bool) (uint64, error)

func InsertVouts

func InsertVouts(db *sql.DB, dbVouts []*dbtypes.Vout, checked bool) ([]uint64, []dbtypes.AddressRow, error)

func RetrieveAddressIDsByOutpoint

func RetrieveAddressIDsByOutpoint(db *sql.DB, txHash string,
	voutIndex uint32) ([]uint64, []string, error)

func RetrieveAddressRecvCount

func RetrieveAddressRecvCount(db *sql.DB, address string) (count int64, err error)

func RetrieveAddressSpent

func RetrieveAddressSpent(db *sql.DB, address string) (count, totalAmount int64, err error)

func RetrieveAddressSpentUnspent

func RetrieveAddressSpentUnspent(db *sql.DB, address string) (numSpent, numUnspent,
	totalSpent, totalUnspent int64, err error)

func RetrieveAddressTxns

func RetrieveAddressTxns(db *sql.DB, address string, N, offset int64) ([]uint64, []*dbtypes.AddressRow, error)

func RetrieveAddressTxnsAlt

func RetrieveAddressTxnsAlt(db *sql.DB, address string, N, offset int64) ([]uint64, []*dbtypes.AddressRow, error)

func RetrieveAddressUnspent

func RetrieveAddressUnspent(db *sql.DB, address string) (count, totalAmount int64, err error)

func RetrieveAllAddressTxns

func RetrieveAllAddressTxns(db *sql.DB, address string) ([]uint64, []*dbtypes.AddressRow, error)

func RetrieveAllVinDbIDs

func RetrieveAllVinDbIDs(db *sql.DB) (vinDbIDs []uint64, err error)

func RetrieveBestBlockHeight

func RetrieveBestBlockHeight(db *sql.DB) (height uint64, hash string, id uint64, err error)

func RetrieveDbTxByHash

func RetrieveDbTxByHash(db *sql.DB, txHash string) (id uint64, dbTx *dbtypes.Tx, err error)

func RetrieveFullTxByHash

func RetrieveFullTxByHash(db *sql.DB, txHash string) (id uint64,
	blockHash string, blockHeight int64, blockTime int64, time int64,
	txType int16, version int32, tree int8, blockInd uint32,
	lockTime, expiry int32, size uint32, spent, sent, fees int64,
	numVin int32, vinDbIDs []int64, numVout int32, voutDbIDs []int64,
	err error)

func RetrieveFundingOutpointByTxIn

func RetrieveFundingOutpointByTxIn(db *sql.DB, txHash string,
	vinIndex uint32) (id uint64, tx string, index uint32, tree int8, err error)

func RetrieveFundingOutpointByVinID

func RetrieveFundingOutpointByVinID(db *sql.DB, vinDbID uint64) (tx string, index uint32, tree int8, err error)

func RetrieveFundingTxByTxIn

func RetrieveFundingTxByTxIn(db *sql.DB, txHash string, vinIndex uint32) (id uint64, tx string, err error)

func RetrieveFundingTxsByTx

func RetrieveFundingTxsByTx(db *sql.DB, txHash string) ([]uint64, []*dbtypes.Tx, error)

func RetrievePkScriptByID

func RetrievePkScriptByID(db *sql.DB, id uint64) (pkScript []byte, err error)

func RetrieveRegularTxByHash

func RetrieveRegularTxByHash(db *sql.DB, txHash string) (id uint64, blockHash string, blockInd uint32, err error)

func RetrieveSpendingTxByTxOut

func RetrieveSpendingTxByTxOut(db *sql.DB, txHash string,
	voutIndex uint32) (id uint64, tx string, vin uint32, tree int8, err error)

func RetrieveSpendingTxByVinID

func RetrieveSpendingTxByVinID(db *sql.DB, vinDbID uint64) (tx string,
	voutIndex uint32, tree int8, err error)

func RetrieveSpendingTxsByFundingTx

func RetrieveSpendingTxsByFundingTx(db *sql.DB, fundingTxID string) (dbIDs []uint64,
	txns []string, vinInds []uint32, voutInds []uint32, err error)

func RetrieveStakeTxByHash

func RetrieveStakeTxByHash(db *sql.DB, txHash string) (id uint64, blockHash string, blockInd uint32, err error)

func RetrieveTxByHash

func RetrieveTxByHash(db *sql.DB, txHash string) (id uint64, blockHash string, blockInd uint32, tree int8, err error)

func RetrieveTxsByBlockHash

func RetrieveTxsByBlockHash(db *sql.DB, blockHash string) (ids []uint64, txs []string, blockInds []uint32, trees []int8, err error)

func RetrieveVinByID

func RetrieveVinByID(db *sql.DB, vinDbID uint64) (prevOutHash string, prevOutVoutInd uint32,
	prevOutTree int8, txHash string, txVinInd uint32, txTree int8, err error)

func RetrieveVoutIDByOutpoint

func RetrieveVoutIDByOutpoint(db *sql.DB, txHash string, voutIndex uint32) (id uint64, err error)

func RetrieveVoutValue

func RetrieveVoutValue(db *sql.DB, txHash string, voutIndex uint32) (value uint64, err error)

func RetrieveVoutValues

func RetrieveVoutValues(db *sql.DB, txHash string) (values []uint64, txInds []uint32, txTrees []int8, err error)

func SetSpendingByVinID

func SetSpendingByVinID(db *sql.DB, vinDbID uint64, spendingTxDbID uint64,
	spendingTxHash string, spendingTxVinIndex uint32) (int64, error)

SetSpendingByVinID is for when you got a new spending tx (vin entry) and you need to get the funding (previous output) tx info, and then update the corresponding row in the addresses table with the spending tx info.

func SetSpendingForAddressDbID

func SetSpendingForAddressDbID(db *sql.DB, addrDbID uint64, spendingTxDbID uint64,
	spendingTxHash string, spendingTxVinIndex uint32, vinDbID uint64) error

func SetSpendingForFundingOP

func SetSpendingForFundingOP(db *sql.DB,
	fundingTxHash string, fundingTxVoutIndex uint32,
	spendingTxDbID uint64, spendingTxHash string, spendingTxVinIndex uint32,
	vinDbID uint64) (int64, error)

func SetSpendingForVinDbID

func SetSpendingForVinDbID(db *sql.DB, vinDbID uint64) (int64, error)

func SetSpendingForVinDbIDs

func SetSpendingForVinDbIDs(db *sql.DB, vinDbIDs []uint64) ([]int64, int64, error)

func TableExists

func TableExists(db *sql.DB, tableName string) (bool, error)

func TableVersions

func TableVersions(db *sql.DB) map[string]int32

func TypeExists

func TypeExists(db *sql.DB, tableName string) (bool, error)

func UpdateBlockNext

func UpdateBlockNext(db *sql.DB, blockDbID uint64, next string) error

func UpdateLastBlock

func UpdateLastBlock(db *sql.DB, blockDbID uint64, isValid bool) error

func UseLogger

func UseLogger(logger btclog.Logger)

UseLogger uses a specified Logger to output package logging info.

Types

type ChainDB

type ChainDB struct {
	// contains filtered or unexported fields
}

ChainDB provides an interface for storing and manipulating extracted blockchain data in a PostgreSQL database.

func NewChainDB

func NewChainDB(dbi *DBInfo, params *chaincfg.Params) (*ChainDB, error)

NewChainDB constructs a ChainDB for the given connection and Decred network parameters. By default, duplicate row checks on insertion are enabled.

func (*ChainDB) AddressHistory

func (pgb *ChainDB) AddressHistory(address string, N, offset int64) ([]*dbtypes.AddressRow, *explorer.AddressBalance, error)

AddressHistory queries the database for all rows of the addresses table for the given address.

func (*ChainDB) BlockTransactions

func (pgb *ChainDB) BlockTransactions(blockHash string) ([]string, []uint32, []int8, error)

BlockTransactions retrieves all transactions in the specified block, their indexes in the block, their tree, and an error value.

func (*ChainDB) Close

func (pgb *ChainDB) Close() error

Close closes the underlying sql.DB connection to the database.

func (*ChainDB) DeindexAddressTable

func (pgb *ChainDB) DeindexAddressTable() error

DeindexAddressTable drops the vin ID and address column indexes for the address table.

func (*ChainDB) DeindexAll

func (pgb *ChainDB) DeindexAll() error

DeindexAll drops all of the indexes in all tables

func (*ChainDB) DropTables

func (pgb *ChainDB) DropTables()

DropTables drops (deletes) all of the known dcrdata tables.

func (*ChainDB) EnableDuplicateCheckOnInsert

func (pgb *ChainDB) EnableDuplicateCheckOnInsert(dupCheck bool)

EnableDuplicateCheckOnInsert specifies whether SQL insertions should check for row conflicts (duplicates), and avoid adding or updating.

func (*ChainDB) FillAddressTransactions

func (pgb *ChainDB) FillAddressTransactions(addrInfo *explorer.AddressInfo) error

FillAddressTransactions is used to fill out the transaction details in an explorer.AddressInfo generated by explorer.ReduceAddressHistory, usually from the output of AddressHistory. This function also sets the number of unconfirmed transactions for the current best block in the database.

func (*ChainDB) Height

func (pgb *ChainDB) Height() uint64

Height uses the last stored height.

func (*ChainDB) HeightDB

func (pgb *ChainDB) HeightDB() (uint64, error)

HeightDB queries the DB for the best block height.

func (*ChainDB) IndexAddressTable

func (pgb *ChainDB) IndexAddressTable() error

IndexAddressTable creates the indexes on the address table on the vout ID and address columns, separately.

func (*ChainDB) IndexAll

func (pgb *ChainDB) IndexAll() error

IndexAll creates all of the indexes in all tables

func (*ChainDB) SetupTables

func (pgb *ChainDB) SetupTables() error

SetupTables creates the required tables and type, and prints table versions stored in the table comments when debug level logging is enabled.

func (*ChainDB) SpendingTransaction

func (pgb *ChainDB) SpendingTransaction(fundingTxID string,
	fundingTxVout uint32) (string, uint32, int8, error)

SpendingTransaction returns the transaction that spends the specified transaction outpoint, if it is spent. The spending transaction hash, input index, tx tree, and an error value are returned.

func (*ChainDB) SpendingTransactions

func (pgb *ChainDB) SpendingTransactions(fundingTxID string) ([]string, []uint32, []uint32, error)

SpendingTransactions retrieves all transactions spending outpoints from the specified funding transaction. The spending transaction hashes, the spending tx input indexes, and the corresponding funding tx output indexes, and an error value are returned.

func (*ChainDB) Store

func (pgb *ChainDB) Store(_ *blockdata.BlockData, msgBlock *wire.MsgBlock) error

Store satisfies BlockDataSaver

func (*ChainDB) StoreBlock

func (pgb *ChainDB) StoreBlock(msgBlock *wire.MsgBlock, isValid,
	updateAddressesSpendingInfo bool) (numVins int64, numVouts int64, err error)

StoreBlock processes the input wire.MsgBlock, and saves to the data tables. The number of vins, and vouts stored are also returned.

func (*ChainDB) SyncChainDB

func (db *ChainDB) SyncChainDB(client *rpcclient.Client, quit chan struct{},
	updateAllAddresses, newIndexes bool) (int64, error)

SyncChainDB stores in the DB all blocks on the main chain available from the RPC client. The table indexes may be force-dropped and recreated by setting newIndexes to true. The quit channel is used to break the sync loop. For example, closing the channel on SIGINT.

func (*ChainDB) SyncChainDBAsync

func (db *ChainDB) SyncChainDBAsync(res chan dbtypes.SyncResult,
	client *rpcclient.Client, quit chan struct{}, updateAllAddresses, newIndexes bool)

SyncChainDBAsync is like SyncChainDB except it also takes a result channel on which the caller should wait to receive the result. As such, this method should be called as a goroutine or it will hang on send if the channel is unbuffered.

func (*ChainDB) TransactionBlock

func (pgb *ChainDB) TransactionBlock(txID string) (string, uint32, int8, error)

TransactionBlock retrieves the hash of the block containing the specified transaction. The index of the transaction within the block, the transaction index, and an error value are also returned.

func (*ChainDB) UpdateSpendingInfoInAllAddresses

func (pgb *ChainDB) UpdateSpendingInfoInAllAddresses() (int64, error)

UpdateSpendingInfoInAllAddresses completely rebuilds the spending transaction info columns of the address table. This is intended to be use after syncing all other tables and creating their indexes, particularly the indexes on the vins table, and the addresses table index on the funding tx columns. This can be used instead of using updateAddressesSpendingInfo=true with storeTxns, which will update these addresses table columns too, but much more slowly for a number of reasons (that are well worth investigating BTW!).

func (*ChainDB) VoutValue

func (pgb *ChainDB) VoutValue(txID string, vout uint32) (uint64, error)

VoutValue retrieves the value of the specified transaction outpoint in atoms.

func (*ChainDB) VoutValues

func (pgb *ChainDB) VoutValues(txID string) ([]uint64, []uint32, []int8, error)

VoutValues retrieves the values of each outpoint of the specified transaction. The corresponding indexes in the block and tx trees of the outpoints, and an error value are also returned.

type DBInfo

type DBInfo struct {
	Host, Port, User, Pass, DBName string
}

DBInfo holds the PostgreSQL database connection information.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL