dpos

package
v0.0.0-...-9ac19d9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 22, 2019 License: GPL-3.0 Imports: 24 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrIllegalCandidateName   = errors.New("illegal candidate name")
	ErrIllegalCandidatePubKey = errors.New("illegal candidate pubkey")
	ErrTooMuchRreversible     = errors.New("too much rreversible blocks")
	ErrSystemTakeOver         = errors.New("system account take over")
)
View Source
var (
	// CandidateKeyPrefix candidateInfo
	CandidateKeyPrefix = "p"
	// CandidateHead all candidate key
	CandidateHead = "s"
	// ActivatedCandidateKeyPrefix candidateInfo
	ActivatedCandidateKeyPrefix = "ap"

	// VoterKeyPrefix voterInfo
	VoterKeyPrefix = "v"
	// VoterHead head
	VoterHead = "v"

	// TakeOver key
	TakeOver = "takeover"

	// StateKeyPrefix globalState
	StateKeyPrefix = "s"
	// LastestStateKey lastest
	LastestStateKey = "lastest"

	// Separator Split characters
	Separator = "_"
)
View Source
var DefaultConfig = &Config{
	MaxURLLen:                     512,
	UnitStake:                     big.NewInt(1000),
	CandidateMinQuantity:          big.NewInt(10),
	CandidateAvailableMinQuantity: big.NewInt(10),
	VoterMinQuantity:              big.NewInt(2),
	ActivatedMinCandidate:         3,
	ActivatedMinQuantity:          big.NewInt(100),
	BlockInterval:                 3000,
	BlockFrequency:                6,
	CandidateScheduleSize:         3,
	BackupScheduleSize:            0,
	EpochInterval:                 1080000,
	FreezeEpochSize:               3,
	AccountName:                   "ftsystemdpos",
	SystemName:                    "ftsystemio",
	SystemURL:                     "www.fractalproject.com",
	ExtraBlockReward:              big.NewInt(1),
	BlockReward:                   big.NewInt(5),
	Decimals:                      18,
	AssetID:                       1,
	ReferenceTime:                 1555776000000 * uint64(time.Millisecond),
}

DefaultConfig configures

View Source
var (
	InvalidIndex = uint64(math.MaxUint64)
)

Functions

func Genesis

func Genesis(cfg *Config, state *state.StateDB, timestamp uint64, number uint64) error

Genesis dpos genesis store

Types

type API

type API struct {
	// contains filtered or unexported fields
}

API exposes dpos related methods for the RPC interface.

func (*API) AvailableStake

func (api *API) AvailableStake(epoch uint64, voter string) (*big.Int, error)

AvailableStake get available stake that can vote candidate

func (*API) BrowserAllEpoch

func (api *API) BrowserAllEpoch() (interface{}, error)

func (*API) BrowserEpochRecord

func (api *API) BrowserEpochRecord(reqEpochNumber uint64) (interface{}, error)

func (*API) BrowserVote

func (api *API) BrowserVote(reqEpochNumber uint64) (interface{}, error)

func (*API) Candidate

func (api *API) Candidate(epoch uint64, name string) (interface{}, error)

Candidate get candidate info

func (*API) Candidates

func (api *API) Candidates(epoch uint64, detail bool) (interface{}, error)

Candidates get all candidates info

func (*API) CandidatesSize

func (api *API) CandidatesSize(epoch uint64) (uint64, error)

CandidatesSize get candidates size

func (*API) Epoch

func (api *API) Epoch(height uint64) (uint64, error)

Epoch get epoch number by height

func (*API) GetActivedCandidate

func (api *API) GetActivedCandidate(epoch uint64, index uint64) (interface{}, error)

GetActivedCandidate get actived candidate info

func (*API) GetActivedCandidateSize

func (api *API) GetActivedCandidateSize(epoch uint64) (uint64, error)

GetActivedCandidateSize get actived candidate size

func (*API) Info

func (api *API) Info() interface{}

Info get dpos config info

func (*API) Irreversible

func (api *API) Irreversible() interface{}

Irreversible get irreversible info

func (*API) NextEpoch

