mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-18 02:40:45 +00:00
updated xdpos.go
This commit is contained in:
parent
951ca28d08
commit
4679c9fc74
1 changed files with 22 additions and 18 deletions
|
|
@ -13,7 +13,7 @@
|
||||||
// You should have received a copy of the GNU Lesser General Public License
|
// You should have received a copy of the GNU Lesser General Public License
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
// Package XDPoS implements the delegated-proof-of-stake consensus engine.
|
// Package XDPoS implements the proof-of-stake-voting consensus engine.
|
||||||
package XDPoS
|
package XDPoS
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
@ -58,7 +58,7 @@ type Masternode struct {
|
||||||
Stake *big.Int
|
Stake *big.Int
|
||||||
}
|
}
|
||||||
|
|
||||||
// XDPoS delegated-proof-of-stake protocol constants.
|
// XDPoS proof-of-stake-voting protocol constants.
|
||||||
var (
|
var (
|
||||||
epochLength = uint64(900) // 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
|
||||||
|
|
||||||
|
|
@ -149,7 +149,7 @@ var (
|
||||||
// backing account.
|
// backing account.
|
||||||
//type SignerFn func(accounts.Account, []byte) ([]byte, error)
|
//type SignerFn func(accounts.Account, []byte) ([]byte, error)
|
||||||
|
|
||||||
// sigHash returns the hash which is used as input for the delegated-proof-of-stake
|
// sigHash returns the hash which is used as input for the proof-of-stake-voting
|
||||||
// signing. It is the hash of the entire header apart from the 65 byte signature
|
// signing. It is the hash of the entire header apart from the 65 byte signature
|
||||||
// contained at the end of the extra data.
|
// contained at the end of the extra data.
|
||||||
//
|
//
|
||||||
|
|
@ -209,7 +209,7 @@ func ecrecover(header *types.Header, sigcache *lru.ARCCache) (common.Address, er
|
||||||
return signer, nil
|
return signer, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// XDPoS is the delegated-proof-of-stake consensus engine proposed to support the
|
// XDPoS is the proof-of-stake-voting consensus engine proposed to support the
|
||||||
// Ethereum testnet following the Ropsten attacks.
|
// Ethereum testnet following the Ropsten attacks.
|
||||||
type XDPoS struct {
|
type XDPoS struct {
|
||||||
config *params.XDPoSConfig // Consensus engine configuration parameters
|
config *params.XDPoSConfig // Consensus engine configuration parameters
|
||||||
|
|
@ -225,15 +225,15 @@ type XDPoS struct {
|
||||||
signFn clique.SignerFn // Signer function to authorize hashes with
|
signFn clique.SignerFn // Signer function to authorize hashes with
|
||||||
lock sync.RWMutex // Protects the signer fields
|
lock sync.RWMutex // Protects the signer fields
|
||||||
|
|
||||||
BlockSigners *lru.Cache
|
BlockSigners *lru.Cache
|
||||||
HookReward func(chain consensus.ChainReader, state *state.StateDB, header *types.Header) (error, map[string]interface{})
|
HookReward func(chain consensus.ChainReader, state *state.StateDB, header *types.Header) (error, map[string]interface{})
|
||||||
HookPenalty func(chain consensus.ChainReader, blockNumberEpoc uint64) ([]common.Address, error)
|
HookPenalty func(chain consensus.ChainReader, blockNumberEpoc uint64) ([]common.Address, error)
|
||||||
HookPenaltyTIPSigning func(chain consensus.ChainReader, header *types.Header, candidate []common.Address) ([]common.Address, error)
|
HookPenaltyTIPSigning func(chain consensus.ChainReader, header *types.Header, candidate []common.Address) ([]common.Address, error)
|
||||||
HookValidator func(header *types.Header, signers []common.Address) ([]byte, error)
|
HookValidator func(header *types.Header, signers []common.Address) ([]byte, error)
|
||||||
HookVerifyMNs func(header *types.Header, signers []common.Address) error
|
HookVerifyMNs func(header *types.Header, signers []common.Address) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a XDPoS delegated-proof-of-stake consensus engine with the initial
|
// New creates a XDPoS 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.XDPoSConfig, db ethdb.Database) *XDPoS {
|
func New(config *params.XDPoSConfig, db ethdb.Database) *XDPoS {
|
||||||
// Set any missing consensus parameters to their defaults
|
// Set any missing consensus parameters to their defaults
|
||||||
|
|
@ -1129,31 +1129,35 @@ func GetM1M2FromCheckpointHeader(checkpointHeader *types.Header, currentHeader *
|
||||||
if checkpointHeader.Number.Uint64()%common.EpocBlockRandomize != 0 {
|
if checkpointHeader.Number.Uint64()%common.EpocBlockRandomize != 0 {
|
||||||
return nil, errors.New("This block is not checkpoint block epoc.")
|
return nil, errors.New("This block is not checkpoint block epoc.")
|
||||||
}
|
}
|
||||||
m1m2 := map[common.Address]common.Address{}
|
|
||||||
// Get signers from this block.
|
// Get signers from this block.
|
||||||
masternodes := GetMasternodesFromCheckpointHeader(checkpointHeader)
|
masternodes := GetMasternodesFromCheckpointHeader(checkpointHeader)
|
||||||
validators := ExtractValidatorsFromBytes(checkpointHeader.Validators)
|
validators := ExtractValidatorsFromBytes(checkpointHeader.Validators)
|
||||||
|
m1m2, _, err := getM1M2(masternodes, validators, currentHeader, config)
|
||||||
|
if err != nil {
|
||||||
|
return map[common.Address]common.Address{}, err
|
||||||
|
}
|
||||||
|
return m1m2, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getM1M2(masternodes []common.Address, validators []int64, currentHeader *types.Header, config *params.ChainConfig) (map[common.Address]common.Address, uint64, error) {
|
||||||
|
m1m2 := map[common.Address]common.Address{}
|
||||||
maxMNs := len(masternodes)
|
maxMNs := len(masternodes)
|
||||||
|
moveM2 := uint64(0)
|
||||||
if len(validators) < maxMNs {
|
if len(validators) < maxMNs {
|
||||||
return nil, errors.New("len(m2) is less than len(m1)")
|
return nil, moveM2, errors.New("len(m2) is less than len(m1)")
|
||||||
}
|
}
|
||||||
if maxMNs > 0 {
|
if maxMNs > 0 {
|
||||||
isForked := config.IsTIPRandomize(currentHeader.Number)
|
isForked := config.IsTIPRandomize(currentHeader.Number)
|
||||||
moveM2 := uint64(0)
|
|
||||||
if isForked {
|
if isForked {
|
||||||
moveM2 = (currentHeader.Number.Uint64() % config.XDPoS.Epoch) / uint64(maxMNs)
|
moveM2 = (currentHeader.Number.Uint64() % config.XDPoS.Epoch) / uint64(maxMNs)
|
||||||
}
|
}
|
||||||
for i, m1 := range masternodes {
|
for i, m1 := range masternodes {
|
||||||
m2Index := uint64(validators[i] % int64(maxMNs))
|
m2Index := uint64(validators[i] % int64(maxMNs))
|
||||||
m2Index = m2Index + moveM2
|
m2Index = (m2Index + moveM2) % uint64(maxMNs)
|
||||||
if m2Index >= common.MaxMasternodes {
|
m1m2[m1] = masternodes[m2Index]
|
||||||
m2Index = m2Index - common.MaxMasternodes
|
|
||||||
}
|
}
|
||||||
m1m2[m1] = masternodes[m2Index]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return m1m2, nil
|
return m1m2, moveM2, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract validators from byte array.
|
// Extract validators from byte array.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue