|
@@ -503,13 +503,24 @@ func (c *Clique) Prepare(chain consensus.ChainReader, header *types.Header) erro
|
|
|
header.Nonce = types.BlockNonce{}
|
|
header.Nonce = types.BlockNonce{}
|
|
|
|
|
|
|
|
number := header.Number.Uint64()
|
|
number := header.Number.Uint64()
|
|
|
|
|
+
|
|
|
|
|
+ // Assemble the voting snapshot to check which votes make sense
|
|
|
|
|
+ snap, err := c.snapshot(chain, number-1, header.ParentHash, nil)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
if number%c.config.Epoch != 0 {
|
|
if number%c.config.Epoch != 0 {
|
|
|
c.lock.RLock()
|
|
c.lock.RLock()
|
|
|
- if len(c.proposals) > 0 {
|
|
|
|
|
- addresses := make([]common.Address, 0, len(c.proposals))
|
|
|
|
|
- for address := range c.proposals {
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // Gather all the proposals that make sense voting on
|
|
|
|
|
+ addresses := make([]common.Address, 0, len(c.proposals))
|
|
|
|
|
+ for address, authorize := range c.proposals {
|
|
|
|
|
+ if snap.validVote(address, authorize) {
|
|
|
addresses = append(addresses, address)
|
|
addresses = append(addresses, address)
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
+ // If there's pending proposals, cast a vote on them
|
|
|
|
|
+ if len(addresses) > 0 {
|
|
|
header.Coinbase = addresses[rand.Intn(len(addresses))]
|
|
header.Coinbase = addresses[rand.Intn(len(addresses))]
|
|
|
if c.proposals[header.Coinbase] {
|
|
if c.proposals[header.Coinbase] {
|
|
|
copy(header.Nonce[:], nonceAuthVote)
|
|
copy(header.Nonce[:], nonceAuthVote)
|
|
@@ -519,11 +530,7 @@ func (c *Clique) Prepare(chain consensus.ChainReader, header *types.Header) erro
|
|
|
}
|
|
}
|
|
|
c.lock.RUnlock()
|
|
c.lock.RUnlock()
|
|
|
}
|
|
}
|
|
|
- // Assemble the voting snapshot and set the correct difficulty
|
|
|
|
|
- snap, err := c.snapshot(chain, number-1, header.ParentHash, nil)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // Set the correct difficulty
|
|
|
header.Difficulty = diffNoTurn
|
|
header.Difficulty = diffNoTurn
|
|
|
if snap.inturn(header.Number.Uint64(), c.signer) {
|
|
if snap.inturn(header.Number.Uint64(), c.signer) {
|
|
|
header.Difficulty = diffInTurn
|
|
header.Difficulty = diffInTurn
|