|
syntax = "proto3";
|
|
package tendermint.types;
|
|
|
|
option go_package = "github.com/tendermint/tendermint/proto/tendermint/types";
|
|
|
|
import "gogoproto/gogo.proto";
|
|
import "google/protobuf/duration.proto";
|
|
|
|
option (gogoproto.equal_all) = true;
|
|
|
|
// ConsensusParams contains consensus critical parameters that determine the
|
|
// validity of blocks.
|
|
message ConsensusParams {
|
|
BlockParams block = 1;
|
|
EvidenceParams evidence = 2;
|
|
ValidatorParams validator = 3;
|
|
VersionParams version = 4;
|
|
SynchronyParams synchrony = 5;
|
|
TimeoutParams timeout = 6;
|
|
}
|
|
|
|
// BlockParams contains limits on the block size.
|
|
message BlockParams {
|
|
// Max block size, in bytes.
|
|
// Note: must be greater than 0
|
|
int64 max_bytes = 1;
|
|
// Max gas per block.
|
|
// Note: must be greater or equal to -1
|
|
int64 max_gas = 2;
|
|
}
|
|
|
|
// EvidenceParams determine how we handle evidence of malfeasance.
|
|
message EvidenceParams {
|
|
// Max age of evidence, in blocks.
|
|
//
|
|
// The basic formula for calculating this is: MaxAgeDuration / {average block
|
|
// time}.
|
|
int64 max_age_num_blocks = 1;
|
|
|
|
// Max age of evidence, in time.
|
|
//
|
|
// It should correspond with an app's "unbonding period" or other similar
|
|
// mechanism for handling [Nothing-At-Stake
|
|
// attacks](https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed).
|
|
google.protobuf.Duration max_age_duration = 2
|
|
[(gogoproto.nullable) = false, (gogoproto.stdduration) = true];
|
|
|
|
// This sets the maximum size of total evidence in bytes that can be committed
|
|
// in a single block. and should fall comfortably under the max block bytes.
|
|
// Default is 1048576 or 1MB
|
|
int64 max_bytes = 3;
|
|
}
|
|
|
|
// ValidatorParams restrict the public key types validators can use.
|
|
// NOTE: uses ABCI pubkey naming, not Amino names.
|
|
message ValidatorParams {
|
|
repeated string pub_key_types = 1;
|
|
}
|
|
|
|
// VersionParams contains the ABCI application version.
|
|
message VersionParams {
|
|
uint64 app_version = 1;
|
|
}
|
|
|
|
// HashedParams is a subset of ConsensusParams.
|
|
//
|
|
// It is hashed into the Header.ConsensusHash.
|
|
message HashedParams {
|
|
int64 block_max_bytes = 1;
|
|
int64 block_max_gas = 2;
|
|
}
|
|
|
|
// SynchronyParams configure the bounds under which a proposed block's timestamp is considered valid.
|
|
// These parameters are part of the proposer-based timestamps algorithm. For more information,
|
|
// see the specification of proposer-based timestamps:
|
|
// https://github.com/tendermint/tendermint/tree/master/spec/consensus/proposer-based-timestamp
|
|
message SynchronyParams {
|
|
// message_delay bounds how long a proposal message may take to reach all validators on a newtork
|
|
// and still be considered valid.
|
|
google.protobuf.Duration message_delay = 1 [(gogoproto.stdduration) = true];
|
|
// precision bounds how skewed a proposer's clock may be from any validator
|
|
// on the network while still producing valid proposals.
|
|
google.protobuf.Duration precision = 2 [(gogoproto.stdduration) = true];
|
|
}
|
|
|
|
// TimeoutParams configure the timeouts for the steps of the Tendermint consensus algorithm.
|
|
message TimeoutParams {
|
|
// These fields configure the timeouts for the propose step of the Tendermint
|
|
// consensus algorithm: propose is the initial timeout and propose_delta
|
|
// determines how much the timeout grows in subsequent rounds.
|
|
// For the first round, this propose timeout is used and for every subsequent
|
|
// round, the timeout grows by propose_delta.
|
|
//
|
|
// For example:
|
|
// With propose = 10ms, propose_delta = 5ms, the first round's propose phase
|
|
// timeout would be 10ms, the second round's would be 15ms, the third 20ms and so on.
|
|
//
|
|
// If a node waiting for a proposal message does not receive one matching its
|
|
// current height and round before this timeout, the node will issue a
|
|
// nil prevote for the round and advance to the next step.
|
|
google.protobuf.Duration propose = 1 [(gogoproto.stdduration) = true];
|
|
google.protobuf.Duration propose_delta = 2 [(gogoproto.stdduration) = true];
|
|
|
|
// vote along with vote_delta configure the timeout for both of the prevote and
|
|
// precommit steps of the Tendermint consensus algorithm.
|
|
//
|
|
// These parameters influence the vote step timeouts in the the same way that
|
|
// the propose and propose_delta parameters do to the proposal step.
|
|
//
|
|
// The vote timeout does not begin until a quorum of votes has been received. Once
|
|
// a quorum of votes has been seen and this timeout elapses, Tendermint will
|
|
// procced to the next step of the consensus algorithm. If Tendermint receives
|
|
// all of the remaining votes before the end of the timeout, it will proceed
|
|
// to the next step immediately.
|
|
google.protobuf.Duration vote = 3 [(gogoproto.stdduration) = true];
|
|
google.protobuf.Duration vote_delta = 4 [(gogoproto.stdduration) = true];
|
|
|
|
// commit configures how long Tendermint will wait after receiving a quorum of
|
|
// precommits before beginning consensus for the next height. This can be
|
|
// used to allow slow precommits to arrive for inclusion in the next height before progressing.
|
|
google.protobuf.Duration commit = 5 [(gogoproto.stdduration) = true];
|
|
|
|
// bypass_commit_timeout configures the node to proceed immediately to
|
|
// the next height once the node has received all precommits for a block, forgoing
|
|
// the remaining commit timeout.
|
|
// Setting bypass_commit_timeout false (the default) causes Tendermint to wait
|
|
// for the full commit timeout.
|
|
bool bypass_commit_timeout = 6;
|
|
}
|