Skip to content

Commit

Permalink
consensus/clique: fix race condition (ethereum#24957) (#766)
Browse files Browse the repository at this point in the history
  • Loading branch information
omerfirmak authored May 23, 2024
1 parent dd96cec commit fe55edd
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 7 deletions.
18 changes: 12 additions & 6 deletions consensus/clique/clique.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ type Clique struct {

signer common.Address // Ethereum address of the signing key
signFn SignerFn // Signer function to authorize hashes with
lock sync.RWMutex // Protects the signer fields
lock sync.RWMutex // Protects the signer and proposals fields

// The fields below are for testing only
fakeDiff bool // Skip difficulty verifications
Expand Down Expand Up @@ -509,9 +509,8 @@ func (c *Clique) Prepare(chain consensus.ChainHeaderReader, header *types.Header
if err != nil {
return err
}
c.lock.RLock()
if number%c.config.Epoch != 0 {
c.lock.RLock()

// Gather all the proposals that make sense voting on
addresses := make([]common.Address, 0, len(c.proposals))
for address, authorize := range c.proposals {
Expand All @@ -528,10 +527,14 @@ func (c *Clique) Prepare(chain consensus.ChainHeaderReader, header *types.Header
copy(header.Nonce[:], nonceDropVote)
}
}
c.lock.RUnlock()
}

// Copy signer protected by mutex to avoid race condition
signer := c.signer
c.lock.RUnlock()

// Set the correct difficulty
header.Difficulty = calcDifficulty(snap, c.signer)
header.Difficulty = calcDifficulty(snap, signer)

// Ensure the extra data has all its components
if len(header.Extra) < extraVanity {
Expand Down Expand Up @@ -670,7 +673,10 @@ func (c *Clique) CalcDifficulty(chain consensus.ChainHeaderReader, time uint64,
if err != nil {
return nil
}
return calcDifficulty(snap, c.signer)
c.lock.RLock()
signer := c.signer
c.lock.RUnlock()
return calcDifficulty(snap, signer)
}

func calcDifficulty(snap *Snapshot, signer common.Address) *big.Int {
Expand Down
2 changes: 1 addition & 1 deletion params/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import (
const (
VersionMajor = 5 // Major version component of the current release
VersionMinor = 3 // Minor version component of the current release
VersionPatch = 19 // Patch version component of the current release
VersionPatch = 20 // Patch version component of the current release
VersionMeta = "mainnet" // Version metadata to append to the version string
)

Expand Down

0 comments on commit fe55edd

Please sign in to comment.