Documentation ¶
Index ¶
- Constants
- Variables
- func NewBlockValidator() stdBlockValidator
- type ConsensusSet
- func (cs *ConsensusSet) AcceptBlock(b types.Block) error
- func (cs *ConsensusSet) AddSiafundBOutput(id types.SiafundOutputID) error
- func (c *ConsensusSet) Alerts() (crit, err, warn []modules.Alert)
- func (cs *ConsensusSet) BlockAtHeight(height types.BlockHeight) (block types.Block, exists bool)
- func (cs *ConsensusSet) BlockByID(id types.BlockID) (block types.Block, height types.BlockHeight, exists bool)
- func (cs *ConsensusSet) ChildTarget(id types.BlockID) (target types.Target, exists bool)
- func (cs *ConsensusSet) Close() error
- func (cs *ConsensusSet) ConsensusSetSubscribe(subscriber modules.ConsensusSetSubscriber, start modules.ConsensusChangeID, ...) error
- func (cs *ConsensusSet) CurrentBlock() (block types.Block)
- func (cs *ConsensusSet) Db() *persist.BoltDatabase
- func (cs *ConsensusSet) Height() (height types.BlockHeight)
- func (cs *ConsensusSet) InCurrentPath(id types.BlockID) (inPath bool)
- func (cs *ConsensusSet) IsSiafundBOutput(id types.SiafundOutputID) (bool, error)
- func (cs *ConsensusSet) LockedTryTransactionSet(fn func(func(txns []types.Transaction) (modules.ConsensusChange, error)) error) error
- func (cs *ConsensusSet) MinimumValidChildTimestamp(id types.BlockID) (timestamp types.Timestamp, exists bool)
- func (cs *ConsensusSet) SiafundClaim(sfoid types.SiafundOutputID) (types.SiafundClaim, error)
- func (cs *ConsensusSet) StorageProofSegment(fcid types.FileContractID) (index uint64, err error)
- func (cs *ConsensusSet) Synced() bool
- func (cs *ConsensusSet) TryTransactionSet(txns []types.Transaction) (modules.ConsensusChange, error)
- func (cs *ConsensusSet) Unsubscribe(subscriber modules.ConsensusSetSubscriber)
- type FileContractOwnership
- type FileContractRange
Constants ¶
const ( // DatabaseFilename contains the filename of the database that will be used // when managing consensus. DatabaseFilename = modules.ConsensusDir + ".db" )
Variables ¶
var ( // ErrBadMinerPayouts is returned when the miner payout does not equal the // block subsidy ErrBadMinerPayouts = errors.New("miner payout sum does not equal block subsidy") // ErrEarlyTimestamp is returned when the block's timestamp is too early ErrEarlyTimestamp = errors.New("block timestamp is too early") // ErrExtremeFutureTimestamp is returned when the block's timestamp is too // far in the future ErrExtremeFutureTimestamp = errors.New("block timestamp too far in future, discarded") // ErrFutureTimestamp is returned when the block's timestamp is too far in // the future to be used now but it's saved for future use ErrFutureTimestamp = errors.New("block timestamp too far in future, but saved for later use") // ErrLargeBlock is returned when the block is too large to be accepted ErrLargeBlock = errors.New("block is too large to be accepted") )
var ( // ChangeLog contains a list of atomic changes that have happened to the // consensus set so that subscribers can subscribe from the most recent // change they have seen. ChangeLog = []byte("ChangeLog") // ChangeLogTailID is a key that points to the id of the current changelog // tail. ChangeLogTailID = []byte("ChangeLogTailID") )
var ( // BlockHeight is a bucket that stores the current block height. // // Generally we would just look at BlockPath.Stats(), but there is an error // in boltdb that prevents the bucket stats from updating until a tx is // committed. Wasn't a problem until we started doing the entire block as // one tx. // // DEPRECATED - block.Stats() should be sufficient to determine the block // height, but currently stats are only computed after committing a // transaction, therefore cannot be assumed reliable. BlockHeight = []byte("BlockHeight") // BlockMap is a database bucket containing all of the processed blocks, // keyed by their id. This includes blocks that are not currently in the // consensus set, and blocks that may not have been fully validated yet. BlockMap = []byte("BlockMap") // BlockMapV2 is a database bucket containing additional information, including // new diff types introduced for SPF-B, for processed blocks, keyed by their id. BlockMapV2 = []byte("V2BlockMap") // BlockPath is a database bucket containing a mapping from the height of a // block to the id of the block at that height. BlockPath only includes // blocks in the current path. BlockPath = []byte("BlockPath") // BucketOak is the database bucket that contains all of the fields related // to the oak difficulty adjustment algorithm. The cumulative difficulty and // time values are stored for each block id, and then the key "OakInit" // contains the value "true" if the oak fields have been properly // initialized. BucketOak = []byte("Oak") // Consistency is a database bucket with a flag indicating whether // inconsistencies within the database have been detected. Consistency = []byte("Consistency") // FileContracts is a database bucket that contains all of the open file // contracts. FileContracts = []byte("FileContracts") // SiacoinOutputs is a database bucket that contains all of the unspent // siacoin outputs. SiacoinOutputs = []byte("SiacoinOutputs") // SiafundOutputs is a database bucket that contains all of the unspent // siafund outputs. SiafundOutputs = []byte("SiafundOutputs") // SiafundPool is a database bucket storing the current value of the // siafund pool. SiafundPool = []byte("SiafundPool") // SiafundHardforkPool is a database bucket storing the value of the // siafund pool at the moment of SPF hardfork. SiafundHardforkPool = []byte("SiafundHardforkPool") // SiafundPoolHistory is a database bucket that stores values of the // siafund pool for each block height. SiafundPoolHistory = []byte("SiafundPoolHistory") // FileContractsOwnership is a database bucket that stores a list of owners // for each contract. FileContractsOwnership = []byte("FileContractsOwnership") // FileContractRanges is a database bucket that stores start and end // heights of each contract by its owner. FileContractRanges = []byte("FileContractRanges") // SiafundBOutputs is a database bucket that stores all existing SPF-B // output IDs (only keys are used). SiafundBOutputs = []byte("SiafundBOutputs") // PoolHistoryHardforkBucket is an utility database bucket that is // only used by SPF pool history hardfork code. PoolHistoryHardforkBucket = []byte("PoolHistoryHardforkBucket") )
var ( // DatabaseBucketsMayNotExist contains buckets which did not exist // in previous versions. DatabaseBucketsMayNotExist = [][]byte{ SiafundHardforkPool, SiafundPoolHistory, FileContractsOwnership, FileContractRanges, SiafundBOutputs, BlockMapV2, PoolHistoryHardforkBucket, } )
var ( // FieldOakInit is a field in BucketOak that gets set to "true" after the // oak initialization process has completed. FieldOakInit = []byte("OakInit") )
var ( // MaxCatchUpBlocks is the maxiumum number of blocks that can be given to // the consensus set in a single iteration during the initial blockchain // download. MaxCatchUpBlocks = build.Select(build.Var{ Standard: types.BlockHeight(10), Dev: types.BlockHeight(50), Testing: types.BlockHeight(3), }).(types.BlockHeight) )
var SurpassThreshold = big.NewRat(20, 100)
SurpassThreshold is a percentage that dictates how much heavier a competing chain has to be before the node will switch to mining on that chain. This is not a consensus rule. This percentage is only applied to the most recent block, not the entire chain; see blockNode.heavierThan.
If no threshold were in place, it would be possible to manipulate a block's timestamp to produce a sufficiently heavier block.
var ( // ValueOakInit is the value that the oak init field is set to if the oak // difficulty adjustment fields have been correctly initialized. ValueOakInit = []byte("true") )
Functions ¶
func NewBlockValidator ¶ added in v1.0.0
func NewBlockValidator() stdBlockValidator
NewBlockValidator creates a new stdBlockValidator with default settings.
Types ¶
type ConsensusSet ¶ added in v1.0.0
type ConsensusSet struct {
// contains filtered or unexported fields
}
The ConsensusSet is the object responsible for tracking the current status of the blockchain. Broadly speaking, it is responsible for maintaining consensus. It accepts blocks and constructs a blockchain, forking when necessary.
func New ¶
New returns a new ConsensusSet, containing at least the genesis block. If there is an existing block database present in the persist directory, it will be loaded.
func NewCustomConsensusSet ¶ added in v1.3.3
func NewCustomConsensusSet(gateway modules.Gateway, bootstrap bool, persistDir string, deps modules.Dependencies) (*ConsensusSet, <-chan error)
NewCustomConsensusSet returns a new ConsensusSet, containing at least the genesis block. If there is an existing block database present in the persist directory, it will be loaded.
func (*ConsensusSet) AcceptBlock ¶ added in v1.0.0
func (cs *ConsensusSet) AcceptBlock(b types.Block) error
AcceptBlock will try to add a block to the consensus set. If the block does not extend the longest currently known chain, an error is returned but the block is still kept in memory. If the block extends a fork such that the fork becomes the longest currently known chain, the consensus set will reorganize itself to recognize the new longest fork. If a block is accepted without error, it will be relayed to all connected peers. This function should only be called for new blocks.
func (*ConsensusSet) AddSiafundBOutput ¶ added in v1.7.0
func (cs *ConsensusSet) AddSiafundBOutput(id types.SiafundOutputID) error
AddSiafundBOutput marks `id` as SPF-B. For tests only!
func (*ConsensusSet) Alerts ¶ added in v1.5.0
func (c *ConsensusSet) Alerts() (crit, err, warn []modules.Alert)
Alerts implements the Alerter interface for the consensusset.
func (*ConsensusSet) BlockAtHeight ¶ added in v1.0.0
func (cs *ConsensusSet) BlockAtHeight(height types.BlockHeight) (block types.Block, exists bool)
BlockAtHeight returns the block at a given height.
func (*ConsensusSet) BlockByID ¶ added in v1.3.3
func (cs *ConsensusSet) BlockByID(id types.BlockID) (block types.Block, height types.BlockHeight, exists bool)
BlockByID returns the block for a given BlockID.
func (*ConsensusSet) ChildTarget ¶ added in v1.0.0
ChildTarget returns the target for the child of a block.
func (*ConsensusSet) Close ¶ added in v1.0.0
func (cs *ConsensusSet) Close() error
Close safely closes the block database.
func (*ConsensusSet) ConsensusSetSubscribe ¶ added in v1.0.0
func (cs *ConsensusSet) ConsensusSetSubscribe(subscriber modules.ConsensusSetSubscriber, start modules.ConsensusChangeID, cancel <-chan struct{}) error
ConsensusSetSubscribe adds a subscriber to the list of subscribers, and gives them every consensus change that has occurred since the change with the provided id.
As a special case, using an empty id as the start will have all the changes sent to the modules starting with the genesis block.
func (*ConsensusSet) CurrentBlock ¶ added in v1.0.0
func (cs *ConsensusSet) CurrentBlock() (block types.Block)
CurrentBlock returns the latest block in the heaviest known blockchain.
func (*ConsensusSet) Db ¶ added in v1.3.8
func (cs *ConsensusSet) Db() *persist.BoltDatabase
Db returns the database associated with the ConsensusSet
func (*ConsensusSet) Height ¶ added in v1.0.0
func (cs *ConsensusSet) Height() (height types.BlockHeight)
Height returns the height of the consensus set.
func (*ConsensusSet) InCurrentPath ¶ added in v1.0.0
func (cs *ConsensusSet) InCurrentPath(id types.BlockID) (inPath bool)
InCurrentPath returns true if the block presented is in the current path, false otherwise.
func (*ConsensusSet) IsSiafundBOutput ¶ added in v1.7.0
func (cs *ConsensusSet) IsSiafundBOutput(id types.SiafundOutputID) (bool, error)
IsSiafundBOutput checks if `id` is an SPF-B output.
func (*ConsensusSet) LockedTryTransactionSet ¶ added in v1.1.1
func (cs *ConsensusSet) LockedTryTransactionSet(fn func(func(txns []types.Transaction) (modules.ConsensusChange, error)) error) error
LockedTryTransactionSet calls fn while under read-lock, passing it a version of TryTransactionSet that can be called under read-lock. This fixes an edge case in the transaction pool.
func (*ConsensusSet) MinimumValidChildTimestamp ¶ added in v1.0.0
func (cs *ConsensusSet) MinimumValidChildTimestamp(id types.BlockID) (timestamp types.Timestamp, exists bool)
MinimumValidChildTimestamp returns the earliest timestamp that the next block can have in order for it to be considered valid.
func (*ConsensusSet) SiafundClaim ¶ added in v1.5.0
func (cs *ConsensusSet) SiafundClaim(sfoid types.SiafundOutputID) (types.SiafundClaim, error)
SiafundClaim returns claim of SiafundOutput with SiafundOutputID taking hardforks into account.
func (*ConsensusSet) StorageProofSegment ¶ added in v1.0.0
func (cs *ConsensusSet) StorageProofSegment(fcid types.FileContractID) (index uint64, err error)
StorageProofSegment returns the segment to be used in the storage proof for a given file contract.
func (*ConsensusSet) Synced ¶ added in v1.0.0
func (cs *ConsensusSet) Synced() bool
Synced returns true if the consensus set is synced with the network.
func (*ConsensusSet) TryTransactionSet ¶ added in v1.0.0
func (cs *ConsensusSet) TryTransactionSet(txns []types.Transaction) (modules.ConsensusChange, error)
TryTransactionSet applies the input transactions to the consensus set to determine if they are valid. An error is returned IFF they are not a valid set in the current consensus set. The size of the transactions and the set is not checked. After the transactions have been validated, a consensus change is returned detailing the diffs that the transactions set would have.
func (*ConsensusSet) Unsubscribe ¶ added in v1.0.0
func (cs *ConsensusSet) Unsubscribe(subscriber modules.ConsensusSetSubscriber)
Unsubscribe removes a subscriber from the list of subscribers, allowing for garbage collection and rescanning. If the subscriber is not found in the subscriber database, no action is taken.
type FileContractOwnership ¶ added in v1.7.0
type FileContractOwnership struct { Start types.BlockHeight Owners []types.UnlockHash }
FileContractOwnership contains a list of contract's owners and its start height.
type FileContractRange ¶ added in v1.7.0
type FileContractRange struct { Start types.BlockHeight End types.BlockHeight }
FileContractRange is a block height range specifying contract lifetime.
func (FileContractRange) Equals ¶ added in v1.7.0
func (fcr FileContractRange) Equals(fcr2 FileContractRange) bool
Equals checks if two file contract ranges are equal.
func (FileContractRange) Marshal ¶ added in v1.7.0
func (fcr FileContractRange) Marshal() []byte
Marshal implements serialisation for FileContractRange structure.
func (*FileContractRange) Unmarshal ¶ added in v1.7.0
func (fcr *FileContractRange) Unmarshal(data []byte) int
Unmarshal implements parsing for FileContractRange structure.