Commit 53798bca authored by OptimismBot's avatar OptimismBot Committed by GitHub

Merge pull request #6459 from ethereum-optimism/refcell/solver-oracle-data

feat(op-challenger): GetOracleData call in Solver
parents f644287a e2b0ede4
...@@ -47,10 +47,11 @@ func (s *Solver) NextMove(claim types.Claim, agreeWithClaimLevel bool) (*types.C ...@@ -47,10 +47,11 @@ func (s *Solver) NextMove(claim types.Claim, agreeWithClaimLevel bool) (*types.C
} }
type StepData struct { type StepData struct {
LeafClaim types.Claim LeafClaim types.Claim
IsAttack bool IsAttack bool
PreState []byte PreState []byte
ProofData []byte ProofData []byte
OracleData types.PreimageOracleData
} }
// AttemptStep determines what step should occur for a given leaf claim. // AttemptStep determines what step should occur for a given leaf claim.
...@@ -83,11 +84,17 @@ func (s *Solver) AttemptStep(claim types.Claim, agreeWithClaimLevel bool) (StepD ...@@ -83,11 +84,17 @@ func (s *Solver) AttemptStep(claim types.Claim, agreeWithClaimLevel bool) (StepD
} }
} }
oracleData, err := s.trace.GetOracleData(index)
if err != nil {
return StepData{}, err
}
return StepData{ return StepData{
LeafClaim: claim, LeafClaim: claim,
IsAttack: !claimCorrect, IsAttack: !claimCorrect,
PreState: preState, PreState: preState,
ProofData: proofData, ProofData: proofData,
OracleData: *oracleData,
}, nil }, nil
} }
......
package solver_test package solver_test
import ( import (
"fmt" "errors"
"testing" "testing"
"github.com/ethereum-optimism/optimism/op-challenger/fault/solver" "github.com/ethereum-optimism/optimism/op-challenger/fault/solver"
...@@ -103,62 +103,78 @@ func TestNextMove(t *testing.T) { ...@@ -103,62 +103,78 @@ func TestNextMove(t *testing.T) {
func TestAttemptStep(t *testing.T) { func TestAttemptStep(t *testing.T) {
maxDepth := 3 maxDepth := 3
builder := test.NewAlphabetClaimBuilder(t, maxDepth) builder := test.NewAlphabetClaimBuilder(t, maxDepth)
alphabetSolver := solver.NewSolver(maxDepth, builder.CorrectTraceProvider())
// Last accessible leaf is the second last trace index // Last accessible leaf is the second last trace index
// The root node is used for the last trace index and can only be attacked. // The root node is used for the last trace index and can only be attacked.
lastLeafTraceIndex := uint64(1<<maxDepth - 2) lastLeafTraceIndex := uint64(1<<maxDepth - 2)
errProvider := errors.New("provider error")
tests := []struct { tests := []struct {
name string name string
claim types.Claim claim types.Claim
agreeWithLevel bool agreeWithLevel bool
expectedErr error expectedErr error
expectAttack bool expectAttack bool
expectPreState []byte expectPreState []byte
expectProofData []byte expectProofData []byte
expectedLocal bool
expectedOracleKey []byte
expectedOracleData []byte
}{ }{
{ {
name: "AttackFirstTraceIndex", name: "AttackFirstTraceIndex",
claim: builder.CreateLeafClaim(0, false), claim: builder.CreateLeafClaim(0, false),
expectAttack: true, expectAttack: true,
expectPreState: builder.CorrectTraceProvider().AbsolutePreState(), expectPreState: builder.CorrectTraceProvider().AbsolutePreState(),
expectProofData: nil, expectProofData: nil,
expectedOracleKey: []byte{byte(0)},
expectedOracleData: []byte{byte(0)},
}, },
{ {
name: "DefendFirstTraceIndex", name: "DefendFirstTraceIndex",
claim: builder.CreateLeafClaim(0, true), claim: builder.CreateLeafClaim(0, true),
expectAttack: false, expectAttack: false,
expectPreState: builder.CorrectPreState(0), expectPreState: builder.CorrectPreState(0),
expectProofData: builder.CorrectProofData(0), expectProofData: builder.CorrectProofData(0),
expectedOracleKey: []byte{byte(0)},
expectedOracleData: []byte{byte(0)},
}, },
{ {
name: "AttackMiddleTraceIndex", name: "AttackMiddleTraceIndex",
claim: builder.CreateLeafClaim(4, false), claim: builder.CreateLeafClaim(4, false),
expectAttack: true, expectAttack: true,
expectPreState: builder.CorrectPreState(3), expectPreState: builder.CorrectPreState(3),
expectProofData: builder.CorrectProofData(3), expectProofData: builder.CorrectProofData(3),
expectedOracleKey: []byte{byte(3)},
expectedOracleData: []byte{byte(3)},
}, },
{ {
name: "DefendMiddleTraceIndex", name: "DefendMiddleTraceIndex",
claim: builder.CreateLeafClaim(4, true), claim: builder.CreateLeafClaim(4, true),
expectAttack: false, expectAttack: false,
expectPreState: builder.CorrectPreState(4), expectPreState: builder.CorrectPreState(4),
expectProofData: builder.CorrectProofData(4), expectProofData: builder.CorrectProofData(4),
expectedOracleKey: []byte{byte(4)},
expectedOracleData: []byte{byte(4)},
}, },
{ {
name: "AttackLastTraceIndex", name: "AttackLastTraceIndex",
claim: builder.CreateLeafClaim(lastLeafTraceIndex, false), claim: builder.CreateLeafClaim(lastLeafTraceIndex, false),
expectAttack: true, expectAttack: true,
expectPreState: builder.CorrectPreState(lastLeafTraceIndex - 1), expectPreState: builder.CorrectPreState(lastLeafTraceIndex - 1),
expectProofData: builder.CorrectProofData(lastLeafTraceIndex - 1), expectProofData: builder.CorrectProofData(lastLeafTraceIndex - 1),
expectedOracleKey: []byte{byte(5)},
expectedOracleData: []byte{byte(5)},
}, },
{ {
name: "DefendLastTraceIndex", name: "DefendLastTraceIndex",
claim: builder.CreateLeafClaim(lastLeafTraceIndex, true), claim: builder.CreateLeafClaim(lastLeafTraceIndex, true),
expectAttack: false, expectAttack: false,
expectPreState: builder.CorrectPreState(lastLeafTraceIndex), expectPreState: builder.CorrectPreState(lastLeafTraceIndex),
expectProofData: builder.CorrectProofData(lastLeafTraceIndex), expectProofData: builder.CorrectProofData(lastLeafTraceIndex),
expectedOracleKey: []byte{byte(6)},
expectedOracleData: []byte{byte(6)},
}, },
{ {
name: "CannotStepNonLeaf", name: "CannotStepNonLeaf",
...@@ -171,21 +187,53 @@ func TestAttemptStep(t *testing.T) { ...@@ -171,21 +187,53 @@ func TestAttemptStep(t *testing.T) {
agreeWithLevel: true, agreeWithLevel: true,
expectedErr: solver.ErrStepNonLeafNode, expectedErr: solver.ErrStepNonLeafNode,
}, },
{
name: "CannotStepAgreedNode",
claim: builder.Seq(false).Attack(false).Get(),
agreeWithLevel: true,
expectedErr: solver.ErrStepNonLeafNode,
},
{
name: "AttackLocalOracleData",
claim: builder.Seq(false).Attack(false).Attack(true).Defend(false).Get(),
expectAttack: true,
agreeWithLevel: false,
expectPreState: builder.CorrectPreState(1),
expectProofData: builder.CorrectProofData(1),
expectedLocal: true,
expectedOracleKey: []byte{0x01},
expectedOracleData: []byte{0x01},
expectedErr: nil,
},
{
name: "AttackStepOracleError",
claim: builder.Seq(false).Attack(false).Attack(false).Attack(false).Get(),
agreeWithLevel: false,
expectedErr: errProvider,
},
} }
for _, test := range tests { for _, tableTest := range tests {
test := test tableTest := tableTest
t.Run(test.name, func(t *testing.T) { t.Run(tableTest.name, func(t *testing.T) {
fmt.Printf("%v\n", test.claim.Position.TraceIndex(maxDepth)) alphabetProvider := test.NewAlphabetWithProofProvider(t, maxDepth, nil)
step, err := alphabetSolver.AttemptStep(test.claim, test.agreeWithLevel) if errors.Is(tableTest.expectedErr, errProvider) {
if test.expectedErr == nil { alphabetProvider = test.NewAlphabetWithProofProvider(t, maxDepth, errProvider)
}
builder = test.NewClaimBuilder(t, maxDepth, alphabetProvider)
alphabetSolver := solver.NewSolver(maxDepth, builder.CorrectTraceProvider())
step, err := alphabetSolver.AttemptStep(tableTest.claim, tableTest.agreeWithLevel)
if tableTest.expectedErr == nil {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, test.claim, step.LeafClaim) require.Equal(t, tableTest.claim, step.LeafClaim)
require.Equal(t, test.expectAttack, step.IsAttack) require.Equal(t, tableTest.expectAttack, step.IsAttack)
require.Equal(t, test.expectPreState, step.PreState) require.Equal(t, tableTest.expectPreState, step.PreState)
require.Equal(t, test.expectProofData, step.ProofData) require.Equal(t, tableTest.expectProofData, step.ProofData)
require.Equal(t, tableTest.expectedLocal, step.OracleData.IsLocal)
require.Equal(t, tableTest.expectedOracleKey, step.OracleData.OracleKey)
require.Equal(t, tableTest.expectedOracleData, step.OracleData.OracleData)
} else { } else {
require.ErrorIs(t, err, test.expectedErr) require.ErrorIs(t, err, tableTest.expectedErr)
require.Equal(t, solver.StepData{}, step) require.Equal(t, solver.StepData{}, step)
} }
}) })
......
...@@ -4,15 +4,24 @@ import ( ...@@ -4,15 +4,24 @@ import (
"testing" "testing"
"github.com/ethereum-optimism/optimism/op-challenger/fault/alphabet" "github.com/ethereum-optimism/optimism/op-challenger/fault/alphabet"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
) )
func NewAlphabetWithProofProvider(t *testing.T, maxDepth int, oracleError error) *alphabetWithProofProvider {
return &alphabetWithProofProvider{
alphabet.NewAlphabetProvider("abcdefghijklmnopqrstuvwxyz", uint64(maxDepth)),
oracleError,
}
}
func NewAlphabetClaimBuilder(t *testing.T, maxDepth int) *ClaimBuilder { func NewAlphabetClaimBuilder(t *testing.T, maxDepth int) *ClaimBuilder {
alphabetProvider := &alphabetWithProofProvider{alphabet.NewAlphabetProvider("abcdefghijklmnopqrstuvwxyz", uint64(maxDepth))} alphabetProvider := NewAlphabetWithProofProvider(t, maxDepth, nil)
return NewClaimBuilder(t, maxDepth, alphabetProvider) return NewClaimBuilder(t, maxDepth, alphabetProvider)
} }
type alphabetWithProofProvider struct { type alphabetWithProofProvider struct {
*alphabet.AlphabetProvider *alphabet.AlphabetProvider
OracleError error
} }
func (a *alphabetWithProofProvider) GetPreimage(i uint64) ([]byte, []byte, error) { func (a *alphabetWithProofProvider) GetPreimage(i uint64) ([]byte, []byte, error) {
...@@ -22,3 +31,11 @@ func (a *alphabetWithProofProvider) GetPreimage(i uint64) ([]byte, []byte, error ...@@ -22,3 +31,11 @@ func (a *alphabetWithProofProvider) GetPreimage(i uint64) ([]byte, []byte, error
} }
return preimage, []byte{byte(i)}, nil return preimage, []byte{byte(i)}, nil
} }
func (a *alphabetWithProofProvider) GetOracleData(i uint64) (*types.PreimageOracleData, error) {
if a.OracleError != nil {
return &types.PreimageOracleData{}, a.OracleError
}
data := types.NewPreimageOracleData([]byte{byte(i)}, []byte{byte(i)})
return &data, nil
}
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