@@ -169,6 +169,13 @@ type worker struct {
169
169
running int32 // The indicator whether the consensus engine is running or not.
170
170
newTxs int32 // New arrival transaction count since last sealing work submitting.
171
171
172
+ // noempty is the flag used to control whether the feature of pre-seal empty
173
+ // block is enabled. The default value is false(pre-seal is enabled by default).
174
+ // But in some special scenario the consensus engine will seal blocks instantaneously,
175
+ // in this case this feature will add all empty blocks into canonical chain
176
+ // non-stop and no real transaction will be included.
177
+ noempty uint32
178
+
172
179
// External functions
173
180
isLocalBlock func (block * types.Block ) bool // Function used to determine whether the specified block is mined by local miner.
174
181
@@ -247,6 +254,16 @@ func (w *worker) setRecommitInterval(interval time.Duration) {
247
254
w .resubmitIntervalCh <- interval
248
255
}
249
256
257
+ // disablePreseal disables pre-sealing mining feature
258
+ func (w * worker ) disablePreseal () {
259
+ atomic .StoreUint32 (& w .noempty , 1 )
260
+ }
261
+
262
+ // enablePreseal enables pre-sealing mining feature
263
+ func (w * worker ) enablePreseal () {
264
+ atomic .StoreUint32 (& w .noempty , 0 )
265
+ }
266
+
250
267
// pending returns the pending state and corresponding block.
251
268
func (w * worker ) pending () (* types.Block , * state.StateDB ) {
252
269
// return a snapshot to avoid contention on currentMu mutex
@@ -480,8 +497,9 @@ func (w *worker) mainLoop() {
480
497
w .updateSnapshot ()
481
498
}
482
499
} else {
483
- // If clique is running in dev mode(period is 0), disable
484
- // advance sealing here.
500
+ // Special case, if the consensus engine is 0 period clique(dev mode),
501
+ // submit mining work here since all empty submission will be rejected
502
+ // by clique. Of course the advance sealing(empty submission) is disabled.
485
503
if w .chainConfig .Clique != nil && w .chainConfig .Clique .Period == 0 {
486
504
w .commitNewWork (nil , true , time .Now ().Unix ())
487
505
}
@@ -910,9 +928,9 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64)
910
928
commitUncles (w .localUncles )
911
929
commitUncles (w .remoteUncles )
912
930
913
- if ! noempty {
914
- // Create an empty block based on temporary copied state for sealing in advance without waiting block
915
- // execution finished.
931
+ // Create an empty block based on temporary copied state for
932
+ // sealing in advance without waiting block execution finished.
933
+ if ! noempty && atomic . LoadUint32 ( & w . noempty ) == 0 {
916
934
w .commit (uncles , nil , false , tstart )
917
935
}
918
936
@@ -922,8 +940,10 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64)
922
940
log .Error ("Failed to fetch pending transactions" , "err" , err )
923
941
return
924
942
}
925
- // Short circuit if there is no available pending transactions
926
- if len (pending ) == 0 {
943
+ // Short circuit if there is no available pending transactions.
944
+ // But if we disable empty precommit already, ignore it. Since
945
+ // empty block is necessary to keep the liveness of the network.
946
+ if len (pending ) == 0 && atomic .LoadUint32 (& w .noempty ) == 0 {
927
947
w .updateSnapshot ()
928
948
return
929
949
}
0 commit comments