You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

4.4 KiB

State

State

The state contains information whose cryptographic digest is included in block headers, and thus is necessary for validating new blocks. For instance, the validators set and the results of transactions are never included in blocks, but their Merkle roots are - the state keeps track of them.

Note that the State object itself is an implementation detail, since it is never included in a block or gossipped over the network, and we never compute its hash. Thus we do not include here details of how the State object is persisted or queried. That said, the types it contains are part of the specification, since their Merkle roots are included in blocks and their values are used in validation.

type State struct {
    ChainID        string
    InitialHeight  int64

    Version     Version
    LastResults []Result
    AppHash     []byte

    LastValidators []Validator
    Validators     []Validator
    NextValidators []Validator

    ConsensusParams ConsensusParams
}

The chain ID and initial height are taken from the genesis file, and not changed again. The initial height will be 1 in the typical case, 0 is an invalid value.

Note there is a hard-coded limit of 10000 validators. This is inherited from the limit on the number of votes in a commit.

Version

type Version struct {
  consensus Consensus
  software string
}

The Consensus contains the protocol version for the blockchain and the application as two uint64 values:

type Consensus struct {
	Block uint64
	App   uint64
}

Result

type Result struct {
    Code uint32
    Data []byte
}

Result is the result of executing a transaction against the application. It returns a result code and an arbitrary byte array (ie. a return value).

NOTE: the Result needs to be updated to include more fields returned from processing transactions, like gas variables and tags - see issue 1007.

Validator

A validator is an active participant in the consensus with a public key and a voting power. Validator's also contain an address field, which is a hash digest of the PubKey.

type Validator struct {
    Address     []byte
    PubKey      PubKey
    VotingPower int64
}

When hashing the Validator struct, the address is not included, because it is redundant with the pubkey.

The state.Validators, state.LastValidators, and state.NextValidators, must always be sorted by voting power, so that there is a canonical order for computing the MerkleRoot.

We also define a TotalVotingPower function, to return the total voting power:

func TotalVotingPower(vals []Validators) int64{
    sum := 0
    for v := range vals{
        sum += v.VotingPower
    }
    return sum
}

ConsensusParams

ConsensusParams define various limits for blockchain data structures. Like validator sets, they are set during genesis and can be updated by the application through ABCI. When hashed, only a subset of the params are included, to allow the params to evolve without breaking the header.

type ConsensusParams struct {
	Block
	Evidence
	Validator
	Version
}

type hashedParams struct {
	BlockMaxBytes int64
	BlockMaxGas   int64
}

func (params ConsensusParams) Hash() []byte {
	SHA256(hashedParams{
		BlockMaxBytes: params.Block.MaxBytes,
		BlockMaxGas:   params.Block.MaxGas,
	})
}

type BlockParams struct {
	MaxBytes   int64
	MaxGas     int64
	TimeIotaMs int64
}

type EvidenceParams struct {
	MaxAgeNumBlocks  int64
	MaxAgeDuration   time.Duration
	MaxNum           uint32
	ProofTrialPeriod int64
}

type ValidatorParams struct {
	PubKeyTypes []string
}

type VersionParams struct {
	AppVersion uint64
}

Block

The total size of a block is limited in bytes by the ConsensusParams.Block.MaxBytes. Proposed blocks must be less than this size, and will be considered invalid otherwise.

Blocks should additionally be limited by the amount of "gas" consumed by the transactions in the block, though this is not yet implemented.

The minimal time between consecutive blocks is controlled by the ConsensusParams.Block.TimeIotaMs.

Evidence

For evidence in a block to be valid, it must satisfy:

block.Header.Time-evidence.Time < ConsensusParams.Evidence.MaxAgeDuration &&
	block.Header.Height-evidence.Height < ConsensusParams.Evidence.MaxAgeNumBlocks

Validator

Validators from genesis file and ResponseEndBlock must have pubkeys of type ∈ ConsensusParams.Validator.PubKeyTypes.