Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
var Protocol = Global{ SmallLambda: 2000 * time.Millisecond, BigLambda: 15000 * time.Millisecond, }
Protocol holds the global configuration settings for the agreement protocol, initialized with our current defaults. This is used across all nodes we create.
Functions ¶
This section is empty.
Types ¶
type BonusPlan ¶ added in v2.5.0
type BonusPlan struct {
// BaseRound is the earliest round this plan can apply. Of course, the
// consensus update must also have happened. So using a low value makes it
// go into effect immediately upon upgrade.
BaseRound uint64
// BaseAmount is the bonus to be paid when this plan first applies (see
// baseRound). If it is zero, then no explicit change is made to the bonus
// (useful for only changing the decay rate).
BaseAmount uint64
// DecayInterval is the time in rounds between 1% decays. For simplicity,
// decay occurs based on round % BonusDecayInterval, so a decay can happen right
// after going into effect. The BonusDecayInterval goes into effect at upgrade
// time, regardless of `baseRound`.
DecayInterval uint64
}
BonusPlan describes how the "extra" proposer payouts are to be made. It specifies an exponential decay in which the bonus decreases by 1% every n rounds. If we need to change the decay rate (only), we would create a new plan like:
BaseAmount: 0, DecayInterval: XXX
by using a zero baseAmount, the amount is not affected. For a bigger change, we'd use a plan like:
BaseRound: <FUTURE round>, BaseAmount: <new amount>, DecayInterval: <new>
or just
BaseAmount: <new amount>, DecayInterval: <new>
the new decay rate would go into effect at upgrade time, and the new amount would be set at baseRound or at upgrade time.
type ConsensusParams ¶
type ConsensusParams struct {
// Consensus protocol upgrades. Votes for upgrades are collected for
// UpgradeVoteRounds. If the number of positive votes is over
// UpgradeThreshold, the proposal is accepted.
//
// UpgradeVoteRounds needs to be long enough to collect an
// accurate sample of participants, and UpgradeThreshold needs
// to be high enough to ensure that there are sufficient participants
// after the upgrade.
//
// A consensus protocol upgrade may specify the delay between its
// acceptance and its execution. This gives clients time to notify
// users. This delay is specified by the upgrade proposer and must
// be between MinUpgradeWaitRounds and MaxUpgradeWaitRounds (inclusive)
// in the old protocol's parameters. Note that these parameters refer
// to the representation of the delay in a block rather than the actual
// delay: if the specified delay is zero, it is equivalent to
// DefaultUpgradeWaitRounds.
//
// The maximum length of a consensus version string is
// MaxVersionStringLen.
UpgradeVoteRounds uint64
UpgradeThreshold uint64
DefaultUpgradeWaitRounds uint64
MinUpgradeWaitRounds uint64
MaxUpgradeWaitRounds uint64
MaxVersionStringLen int
// MaxTxnBytesPerBlock determines the maximum number of bytes
// that transactions can take up in a block. Specifically,
// the sum of the lengths of encodings of each transaction
// in a block must not exceed MaxTxnBytesPerBlock.
MaxTxnBytesPerBlock int
// MaxTxnBytesPerBlock is the maximum size of a transaction's Note field.
MaxTxnNoteBytes int
// MaxTxnLife is how long a transaction can be live for:
// the maximum difference between LastValid and FirstValid.
//
// Note that in a protocol upgrade, the ledger must first be upgraded
// to hold more past blocks for this value to be raised.
MaxTxnLife uint64
// ApprovedUpgrades describes the upgrade proposals that this protocol
// implementation will vote for, along with their delay value
// (in rounds). A delay value of zero is the same as a delay of
// DefaultUpgradeWaitRounds.
ApprovedUpgrades map[protocol.ConsensusVersion]uint64
// SupportGenesisHash indicates support for the GenesisHash
// fields in transactions (and requires them in blocks).
SupportGenesisHash bool
// RequireGenesisHash indicates that GenesisHash must be present
// in every transaction.
RequireGenesisHash bool
// DefaultKeyDilution specifies the granularity of top-level ephemeral
// keys. KeyDilution is the number of second-level keys in each batch,
// signed by a top-level "batch" key. The default value can be
// overridden in the account state.
DefaultKeyDilution uint64
// MinBalance specifies the minimum balance that can appear in
// an account. To spend money below MinBalance requires issuing
// an account-closing transaction, which transfers all of the
// money from the account, and deletes the account state.
MinBalance uint64
// MinTxnFee specifies the minimum fee allowed on a transaction.
// A minimum fee is necessary to prevent DoS. In some sense this is
// a way of making the spender subsidize the cost of storing this transaction.
MinTxnFee uint64
// EnableFeePooling specifies that the sum of the fees in a
// group must exceed one MinTxnFee per Txn, rather than check that
// each Txn has a MinFee.
EnableFeePooling bool
// EnableAppCostPooling specifies that the sum of fees for application calls
// in a group is checked against the sum of the budget for application calls,
// rather than check each individual app call is within the budget.
EnableAppCostPooling bool
// EnableLogicSigCostPooling specifies LogicSig budgets are pooled across a
// group. The total available is len(group) * LogicSigMaxCost
EnableLogicSigCostPooling bool
// EnableLogicSigSizePooling specifies LogicSig sizes are pooled across a
// group. The total available is len(group) * LogicSigMaxSize
EnableLogicSigSizePooling bool
// RewardUnit specifies the number of MicroAlgos corresponding to one reward
// unit.
//
// Rewards are received by whole reward units. Fractions of
// RewardUnits do not receive rewards.
//
// Ensure both considerations below are taken into account if RewardUnit is planned for change:
// 1. RewardUnits should not be changed without touching all accounts to apply their rewards
// based on the old RewardUnits and then use the new RewardUnits for all subsequent calculations.
// 2. Having a consistent RewardUnit is also important for preserving
// a constant amount of total algos in the system:
// the block header tracks how many reward units worth of algos are in existence
// and have logically received rewards.
RewardUnit uint64
// RewardsRateRefreshInterval is the number of rounds after which the
// rewards level is recomputed for the next RewardsRateRefreshInterval rounds.
RewardsRateRefreshInterval uint64
// seed-related parameters
SeedLookback uint64 // how many blocks back we use seeds from in sortition. delta_s in the spec
SeedRefreshInterval uint64 // how often an old block hash is mixed into the seed. delta_r in the spec
// ledger retention policy
MaxBalLookback uint64 // (current round - MaxBalLookback) is the oldest round the ledger must answer balance queries for
// sortition threshold factors
NumProposers uint64
SoftCommitteeSize uint64
SoftCommitteeThreshold uint64
CertCommitteeSize uint64
CertCommitteeThreshold uint64
NextCommitteeSize uint64 // for any non-FPR votes >= deadline step, committee sizes and thresholds are constant
NextCommitteeThreshold uint64
LateCommitteeSize uint64
LateCommitteeThreshold uint64
RedoCommitteeSize uint64
RedoCommitteeThreshold uint64
DownCommitteeSize uint64
DownCommitteeThreshold uint64
// time for nodes to wait for block proposal headers for period > 0, value should be set to 2 * SmallLambda
AgreementFilterTimeout time.Duration
// time for nodes to wait for block proposal headers for period = 0, value should be configured to suit best case
// critical path
AgreementFilterTimeoutPeriod0 time.Duration
// Duration of the second agreement step for period=0, value should be configured to suit best case critical path
AgreementDeadlineTimeoutPeriod0 time.Duration
FastRecoveryLambda time.Duration // time between fast recovery attempts
// how to commit to the payset: flat or merkle tree
PaysetCommit PaysetCommitType
MaxTimestampIncrement int64 // maximum time between timestamps on successive blocks
// support for the efficient encoding in SignedTxnInBlock
SupportSignedTxnInBlock bool
// force the FeeSink address to be non-participating in the genesis balances.
ForceNonParticipatingFeeSink bool
// support for ApplyData in SignedTxnInBlock
ApplyData bool
// track reward distributions in ApplyData
RewardsInApplyData bool
// domain-separated credentials
CredentialDomainSeparationEnabled bool
// support for transactions that mark an account non-participating
SupportBecomeNonParticipatingTransactions bool
// fix the rewards calculation by avoiding subtracting too much from the rewards pool
PendingResidueRewards bool
// asset support
Asset bool
// max number of assets per account
MaxAssetsPerAccount int
// max length of asset name
MaxAssetNameBytes int
// max length of asset unit name
MaxAssetUnitNameBytes int
// max length of asset url
MaxAssetURLBytes int
// support sequential transaction counter TxnCounter
TxnCounter bool
// transaction groups
SupportTxGroups bool
// max group size
MaxTxGroupSize int
// support for transaction leases
// note: if FixTransactionLeases is not set, the transaction
// leases supported are faulty; specifically, they do not
// enforce exclusion correctly when the FirstValid of
// transactions do not match.
SupportTransactionLeases bool
FixTransactionLeases bool
// 0 for no support, otherwise highest version supported
LogicSigVersion uint64
// len(LogicSig.Logic) + len(LogicSig.Args[*]) must be less than this (unless pooling is enabled)
LogicSigMaxSize uint64
// sum of estimated op cost must be less than this
LogicSigMaxCost uint64
LogicSigMsig bool
LogicSigLMsig bool
// max decimal precision for assets
MaxAssetDecimals uint32
// SupportRekeying indicates support for account rekeying (the RekeyTo and AuthAddr fields)
SupportRekeying bool
// application support
Application bool
// max number of ApplicationArgs for an ApplicationCall transaction
MaxAppArgs int
// max sum([len(arg) for arg in txn.ApplicationArgs])
MaxAppTotalArgLen int
// maximum byte len of application approval program or clear state
// When MaxExtraAppProgramPages > 0, this is the size of those pages.
// So two "extra pages" would mean 3*MaxAppProgramLen bytes are available.
MaxAppProgramLen int
// maximum total length of an application's programs (approval + clear state)
// When MaxExtraAppProgramPages > 0, this is the size of those pages.
// So two "extra pages" would mean 3*MaxAppTotalProgramLen bytes are available.
MaxAppTotalProgramLen int
// extra length for application program in pages. A page is MaxAppProgramLen bytes
MaxExtraAppProgramPages int
// maximum number of accounts in the ApplicationCall Accounts field.
// this determines, in part, the maximum number of balance records
// accessed by a single transaction
MaxAppTxnAccounts int
// maximum number of app ids in the ApplicationCall ForeignApps field.
// these are the only applications besides the called application for
// which global state may be read in the transaction
MaxAppTxnForeignApps int
// maximum number of asset ids in the ApplicationCall ForeignAssets
// field. these are the only assets for which the asset parameters may
// be read in the transaction
MaxAppTxnForeignAssets int
// maximum number of "foreign references" (accounts, asa, app, boxes) that
// can be attached to a single app call. Modern transactions can use
// MaxAppAccess references in txn.Access to access more.
MaxAppTotalTxnReferences int
// maximum cost of application approval program or clear state program
MaxAppProgramCost int
// maximum length of a key used in an application's global or local
// key/value store
MaxAppKeyLen int
// maximum length of a bytes value used in an application's global or
// local key/value store
MaxAppBytesValueLen int
// maximum sum of the lengths of the key and value of one app state entry
MaxAppSumKeyValueLens int
// maximum number of inner transactions that can be created by an app call.
// with EnableInnerTransactionPooling, limit is multiplied by MaxTxGroupSize
// and enforced over the whole group.
MaxInnerTransactions int
// should the number of inner transactions be pooled across group?
EnableInnerTransactionPooling bool
// provide greater isolation for clear state programs
IsolateClearState bool
// The minimum app version that can be called in an inner transaction
MinInnerApplVersion uint64
// maximum number of applications a single account can create and store
// AppParams for at once
MaxAppsCreated int
// maximum number of applications a single account can opt in to and
// store AppLocalState for at once
MaxAppsOptedIn int
// flat MinBalance requirement for creating a single application and
// storing its AppParams
AppFlatParamsMinBalance uint64
// flat MinBalance requirement for opting in to a single application
// and storing its AppLocalState
AppFlatOptInMinBalance uint64
// MinBalance requirement per key/value entry in LocalState or
// GlobalState key/value stores, regardless of value type
SchemaMinBalancePerEntry uint64
// MinBalance requirement (in addition to SchemaMinBalancePerEntry) for
// integer values stored in LocalState or GlobalState key/value stores
SchemaUintMinBalance uint64
// MinBalance requirement (in addition to SchemaMinBalancePerEntry) for
// []byte values stored in LocalState or GlobalState key/value stores
SchemaBytesMinBalance uint64
// Maximum length of a box (Does not include name/key length. That is capped by MaxAppKeyLen)
MaxBoxSize uint64
// Minimum Balance Requirement (MBR) per box created (this accounts for a
// bit of overhead used to store the box bytes)
BoxFlatMinBalance uint64
// MBR per byte of box storage. MBR is incremented by BoxByteMinBalance * (len(name)+len(value))
BoxByteMinBalance uint64
// Number of box references allowed
MaxAppBoxReferences int
// Number of references allowed in txn.Access
MaxAppAccess int
// Amount added to a txgroup's box I/O budget per box ref supplied.
// For reads: the sum of the sizes of all boxes in the group must be less than I/O budget
// For writes: the sum of the sizes of all boxes created or written must be less than I/O budget
// In both cases, what matters is the sizes of the boxes touched, not the
// number of times they are touched, or the size of the touches.
BytesPerBoxReference uint64
// maximum number of total key/value pairs allowed by a given
// LocalStateSchema (and therefore allowed in LocalState)
MaxLocalSchemaEntries uint64
// maximum number of total key/value pairs allowed by a given
// GlobalStateSchema (and therefore allowed in GlobalState)
MaxGlobalSchemaEntries uint64
// maximum total minimum balance requirement for an account, used
// to limit the maximum size of a single balance record
MaximumMinimumBalance uint64
// StateProofInterval defines the frequency with which state
// proofs are generated. Every round that is a multiple
// of StateProofInterval, the block header will include a vector
// commitment to the set of online accounts (that can vote after
// another StateProofInterval rounds), and that block will be signed
// (forming a state proof) by the voters from the previous
// such vector commitment. A value of zero means no state proof.
StateProofInterval uint64
// StateProofTopVoters is a bound on how many online accounts get to
// participate in forming the state proof, by including the
// top StateProofTopVoters accounts (by normalized balance) into the
// vector commitment.
StateProofTopVoters uint64
// StateProofVotersLookback is the number of blocks we skip before
// publishing a vector commitment to the online accounts. Namely,
// if block number N contains a vector commitment to the online
// accounts (which, incidentally, means N%StateProofInterval=0),
// then the balances reflected in that commitment must come from
// block N-StateProofVotersLookback. This gives each node some
// time (StateProofVotersLookback blocks worth of time) to
// construct this vector commitment, so as to avoid placing the
// construction of this vector commitment (and obtaining the requisite
// accounts and balances) in the critical path.
StateProofVotersLookback uint64
// StateProofWeightThreshold specifies the fraction of top voters weight
// that must sign the message (block header) for security. The state
// proof ensures this threshold holds; however, forming a valid
// state proof requires a somewhat higher number of signatures,
// and the more signatures are collected, the smaller the state proof
// can be.
//
// This threshold can be thought of as the maximum fraction of
// malicious weight that state proofs defend against.
//
// The threshold is computed as StateProofWeightThreshold/(1<<32).
StateProofWeightThreshold uint32
// StateProofStrengthTarget represents either k+q (for pre-quantum security) or k+2q (for post-quantum security)
StateProofStrengthTarget uint64
// StateProofMaxRecoveryIntervals represents the number of state proof intervals that the network will try to catch-up with.
// When the difference between the latest state proof and the current round will be greater than value, Nodes will
// release resources allocated for creating state proofs.
StateProofMaxRecoveryIntervals uint64
// StateProofExcludeTotalWeightWithRewards specifies whether to subtract rewards from excluded online accounts along with
// their account balances.
StateProofExcludeTotalWeightWithRewards bool
// StateProofBlockHashInLightHeader specifies that the LightBlockHeader
// committed to by state proofs should contain the BlockHash of each
// block, instead of the seed.
StateProofBlockHashInLightHeader bool
// EnableAssetCloseAmount adds an extra field to the ApplyData. The field contains the amount of the remaining
// asset that were sent to the close-to address.
EnableAssetCloseAmount bool
// update the initial rewards rate calculation to take the reward pool minimum balance into account
InitialRewardsRateCalculation bool
// NoEmptyLocalDeltas updates how ApplyDelta.EvalDelta.LocalDeltas are stored
NoEmptyLocalDeltas bool
// EnableKeyregCoherencyCheck enable the following extra checks on key registration transactions:
// 1. checking that [VotePK/SelectionPK/VoteKeyDilution] are all set or all clear.
// 2. checking that the VoteFirst is less or equal to VoteLast.
// 3. checking that in the case of going offline, both the VoteFirst and VoteLast are clear.
// 4. checking that in the case of going online the VoteLast is non-zero and greater then the current network round.
// 5. checking that in the case of going online the VoteFirst is less or equal to the LastValid+1.
// 6. checking that in the case of going online the VoteFirst is less or equal to the next network round.
EnableKeyregCoherencyCheck bool
// When extra pages were introduced, a bug prevented the extra pages of an
// app from being properly removed from the creator upon deletion.
EnableProperExtraPageAccounting bool
// Autoincrements an app's version when the app is updated, careful callers
// may avoid making inner calls to apps that have changed.
EnableAppVersioning bool
// MaxProposedExpiredOnlineAccounts is the maximum number of online accounts
// that a proposer can take offline for having expired voting keys.
MaxProposedExpiredOnlineAccounts int
// EnableLedgerDataUpdateRound enables the support for setting the UpdateRound on account and
// resource data in the ledger. The UpdateRound is encoded in account/resource data types used
// on disk and in catchpoint snapshots, and also used to construct catchpoint merkle trie keys,
// but does not appear in on-chain state.
EnableLedgerDataUpdateRound bool
// When rewards rate changes, use the new value immediately.
RewardsCalculationFix bool
// EnableStateProofKeyregCheck enables the check for stateProof key on key registration
EnableStateProofKeyregCheck bool
// MaxKeyregValidPeriod defines the longest period (in rounds) allowed for a keyreg transaction.
// This number sets a limit to prevent the number of StateProof keys generated by the user from being too large, and also checked by the WellFormed method.
// The hard-limit for number of StateProof keys is derived from the maximum depth allowed for the merkle signature scheme's tree - 2^16.
// More keys => deeper merkle tree => longer proof required => infeasible for our SNARK.
MaxKeyregValidPeriod uint64
// UnifyInnerTxIDs enables a consistent, unified way of computing inner transaction IDs
UnifyInnerTxIDs bool
// EnableSHA256TxnCommitmentHeader enables the creation of a transaction vector commitment tree using SHA256 hash function. (vector commitment extends Merkle tree by having a position binding property).
// This new header is in addition to the existing SHA512_256 merkle root.
// It is useful for verifying transaction on different blockchains, as some may not support SHA512_256 OPCODE natively but SHA256 is common.
EnableSHA256TxnCommitmentHeader bool
// CatchpointLookback specifies a round lookback to take catchpoints at.
// Accounts snapshot for round X will be taken at X-CatchpointLookback
CatchpointLookback uint64
// DeeperBlockHeaderHistory defines number of rounds in addition to MaxTxnLife
// available for lookup for smart contracts and smart signatures.
// Setting it to 1 for example allows querying data up to MaxTxnLife + 1 rounds back from the Latest.
DeeperBlockHeaderHistory uint64
// UnfundedSenders ensures that accounts with no balance (so they don't even
// "exist") can still be a transaction sender by avoiding updates to rewards
// state for accounts with no algos. The actual change implemented to allow
// this is to avoid updating an account if the only change would have been
// the rewardsLevel, but the rewardsLevel has no meaning because the account
// has fewer than RewardUnit algos.
UnfundedSenders bool
// EnablePrecheckECDSACurve means that ecdsa_verify opcode will bail early,
// returning false, if pubkey is not on the curve.
EnablePrecheckECDSACurve bool
// EnableBareBudgetError specifies that I/O budget overruns should not be considered EvalError
EnableBareBudgetError bool
// StateProofUseTrackerVerification specifies whether the node will use data from state proof verification tracker
// in order to verify state proofs.
StateProofUseTrackerVerification bool
// EnableCatchpointsWithSPContexts specifies when to re-enable version 7 catchpoints.
// Version 7 includes state proof verification contexts
EnableCatchpointsWithSPContexts bool
// EnableCatchpointsWithOnlineAccounts specifies when to enable version 8 catchpoints.
// Version 8 includes onlineaccounts and onlineroundparams amounts, for historical stake lookups.
EnableCatchpointsWithOnlineAccounts bool
// AppForbidLowResources enforces a rule that prevents apps from accessing
// asas and apps below 256, in an effort to decrease the ambiguity of
// opcodes that accept IDs or slot indexes. Simultaneously, the first ID
// allocated in new chains is raised to 1001.
AppForbidLowResources bool
// EnableBoxRefNameError specifies that box ref names should be validated early
EnableBoxRefNameError bool
// EnableUnnamedBoxAccessInNewApps allows newly created (in this group) apps to
// create boxes that were not named in a box ref. Each empty box ref in the
// group allows one such creation.
EnableUnnamedBoxAccessInNewApps bool
// ExcludeExpiredCirculation excludes expired stake from the total online stake
// used by agreement for Circulation, and updates the calculation of StateProofOnlineTotalWeight used
// by state proofs to use the same method (rather than excluding stake from the top N stakeholders as before).
ExcludeExpiredCirculation bool
// DynamicFilterTimeout indicates whether the filter timeout is set
// dynamically, at run time, according to the recent history of credential
// arrival times or is set to a static value. Even if this flag disables the
// dynamic filter, it will be calculated and logged (but not used).
DynamicFilterTimeout bool
// Payouts contains parameters for amounts and eligibility for block proposer
// payouts. It excludes information about the "unsustainable" payouts
// described in BonusPlan.
Payouts ProposerPayoutRules
// Bonus contains parameters related to the extra payout made to block
// proposers, unrelated to the fees paid in that block. For it to actually
// occur, extra funds need to be put into the FeeSink. The bonus amount
// decays exponentially.
Bonus BonusPlan
// Heartbeat support
Heartbeat bool
// EnableSha512BlockHash adds an additional SHA-512 hash to the block header.
EnableSha512BlockHash bool
// EnableInnerClawbackWithoutSenderHolding allows an inner clawback (axfer
// w/ AssetSender) even if the Sender holding of the asset is not
// available. This parameters can be removed and assumed true after the
// first consensus release in which it is set true.
EnableInnerClawbackWithoutSenderHolding bool
}
ConsensusParams specifies settings that might vary based on the particular version of the consensus protocol.
type ConsensusProtocols ¶
type ConsensusProtocols map[protocol.ConsensusVersion]ConsensusParams
ConsensusProtocols defines a set of supported protocol versions and their corresponding parameters.
var Consensus ConsensusProtocols
Consensus tracks the protocol-level settings for different versions of the consensus protocol.
type Global ¶
type Global struct {
SmallLambda time.Duration // min amount of time to wait for leader's credential (i.e., time to propagate one credential)
BigLambda time.Duration // max amount of time to wait for leader's proposal (i.e., time to propagate one block)
}
Global defines global Algorand protocol parameters which should not be overridden.
type PaysetCommitType ¶
type PaysetCommitType int
PaysetCommitType enumerates possible ways for the block header to commit to the set of transactions in the block.
const ( // PaysetCommitUnsupported is the zero value, reflecting the fact // that some early protocols used a Merkle tree to commit to the // transactions in a way that we no longer support. PaysetCommitUnsupported PaysetCommitType = iota // PaysetCommitFlat hashes the entire payset array. PaysetCommitFlat // PaysetCommitMerkle uses merkle array to commit to the payset. PaysetCommitMerkle )
type ProposerPayoutRules ¶ added in v2.5.0
type ProposerPayoutRules struct {
// Enabled turns on several things needed for paying block incentives,
// including tracking of the proposer and fees collected.
Enabled bool
// GoOnlineFee imparts a small cost on moving from offline to online. This
// will impose a cost to running unreliable nodes that get suspended and
// then come back online.
GoOnlineFee uint64
// Percent specifies the percent of fees paid in a block that go to the
// proposer instead of the FeeSink.
Percent uint64
// MinBalance is the minimum balance an account must have to be eligible for
// incentives. It ensures that smaller accounts continue to operate for the
// same motivations they had before block incentives were
// introduced. Without that assurance, it is difficult to model their
// behaviour - might many participants join for the hope of easy financial
// rewards, but without caring enough to run a high-quality node?
MinBalance uint64
// MaxBalance is the maximum balance an account can have to be eligible for
// incentives. It encourages large accounts to split their stake to add
// resilience to consensus in the case of outages. Nothing in protocol can
// prevent such accounts from running nodes that share fate (same machine,
// same data center, etc), but this serves as a gentle reminder.
MaxBalance uint64
// MaxMarkAbsent is the maximum number of online accounts, that a proposer
// can suspend for not proposing "lately" (In 10x expected interval, or
// within a grace period from being challenged)
MaxMarkAbsent int
// Challenges occur once every challengeInterval rounds.
ChallengeInterval uint64
// Suspensions happen between 1 and 2 grace periods after a challenge. Must
// be less than half MaxTxnLife to ensure the Block header will be cached
// and less than half ChallengeInterval to avoid overlapping challenges. A larger
// grace period means larger stake nodes will probably propose before they
// need to consider an active heartbeat.
ChallengeGracePeriod uint64
// An account is challenged if the first challengeBits match the start of
// the account address. An online account will be challenged about once
// every interval*2^bits rounds.
ChallengeBits int
}
ProposerPayoutRules puts several related consensus parameters in one place. The same care for backward compatibility with old blocks must be taken.