diff --git a/miner/payload_building.go b/miner/payload_building.go index 74c1eee59..5ec756c0e 100644 --- a/miner/payload_building.go +++ b/miner/payload_building.go @@ -175,10 +175,20 @@ func (w *worker) buildPayload(args *BuildPayloadArgs) (*Payload, error) { // Build the initial version with no transaction included. It should be fast // enough to run. The empty payload can at least make sure there is something // to deliver for not missing slot. - empty := w.getSealingBlock(args.Parent, args.Timestamp, args.FeeRecipient, args.Random, args.Withdrawals, true) + emptyParams := &generateParams{ + timestamp: args.Timestamp, + forceTime: true, + parentHash: args.Parent, + coinbase: args.FeeRecipient, + random: args.Random, + withdrawals: args.Withdrawals, + noTxs: true, + } + empty := w.getSealingBlock(emptyParams) if empty.err != nil { return nil, empty.err } + // Construct a payload object for return. payload := newPayload(empty.block, args.Id()) @@ -195,11 +205,21 @@ func (w *worker) buildPayload(args *BuildPayloadArgs) (*Payload, error) { // by the timestamp parameter. endTimer := time.NewTimer(time.Second * 12) + fullParams := &generateParams{ + timestamp: args.Timestamp, + forceTime: true, + parentHash: args.Parent, + coinbase: args.FeeRecipient, + random: args.Random, + withdrawals: args.Withdrawals, + noTxs: false, + } + for { select { case <-timer.C: start := time.Now() - r := w.getSealingBlock(args.Parent, args.Timestamp, args.FeeRecipient, args.Random, args.Withdrawals, false) + r := w.getSealingBlock(fullParams) if r.err == nil { payload.update(r, time.Since(start)) } diff --git a/miner/worker.go b/miner/worker.go index 3ec8c84dc..652dc61d1 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -1106,17 +1106,9 @@ func (w *worker) commit(env *environment, interval func(), update bool, start ti // getSealingBlock generates the sealing block based on the given parameters. // The generation result will be passed back via the given channel no matter // the generation itself succeeds or not. -func (w *worker) getSealingBlock(parent common.Hash, timestamp uint64, coinbase common.Address, random common.Hash, withdrawals types.Withdrawals, noTxs bool) *newPayloadResult { +func (w *worker) getSealingBlock(params *generateParams) *newPayloadResult { req := &getWorkReq{ - params: &generateParams{ - timestamp: timestamp, - forceTime: true, - parentHash: parent, - coinbase: coinbase, - random: random, - withdrawals: withdrawals, - noTxs: noTxs, - }, + params: params, result: make(chan *newPayloadResult, 1), } select { diff --git a/miner/worker_test.go b/miner/worker_test.go index e504342fa..cc58578e3 100644 --- a/miner/worker_test.go +++ b/miner/worker_test.go @@ -452,7 +452,15 @@ func testGetSealingWork(t *testing.T, chainConfig *params.ChainConfig, engine co // This API should work even when the automatic sealing is not enabled for _, c := range cases { - r := w.getSealingBlock(c.parent, timestamp, c.coinbase, c.random, nil, false) + r := w.getSealingBlock(&generateParams{ + parentHash: c.parent, + timestamp: timestamp, + coinbase: c.coinbase, + random: c.random, + withdrawals: nil, + noTxs: false, + forceTime: true, + }) if c.expectErr { if r.err == nil { t.Error("Expect error but get nil") @@ -468,7 +476,15 @@ func testGetSealingWork(t *testing.T, chainConfig *params.ChainConfig, engine co // This API should work even when the automatic sealing is enabled w.start() for _, c := range cases { - r := w.getSealingBlock(c.parent, timestamp, c.coinbase, c.random, nil, false) + r := w.getSealingBlock(&generateParams{ + parentHash: c.parent, + timestamp: timestamp, + coinbase: c.coinbase, + random: c.random, + withdrawals: nil, + noTxs: false, + forceTime: true, + }) if c.expectErr { if r.err == nil { t.Error("Expect error but get nil")