Commit 3186d8f9 authored by OptimismBot's avatar OptimismBot Committed by GitHub

Merge pull request #5515 from ethereum-optimism/aj/fpp-logs

op-program: Improve logging
parents 67b2d61d 55044e96
...@@ -9,7 +9,7 @@ import ( ...@@ -9,7 +9,7 @@ import (
"github.com/ethereum-optimism/optimism/op-node/client" "github.com/ethereum-optimism/optimism/op-node/client"
"github.com/ethereum-optimism/optimism/op-node/sources" "github.com/ethereum-optimism/optimism/op-node/sources"
"github.com/ethereum-optimism/optimism/op-node/testlog" "github.com/ethereum-optimism/optimism/op-node/testlog"
oppcl "github.com/ethereum-optimism/optimism/op-program/client" "github.com/ethereum-optimism/optimism/op-program/client/driver"
opp "github.com/ethereum-optimism/optimism/op-program/host" opp "github.com/ethereum-optimism/optimism/op-program/host"
oppconf "github.com/ethereum-optimism/optimism/op-program/host/config" oppconf "github.com/ethereum-optimism/optimism/op-program/host/config"
"github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind"
...@@ -119,7 +119,7 @@ func TestVerifyL2OutputRoot(t *testing.T) { ...@@ -119,7 +119,7 @@ func TestVerifyL2OutputRoot(t *testing.T) {
t.Log("Running fault proof with invalid claim") t.Log("Running fault proof with invalid claim")
fppConfig.L2Claim = common.Hash{0xaa} fppConfig.L2Claim = common.Hash{0xaa}
err = opp.FaultProofProgram(log, fppConfig) err = opp.FaultProofProgram(log, fppConfig)
require.ErrorIs(t, err, oppcl.ErrClaimNotValid) require.ErrorIs(t, err, driver.ErrClaimNotValid)
} }
func waitForSafeHead(ctx context.Context, safeBlockNum uint64, rollupClient *sources.RollupClient) error { func waitForSafeHead(ctx context.Context, safeBlockNum uint64, rollupClient *sources.RollupClient) error {
......
...@@ -13,6 +13,10 @@ import ( ...@@ -13,6 +13,10 @@ import (
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"
) )
var (
ErrClaimNotValid = errors.New("invalid claim")
)
type Derivation interface { type Derivation interface {
Step(ctx context.Context) error Step(ctx context.Context) error
SafeL2Head() eth.L2BlockRef SafeL2Head() eth.L2BlockRef
...@@ -47,11 +51,12 @@ func NewDriver(logger log.Logger, cfg *rollup.Config, l1Source derive.L1Fetcher, ...@@ -47,11 +51,12 @@ func NewDriver(logger log.Logger, cfg *rollup.Config, l1Source derive.L1Fetcher,
// Returns a non-EOF error if the derivation failed // Returns a non-EOF error if the derivation failed
func (d *Driver) Step(ctx context.Context) error { func (d *Driver) Step(ctx context.Context) error {
if err := d.pipeline.Step(ctx); errors.Is(err, io.EOF) { if err := d.pipeline.Step(ctx); errors.Is(err, io.EOF) {
d.logger.Info("Derivation complete: reached L1 head", "head", d.pipeline.SafeL2Head())
return io.EOF return io.EOF
} else if errors.Is(err, derive.NotEnoughData) { } else if errors.Is(err, derive.NotEnoughData) {
head := d.pipeline.SafeL2Head() head := d.pipeline.SafeL2Head()
if head.Number >= d.targetBlockNum { if head.Number >= d.targetBlockNum {
d.logger.Info("Target L2 block reached", "head", head) d.logger.Info("Derivation complete: reached L2 block", "head", head)
return io.EOF return io.EOF
} }
d.logger.Debug("Data is lacking") d.logger.Debug("Data is lacking")
...@@ -66,12 +71,14 @@ func (d *Driver) SafeHead() eth.L2BlockRef { ...@@ -66,12 +71,14 @@ func (d *Driver) SafeHead() eth.L2BlockRef {
return d.pipeline.SafeL2Head() return d.pipeline.SafeL2Head()
} }
func (d *Driver) ValidateClaim(claimedOutputRoot eth.Bytes32) bool { func (d *Driver) ValidateClaim(claimedOutputRoot eth.Bytes32) error {
outputRoot, err := d.l2OutputRoot() outputRoot, err := d.l2OutputRoot()
if err != nil { if err != nil {
d.logger.Info("Failed to calculate L2 output root", "err", err) return fmt.Errorf("calculate L2 output root: %w", err)
return false
} }
d.logger.Info("Derivation complete", "head", d.SafeHead(), "output", outputRoot, "claim", claimedOutputRoot) d.logger.Info("Validating claim", "head", d.SafeHead(), "output", outputRoot, "claim", claimedOutputRoot)
return claimedOutputRoot == outputRoot if claimedOutputRoot != outputRoot {
return fmt.Errorf("%w: claim: %v actual: %v", ErrClaimNotValid, claimedOutputRoot, outputRoot)
}
return nil
} }
...@@ -76,8 +76,8 @@ func TestValidateClaim(t *testing.T) { ...@@ -76,8 +76,8 @@ func TestValidateClaim(t *testing.T) {
driver.l2OutputRoot = func() (eth.Bytes32, error) { driver.l2OutputRoot = func() (eth.Bytes32, error) {
return expected, nil return expected, nil
} }
valid := driver.ValidateClaim(expected) err := driver.ValidateClaim(expected)
require.True(t, valid) require.NoError(t, err)
}) })
t.Run("Invalid", func(t *testing.T) { t.Run("Invalid", func(t *testing.T) {
...@@ -85,17 +85,18 @@ func TestValidateClaim(t *testing.T) { ...@@ -85,17 +85,18 @@ func TestValidateClaim(t *testing.T) {
driver.l2OutputRoot = func() (eth.Bytes32, error) { driver.l2OutputRoot = func() (eth.Bytes32, error) {
return eth.Bytes32{0x22}, nil return eth.Bytes32{0x22}, nil
} }
valid := driver.ValidateClaim(eth.Bytes32{0x11}) err := driver.ValidateClaim(eth.Bytes32{0x11})
require.False(t, valid) require.ErrorIs(t, err, ErrClaimNotValid)
}) })
t.Run("Error", func(t *testing.T) { t.Run("Error", func(t *testing.T) {
driver := createDriver(t, io.EOF) driver := createDriver(t, io.EOF)
expectedErr := errors.New("boom")
driver.l2OutputRoot = func() (eth.Bytes32, error) { driver.l2OutputRoot = func() (eth.Bytes32, error) {
return eth.Bytes32{}, errors.New("boom") return eth.Bytes32{}, expectedErr
} }
valid := driver.ValidateClaim(eth.Bytes32{0x11}) err := driver.ValidateClaim(eth.Bytes32{0x11})
require.False(t, valid) require.ErrorIs(t, err, expectedErr)
}) })
} }
......
...@@ -18,10 +18,6 @@ import ( ...@@ -18,10 +18,6 @@ import (
"github.com/ethereum-optimism/optimism/op-program/preimage" "github.com/ethereum-optimism/optimism/op-program/preimage"
) )
var (
ErrClaimNotValid = errors.New("invalid claim")
)
// ClientProgram executes the Program, while attached to an IO based pre-image oracle, to be served by a host. // ClientProgram executes the Program, while attached to an IO based pre-image oracle, to be served by a host.
func ClientProgram( func ClientProgram(
logger log.Logger, logger log.Logger,
...@@ -59,9 +55,5 @@ func Program(logger log.Logger, cfg *rollup.Config, l2Cfg *params.ChainConfig, l ...@@ -59,9 +55,5 @@ func Program(logger log.Logger, cfg *rollup.Config, l2Cfg *params.ChainConfig, l
return err return err
} }
} }
if !d.ValidateClaim(eth.Bytes32(l2Claim)) { return d.ValidateClaim(eth.Bytes32(l2Claim))
return ErrClaimNotValid
}
logger.Info("Derivation complete", "head", d.SafeHead())
return nil
} }
package main package main
import ( import (
"errors"
"fmt" "fmt"
"os" "os"
"github.com/ethereum-optimism/optimism/op-program/client/driver"
"github.com/ethereum-optimism/optimism/op-program/host" "github.com/ethereum-optimism/optimism/op-program/host"
"github.com/ethereum-optimism/optimism/op-program/host/config" "github.com/ethereum-optimism/optimism/op-program/host/config"
"github.com/ethereum-optimism/optimism/op-program/host/flags" "github.com/ethereum-optimism/optimism/op-program/host/flags"
...@@ -35,9 +37,10 @@ var VersionWithMeta = func() string { ...@@ -35,9 +37,10 @@ var VersionWithMeta = func() string {
func main() { func main() {
args := os.Args args := os.Args
err := run(args, host.FaultProofProgram) if err := run(args, host.FaultProofProgram); errors.Is(err, driver.ErrClaimNotValid) {
if err != nil { log.Crit("Claim is invalid", "err", err)
log.Crit("Application failed", "message", err) } else if err != nil {
log.Crit("Application failed", "err", err)
} else { } else {
log.Info("Claim successfully verified") log.Info("Claim successfully verified")
} }
......
...@@ -131,7 +131,7 @@ func routeHints(logger log.Logger, hintReader *preimage.HintReader, hinter func( ...@@ -131,7 +131,7 @@ func routeHints(logger log.Logger, hintReader *preimage.HintReader, hinter func(
for { for {
if err := hintReader.NextHint(hinter); err != nil { if err := hintReader.NextHint(hinter); err != nil {
if err == io.EOF || errors.Is(err, io.ErrClosedPipe) { if err == io.EOF || errors.Is(err, io.ErrClosedPipe) {
logger.Info("closing pre-image hint handler") logger.Debug("closing pre-image hint handler")
return return
} }
logger.Error("pre-image hint router error", "err", err) logger.Error("pre-image hint router error", "err", err)
...@@ -146,7 +146,7 @@ func launchOracleServer(logger log.Logger, server *preimage.OracleServer, getter ...@@ -146,7 +146,7 @@ func launchOracleServer(logger log.Logger, server *preimage.OracleServer, getter
for { for {
if err := server.NextPreimageRequest(getter); err != nil { if err := server.NextPreimageRequest(getter); err != nil {
if err == io.EOF || errors.Is(err, io.ErrClosedPipe) { if err == io.EOF || errors.Is(err, io.ErrClosedPipe) {
logger.Info("closing pre-image server") logger.Debug("closing pre-image server")
return return
} }
logger.Error("pre-image server error", "error", err) logger.Error("pre-image server error", "error", err)
......
...@@ -49,11 +49,13 @@ func NewPrefetcher(logger log.Logger, l1Fetcher L1Source, l2Fetcher L2Source, kv ...@@ -49,11 +49,13 @@ func NewPrefetcher(logger log.Logger, l1Fetcher L1Source, l2Fetcher L2Source, kv
} }
func (p *Prefetcher) Hint(hint string) error { func (p *Prefetcher) Hint(hint string) error {
p.logger.Trace("Received hint", "hint", hint)
p.lastHint = hint p.lastHint = hint
return nil return nil
} }
func (p *Prefetcher) GetPreimage(ctx context.Context, key common.Hash) ([]byte, error) { func (p *Prefetcher) GetPreimage(ctx context.Context, key common.Hash) ([]byte, error) {
p.logger.Trace("Pre-image requested", "key", key)
pre, err := p.kvStore.Get(key) pre, err := p.kvStore.Get(key)
if errors.Is(err, kvstore.ErrNotFound) && p.lastHint != "" { if errors.Is(err, kvstore.ErrNotFound) && p.lastHint != "" {
hint := p.lastHint hint := p.lastHint
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment