Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
2bf094a8
Unverified
Commit
2bf094a8
authored
Nov 08, 2023
by
Adrian Sutton
Committed by
GitHub
Nov 08, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #8043 from ethereum-optimism/aj/simple-trace-accessor
op-challenger: Introduce TraceAccessor
parents
f292f095
8c219fcb
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
151 additions
and
40 deletions
+151
-40
agent.go
op-challenger/game/fault/agent.go
+1
-1
agent_test.go
op-challenger/game/fault/agent_test.go
+3
-2
player.go
op-challenger/game/fault/player.go
+4
-1
game_solver.go
op-challenger/game/fault/solver/game_solver.go
+1
-1
game_solver_test.go
op-challenger/game/fault/solver/game_solver_test.go
+2
-1
solver.go
op-challenger/game/fault/solver/solver.go
+24
-33
solver_test.go
op-challenger/game/fault/solver/solver_test.go
+2
-1
select.go
op-challenger/game/fault/trace/select.go
+39
-0
select_test.go
op-challenger/game/fault/trace/select_test.go
+70
-0
types.go
op-challenger/game/fault/types/types.go
+5
-0
No files found.
op-challenger/game/fault/agent.go
View file @
2bf094a8
...
...
@@ -39,7 +39,7 @@ type Agent struct {
log
log
.
Logger
}
func
NewAgent
(
m
metrics
.
Metricer
,
loader
ClaimLoader
,
maxDepth
int
,
trace
types
.
Trace
Provide
r
,
responder
Responder
,
updater
types
.
OracleUpdater
,
agreeWithProposedOutput
bool
,
log
log
.
Logger
)
*
Agent
{
func
NewAgent
(
m
metrics
.
Metricer
,
loader
ClaimLoader
,
maxDepth
int
,
trace
types
.
Trace
Accesso
r
,
responder
Responder
,
updater
types
.
OracleUpdater
,
agreeWithProposedOutput
bool
,
log
log
.
Logger
)
*
Agent
{
return
&
Agent
{
metrics
:
m
,
solver
:
solver
.
NewGameSolver
(
maxDepth
,
trace
),
...
...
op-challenger/game/fault/agent_test.go
View file @
2bf094a8
...
...
@@ -5,6 +5,7 @@ import (
"errors"
"testing"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace"
"github.com/stretchr/testify/require"
"github.com/ethereum/go-ethereum/log"
...
...
@@ -112,10 +113,10 @@ func setupTestAgent(t *testing.T, agreeWithProposedOutput bool) (*Agent, *stubCl
logger
:=
testlog
.
Logger
(
t
,
log
.
LvlInfo
)
claimLoader
:=
&
stubClaimLoader
{}
depth
:=
4
trace
:=
alphabet
.
NewTraceProvider
(
"abcd"
,
uint64
(
depth
))
provider
:=
alphabet
.
NewTraceProvider
(
"abcd"
,
uint64
(
depth
))
responder
:=
&
stubResponder
{}
updater
:=
&
stubUpdater
{}
agent
:=
NewAgent
(
metrics
.
NoopMetrics
,
claimLoader
,
depth
,
trace
,
responder
,
updater
,
agreeWithProposedOutput
,
logger
)
agent
:=
NewAgent
(
metrics
.
NoopMetrics
,
claimLoader
,
depth
,
trace
.
NewSimpleTraceAccessor
(
provider
)
,
responder
,
updater
,
agreeWithProposedOutput
,
logger
)
return
agent
,
claimLoader
,
responder
}
...
...
op-challenger/game/fault/player.go
View file @
2bf094a8
...
...
@@ -8,6 +8,7 @@ import (
"github.com/ethereum-optimism/optimism/op-challenger/config"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/responder"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
gameTypes
"github.com/ethereum-optimism/optimism/op-challenger/game/types"
"github.com/ethereum-optimism/optimism/op-challenger/metrics"
...
...
@@ -90,8 +91,10 @@ func NewGamePlayer(
return
nil
,
fmt
.
Errorf
(
"failed to create the responder: %w"
,
err
)
}
accessor
:=
trace
.
NewSimpleTraceAccessor
(
provider
)
agent
:=
NewAgent
(
m
,
loader
,
int
(
gameDepth
),
accessor
,
responder
,
updater
,
cfg
.
AgreeWithProposedOutput
,
logger
)
return
&
GamePlayer
{
act
:
NewAgent
(
m
,
loader
,
int
(
gameDepth
),
provider
,
responder
,
updater
,
cfg
.
AgreeWithProposedOutput
,
logger
)
.
Act
,
act
:
agent
.
Act
,
agreeWithProposedOutput
:
cfg
.
AgreeWithProposedOutput
,
loader
:
loader
,
logger
:
logger
,
...
...
op-challenger/game/fault/solver/game_solver.go
View file @
2bf094a8
...
...
@@ -12,7 +12,7 @@ type GameSolver struct {
claimSolver
*
claimSolver
}
func
NewGameSolver
(
gameDepth
int
,
trace
types
.
Trace
Provide
r
)
*
GameSolver
{
func
NewGameSolver
(
gameDepth
int
,
trace
types
.
Trace
Accesso
r
)
*
GameSolver
{
return
&
GameSolver
{
claimSolver
:
newClaimSolver
(
gameDepth
,
trace
),
}
...
...
op-challenger/game/fault/solver/game_solver_test.go
View file @
2bf094a8
...
...
@@ -6,6 +6,7 @@ import (
"testing"
faulttest
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/test"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace"
"github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/require"
)
...
...
@@ -113,7 +114,7 @@ func TestCalculateNextActions(t *testing.T) {
i
,
claim
.
Position
.
ToGIndex
(),
claim
.
Position
.
TraceIndex
(
maxDepth
),
claim
.
ParentContractIndex
,
claim
.
Countered
,
claim
.
Value
)
}
solver
:=
NewGameSolver
(
maxDepth
,
claimBuilder
.
CorrectTraceProvider
(
))
solver
:=
NewGameSolver
(
maxDepth
,
trace
.
NewSimpleTraceAccessor
(
claimBuilder
.
CorrectTraceProvider
()
))
actions
,
err
:=
solver
.
CalculateNextActions
(
context
.
Background
(),
game
)
require
.
NoError
(
t
,
err
)
for
i
,
action
:=
range
actions
{
...
...
op-challenger/game/fault/solver/solver.go
View file @
2bf094a8
...
...
@@ -7,7 +7,6 @@ import (
"fmt"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/ethereum/go-ethereum/common"
)
var
(
...
...
@@ -18,14 +17,14 @@ var (
// claimSolver uses a [TraceProvider] to determine the moves to make in a dispute game.
type
claimSolver
struct
{
trace
types
.
Trace
Provide
r
trace
types
.
Trace
Accesso
r
gameDepth
int
}
// newClaimSolver creates a new [claimSolver] using the provided [TraceProvider].
func
newClaimSolver
(
gameDepth
int
,
trace
Provider
types
.
TraceProvide
r
)
*
claimSolver
{
func
newClaimSolver
(
gameDepth
int
,
trace
types
.
TraceAccesso
r
)
*
claimSolver
{
return
&
claimSolver
{
trace
Provider
,
trace
,
gameDepth
,
}
}
...
...
@@ -53,14 +52,14 @@ func (s *claimSolver) NextMove(ctx context.Context, claim types.Claim, game type
}
}
agree
,
err
:=
s
.
agreeWithClaim
(
ctx
,
claim
.
ClaimData
)
agree
,
err
:=
s
.
agreeWithClaim
(
ctx
,
game
,
claim
)
if
err
!=
nil
{
return
nil
,
err
}
if
agree
{
return
s
.
defend
(
ctx
,
claim
)
return
s
.
defend
(
ctx
,
game
,
claim
)
}
else
{
return
s
.
attack
(
ctx
,
claim
)
return
s
.
attack
(
ctx
,
game
,
claim
)
}
}
...
...
@@ -93,28 +92,25 @@ func (s *claimSolver) AttemptStep(ctx context.Context, game types.Game, claim ty
return
StepData
{},
ErrStepIgnoreInvalidPath
}
claimCorrect
,
err
:=
s
.
agreeWithClaim
(
ctx
,
claim
.
ClaimData
)
claimCorrect
,
err
:=
s
.
agreeWithClaim
(
ctx
,
game
,
claim
)
if
err
!=
nil
{
return
StepData
{},
err
}
var
preState
[]
byte
var
proofData
[]
byte
var
oracleData
*
types
.
PreimageOracleData
var
position
types
.
Position
if
!
claimCorrect
{
// Attack the claim by executing step index, so we need to get the pre-state of that index
preState
,
proofData
,
oracleData
,
err
=
s
.
trace
.
GetStepData
(
ctx
,
claim
.
Position
)
if
err
!=
nil
{
return
StepData
{},
err
}
position
=
claim
.
Position
}
else
{
// We agree with the claim so Defend and use this claim as the starting point to
// execute the step after. Thus we need the pre-state of the next step.
preState
,
proofData
,
oracleData
,
err
=
s
.
trace
.
GetStepData
(
ctx
,
claim
.
MoveRight
())
// Defend and use this claim as the starting point to execute the step after.
// Thus, we need the pre-state of the next step.
position
=
claim
.
Position
.
MoveRight
()
}
preState
,
proofData
,
oracleData
,
err
:=
s
.
trace
.
GetStepData
(
ctx
,
game
,
claim
,
position
)
if
err
!=
nil
{
return
StepData
{},
err
}
}
return
StepData
{
LeafClaim
:
claim
,
...
...
@@ -126,9 +122,9 @@ func (s *claimSolver) AttemptStep(ctx context.Context, game types.Game, claim ty
}
// attack returns a response that attacks the claim.
func
(
s
*
claimSolver
)
attack
(
ctx
context
.
Context
,
claim
types
.
Claim
)
(
*
types
.
Claim
,
error
)
{
func
(
s
*
claimSolver
)
attack
(
ctx
context
.
Context
,
game
types
.
Game
,
claim
types
.
Claim
)
(
*
types
.
Claim
,
error
)
{
position
:=
claim
.
Attack
()
value
,
err
:=
s
.
trace
AtPosition
(
ctx
,
position
)
value
,
err
:=
s
.
trace
.
Get
(
ctx
,
game
,
claim
,
position
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"attack claim: %w"
,
err
)
}
...
...
@@ -139,12 +135,12 @@ func (s *claimSolver) attack(ctx context.Context, claim types.Claim) (*types.Cla
}
// defend returns a response that defends the claim.
func
(
s
*
claimSolver
)
defend
(
ctx
context
.
Context
,
claim
types
.
Claim
)
(
*
types
.
Claim
,
error
)
{
func
(
s
*
claimSolver
)
defend
(
ctx
context
.
Context
,
game
types
.
Game
,
claim
types
.
Claim
)
(
*
types
.
Claim
,
error
)
{
if
claim
.
IsRoot
()
{
return
nil
,
nil
}
position
:=
claim
.
Defend
()
value
,
err
:=
s
.
trace
AtPosition
(
ctx
,
position
)
value
,
err
:=
s
.
trace
.
Get
(
ctx
,
game
,
claim
,
position
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"defend claim: %w"
,
err
)
}
...
...
@@ -155,19 +151,14 @@ func (s *claimSolver) defend(ctx context.Context, claim types.Claim) (*types.Cla
}
// agreeWithClaim returns true if the claim is correct according to the internal [TraceProvider].
func
(
s
*
claimSolver
)
agreeWithClaim
(
ctx
context
.
Context
,
claim
types
.
ClaimData
)
(
bool
,
error
)
{
ourValue
,
err
:=
s
.
trace
AtPosition
(
ctx
,
claim
.
Position
)
func
(
s
*
claimSolver
)
agreeWithClaim
(
ctx
context
.
Context
,
game
types
.
Game
,
claim
types
.
Claim
)
(
bool
,
error
)
{
ourValue
,
err
:=
s
.
trace
.
Get
(
ctx
,
game
,
claim
,
claim
.
Position
)
return
bytes
.
Equal
(
ourValue
[
:
],
claim
.
Value
[
:
]),
err
}
// traceAtPosition returns the [common.Hash] from internal [TraceProvider] at the given [Position].
func
(
s
*
claimSolver
)
traceAtPosition
(
ctx
context
.
Context
,
p
types
.
Position
)
(
common
.
Hash
,
error
)
{
return
s
.
trace
.
Get
(
ctx
,
p
)
}
// agreeWithClaimPath returns true if the every other claim in the path to root is correct according to the internal [TraceProvider].
func
(
s
*
claimSolver
)
agreeWithClaimPath
(
ctx
context
.
Context
,
game
types
.
Game
,
claim
types
.
Claim
)
(
bool
,
error
)
{
agree
,
err
:=
s
.
agreeWithClaim
(
ctx
,
claim
.
ClaimData
)
agree
,
err
:=
s
.
agreeWithClaim
(
ctx
,
game
,
claim
)
if
err
!=
nil
{
return
false
,
err
}
...
...
op-challenger/game/fault/solver/solver_test.go
View file @
2bf094a8
...
...
@@ -6,6 +6,7 @@ import (
"testing"
faulttest
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/test"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/require"
...
...
@@ -161,7 +162,7 @@ func TestAttemptStep(t *testing.T) {
t
.
Run
(
tableTest
.
name
,
func
(
t
*
testing
.
T
)
{
builder
:=
claimBuilder
.
GameBuilder
(
tableTest
.
agreeWithOutputRoot
,
!
tableTest
.
agreeWithOutputRoot
)
tableTest
.
setupGame
(
builder
)
alphabetSolver
:=
newClaimSolver
(
maxDepth
,
claimBuilder
.
CorrectTraceProvider
(
))
alphabetSolver
:=
newClaimSolver
(
maxDepth
,
trace
.
NewSimpleTraceAccessor
(
claimBuilder
.
CorrectTraceProvider
()
))
game
:=
builder
.
Game
claims
:=
game
.
Claims
()
lastClaim
:=
claims
[
len
(
claims
)
-
1
]
...
...
op-challenger/game/fault/trace/select.go
0 → 100644
View file @
2bf094a8
package
trace
import
(
"context"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/ethereum/go-ethereum/common"
)
type
ProviderCreator
func
(
ctx
context
.
Context
,
pre
types
.
Claim
,
post
types
.
Claim
)
(
types
.
TraceProvider
,
error
)
func
NewSimpleTraceAccessor
(
trace
types
.
TraceProvider
)
*
Accessor
{
selector
:=
func
(
_
context
.
Context
,
_
types
.
Game
,
_
types
.
Claim
,
_
types
.
Position
)
(
types
.
TraceProvider
,
error
)
{
return
trace
,
nil
}
return
&
Accessor
{
selector
}
}
type
Accessor
struct
{
selector
func
(
ctx
context
.
Context
,
game
types
.
Game
,
ref
types
.
Claim
,
pos
types
.
Position
)
(
types
.
TraceProvider
,
error
)
}
func
(
t
*
Accessor
)
Get
(
ctx
context
.
Context
,
game
types
.
Game
,
ref
types
.
Claim
,
pos
types
.
Position
)
(
common
.
Hash
,
error
)
{
provider
,
err
:=
t
.
selector
(
ctx
,
game
,
ref
,
pos
)
if
err
!=
nil
{
return
common
.
Hash
{},
err
}
return
provider
.
Get
(
ctx
,
pos
)
}
func
(
t
*
Accessor
)
GetStepData
(
ctx
context
.
Context
,
game
types
.
Game
,
ref
types
.
Claim
,
pos
types
.
Position
)
(
prestate
[]
byte
,
proofData
[]
byte
,
preimageData
*
types
.
PreimageOracleData
,
err
error
)
{
provider
,
err
:=
t
.
selector
(
ctx
,
game
,
ref
,
pos
)
if
err
!=
nil
{
return
nil
,
nil
,
nil
,
err
}
return
provider
.
GetStepData
(
ctx
,
pos
)
}
var
_
types
.
TraceAccessor
=
(
*
Accessor
)(
nil
)
op-challenger/game/fault/trace/select_test.go
0 → 100644
View file @
2bf094a8
package
trace
import
(
"context"
"fmt"
"math/big"
"testing"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/test"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/alphabet"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/stretchr/testify/require"
)
func
TestAccessor_UsesSelector
(
t
*
testing
.
T
)
{
ctx
:=
context
.
Background
()
depth
:=
uint64
(
4
)
provider1
:=
test
.
NewAlphabetWithProofProvider
(
t
,
int
(
depth
),
nil
)
provider2
:=
alphabet
.
NewTraceProvider
(
"qrstuv"
,
depth
)
claim
:=
types
.
Claim
{}
game
:=
types
.
NewGameState
(
true
,
[]
types
.
Claim
{
claim
},
depth
)
pos1
:=
types
.
NewPositionFromGIndex
(
big
.
NewInt
(
4
))
pos2
:=
types
.
NewPositionFromGIndex
(
big
.
NewInt
(
6
))
accessor
:=
&
Accessor
{
selector
:
func
(
ctx
context
.
Context
,
actualGame
types
.
Game
,
ref
types
.
Claim
,
pos
types
.
Position
)
(
types
.
TraceProvider
,
error
)
{
require
.
Equal
(
t
,
game
,
actualGame
)
require
.
Equal
(
t
,
claim
,
ref
)
if
pos
==
pos1
{
return
provider1
,
nil
}
else
if
pos
==
pos2
{
return
provider2
,
nil
}
return
nil
,
fmt
.
Errorf
(
"incorrect position requested: %v"
,
pos
)
},
}
t
.
Run
(
"Get"
,
func
(
t
*
testing
.
T
)
{
actual
,
err
:=
accessor
.
Get
(
ctx
,
game
,
claim
,
pos1
)
require
.
NoError
(
t
,
err
)
expected
,
err
:=
provider1
.
Get
(
ctx
,
pos1
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
expected
,
actual
)
actual
,
err
=
accessor
.
Get
(
ctx
,
game
,
claim
,
pos2
)
require
.
NoError
(
t
,
err
)
expected
,
err
=
provider2
.
Get
(
ctx
,
pos2
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
expected
,
actual
)
})
t
.
Run
(
"GetStepData"
,
func
(
t
*
testing
.
T
)
{
actualPrestate
,
actualProofData
,
actualPreimageData
,
err
:=
accessor
.
GetStepData
(
ctx
,
game
,
claim
,
pos1
)
require
.
NoError
(
t
,
err
)
expectedPrestate
,
expectedProofData
,
expectedPreimageData
,
err
:=
provider1
.
GetStepData
(
ctx
,
pos1
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
expectedPrestate
,
actualPrestate
)
require
.
Equal
(
t
,
expectedProofData
,
actualProofData
)
require
.
Equal
(
t
,
expectedPreimageData
,
actualPreimageData
)
actualPrestate
,
actualProofData
,
actualPreimageData
,
err
=
accessor
.
GetStepData
(
ctx
,
game
,
claim
,
pos2
)
require
.
NoError
(
t
,
err
)
expectedPrestate
,
expectedProofData
,
expectedPreimageData
,
err
=
provider2
.
GetStepData
(
ctx
,
pos2
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
expectedPrestate
,
actualPrestate
)
require
.
Equal
(
t
,
expectedProofData
,
actualProofData
)
require
.
Equal
(
t
,
expectedPreimageData
,
actualPreimageData
)
})
}
op-challenger/game/fault/types/types.go
View file @
2bf094a8
...
...
@@ -57,6 +57,11 @@ type OracleUpdater interface {
UpdateOracle
(
ctx
context
.
Context
,
data
*
PreimageOracleData
)
error
}
type
TraceAccessor
interface
{
Get
(
ctx
context
.
Context
,
game
Game
,
ref
Claim
,
pos
Position
)
(
common
.
Hash
,
error
)
GetStepData
(
ctx
context
.
Context
,
game
Game
,
ref
Claim
,
pos
Position
)
(
prestate
[]
byte
,
proofData
[]
byte
,
preimageData
*
PreimageOracleData
,
err
error
)
}
// TraceProvider is a generic way to get a claim value at a specific step in the trace.
type
TraceProvider
interface
{
// Get returns the claim value at the requested index.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment