1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package engine
import (
"context"
"fmt"
"github.com/ethereum-optimism/optimism/op-node/rollup"
"github.com/ethereum-optimism/optimism/op-service/eth"
)
type PayloadProcessEvent struct {
// if payload should be promoted to safe (must also be pending safe, see DerivedFrom)
IsLastInSpan bool
// payload is promoted to pending-safe if non-zero
DerivedFrom eth.L1BlockRef
Envelope *eth.ExecutionPayloadEnvelope
Ref eth.L2BlockRef
}
func (ev PayloadProcessEvent) String() string {
return "payload-process"
}
func (eq *EngDeriver) onPayloadProcess(ev PayloadProcessEvent) {
ctx, cancel := context.WithTimeout(eq.ctx, payloadProcessTimeout)
defer cancel()
status, err := eq.ec.engine.NewPayload(ctx,
ev.Envelope.ExecutionPayload, ev.Envelope.ParentBeaconBlockRoot)
if err != nil {
eq.emitter.Emit(rollup.EngineTemporaryErrorEvent{
Err: fmt.Errorf("failed to insert execution payload: %w", err)})
return
}
switch status.Status {
case eth.ExecutionInvalid, eth.ExecutionInvalidBlockHash:
eq.emitter.Emit(PayloadInvalidEvent{
Envelope: ev.Envelope,
Err: eth.NewPayloadErr(ev.Envelope.ExecutionPayload, status)})
return
case eth.ExecutionValid:
eq.emitter.Emit(PayloadSuccessEvent(ev))
return
default:
eq.emitter.Emit(rollup.EngineTemporaryErrorEvent{
Err: eth.NewPayloadErr(ev.Envelope.ExecutionPayload, status)})
return
}
}