func (api *API) NextEpoch(epoch uint64) (uint64, error)

NextEpoch get next epoch number by epoch

func (*API) NextValidCandidates

func (api *API) NextValidCandidates() (interface{}, error)

NextValidCandidates next valid candidates

func (*API) PrevEpoch

func (api *API) PrevEpoch(epoch uint64) (uint64, error)

PrevEpoch get prev epoch number by epoch

func (*API) SnapShotStake

func (api *API) SnapShotStake(epoch uint64, name string) (interface{}, error)

SnapShotStake get snapshot stake

func (*API) SnapShotTime

func (api *API) SnapShotTime(epoch uint64) (interface{}, error)

SnapShotTime get snapshot timestamp

func (*API) ValidCandidates

func (api *API) ValidCandidates(epoch uint64) (interface{}, error)

ValidCandidates get valid candidates

func (*API) VotersByCandidate

func (api *API) VotersByCandidate(epoch uint64, candidate string, detail bool) (interface{}, error)

VotersByCandidate get voters info of candidate

func (*API) VotersByVoter

func (api *API) VotersByVoter(epoch uint64, voter string, detail bool) (interface{}, error)

VotersByVoter get voters info of voter

type ArrayCandidateInfoForBrowser

type ArrayCandidateInfoForBrowser struct {
	Data                        []*CandidateInfoForBrowser `json:"data"`
	BadCandidateIndexSchedule   []uint64                   `json:"bad"`
	UsingCandidateIndexSchedule []uint64                   `json:"using"`
}

ArrayCandidateInfoForBrowser dpos state

type CandidateInfo

type CandidateInfo struct {
	Epoch         uint64        `json:"epoch"`
	Name          string        `json:"name"`          // candidate name
	URL           string        `json:"url"`           // candidate url
	Quantity      *big.Int      `json:"quantity"`      // candidate stake quantity
	TotalQuantity *big.Int      `json:"totalQuantity"` // candidate total stake quantity
	Number        uint64        `json:"number"`        // timestamp
	Counter       uint64        `json:"shouldCounter"`
	ActualCounter uint64        `json:"actualCounter"`
	Type          CandidateType `json:"type"`
	PrevKey       string        `json:"-"`
	NextKey       string        `json:"-"`
}

CandidateInfo info

type CandidateInfoArray

type CandidateInfoArray []*CandidateInfo

CandidateInfoArray array of candidate

func (CandidateInfoArray) Len

func (prods CandidateInfoArray) Len() int

func (CandidateInfoArray) Less

func (prods CandidateInfoArray) Less(i, j int) bool

func (CandidateInfoArray) Swap

func (prods CandidateInfoArray) Swap(i, j int)

type CandidateInfoForBrowser

type CandidateInfoForBrowser struct {
	Candidate        string `json:"candidate"`
	Holder           string `json:"holder"`
	Quantity         string `json:"quantity"`
	TotalQuantity    string `json:"totalQuantity"`
	Counter          uint64 `json:"shouldCounter"`
	ActualCounter    uint64 `json:"actualCounter"`
	NowCounter       uint64 `json:"nowShouldCounter"`
	NowActualCounter uint64 `json:"nowActualCounter"`
}

CandidateInfoForBrowser dpos state

type CandidateType

type CandidateType uint64
const (
	Normal CandidateType = iota
	Freeze
	Black
	Jail
	Unkown
)

func (CandidateType) MarshalJSON

func (t CandidateType) MarshalJSON() ([]byte, error)

MarshalJSON returns the hex representation of a.

func (CandidateType) MarshalText

func (t CandidateType) MarshalText() ([]byte, error)

MarshalText returns the hex representation of a.

func (*CandidateType) UnmarshalJSON

func (t *CandidateType) UnmarshalJSON(data []byte) error

UnmarshalJSON parses a type in syntax.

func (*CandidateType) UnmarshalText

func (t *CandidateType) UnmarshalText(input []byte) error

UnmarshalText parses a hash in syntax.

type Config

