mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-03-30 15:08:33 +00:00

* [DEV-134] Implement Continuous Integration Squashed commit: [5e41d830] Dev 223 fix txindex (#100) * [DEV-201] In handleGetBlockDAGInfo calculate difficulty by the tip with the lowest bits * [DEV-202] Move VirtualBlock.GetUTXOEntry to BlockDAG * [DEV-203] Move VirtualBlock.SelectedTip() to BlockDAG * [DEV-203] Move VirtualBlock.SelectedTip() to BlockDAG * [DEV-204] Unexport VirtualBlock() and add CalcMedianTime method for DAG * [DEV-204] add explanation about difficulty in CurrentBits() comment * [DEV-204] unexport VirtualBlock type * [DEV-223] make applyUTXOChanges return pastUTXOResults * [DEV-223] add bluestxdata for current block as well * [DEV-223] re-design tx index * [DEV-223] edit txindex comments * [DEV-223] rename BluesTxData -> AcceptedTxData, and return from applyUTXOChanges only transactions that got accepted * [DEV-223] add unit test for txindex * [DEV-223] fix comments and unite blueTransaction and AcceptedTxData to one type * [DEV-223] use bucket cursor for dbFetchFirstTxRegion * [DEV-223] use the same cursor instance for dbFetchFirstTxRegion * [DEV-223] write in dbFetchFirstTxRegion's comment that it returns the first block region * [DEV-223] rename type BlueBlockTransaction to TxWithBlockHash * [DEV-223] add named returned value for applyUTXOChanges [4c95e293] [DEV-134] Made golint ignore the vendor directory. [21736dbc] [DEV-134] Renamed ExampleBlockChain_ProcessBlock to ExampleBlockDAG_ProcessBlock to satisfy go vet. [beea6486] [DEV-134] Removed pushing the built docker to a remove repository. That's unnecessary at this stage. [bee911ed] [DEV-134] Made all precompilation checks run on everything instead of only the root dir. [585f92ae] [DEV-134] Added "github.com/pkg/errors" to dep. [5f02f570] [DEV-134] -vendor-only is written with only one hyphen. [3eee7f95] [DEV-134] go vet instead of go tool vet. [0c2d4343] [DEV-134] Split all the pre-compile checks to separate lines to be able to tell which of them is failing. [780519c8] [DEV-134] Ran gofmt on everything. [8247146b] Dev 223 fix txindex (#100) * [DEV-201] In handleGetBlockDAGInfo calculate difficulty by the tip with the lowest bits * [DEV-202] Move VirtualBlock.GetUTXOEntry to BlockDAG * [DEV-203] Move VirtualBlock.SelectedTip() to BlockDAG * [DEV-203] Move VirtualBlock.SelectedTip() to BlockDAG * [DEV-204] Unexport VirtualBlock() and add CalcMedianTime method for DAG * [DEV-204] add explanation about difficulty in CurrentBits() comment * [DEV-204] unexport VirtualBlock type * [DEV-223] make applyUTXOChanges return pastUTXOResults * [DEV-223] add bluestxdata for current block as well * [DEV-223] re-design tx index * [DEV-223] edit txindex comments * [DEV-223] rename BluesTxData -> AcceptedTxData, and return from applyUTXOChanges only transactions that got accepted * [DEV-223] add unit test for txindex * [DEV-223] fix comments and unite blueTransaction and AcceptedTxData to one type * [DEV-223] use bucket cursor for dbFetchFirstTxRegion * [DEV-223] use the same cursor instance for dbFetchFirstTxRegion * [DEV-223] write in dbFetchFirstTxRegion's comment that it returns the first block region * [DEV-223] rename type BlueBlockTransaction to TxWithBlockHash * [DEV-223] add named returned value for applyUTXOChanges [bff68aa3] [DEV-134] Gave executable permission to deploy.sh [638a99d9] [DEV-134] Added jenkinsfile and deploy script. * [DEV-134] Added a robust testing script. * [DEV-134] Fixed a bash-ism. * [DEV-134] Disabled testing with coverage for now. * [DEV-134] Disabled golint and removed removing debug symbols. * [DEV-134] Disabled aligncheck. * [DEV-134] Disabled structcheck and varcheck. * [DEV-134] Added "don't inline functions" to compiler flags for testing. * [DEV-134] Made build fail if gofmt prints out anything. * [DEV-134] Fixed misleading comment. * [DEV-134] Added comments to test.sh. * [DEV-134] Renamed tm to measure_runtime and removed do_ prefixes from functions. * [DEV-134] Fixed gofmt line in build script. * [DEV-134] Fixed gofmt some more. * [DEV-134] Fixed gofmt not actually failing due to logical or.
92 lines
3.9 KiB
Go
92 lines
3.9 KiB
Go
// Copyright (c) 2015-2016 The btcsuite developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
/*
|
|
Package database provides a block and metadata storage database.
|
|
|
|
Overview
|
|
|
|
As of Feb 2016, there are over 400,000 blocks in the Bitcoin block chain and
|
|
and over 112 million transactions (which turns out to be over 60GB of data).
|
|
This package provides a database layer to store and retrieve this data in a
|
|
simple and efficient manner.
|
|
|
|
The default backend, ffldb, has a strong focus on speed, efficiency, and
|
|
robustness. It makes use leveldb for the metadata, flat files for block
|
|
storage, and strict checksums in key areas to ensure data integrity.
|
|
|
|
A quick overview of the features database provides are as follows:
|
|
|
|
- Key/value metadata store
|
|
- Bitcoin block storage
|
|
- Efficient retrieval of block headers and regions (transactions, scripts, etc)
|
|
- Read-only and read-write transactions with both manual and managed modes
|
|
- Nested buckets
|
|
- Supports registration of backend databases
|
|
- Comprehensive test coverage
|
|
|
|
Database
|
|
|
|
The main entry point is the DB interface. It exposes functionality for
|
|
transactional-based access and storage of metadata and block data. It is
|
|
obtained via the Create and Open functions which take a database type string
|
|
that identifies the specific database driver (backend) to use as well as
|
|
arguments specific to the specified driver.
|
|
|
|
The interface provides facilities for obtaining transactions (the Tx interface)
|
|
that are the basis of all database reads and writes. Unlike some database
|
|
interfaces that support reading and writing without transactions, this interface
|
|
requires transactions even when only reading or writing a single key.
|
|
|
|
The Begin function provides an unmanaged transaction while the View and Update
|
|
functions provide a managed transaction. These are described in more detail
|
|
below.
|
|
|
|
Transactions
|
|
|
|
The Tx interface provides facilities for rolling back or committing changes that
|
|
took place while the transaction was active. It also provides the root metadata
|
|
bucket under which all keys, values, and nested buckets are stored. A
|
|
transaction can either be read-only or read-write and managed or unmanaged.
|
|
|
|
Managed versus Unmanaged Transactions
|
|
|
|
A managed transaction is one where the caller provides a function to execute
|
|
within the context of the transaction and the commit or rollback is handled
|
|
automatically depending on whether or not the provided function returns an
|
|
error. Attempting to manually call Rollback or Commit on the managed
|
|
transaction will result in a panic.
|
|
|
|
An unmanaged transaction, on the other hand, requires the caller to manually
|
|
call Commit or Rollback when they are finished with it. Leaving transactions
|
|
open for long periods of time can have several adverse effects, so it is
|
|
recommended that managed transactions are used instead.
|
|
|
|
Buckets
|
|
|
|
The Bucket interface provides the ability to manipulate key/value pairs and
|
|
nested buckets as well as iterate through them.
|
|
|
|
The Get, Put, and Delete functions work with key/value pairs, while the Bucket,
|
|
CreateBucket, CreateBucketIfNotExists, and DeleteBucket functions work with
|
|
buckets. The ForEach function allows the caller to provide a function to be
|
|
called with each key/value pair and nested bucket in the current bucket.
|
|
|
|
Metadata Bucket
|
|
|
|
As discussed above, all of the functions which are used to manipulate key/value
|
|
pairs and nested buckets exist on the Bucket interface. The root metadata
|
|
bucket is the upper-most bucket in which data is stored and is created at the
|
|
same time as the database. Use the Metadata function on the Tx interface
|
|
to retrieve it.
|
|
|
|
Nested Buckets
|
|
|
|
The CreateBucket and CreateBucketIfNotExists functions on the Bucket interface
|
|
provide the ability to create an arbitrary number of nested buckets. It is
|
|
a good idea to avoid a lot of buckets with little data in them as it could lead
|
|
to poor page utilization depending on the specific driver in use.
|
|
*/
|
|
package database
|