Преглед на файлове

consensus/clique: choose valid votes

mark.lin преди 8 години
родител
ревизия
db6e695002
променени са 2 файла, в които са добавени 23 реда и са изтрити 11 реда
  1. 15 9
      consensus/clique/clique.go
  2. 8 2
      consensus/clique/snapshot.go

+ 15 - 9
consensus/clique/clique.go

@@ -504,14 +504,23 @@ func (c *Clique) Prepare(chain consensus.ChainReader, header *types.Header) erro
 	header.Nonce = types.BlockNonce{}
 
 	number := header.Number.Uint64()
+	// Assemble the voting snapshot
+	snap, err := c.snapshot(chain, number-1, header.ParentHash, nil)
+	if err != nil {
+		return err
+	}
 	if number%c.config.Epoch != 0 {
+		// Get valid votes
 		c.lock.RLock()
-		if len(c.proposals) > 0 {
-			addresses := make([]common.Address, 0, len(c.proposals))
-			for address := range c.proposals {
+		var addresses []common.Address
+		for address, authorize := range c.proposals {
+			if snap.validVote(address, authorize) {
 				addresses = append(addresses, address)
 			}
-			header.Coinbase = addresses[rand.Intn(len(addresses))]
+		}
+		if len(addresses) > 0 {
+			index := rand.Intn(len(addresses))
+			header.Coinbase = addresses[index]
 			if c.proposals[header.Coinbase] {
 				copy(header.Nonce[:], nonceAuthVote)
 			} else {
@@ -520,11 +529,8 @@ func (c *Clique) Prepare(chain consensus.ChainReader, header *types.Header) erro
 		}
 		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
 	if snap.inturn(header.Number.Uint64(), c.signer) {
 		header.Difficulty = diffInTurn

+ 8 - 2
consensus/clique/snapshot.go

@@ -126,11 +126,17 @@ func (s *Snapshot) copy() *Snapshot {
 	return cpy
 }
 
+// validVote returns whether it makes sense to cast the specified vote in the
+// given snapshot context (e.g. don't try to add an already authorized signer).
+func (s *Snapshot) validVote(address common.Address, authorize bool) bool {
+	_, signer := s.Signers[address]
+	return (signer && !authorize) || (!signer && authorize)
+}
+
 // cast adds a new vote into the tally.
 func (s *Snapshot) cast(address common.Address, authorize bool) bool {
 	// Ensure the vote is meaningful
-	_, signer := s.Signers[address]
-	if (signer && authorize) || (!signer && !authorize) {
+	if !s.validVote(address, authorize) {
 		return false
 	}
 	// Cast the vote into an existing or new tally