Commit 0578a390 authored by Andreas Bigger's avatar Andreas Bigger

Solver module

parent fe481a49
......@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"github.com/ethereum-optimism/optimism/op-challenger/fault/solver"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/ethereum/go-ethereum/log"
)
......@@ -19,7 +20,7 @@ type Responder interface {
}
type Agent struct {
solver *Solver
solver *solver.Solver
loader Loader
responder Responder
maxDepth int
......@@ -29,7 +30,7 @@ type Agent struct {
func NewAgent(loader Loader, maxDepth int, trace types.TraceProvider, responder Responder, agreeWithProposedOutput bool, log log.Logger) *Agent {
return &Agent{
solver: NewSolver(maxDepth, trace),
solver: solver.NewSolver(maxDepth, trace),
loader: loader,
responder: responder,
maxDepth: maxDepth,
......@@ -49,7 +50,7 @@ func (a *Agent) Act(ctx context.Context) error {
}
// Create counter claims
for _, claim := range game.Claims() {
if err := a.move(ctx, claim, game); err != nil && !errors.Is(err, ErrGameDepthReached) {
if err := a.move(ctx, claim, game); err != nil && !errors.Is(err, types.ErrGameDepthReached) {
log.Error("Failed to move", "err", err)
}
}
......
package fault
package solver
import (
"errors"
......@@ -9,9 +9,8 @@ import (
)
var (
ErrGameDepthReached = errors.New("game depth reached")
ErrStepNonLeafNode = errors.New("cannot step on non-leaf claims")
ErrStepAgreedClaim = errors.New("cannot step on claims we agree with")
ErrStepNonLeafNode = errors.New("cannot step on non-leaf claims")
ErrStepAgreedClaim = errors.New("cannot step on claims we agree with")
)
// Solver uses a [TraceProvider] to determine the moves to make in a dispute game.
......@@ -62,7 +61,7 @@ func (s *Solver) handleMiddle(claim types.Claim) (*types.Claim, error) {
return nil, err
}
if claim.Depth() == s.gameDepth {
return nil, ErrGameDepthReached
return nil, types.ErrGameDepthReached
}
if claimCorrect {
return s.defend(claim)
......
package fault
package solver_test
import (
"fmt"
"testing"
"github.com/ethereum-optimism/optimism/op-challenger/fault/solver"
"github.com/ethereum-optimism/optimism/op-challenger/fault/test"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/stretchr/testify/require"
)
func TestNextMove(t *testing.T) {
maxDepth := 4
builder := NewClaimBuilder(t, maxDepth)
builder := test.NewAlphabetClaimBuilder(t, maxDepth)
tests := []struct {
name string
claim types.Claim
......@@ -70,18 +72,18 @@ func TestNextMove(t *testing.T) {
{
name: "ErrorWhenClaimIsLeaf_Correct",
claim: builder.CreateLeafClaim(4, true),
expectedErr: ErrGameDepthReached,
expectedErr: types.ErrGameDepthReached,
},
{
name: "ErrorWhenClaimIsLeaf_Incorrect",
claim: builder.CreateLeafClaim(6, false),
expectedErr: ErrGameDepthReached,
expectedErr: types.ErrGameDepthReached,
},
}
for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) {
solver := NewSolver(maxDepth, builder.CorrectTraceProvider())
solver := solver.NewSolver(maxDepth, builder.CorrectTraceProvider())
move, err := solver.NextMove(test.claim, test.agreeWithLevel)
if test.expectedErr == nil {
require.NoError(t, err)
......@@ -100,8 +102,8 @@ func TestNextMove(t *testing.T) {
func TestAttemptStep(t *testing.T) {
maxDepth := 3
builder := NewClaimBuilder(t, maxDepth)
solver := NewSolver(maxDepth, builder.CorrectTraceProvider())
builder := test.NewAlphabetClaimBuilder(t, maxDepth)
alphabetSolver := solver.NewSolver(maxDepth, builder.CorrectTraceProvider())
// Last accessible leaf is the second last trace index
// The root node is used for the last trace index and can only be attacked.
......@@ -161,13 +163,13 @@ func TestAttemptStep(t *testing.T) {
{
name: "CannotStepNonLeaf",
claim: builder.Seq(false).Attack(false).Get(),
expectedErr: ErrStepNonLeafNode,
expectedErr: solver.ErrStepNonLeafNode,
},
{
name: "CannotStepAgreedNode",
claim: builder.Seq(false).Attack(false).Get(),
agreeWithLevel: true,
expectedErr: ErrStepNonLeafNode,
expectedErr: solver.ErrStepNonLeafNode,
},
}
......@@ -175,7 +177,7 @@ func TestAttemptStep(t *testing.T) {
test := test
t.Run(test.name, func(t *testing.T) {
fmt.Printf("%v\n", test.claim.Position.TraceIndex(maxDepth))
step, err := solver.AttemptStep(test.claim, test.agreeWithLevel)
step, err := alphabetSolver.AttemptStep(test.claim, test.agreeWithLevel)
if test.expectedErr == nil {
require.NoError(t, err)
require.Equal(t, test.claim, step.LeafClaim)
......@@ -184,7 +186,7 @@ func TestAttemptStep(t *testing.T) {
require.Equal(t, test.expectProofData, step.ProofData)
} else {
require.ErrorIs(t, err, test.expectedErr)
require.Equal(t, StepData{}, step)
require.Equal(t, solver.StepData{}, step)
}
})
}
......
package test
import (
"testing"
"github.com/ethereum-optimism/optimism/op-challenger/fault"
)
func NewAlphabetClaimBuilder(t *testing.T, maxDepth int) *ClaimBuilder {
alphabetProvider := &alphabetWithProofProvider{fault.NewAlphabetProvider("abcdefghijklmnopqrstuvwxyz", uint64(maxDepth))}
return NewClaimBuilder(t, maxDepth, alphabetProvider)
}
type alphabetWithProofProvider struct {
*fault.AlphabetProvider
}
func (a *alphabetWithProofProvider) GetPreimage(i uint64) ([]byte, []byte, error) {
preimage, _, err := a.AlphabetProvider.GetPreimage(i)
if err != nil {
return nil, nil, err
}
return preimage, []byte{byte(i)}, nil
}
package fault
package test
import (
"math/big"
......@@ -17,11 +17,16 @@ type ClaimBuilder struct {
correct types.TraceProvider
}
func NewClaimBuilder(t *testing.T, maxDepth int) *ClaimBuilder {
// NewClaimBuilder creates a new [ClaimBuilder].
func NewClaimBuilder(t *testing.T, maxDepth int, provider types.TraceProvider) *ClaimBuilder {
return &ClaimBuilder{
require: require.New(t),
maxDepth: maxDepth,
<<<<<<< HEAD:op-challenger/fault/claimbuilder_test.go
correct: &alphabetWithProofProvider{alphabet.NewAlphabetProvider("abcdefghijklmnopqrstuvwxyz", uint64(maxDepth))},
=======
correct: provider,
>>>>>>> 99df402dd (Solver module):op-challenger/fault/test/claim_builder.go
}
}
......@@ -109,6 +114,7 @@ func (c *ClaimBuilder) DefendClaim(claim types.Claim, correct bool) types.Claim
Parent: claim.ClaimData,
}
}
<<<<<<< HEAD:op-challenger/fault/claimbuilder_test.go
type SequenceBuilder struct {
builder *ClaimBuilder
......@@ -157,3 +163,5 @@ func (a *alphabetWithProofProvider) GetPreimage(i uint64) ([]byte, []byte, error
}
return preimage, []byte{byte(i)}, nil
}
=======
>>>>>>> 99df402dd (Solver module):op-challenger/fault/test/claim_builder.go
package test
import (
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
)
type SequenceBuilder struct {
builder *ClaimBuilder
lastClaim types.Claim
}
// Seq starts building a claim by following a sequence of attack and defend moves from the root
// The returned SequenceBuilder can be used to add additional moves. e.g:
// claim := Seq(true).Attack(false).Attack(true).Defend(true).Get()
func (c *ClaimBuilder) Seq(rootCorrect bool) *SequenceBuilder {
claim := c.CreateRootClaim(rootCorrect)
return &SequenceBuilder{
builder: c,
lastClaim: claim,
}
}
func (s *SequenceBuilder) Attack(correct bool) *SequenceBuilder {
claim := s.builder.AttackClaim(s.lastClaim, correct)
return &SequenceBuilder{
builder: s.builder,
lastClaim: claim,
}
}
func (s *SequenceBuilder) Defend(correct bool) *SequenceBuilder {
claim := s.builder.DefendClaim(s.lastClaim, correct)
return &SequenceBuilder{
builder: s.builder,
lastClaim: claim,
}
}
func (s *SequenceBuilder) Get() types.Claim {
return s.lastClaim
}
......@@ -4,6 +4,14 @@ import (
"github.com/ethereum/go-ethereum/common"
)
<<<<<<< HEAD
=======
var (
ErrIndexTooLarge = errors.New("index is larger than the maximum index")
ErrGameDepthReached = errors.New("game depth reached")
)
>>>>>>> 99df402dd (Solver module)
type GameStatus uint8
const (
......
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