type Config struct {
	// consensus fileds
	MaxURLLen                     uint64   `json:"maxURLLen"`                     // url length
	UnitStake                     *big.Int `json:"unitStake"`                     // state unit
	CandidateMinQuantity          *big.Int `json:"candidateMinQuantity"`          // min quantity
	CandidateAvailableMinQuantity *big.Int `json:"candidateAvailableMinQuantity"` // min quantity
	VoterMinQuantity              *big.Int `json:"voterMinQuantity"`              // min quantity
	ActivatedMinCandidate         uint64   `json:"activatedMinCandidate"`
	ActivatedMinQuantity          *big.Int `json:"activatedMinQuantity"` // min active quantity
	BlockInterval                 uint64   `json:"blockInterval"`
	BlockFrequency                uint64   `json:"blockFrequency"`
	CandidateScheduleSize         uint64   `json:"candidateScheduleSize"`
	BackupScheduleSize            uint64   `json:"backupScheduleSize"`
	EpochInterval                 uint64   `json:"epochInterval"`
	FreezeEpochSize               uint64   `json:"freezeEpochSize"`
	AccountName                   string   `json:"accountName"`
	SystemName                    string   `json:"systemName"`
	SystemURL                     string   `json:"systemURL"`
	ExtraBlockReward              *big.Int `json:"extraBlockReward"`
	BlockReward                   *big.Int `json:"blockReward"`
	Decimals                      uint64   `json:"decimals"`
	AssetID                       uint64   `json:"assetID"`
	ReferenceTime                 uint64   `json:"referenceTime"`
	// contains filtered or unexported fields
}

Config dpos configures

func (*Config) IsValid

func (cfg *Config) IsValid() error

type Dpos

type Dpos struct {
	// contains filtered or unexported fields
}

Dpos dpos engine

func New

func New(config *Config, chain consensus.IChainReader) *Dpos

New creates a DPOS consensus engine

func (*Dpos) APIs

func (dpos *Dpos) APIs(chain consensus.IChainReader) []rpc.API

APIs returning the user facing RPC APIs.

func (*Dpos) Author

func (dpos *Dpos) Author(header *types.Header) (common.Name, error)

Author implements consensus.Engine, returning the header's coinbase

func (*Dpos) BlockInterval

func (dpos *Dpos) BlockInterval() uint64

BlockInterval block interval

func (*Dpos) CalcBFTIrreversible

func (dpos *Dpos) CalcBFTIrreversible() uint64

CalcBFTIrreversible calc irreversible

func (*Dpos) CalcDifficulty

func (dpos *Dpos) CalcDifficulty(chain consensus.IChainReader, time uint64, parent *types.Header) *big.Int

CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty that a new block should have when created at time given the parent block's time and difficulty.

func (*Dpos) CalcProposedIrreversible

func (dpos *Dpos) CalcProposedIrreversible(chain consensus.IChainReader, parent *types.Header, strict bool) uint64

CalcProposedIrreversible calc irreversible

func (*Dpos) Config

func (dpos *Dpos) Config() *Config

Config return dpos config

func (*Dpos) Engine

func (dpos *Dpos) Engine() consensus.IEngine

Engine an engine

func (*Dpos) Finalize

func (dpos *Dpos) Finalize(chain consensus.IChainReader, header *types.Header, txs []*types.Transaction, receipts []*types.Receipt, state *state.StateDB) (*types.Block, error)

Finalize assembles the final block.

func (*Dpos) GetActivedCandidate

func (dpos *Dpos) GetActivedCandidate(state *state.StateDB, epoch uint64, index uint64) (string, *big.Int, *big.Int, uint64, uint64, uint64, bool, error)

GetActivedCandidate get actived candidate info

func (*Dpos) GetActivedCandidateSize

func (dpos *Dpos) GetActivedCandidateSize(state *state.StateDB, epoch uint64) (uint64, error)

GetActivedCandidateSize get actived candidate size

func (*Dpos) GetCandidateStake

func (dpos *Dpos) GetCandidateStake(state *state.StateDB, epoch uint64, candidate string) (*big.Int, error)

GetCandidateStake candidate delegate stake

func (*Dpos) GetDelegatedByTime

func (dpos *Dpos) GetDelegatedByTime(state *state.StateDB, candidate string, timestamp uint64) (*big.Int, error)

