|
|
|
@ -134,11 +134,6 @@ var ( |
|
|
|
|
// errRecentlySigned is returned if a header is signed by an authorized entity
|
|
|
|
|
// that already signed a header recently, thus is temporarily not allowed to.
|
|
|
|
|
errRecentlySigned = errors.New("recently signed") |
|
|
|
|
|
|
|
|
|
// errWaitTransactions is returned if an empty block is attempted to be sealed
|
|
|
|
|
// on an instant chain (0 second period). It's important to refuse these as the
|
|
|
|
|
// block reward is zero, so an empty block just bloats the chain... fast.
|
|
|
|
|
errWaitTransactions = errors.New("waiting for transactions") |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// SignerFn is a signer callback function to request a hash to be signed by a
|
|
|
|
@ -615,7 +610,8 @@ func (c *Clique) Seal(chain consensus.ChainReader, block *types.Block, results c |
|
|
|
|
} |
|
|
|
|
// For 0-period chains, refuse to seal empty blocks (no reward but would spin sealing)
|
|
|
|
|
if c.config.Period == 0 && len(block.Transactions()) == 0 { |
|
|
|
|
return errWaitTransactions |
|
|
|
|
log.Info("Sealing paused, waiting for transactions") |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
// Don't hold the signer fields for the entire sealing procedure
|
|
|
|
|
c.lock.RLock() |
|
|
|
|