verify block difficulty

This commit is contained in:
Nguyen Ba Tam 2018-12-10 16:17:29 +07:00
parent b2929f2b50
commit 5475ef4faa
2 changed files with 26 additions and 24 deletions

View file

@ -352,12 +352,6 @@ func (c *Posv) verifyHeader(chain consensus.ChainReader, header *types.Header, p
if header.UncleHash != uncleHash { if header.UncleHash != uncleHash {
return errInvalidUncleHash return errInvalidUncleHash
} }
//// Ensure that the block's difficulty is meaningful (may not be correct at this point)
//if number > 0 {
// if header.Difficulty.Int64() != 1 {
// return errInvalidDifficulty
// }
//}
// If all checks passed, validate any special fields for hard forks // If all checks passed, validate any special fields for hard forks
if err := misc.VerifyForkHashes(chain.Config(), header, false); err != nil { if err := misc.VerifyForkHashes(chain.Config(), header, false); err != nil {
return err return err
@ -483,7 +477,7 @@ func WhoIsCreator(snap *Snapshot, header *types.Header) (common.Address, error)
return m, nil return m, nil
} }
func (c *Posv) YourTurn(chain consensus.ChainReader, parent *types.Header) (int, int, int, bool, error) { func (c *Posv) YourTurn(chain consensus.ChainReader, parent *types.Header, signer common.Address) (int, int, int, bool, error) {
masternodes := c.GetMasternodes(chain, parent) masternodes := c.GetMasternodes(chain, parent)
snap, err := c.GetSnapshot(chain, parent) snap, err := c.GetSnapshot(chain, parent)
if err != nil { if err != nil {
@ -503,8 +497,10 @@ func (c *Posv) YourTurn(chain consensus.ChainReader, parent *types.Header) (int,
} }
preIndex = position(masternodes, pre) preIndex = position(masternodes, pre)
} }
curIndex := position(masternodes, c.signer) curIndex := position(masternodes, signer)
log.Info("Masternodes cycle info", "number of masternodes", len(masternodes), "previous", pre, "position", preIndex, "current", c.signer, "position", curIndex) if signer == c.signer {
log.Info("Masternodes cycle info", "number of masternodes", len(masternodes), "previous", pre, "position", preIndex, "current", signer, "position", curIndex)
}
for i, s := range masternodes { for i, s := range masternodes {
fmt.Printf("%d - %s\n", i, s.String()) fmt.Printf("%d - %s\n", i, s.String())
} }
@ -630,7 +626,20 @@ func (c *Posv) verifySeal(chain consensus.ChainReader, header *types.Header, par
if err != nil { if err != nil {
return err return err
} }
log.Debug("verify seal block", "number", header.Number, "hash", header.Hash(), "difficulty", header.Difficulty, "creator", creator) var parent *types.Header
if len(parents) > 0 {
parent = parents[len(parents)-1]
} else {
parent = chain.GetHeader(header.ParentHash, number-1)
}
difficulty := c.calcDifficulty(chain, parent, creator)
log.Debug("verify seal block", "number", header.Number, "hash", header.Hash(), "block difficulty", header.Difficulty, "calc difficulty", difficulty, "creator", creator)
// Ensure that the block's difficulty is meaningful (may not be correct at this point)
if number > 0 {
if header.Difficulty.Int64() != difficulty.Int64() {
return errInvalidDifficulty
}
}
masternodes := c.GetMasternodes(chain, header) masternodes := c.GetMasternodes(chain, header)
mstring := []string{} mstring := []string{}
for _, m := range masternodes { for _, m := range masternodes {
@ -753,7 +762,7 @@ func (c *Posv) Prepare(chain consensus.ChainReader, header *types.Header) error
return consensus.ErrUnknownAncestor return consensus.ErrUnknownAncestor
} }
// Set the correct difficulty // Set the correct difficulty
header.Difficulty = c.CalcDifficulty(chain, 0, parent) header.Difficulty = c.calcDifficulty(chain, parent, c.signer)
log.Debug("CalcDifficulty ", "number", header.Number, "difficulty", header.Difficulty) log.Debug("CalcDifficulty ", "number", header.Number, "difficulty", header.Difficulty)
// Ensure the extra data has all it's components // Ensure the extra data has all it's components
if len(header.Extra) < extraVanity { if len(header.Extra) < extraVanity {
@ -935,24 +944,17 @@ func (c *Posv) Seal(chain consensus.ChainReader, block *types.Block, stop <-chan
// that a new block should have based on the previous blocks in the chain and the // that a new block should have based on the previous blocks in the chain and the
// current signer. // current signer.
func (c *Posv) CalcDifficulty(chain consensus.ChainReader, time uint64, parent *types.Header) *big.Int { func (c *Posv) CalcDifficulty(chain consensus.ChainReader, time uint64, parent *types.Header) *big.Int {
len, preIndex, curIndex, _, err := c.YourTurn(chain, parent) return c.calcDifficulty(chain, parent, c.signer)
}
func (c *Posv) calcDifficulty(chain consensus.ChainReader, parent *types.Header, signer common.Address) *big.Int {
len, preIndex, curIndex, _, err := c.YourTurn(chain, parent, signer)
if err != nil { if err != nil {
return big.NewInt(int64(len + curIndex - preIndex)) return big.NewInt(int64(len + curIndex - preIndex))
} }
return big.NewInt(int64(len - Hop(len, preIndex, curIndex))) return big.NewInt(int64(len - Hop(len, preIndex, curIndex)))
} }
// CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty
// that a new block should have based on the previous blocks in the chain and the
// current signer.
//func CalcDifficulty(snap *Snapshot, parent *types.Header, signer common.Address) *big.Int {
//
// if snap.inturn(snap.Number+1, signer) {
// return new(big.Int).Set(diffInTurn)
// }
// return new(big.Int).Set(diffNoTurn)
//}
// APIs implements consensus.Engine, returning the user facing RPC API to allow // APIs implements consensus.Engine, returning the user facing RPC API to allow
// controlling the signer voting. // controlling the signer voting.
func (c *Posv) APIs(chain consensus.ChainReader) []rpc.API { func (c *Posv) APIs(chain consensus.ChainReader) []rpc.API {

View file

@ -497,7 +497,7 @@ func (self *worker) commitNewWork() {
if self.config.Posv != nil { if self.config.Posv != nil {
// get masternodes set from latest checkpoint // get masternodes set from latest checkpoint
c := self.engine.(*posv.Posv) c := self.engine.(*posv.Posv)
len, preIndex, curIndex, ok, err := c.YourTurn(self.chain, parent.Header()) len, preIndex, curIndex, ok, err := c.YourTurn(self.chain, parent.Header(),self.coinbase)
if err != nil { if err != nil {
log.Error("Failed when trying to commit new work", "err", err) log.Error("Failed when trying to commit new work", "err", err)
return return