GetDelegatedByTime get delegate of candidate

func (*Dpos) GetEpoch

func (dpos *Dpos) GetEpoch(state *state.StateDB, t uint64, curEpoch uint64) (epoch uint64, time uint64, err error)

GetEpoch get epoch and epoch start time by type

func (*Dpos) GetVoterStake

func (dpos *Dpos) GetVoterStake(state *state.StateDB, epoch uint64, voter string, candidate string) (*big.Int, error)

GetVoterStake voter stake

func (*Dpos) IsValidateCandidate

func (dpos *Dpos) IsValidateCandidate(chain consensus.IChainReader, parent *types.Header, timestamp uint64, candidate string, pubkeys [][]byte, state *state.StateDB, force bool, fid uint64) error

IsValidateCandidate current candidate

func (*Dpos) Prepare

func (dpos *Dpos) Prepare(chain consensus.IChainReader, header *types.Header, txs []*types.Transaction, receipts []*types.Receipt, state *state.StateDB) error

Prepare initializes the consensus fields of a block header according to the rules of a particular engine. The changes are executed inline.

func (*Dpos) ProcessAction

func (dpos *Dpos) ProcessAction(fid uint64, number uint64, chainCfg *params.ChainConfig, state *state.StateDB, action *types.Action) ([]*types.InternalAction, error)

ProcessAction exec action

func (*Dpos) Seal

func (dpos *Dpos) Seal(chain consensus.IChainReader, block *types.Block, stop <-chan struct{}) (*types.Block, error)

Seal generates a new block for the given input block with the local miner's seal place on top.

func (*Dpos) SetConfig

func (dpos *Dpos) SetConfig(config *Config)

SetConfig set dpos config

func (*Dpos) SetSignFn

func (dpos *Dpos) SetSignFn(signFn SignFn)

SetSignFn set signature function

func (*Dpos) Slot

func (dpos *Dpos) Slot(timestamp uint64) uint64

Slot slot

func (*Dpos) VerifySeal

func (dpos *Dpos) VerifySeal(chain consensus.IChainReader, header *types.Header) error

VerifySeal checks whether the crypto seal on a header is valid according to the consensus rules of the given engine.

type Epoch

type Epoch struct {
	Start uint64 `json:"start"`
	Epoch uint64 `json:"epoch"`
}

type Epochs

type Epochs struct {
	Data []*Epoch `json:"data"`
}

type GlobalState

type GlobalState struct {
	Epoch                       uint64   `json:"epoch"`                       // epoch
	PreEpoch                    uint64   `json:"preEpoch"`                    // epoch
	ActivatedCandidateSchedule  []string `json:"activatedCandidateSchedule"`  // candidates
	ActivatedTotalQuantity      *big.Int `json:"activatedTotalQuantity"`      // the sum of activate candidate votes
	BadCandidateIndexSchedule   []uint64 `json:"badCandidateIndexSchedule"`   // activated backup candidates
	UsingCandidateIndexSchedule []uint64 `json:"usingCandidateIndexSchedule"` // activated backup candidates
	TotalQuantity               *big.Int `json:"totalQuantity"`               // the sum of all candidate votes
	TakeOver                    bool     `json:"takeOver"`                    // systemio take over dpos
	Dpos                        bool     `json:"dpos"`                        // dpos status
	Number                      uint64   `json:"number"`                      // timestamp
}

GlobalState dpos state

type IDB

