github.com/reapchain/go-reapchain@v0.2.15-0.20210609012950-9735c110c705/consensus/podc/validator/validator.go (about)

     1  // Copyright 2017 AMIS Technologies
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package validator
    18  
    19  import (
    20  	"github.com/ethereum/go-ethereum/common"
    21  	"github.com/ethereum/go-ethereum/consensus/podc"
    22  )
    23  
    24  func New(addr common.Address) podc.Validator {
    25  	return &defaultValidator{
    26  		address: addr,
    27  	}
    28  }
    29  
    30  func NewSet(addrs []common.Address, policy podc.ProposerPolicy) podc.ValidatorSet {  //return is interface
    31  	switch policy {
    32  	case podc.RoundRobin:
    33  		return newDefaultSet(addrs, roundRobinProposer)
    34  	case podc.Sticky:
    35  		return newDefaultSet(addrs, stickyProposer)
    36  	case podc.QRF:
    37  		return newDefaultSet(addrs, qrfProposer)
    38  
    39  	}
    40  
    41  	// use round-robin policy as default proposal policy
    42  	return newDefaultSet(addrs, roundRobinProposer)
    43  }
    44  
    45  func ExtractValidators(extraData []byte) []common.Address {
    46  	// get the validator addresses
    47  	addrs := make([]common.Address, (len(extraData) / common.AddressLength))
    48  	for i := 0; i < len(addrs); i++ {
    49  		copy(addrs[i][:], extraData[i*common.AddressLength:])
    50  	}
    51  
    52  	return addrs
    53  }
    54  
    55  // Check whether the extraData is presented in prescribed form
    56  func ValidExtraData(extraData []byte) bool {
    57  	return len(extraData)%common.AddressLength == 0
    58  }