remove signer term, use masternode for consistency

This commit is contained in:
Tuna 2018-11-13 11:46:35 +07:00
parent acca52510f
commit e94daa8240

View file

@ -47,7 +47,6 @@ import (
const ( const (
inmemorySnapshots = 128 // Number of recent vote snapshots to keep in memory inmemorySnapshots = 128 // Number of recent vote snapshots to keep in memory
inmemorySignatures = 4096 // Number of recent block signatures to keep in memory inmemorySignatures = 4096 // Number of recent block signatures to keep in memory
wiggleTime = 500 * time.Millisecond // Random delay (per signer) to allow concurrent signers
M2ByteLength = 4 M2ByteLength = 4
) )
@ -58,8 +57,7 @@ type Masternode struct {
// Posv proof-of-stake-voting protocol constants. // Posv proof-of-stake-voting protocol constants.
var ( var (
epochLength = uint64(30000) // Default number of blocks after which to checkpoint and reset the pending votes epochLength = uint64(900) // Default number of blocks after which to checkpoint and reset the pending votes
blockPeriod = uint64(15) // Default minimum difference between two consecutive block's timestamps
extraVanity = 32 // Fixed number of extra-data prefix bytes reserved for signer vanity extraVanity = 32 // Fixed number of extra-data prefix bytes reserved for signer vanity
extraSeal = 65 // Fixed number of extra-data suffix bytes reserved for signer seal extraSeal = 65 // Fixed number of extra-data suffix bytes reserved for signer seal
@ -230,7 +228,7 @@ type Posv struct {
HookVerifyMNs func(header *types.Header, signers []common.Address) error HookVerifyMNs func(header *types.Header, signers []common.Address) error
} }
// New creates a Posv proof-of-stake-voting consensus engine with the initial // New creates a PoSV proof-of-stake-voting consensus engine with the initial
// signers set to the ones provided by the user. // signers set to the ones provided by the user.
func New(config *params.PosvConfig, db ethdb.Database) *Posv { func New(config *params.PosvConfig, db ethdb.Database) *Posv {
// Set any missing consensus parameters to their defaults // Set any missing consensus parameters to their defaults
@ -348,7 +346,7 @@ func (c *Posv) verifyHeader(chain consensus.ChainReader, header *types.Header, p
if header.MixDigest != (common.Hash{}) { if header.MixDigest != (common.Hash{}) {
return errInvalidMixDigest return errInvalidMixDigest
} }
// Ensure that the block doesn't contain any uncles which are meaningless in PoA // Ensure that the block doesn't contain any uncles which are meaningless in PoSV
if header.UncleHash != uncleHash { if header.UncleHash != uncleHash {
return errInvalidUncleHash return errInvalidUncleHash
} }
@ -466,7 +464,7 @@ func (c *Posv) GetMasternodes(chain consensus.ChainReader, header *types.Header)
func (c *Posv) GetPeriod() uint64 { return c.config.Period } func (c *Posv) GetPeriod() uint64 { return c.config.Period }
func WhoIsCreator(snap *Snapshot, header *types.Header) (common.Address, error) { func whoIsCreator(snap *Snapshot, header *types.Header) (common.Address, error) {
if header.Number.Uint64() == 0 { if header.Number.Uint64() == 0 {
return common.Address{}, errors.New("Don't take block 0") return common.Address{}, errors.New("Don't take block 0")
} }
@ -491,7 +489,7 @@ func (c *Posv) YourTurn(chain consensus.ChainReader, parent *types.Header, signe
// masternode[0] has chance to create block 1 // masternode[0] has chance to create block 1
preIndex := -1 preIndex := -1
if parent.Number.Uint64() != 0 { if parent.Number.Uint64() != 0 {
pre, err = WhoIsCreator(snap, parent) pre, err = whoIsCreator(snap, parent)
if err != nil { if err != nil {
return 0, 0, 0, false, err return 0, 0, 0, false, err
} }
@ -769,30 +767,30 @@ func (c *Posv) Prepare(chain consensus.ChainReader, header *types.Header) error
header.Extra = append(header.Extra, bytes.Repeat([]byte{0x00}, extraVanity-len(header.Extra))...) header.Extra = append(header.Extra, bytes.Repeat([]byte{0x00}, extraVanity-len(header.Extra))...)
} }
header.Extra = header.Extra[:extraVanity] header.Extra = header.Extra[:extraVanity]
signers := snap.GetSigners() masternodes := snap.GetSigners()
if number%c.config.Epoch == 0 { if number%c.config.Epoch == 0 {
if c.HookPenalty != nil { if c.HookPenalty != nil {
penSigners, err := c.HookPenalty(chain, number) penMasternodes, err := c.HookPenalty(chain, number)
if err != nil { if err != nil {
return err return err
} }
if len(penSigners) > 0 { if len(penMasternodes) > 0 {
// Keep remove penalty signer out of signer list. // penalize bad masternode(s)
signers = common.RemoveItemFromArray(signers, penSigners) masternodes = common.RemoveItemFromArray(masternodes, penMasternodes)
for _, address := range penSigners { for _, address := range penMasternodes {
log.Debug("Penalty Info", "address", address, "number", number) log.Debug("Penalty status", "address", address, "block number", number)
} }
header.Penalties = common.ExtractAddressToBytes(penSigners) header.Penalties = common.ExtractAddressToBytes(penMasternodes)
} }
} }
// Prevent penaltied signer in 4 epocs ago jump into signer list. // Prevent penalized masternode(s) within 4 recent epochs
for i := 1; i <= common.LimitPenaltyEpoch; i++ { for i := 1; i <= common.LimitPenaltyEpoch; i++ {
if number > uint64(i)*c.config.Epoch { if number > uint64(i)*c.config.Epoch {
signers = RemovePenaltiesFromBlock(chain, signers, number-uint64(i)*c.config.Epoch) masternodes = RemovePenaltiesFromBlock(chain, masternodes, number-uint64(i)*c.config.Epoch)
} }
} }
for _, signer := range signers { for _, masternode := range masternodes {
header.Extra = append(header.Extra, signer[:]...) header.Extra = append(header.Extra, masternode[:]...)
} }
} }
header.Extra = append(header.Extra, make([]byte, extraSeal)...) header.Extra = append(header.Extra, make([]byte, extraSeal)...)
@ -807,7 +805,7 @@ func (c *Posv) Prepare(chain consensus.ChainReader, header *types.Header) error
header.Time = big.NewInt(time.Now().Unix()) header.Time = big.NewInt(time.Now().Unix())
} }
if c.HookValidator != nil { if c.HookValidator != nil {
c.HookValidator(header, signers) c.HookValidator(header, masternodes)
if err != nil { if err != nil {
return err return err
} }
@ -823,11 +821,11 @@ func (c *Posv) UpdateMasternodes(chain consensus.ChainReader, header *types.Head
if err != nil { if err != nil {
return err return err
} }
newSigners := make(map[common.Address]struct{}) newMasternodes := make(map[common.Address]struct{})
for _, m := range ms { for _, m := range ms {
newSigners[m.Address] = struct{}{} newMasternodes[m.Address] = struct{}{}
} }
snap.Signers = newSigners snap.Signers = newMasternodes
nm := []string{} nm := []string{}
for _, n := range ms { for _, n := range ms {
nm = append(nm, n.Address.String()) nm = append(nm, n.Address.String())
@ -841,7 +839,6 @@ func (c *Posv) UpdateMasternodes(chain consensus.ChainReader, header *types.Head
// rewards given, and returns the final block. // rewards given, and returns the final block.
func (c *Posv) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { func (c *Posv) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) {
// set block reward // set block reward
// FIXME: unit Ether could be too plump
number := header.Number.Uint64() number := header.Number.Uint64()
rCheckpoint := chain.Config().Posv.RewardCheckpoint rCheckpoint := chain.Config().Posv.RewardCheckpoint
@ -851,7 +848,7 @@ func (c *Posv) Finalize(chain consensus.ChainReader, header *types.Header, state
} }
} }
// No block rewards in PoA, so the state remains as is and uncles are dropped // the state remains as is and uncles are dropped
header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number))
header.UncleHash = types.CalcUncleHash(nil) header.UncleHash = types.CalcUncleHash(nil)
@ -916,7 +913,7 @@ func (c *Posv) Seal(chain consensus.ChainReader, block *types.Block, stop <-chan
if limit := uint64(2); number < limit || seen > number-limit { if limit := uint64(2); number < limit || seen > number-limit {
// Only take into account the non-epoch blocks // Only take into account the non-epoch blocks
if number%c.config.Epoch != 0 { if number%c.config.Epoch != 0 {
log.Info("Debugging", "len(masternodes)", len(masternodes), "number", number, "limit", limit, "seen", seen, "recent", recent.String(), "snap.Recents", snap.Recents) log.Info("len(masternodes)", len(masternodes), "number", number, "limit", limit, "seen", seen, "recent", recent.String(), "snap.Recents", snap.Recents)
log.Info("Signed recently, must wait for others") log.Info("Signed recently, must wait for others")
<-stop <-stop
return nil, nil return nil, nil
@ -1007,18 +1004,18 @@ func (c *Posv) GetMasternodesFromCheckpointHeader(preCheckpointHeader *types.Hea
} }
// Extract validators from byte array. // Extract validators from byte array.
func RemovePenaltiesFromBlock(chain consensus.ChainReader, signers []common.Address, epochNumber uint64) []common.Address { func RemovePenaltiesFromBlock(chain consensus.ChainReader, masternodes []common.Address, epochNumber uint64) []common.Address {
if epochNumber <= 0 { if epochNumber <= 0 {
return signers return masternodes
} }
header := chain.GetHeaderByNumber(epochNumber) header := chain.GetHeaderByNumber(epochNumber)
block := chain.GetBlock(header.Hash(), epochNumber) block := chain.GetBlock(header.Hash(), epochNumber)
penalties := block.Penalties() penalties := block.Penalties()
if penalties != nil { if penalties != nil {
prevPenalties := common.ExtractAddressFromBytes(penalties) prevPenalties := common.ExtractAddressFromBytes(penalties)
signers = common.RemoveItemFromArray(signers, prevPenalties) masternodes = common.RemoveItemFromArray(masternodes, prevPenalties)
} }
return signers return masternodes
} }
// Get masternodes address from checkpoint Header. // Get masternodes address from checkpoint Header.