Skip to main content
MAIN CHAIN

BPoS Voting System

BPoS (Bonded Proof of Stake) is the consensus mechanism that selects which validators produce and confirm blocks on the ELA main chain. Community members stake ELA, vote for validators, and earn rewards proportional to their stake. This page covers the technical mechanics.

Validator Lifecycle

Validator Registration

To register as a validator, submit a RegisterProducer transaction (type 0x09):

FieldDescription
OwnerKeyProducer owner's public key
NodePublicKeyNode's public key (for DPoS P2P)
NickNameDisplay name
UrlInformation URL
LocationCountry code
NetAddressNode IP:Port
StakeUntilBlock height when stake unlocks
Eligibility

Validators need 80,000+ staking rights to be eligible for block production.

Validator Management Transactions

TransactionCodePurpose
RegisterProducer0x09Register as a validator
UpdateProducer0x0bUpdate profile info
CancelProducer0x0aCancel registration
ActivateProducer0x0dReactivate after inactivity
ReturnDepositCoin0x0cReclaim deposit after cancel

Vote Weight Calculation

BPoS (After Height 1,405,000)

Vote weight uses a logarithmic time-lock multiplier — longer commitments earn more influence:

weight = log10((LockTime - CurrentBlockHeight) / 7200 * 10)
effectiveVotes = stakedELA * weight

Where 7200 blocks is approximately 10 days at 2-minute block time.

Legacy DPoS v1 (Before Height 1,405,000)

Vote weight equaled the raw ELA amount. No time-locking.

BPoS Staking Transactions

TransactionCodePurpose
ExchangeVotes0x62Convert ELA to stake votes
Voting0x63Cast BPoS votes with lock time
ReturnVotes0x64Return staked votes
VotesRealWithdraw0x65Execute vote return
DposV2ClaimReward0x60Claim voter rewards
DposV2ClaimRewardRealWithdraw0x61Execute reward withdrawal

Validator Selection

Every election round, the validator set is recalculated by ranking all validators by total staking rights:

Configuration:

  • ~70 community-elected validators (variable; see nodes.elastos.net)
  • 12 Council validators (always active, claimed by council members)
  • Backup candidates fill in on failures via ForceChange()

Block Production Rotation

Validators take turns proposing blocks by rotating a duty index:

  1. On-duty validator broadcasts a DPOSProposal with the block hash
  2. Other validators validate and broadcast DPOSProposalVote (accept/reject)
  3. When 2/3+1 of active validators vote to accept, a Confirm is formed
  4. The confirmed block is final — no reorganization is possible

Inactivity Penalties

ConditionConsequence
Missed 1,440+ duty rounds (~2 days)Producer enters Inactive state
Double signing / conflicting proposals200 ELA deducted from deposit; can re-register by posting a new deposit
Evidence submittedPermanent on-chain record of misbehavior

Staking via NFT Tickets

When users stake ELA for BPoS, they receive NFT tickets on ESC via the StakeTicket contract:

  1. User stakes ELA on the main chain
  2. User calls StakeTicket.claim() on ESC with the main chain tx hash
  3. Contract verifies multi-sig via precompiled contract at address 1003
  4. An ERC-721 NFT is minted representing the stake position

Relevant ESC precompiles:

AddressPurpose
1000Current active BPoS validators
1003Pledge bill multi-sig verification
1004Main chain tx to NFT token ID mapping
1005Full NFT metadata
1006BPoS NFT payload version