type IDB interface {
	SetCandidate(*CandidateInfo) error
	DelCandidate(uint64, string) error
	GetCandidate(uint64, string) (*CandidateInfo, error)
	GetCandidates(uint64) (CandidateInfoArray, error)
	CandidatesSize(uint64) (uint64, error)

	SetActivatedCandidate(uint64, *CandidateInfo) error
	GetActivatedCandidate(uint64) (*CandidateInfo, error)

	SetAvailableQuantity(uint64, string, *big.Int) error
	GetAvailableQuantity(uint64, string) (*big.Int, error)

	SetVoter(*VoterInfo) error
	GetVoter(uint64, string, string) (*VoterInfo, error)
	GetVotersByVoter(uint64, string) ([]*VoterInfo, error)
	GetVotersByCandidate(uint64, string) ([]*VoterInfo, error)

	SetState(*GlobalState) error
	GetState(uint64) (*GlobalState, error)
	SetLastestEpoch(uint64) error
	GetLastestEpoch() (uint64, error)

	SetTakeOver(uint64) error
	GetTakeOver() (uint64, error)

	Undelegate(string, *big.Int) (*types.Action, error)
	IncAsset2Acct(string, string, *big.Int) (*types.Action, error)
	GetBalanceByTime(name string, timestamp uint64) (*big.Int, error)
	GetCandidateInfoByTime(epoch uint64, name string, timestamp uint64) (*CandidateInfo, error)
}

IDB dpos database

type IDatabase

type IDatabase interface {
	Get(key string) ([]byte, error)
	Put(key string, value []byte) error
	Delete(key string) error

	Undelegate(string, *big.Int) (*types.Action, error)
	IncAsset2Acct(string, string, *big.Int) (*types.Action, error)
	GetBalanceByTime(name string, timestamp uint64) (*big.Int, error)

	GetSnapshot(key string, timestamp uint64) ([]byte, error)
}

IDatabase level db

type KickedCandidate

type KickedCandidate struct {
	Candidates []string
}

KickedCandidate kicked info

type LDB

type LDB struct {
	IDatabase
}

LDB dpos level db

func NewLDB

func NewLDB(db IDatabase) (*LDB, error)

NewLDB new object

func (*LDB) CandidatesSize

func (db *LDB) CandidatesSize(epoch uint64) (uint64, error)

CandidatesSize candidate len

func (*LDB) DelCandidate

func (db *LDB) DelCandidate(epoch uint64, name string) error

DelCandidate del candidate info

func (*LDB) GetActivatedCandidate

func (db *LDB) GetActivatedCandidate(index uint64) (*CandidateInfo, error)

GetActivatedCandidate get activated candidate info

func (*LDB) GetAvailableQuantity

func (db *LDB) GetAvailableQuantity(epoch uint64, voter string) (*big.Int, error)

GetAvailableQuantity get quantity

func (*LDB) GetCandidate

func (db *LDB) GetCandidate(epoch uint64, name string) (*CandidateInfo, error)

GetCandidate get candidate info by name

func (*LDB) GetCandidateInfoByTime

func (db *LDB) GetCandidateInfoByTime(epoch uint64, candidate string, timestamp uint64) (*CandidateInfo, error)

GetCandidateInfoByTime candidate info

func (*LDB) GetCandidates

func (db *LDB) GetCandidates(epoch uint64) (CandidateInfoArray, error)

GetCandidates get all candidate info & sort

func (*LDB) GetLastestEpoch

func (db *LDB) GetLastestEpoch() (uint64, error)

GetLastestEpoch get latest epoch

func (*LDB) GetState

func (db *LDB) GetState(epoch uint64) (*GlobalState, error)

GetState get state info

func (*LDB) GetTakeOver

func (db *LDB) GetTakeOver() (uint64, error)

GetTakeOver get activated candidate info

func (*LDB) GetVoter

func (db *LDB) GetVoter(epoch uint64, voter string, candidate string) (*VoterInfo, error)

GetVoter voter info by name

func (*LDB) GetVotersByCandidate

func (db *LDB) GetVotersByCandidate(epoch uint64, candidate string) ([]*VoterInfo, error)

GetVotersByCandidate voters info by candidate

func (*LDB) GetVotersByVoter

func (db *LDB) GetVotersByVoter(epoch uint64, voter string) ([]*VoterInfo, error)

GetVotersByVoter voters info by voter

func (*LDB) SetActivatedCandidate

func (db *LDB) SetActivatedCandidate(index uint64, candidate *CandidateInfo) error

SetActivatedCandidate update activated candidate info

func (*LDB) SetAvailableQuantity

func (db *LDB) SetAvailableQuantity(epoch uint64, voter string, quantity *big.Int) error

SetAvailableQuantity set quantity

func (*LDB) SetCandidate

