diff --git a/eth/catalyst/api.go b/eth/catalyst/api.go index 9077f20bff..c63305d32d 100644 --- a/eth/catalyst/api.go +++ b/eth/catalyst/api.go @@ -169,6 +169,7 @@ func NewConsensusAPI(eth *eth.Ethereum) *ConsensusAPI { // If there are payloadAttributes: we try to assemble a block with the payloadAttributes // and return its payloadID. func (api *ConsensusAPI) ForkchoiceUpdatedV1(update engine.ForkchoiceStateV1, payloadAttributes *engine.PayloadAttributes) (engine.ForkChoiceResponse, error) { + log.Info("ForkchoiceUpdatedV1 called") if payloadAttributes != nil { if payloadAttributes.Withdrawals != nil { return engine.STATUS_INVALID, engine.InvalidParams.With(fmt.Errorf("withdrawals not supported in V1")) @@ -398,6 +399,7 @@ func (api *ConsensusAPI) ExchangeTransitionConfigurationV1(config engine.Transit // GetPayloadV1 returns a cached payload by id. func (api *ConsensusAPI) GetPayloadV1(payloadID engine.PayloadID) (*engine.ExecutableData, error) { + log.Info("GetPayloadV1 called") data, err := api.getPayload(payloadID) if err != nil { return nil, err diff --git a/grpc/execution/server.go b/grpc/execution/server.go index 5a46ffd9e0..564503d073 100644 --- a/grpc/execution/server.go +++ b/grpc/execution/server.go @@ -7,7 +7,6 @@ package execution import ( "context" "fmt" - "time" "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" @@ -62,14 +61,13 @@ func (s *ExecutionServiceServer) DoBlock(ctx context.Context, req *executionv1.D Random: common.Hash{}, SuggestedFeeRecipient: common.Address{}, } + fcStartResp, err := s.consensus.ForkchoiceUpdatedV1(*startForkChoice, payloadAttributes) if err != nil { return nil, err } - // super janky but this is what the payload builder requires :/ (miner.worker.buildPayload()) - // we should probably just execute + store the block directly instead of using the engine api. - time.Sleep(time.Second) + // TODO: we should probably just execute + store the block directly instead of using the engine api. payloadResp, err := s.consensus.GetPayloadV1(*fcStartResp.PayloadID) if err != nil { log.Error("failed to call GetPayloadV1", "err", err) diff --git a/miner/payload_building.go b/miner/payload_building.go index f84d908e86..08c772bacb 100644 --- a/miner/payload_building.go +++ b/miner/payload_building.go @@ -21,7 +21,6 @@ import ( "encoding/binary" "math/big" "sync" - "time" "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" @@ -84,7 +83,7 @@ func newPayload(empty *types.Block, id engine.PayloadID) *Payload { } // update updates the full-block with latest built version. -func (payload *Payload) update(block *types.Block, fees *big.Int, elapsed time.Duration) { +func (payload *Payload) update(block *types.Block, fees *big.Int) { payload.lock.Lock() defer payload.lock.Unlock() @@ -103,7 +102,7 @@ func (payload *Payload) update(block *types.Block, fees *big.Int, elapsed time.D feesInEther := new(big.Float).Quo(new(big.Float).SetInt(fees), big.NewFloat(params.Ether)) log.Info("Updated payload", "id", payload.id, "number", block.NumberU64(), "hash", block.Hash(), "txs", len(block.Transactions()), "gas", block.GasUsed(), "fees", feesInEther, - "root", block.Root(), "elapsed", common.PrettyDuration(elapsed)) + "root", block.Root()) } payload.cond.Broadcast() // fire signal for notifying full block } @@ -160,39 +159,17 @@ func (w *worker) buildPayload(args *BuildPayloadArgs) (*Payload, error) { if err != nil { return nil, err } - // Construct a payload object for return. + // Construct a payload object for updating the block. payload := newPayload(empty, args.Id()) - // Spin up a routine for updating the payload in background. This strategy - // can maximum the revenue for including transactions with highest fee. - go func() { - // Setup the timer for re-building the payload. The initial clock is kept - // for triggering process immediately. - timer := time.NewTimer(0) - defer timer.Stop() - - // Setup the timer for terminating the process if SECONDS_PER_SLOT (12s in - // the Mainnet configuration) have passed since the point in time identified - // by the timestamp parameter. - endTimer := time.NewTimer(time.Second * 12) - - for { - select { - case <-timer.C: - start := time.Now() - block, fees, err := w.getSealingBlock(args.Parent, args.Timestamp, args.FeeRecipient, args.Random, args.Withdrawals, false) - if err == nil { - payload.update(block, fees, time.Since(start)) - } - timer.Reset(w.recommit) - case <-payload.stop: - log.Info("Stopping work on payload", "id", payload.id, "reason", "delivery") - return - case <-endTimer.C: - log.Info("Stopping work on payload", "id", payload.id, "reason", "timeout") - return - } - } - }() - return payload, nil + // Get the block to update with the payload + block, fees, err := w.getSealingBlock(args.Parent, args.Timestamp, args.FeeRecipient, args.Random, args.Withdrawals, false) + if err == nil { + payload.update(block, fees) + log.Info("Stopping work on payload", "id", payload.id, "reason", "delivery") + return payload, nil + } else { + log.Info("Stopping work on payload", "id", payload.id, "reason", "failed to retrieve payload") + return payload, nil + } }