Commit de795648 authored by Adrian Sutton's avatar Adrian Sutton Committed by GitHub

op-challenger: Log warning and continue if game impl not available (#12539)

parent 984bd412
...@@ -256,7 +256,7 @@ func (e *RegisterTask) Register( ...@@ -256,7 +256,7 @@ func (e *RegisterTask) Register(
} }
return NewGamePlayer(ctx, systemClock, l1Clock, logger, m, dir, game.Proxy, txSender, contract, syncValidator, validators, creator, l1HeaderSource, selective, claimants) return NewGamePlayer(ctx, systemClock, l1Clock, logger, m, dir, game.Proxy, txSender, contract, syncValidator, validators, creator, l1HeaderSource, selective, claimants)
} }
err := registerOracle(ctx, m, oracles, gameFactory, caller, e.gameType) err := registerOracle(ctx, logger, m, oracles, gameFactory, caller, e.gameType)
if err != nil { if err != nil {
return err return err
} }
...@@ -269,11 +269,15 @@ func (e *RegisterTask) Register( ...@@ -269,11 +269,15 @@ func (e *RegisterTask) Register(
return nil return nil
} }
func registerOracle(ctx context.Context, m metrics.Metricer, oracles OracleRegistry, gameFactory *contracts.DisputeGameFactoryContract, caller *batching.MultiCaller, gameType faultTypes.GameType) error { func registerOracle(ctx context.Context, logger log.Logger, m metrics.Metricer, oracles OracleRegistry, gameFactory *contracts.DisputeGameFactoryContract, caller *batching.MultiCaller, gameType faultTypes.GameType) error {
implAddr, err := gameFactory.GetGameImpl(ctx, gameType) implAddr, err := gameFactory.GetGameImpl(ctx, gameType)
if err != nil { if err != nil {
return fmt.Errorf("failed to load implementation for game type %v: %w", gameType, err) return fmt.Errorf("failed to load implementation for game type %v: %w", gameType, err)
} }
if implAddr == (common.Address{}) {
logger.Warn("No game implementation set for game type", "gameType", gameType)
return nil
}
contract, err := contracts.NewFaultDisputeGameContract(ctx, m, implAddr, caller) contract, err := contracts.NewFaultDisputeGameContract(ctx, m, implAddr, caller)
if err != nil { if err != nil {
return fmt.Errorf("failed to create fault dispute game contracts: %w", err) return fmt.Errorf("failed to create fault dispute game contracts: %w", err)
......
package fault
import (
"context"
"testing"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/ethereum-optimism/optimism/op-challenger/game/registry"
"github.com/ethereum-optimism/optimism/op-challenger/metrics"
"github.com/ethereum-optimism/optimism/op-service/sources/batching"
"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
"github.com/ethereum-optimism/optimism/op-service/sources/batching/test"
"github.com/ethereum-optimism/optimism/op-service/testlog"
"github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/log"
"github.com/stretchr/testify/require"
)
func TestRegisterOracle_MissingGameImpl(t *testing.T) {
gameFactoryAddr := common.Address{0xaa}
rpc := test.NewAbiBasedRpc(t, gameFactoryAddr, snapshots.LoadDisputeGameFactoryABI())
m := metrics.NoopMetrics
caller := batching.NewMultiCaller(rpc, batching.DefaultBatchSize)
gameFactory := contracts.NewDisputeGameFactoryContract(m, gameFactoryAddr, caller)
logger, logs := testlog.CaptureLogger(t, log.LvlInfo)
oracles := registry.NewOracleRegistry()
gameType := faultTypes.CannonGameType
rpc.SetResponse(gameFactoryAddr, "gameImpls", rpcblock.Latest, []interface{}{gameType}, []interface{}{common.Address{}})
err := registerOracle(context.Background(), logger, m, oracles, gameFactory, caller, gameType)
require.NoError(t, err)
require.NotNil(t, logs.FindLog(
testlog.NewMessageFilter("No game implementation set for game type"),
testlog.NewAttributesFilter("gameType", gameType.String())))
}
func TestRegisterOracle_AddsOracle(t *testing.T) {
gameFactoryAddr := common.Address{0xaa}
gameImplAddr := common.Address{0xbb}
vmAddr := common.Address{0xcc}
oracleAddr := common.Address{0xdd}
rpc := test.NewAbiBasedRpc(t, gameFactoryAddr, snapshots.LoadDisputeGameFactoryABI())
rpc.AddContract(gameImplAddr, snapshots.LoadFaultDisputeGameABI())
rpc.AddContract(vmAddr, snapshots.LoadMIPSABI())
rpc.AddContract(oracleAddr, snapshots.LoadPreimageOracleABI())
m := metrics.NoopMetrics
caller := batching.NewMultiCaller(rpc, batching.DefaultBatchSize)
gameFactory := contracts.NewDisputeGameFactoryContract(m, gameFactoryAddr, caller)
logger := testlog.Logger(t, log.LvlInfo)
oracles := registry.NewOracleRegistry()
gameType := faultTypes.CannonGameType
// Use the latest v1 of these contracts. Doesn't have to be an exact match for the version.
rpc.SetResponse(gameImplAddr, "version", rpcblock.Latest, []interface{}{}, []interface{}{"1.100.0"})
rpc.SetResponse(oracleAddr, "version", rpcblock.Latest, []interface{}{}, []interface{}{"1.100.0"})
rpc.SetResponse(gameFactoryAddr, "gameImpls", rpcblock.Latest, []interface{}{gameType}, []interface{}{gameImplAddr})
rpc.SetResponse(gameImplAddr, "vm", rpcblock.Latest, []interface{}{}, []interface{}{vmAddr})
rpc.SetResponse(vmAddr, "oracle", rpcblock.Latest, []interface{}{}, []interface{}{oracleAddr})
err := registerOracle(context.Background(), logger, m, oracles, gameFactory, caller, gameType)
require.NoError(t, err)
registered := oracles.Oracles()
require.Len(t, registered, 1)
require.Equal(t, oracleAddr, registered[0].Addr())
}
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