func (db *LDB) SetCandidate(candidate *CandidateInfo) error

SetCandidate update candidate info

func (*LDB) SetLastestEpoch

func (db *LDB) SetLastestEpoch(epoch uint64) error

SetLastestEpoch set latest epoch

func (*LDB) SetState

func (db *LDB) SetState(gstate *GlobalState) error

SetState set global state info

func (*LDB) SetTakeOver

func (db *LDB) SetTakeOver(epoch uint64) error

SetTakeOver update activated candidate info

func (*LDB) SetVoter

func (db *LDB) SetVoter(voter *VoterInfo) error

SetVoter update voter info

type RegisterCandidate

type RegisterCandidate struct {
	URL string
}

RegisterCandidate candidate info

type RemoveKickedCandidate

type RemoveKickedCandidate struct {
	Candidates []string
}

RemoveKickedCandidate remove kicked info

type SignFn

type SignFn func([]byte, *state.StateDB) ([]byte, error)

SignFn signature function

type System

type System struct {
	IDB
	// contains filtered or unexported fields
}

System dpos internal contract

func NewSystem

func NewSystem(state *state.StateDB, config *Config) *System

NewSystem new object

func (*System) ExitTakeOver

func (sys *System) ExitTakeOver(epoch uint64, number uint64, fid uint64) error

ExitTakeOver system exit take over

func (*System) KickedCandidate

func (sys *System) KickedCandidate(epoch uint64, candidate string, number uint64, fid uint64) error

KickedCandidate kicked

func (*System) RefundCandidate

func (sys *System) RefundCandidate(epoch uint64, candidate string, number uint64, fid uint64) error

RefundCandidate refund a candidate

func (*System) RegCandidate

func (sys *System) RegCandidate(epoch uint64, candidate string, url string, stake *big.Int, number uint64, fid uint64) error

RegCandidate register a candidate

func (*System) RemoveKickedCandidate

func (sys *System) RemoveKickedCandidate(epoch uint64, candidate string, number uint64, fid uint64) error

RemoveKickedCandidate remove

func (*System) UnregCandidate

func (sys *System) UnregCandidate(epoch uint64, candidate string, number uint64, fid uint64) error

UnregCandidate unregister a candidate

func (*System) UpdateCandidate

func (sys *System) UpdateCandidate(epoch uint64, candidate string, url string, nstake *big.Int, number uint64, fid uint64) error

UpdateCandidate update a candidate

func (*System) UpdateElectedCandidates0

func (sys *System) UpdateElectedCandidates0(pepoch uint64, epoch uint64, number uint64, miner string) error

UpdateElectedCandidates0 update

func (*System) UpdateElectedCandidates1

func (sys *System) UpdateElectedCandidates1(pepoch uint64, epoch uint64, number uint64, miner string) error

UpdateElectedCandidates1 update

func (*System) VoteCandidate

func (sys *System) VoteCandidate(epoch uint64, voter string, candidate string, stake *big.Int, number uint64, fid uint64) error

VoteCandidate vote a candidate

type UInt64Slice

type UInt64Slice []uint64

UInt64Slice attaches the methods of sort.Interface to []uint64, sorting in increasing order.

func (UInt64Slice) Len

func (s UInt64Slice) Len() int

func (UInt64Slice) Less

func (s UInt64Slice) Less(i, j int) bool

func (UInt64Slice) Swap

func (s UInt64Slice) Swap(i, j int)

type UpdateCandidate

type UpdateCandidate struct {
	URL string
}

UpdateCandidate candidate info

type VoteCandidate

type VoteCandidate struct {
	Candidate string
	Stake     *big.Int
}

VoteCandidate vote info

type VoterInfo

type VoterInfo struct {
	Epoch               uint64   `json:"epoch"`
	Name                string   `json:"name"`      // voter name
	Candidate           string   `json:"candidate"` // candidate approved by this voter
	Quantity            *big.Int `json:"quantity"`  // stake approved by this voter
	Number              uint64   `json:"number"`    // timestamp
	NextKeyForVoter     string   `json:"-"`
	NextKeyForCandidate string   `json:"-"`
}

VoterInfo info

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL