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
0578a390
Commit
0578a390
authored
Jul 24, 2023
by
Andreas Bigger
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Solver module
parent
fe481a49
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
104 additions
and
21 deletions
+104
-21
agent.go
op-challenger/fault/agent.go
+4
-3
solver.go
op-challenger/fault/solver/solver.go
+4
-5
solver_test.go
op-challenger/fault/solver/solver_test.go
+13
-11
alphabet.go
op-challenger/fault/test/alphabet.go
+24
-0
claim_builder.go
op-challenger/fault/test/claim_builder.go
+10
-2
seq_builder.go
op-challenger/fault/test/seq_builder.go
+41
-0
types.go
op-challenger/fault/types/types.go
+8
-0
No files found.
op-challenger/fault/agent.go
View file @
0578a390
...
@@ -5,6 +5,7 @@ import (
...
@@ -5,6 +5,7 @@ import (
"errors"
"errors"
"fmt"
"fmt"
"github.com/ethereum-optimism/optimism/op-challenger/fault/solver"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/log"
)
)
...
@@ -19,7 +20,7 @@ type Responder interface {
...
@@ -19,7 +20,7 @@ type Responder interface {
}
}
type
Agent
struct
{
type
Agent
struct
{
solver
*
Solver
solver
*
solver
.
Solver
loader
Loader
loader
Loader
responder
Responder
responder
Responder
maxDepth
int
maxDepth
int
...
@@ -29,7 +30,7 @@ type Agent struct {
...
@@ -29,7 +30,7 @@ type Agent struct {
func
NewAgent
(
loader
Loader
,
maxDepth
int
,
trace
types
.
TraceProvider
,
responder
Responder
,
agreeWithProposedOutput
bool
,
log
log
.
Logger
)
*
Agent
{
func
NewAgent
(
loader
Loader
,
maxDepth
int
,
trace
types
.
TraceProvider
,
responder
Responder
,
agreeWithProposedOutput
bool
,
log
log
.
Logger
)
*
Agent
{
return
&
Agent
{
return
&
Agent
{
solver
:
NewSolver
(
maxDepth
,
trace
),
solver
:
solver
.
NewSolver
(
maxDepth
,
trace
),
loader
:
loader
,
loader
:
loader
,
responder
:
responder
,
responder
:
responder
,
maxDepth
:
maxDepth
,
maxDepth
:
maxDepth
,
...
@@ -49,7 +50,7 @@ func (a *Agent) Act(ctx context.Context) error {
...
@@ -49,7 +50,7 @@ func (a *Agent) Act(ctx context.Context) error {
}
}
// Create counter claims
// Create counter claims
for
_
,
claim
:=
range
game
.
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
)
log
.
Error
(
"Failed to move"
,
"err"
,
err
)
}
}
}
}
...
...
op-challenger/fault/solver.go
→
op-challenger/fault/solver
/solver
.go
View file @
0578a390
package
fault
package
solver
import
(
import
(
"errors"
"errors"
...
@@ -9,9 +9,8 @@ import (
...
@@ -9,9 +9,8 @@ import (
)
)
var
(
var
(
ErrGameDepthReached
=
errors
.
New
(
"game depth reached"
)
ErrStepNonLeafNode
=
errors
.
New
(
"cannot step on non-leaf claims"
)
ErrStepNonLeafNode
=
errors
.
New
(
"cannot step on non-leaf claims"
)
ErrStepAgreedClaim
=
errors
.
New
(
"cannot step on claims we agree with"
)
ErrStepAgreedClaim
=
errors
.
New
(
"cannot step on claims we agree with"
)
)
)
// Solver uses a [TraceProvider] to determine the moves to make in a dispute game.
// 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) {
...
@@ -62,7 +61,7 @@ func (s *Solver) handleMiddle(claim types.Claim) (*types.Claim, error) {
return
nil
,
err
return
nil
,
err
}
}
if
claim
.
Depth
()
==
s
.
gameDepth
{
if
claim
.
Depth
()
==
s
.
gameDepth
{
return
nil
,
ErrGameDepthReached
return
nil
,
types
.
ErrGameDepthReached
}
}
if
claimCorrect
{
if
claimCorrect
{
return
s
.
defend
(
claim
)
return
s
.
defend
(
claim
)
...
...
op-challenger/fault/solver_test.go
→
op-challenger/fault/solver
/solver
_test.go
View file @
0578a390
package
faul
t
package
solver_tes
t
import
(
import
(
"fmt"
"fmt"
"testing"
"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/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
)
)
func
TestNextMove
(
t
*
testing
.
T
)
{
func
TestNextMove
(
t
*
testing
.
T
)
{
maxDepth
:=
4
maxDepth
:=
4
builder
:=
New
ClaimBuilder
(
t
,
maxDepth
)
builder
:=
test
.
NewAlphabet
ClaimBuilder
(
t
,
maxDepth
)
tests
:=
[]
struct
{
tests
:=
[]
struct
{
name
string
name
string
claim
types
.
Claim
claim
types
.
Claim
...
@@ -70,18 +72,18 @@ func TestNextMove(t *testing.T) {
...
@@ -70,18 +72,18 @@ func TestNextMove(t *testing.T) {
{
{
name
:
"ErrorWhenClaimIsLeaf_Correct"
,
name
:
"ErrorWhenClaimIsLeaf_Correct"
,
claim
:
builder
.
CreateLeafClaim
(
4
,
true
),
claim
:
builder
.
CreateLeafClaim
(
4
,
true
),
expectedErr
:
ErrGameDepthReached
,
expectedErr
:
types
.
ErrGameDepthReached
,
},
},
{
{
name
:
"ErrorWhenClaimIsLeaf_Incorrect"
,
name
:
"ErrorWhenClaimIsLeaf_Incorrect"
,
claim
:
builder
.
CreateLeafClaim
(
6
,
false
),
claim
:
builder
.
CreateLeafClaim
(
6
,
false
),
expectedErr
:
ErrGameDepthReached
,
expectedErr
:
types
.
ErrGameDepthReached
,
},
},
}
}
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
test
:=
test
test
:=
test
t
.
Run
(
test
.
name
,
func
(
t
*
testing
.
T
)
{
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
)
move
,
err
:=
solver
.
NextMove
(
test
.
claim
,
test
.
agreeWithLevel
)
if
test
.
expectedErr
==
nil
{
if
test
.
expectedErr
==
nil
{
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
...
@@ -100,8 +102,8 @@ func TestNextMove(t *testing.T) {
...
@@ -100,8 +102,8 @@ func TestNextMove(t *testing.T) {
func
TestAttemptStep
(
t
*
testing
.
T
)
{
func
TestAttemptStep
(
t
*
testing
.
T
)
{
maxDepth
:=
3
maxDepth
:=
3
builder
:=
New
ClaimBuilder
(
t
,
maxDepth
)
builder
:=
test
.
NewAlphabet
ClaimBuilder
(
t
,
maxDepth
)
solver
:=
NewSolver
(
maxDepth
,
builder
.
CorrectTraceProvider
())
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.
...
@@ -161,13 +163,13 @@ func TestAttemptStep(t *testing.T) {
...
@@ -161,13 +163,13 @@ func TestAttemptStep(t *testing.T) {
{
{
name
:
"CannotStepNonLeaf"
,
name
:
"CannotStepNonLeaf"
,
claim
:
builder
.
Seq
(
false
)
.
Attack
(
false
)
.
Get
(),
claim
:
builder
.
Seq
(
false
)
.
Attack
(
false
)
.
Get
(),
expectedErr
:
ErrStepNonLeafNode
,
expectedErr
:
solver
.
ErrStepNonLeafNode
,
},
},
{
{
name
:
"CannotStepAgreedNode"
,
name
:
"CannotStepAgreedNode"
,
claim
:
builder
.
Seq
(
false
)
.
Attack
(
false
)
.
Get
(),
claim
:
builder
.
Seq
(
false
)
.
Attack
(
false
)
.
Get
(),
agreeWithLevel
:
true
,
agreeWithLevel
:
true
,
expectedErr
:
ErrStepNonLeafNode
,
expectedErr
:
solver
.
ErrStepNonLeafNode
,
},
},
}
}
...
@@ -175,7 +177,7 @@ func TestAttemptStep(t *testing.T) {
...
@@ -175,7 +177,7 @@ func TestAttemptStep(t *testing.T) {
test
:=
test
test
:=
test
t
.
Run
(
test
.
name
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
test
.
name
,
func
(
t
*
testing
.
T
)
{
fmt
.
Printf
(
"%v
\n
"
,
test
.
claim
.
Position
.
TraceIndex
(
maxDepth
))
fmt
.
Printf
(
"%v
\n
"
,
test
.
claim
.
Position
.
TraceIndex
(
maxDepth
))
step
,
err
:=
s
olver
.
AttemptStep
(
test
.
claim
,
test
.
agreeWithLevel
)
step
,
err
:=
alphabetS
olver
.
AttemptStep
(
test
.
claim
,
test
.
agreeWithLevel
)
if
test
.
expectedErr
==
nil
{
if
test
.
expectedErr
==
nil
{
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
test
.
claim
,
step
.
LeafClaim
)
require
.
Equal
(
t
,
test
.
claim
,
step
.
LeafClaim
)
...
@@ -184,7 +186,7 @@ func TestAttemptStep(t *testing.T) {
...
@@ -184,7 +186,7 @@ func TestAttemptStep(t *testing.T) {
require
.
Equal
(
t
,
test
.
expectProofData
,
step
.
ProofData
)
require
.
Equal
(
t
,
test
.
expectProofData
,
step
.
ProofData
)
}
else
{
}
else
{
require
.
ErrorIs
(
t
,
err
,
test
.
expectedErr
)
require
.
ErrorIs
(
t
,
err
,
test
.
expectedErr
)
require
.
Equal
(
t
,
StepData
{},
step
)
require
.
Equal
(
t
,
solver
.
StepData
{},
step
)
}
}
})
})
}
}
...
...
op-challenger/fault/test/alphabet.go
0 → 100644
View file @
0578a390
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
}
op-challenger/fault/
claimbuilder_test
.go
→
op-challenger/fault/
test/claim_builder
.go
View file @
0578a390
package
faul
t
package
tes
t
import
(
import
(
"math/big"
"math/big"
...
@@ -17,11 +17,16 @@ type ClaimBuilder struct {
...
@@ -17,11 +17,16 @@ type ClaimBuilder struct {
correct
types
.
TraceProvider
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
{
return
&
ClaimBuilder
{
require
:
require
.
New
(
t
),
require
:
require
.
New
(
t
),
maxDepth
:
maxDepth
,
maxDepth
:
maxDepth
,
<<<<<<<
HEAD
:
op
-
challenger
/
fault
/
claimbuilder_test
.
go
correct
:
&
alphabetWithProofProvider
{
alphabet
.
NewAlphabetProvider
(
"abcdefghijklmnopqrstuvwxyz"
,
uint64
(
maxDepth
))},
correct
:
&
alphabetWithProofProvider
{
alphabet
.
NewAlphabetProvider
(
"abcdefghijklmnopqrstuvwxyz"
,
uint64
(
maxDepth
))},
=======
correct
:
provider
,
>>>>>>>
99
df402dd
(
Solver
module
)
:
op
-
challenger
/
fault
/
test
/
claim_builder
.
go
}
}
}
}
...
@@ -109,6 +114,7 @@ func (c *ClaimBuilder) DefendClaim(claim types.Claim, correct bool) types.Claim
...
@@ -109,6 +114,7 @@ func (c *ClaimBuilder) DefendClaim(claim types.Claim, correct bool) types.Claim
Parent
:
claim
.
ClaimData
,
Parent
:
claim
.
ClaimData
,
}
}
}
}
<<<<<<<
HEAD
:
op
-
challenger
/
fault
/
claimbuilder_test
.
go
type
SequenceBuilder
struct
{
type
SequenceBuilder
struct
{
builder
*
ClaimBuilder
builder
*
ClaimBuilder
...
@@ -157,3 +163,5 @@ func (a *alphabetWithProofProvider) GetPreimage(i uint64) ([]byte, []byte, error
...
@@ -157,3 +163,5 @@ func (a *alphabetWithProofProvider) GetPreimage(i uint64) ([]byte, []byte, error
}
}
return
preimage
,
[]
byte
{
byte
(
i
)},
nil
return
preimage
,
[]
byte
{
byte
(
i
)},
nil
}
}
=======
>>>>>>>
99
df402dd
(
Solver
module
)
:
op
-
challenger
/
fault
/
test
/
claim_builder
.
go
op-challenger/fault/test/seq_builder.go
0 → 100644
View file @
0578a390
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
}
op-challenger/fault/types/types.go
View file @
0578a390
...
@@ -4,6 +4,14 @@ import (
...
@@ -4,6 +4,14 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
)
)
<<<<<<<
HEAD
=======
var
(
ErrIndexTooLarge
=
errors
.
New
(
"index is larger than the maximum index"
)
ErrGameDepthReached
=
errors
.
New
(
"game depth reached"
)
)
>>>>>>>
99
df402dd
(
Solver
module
)
type
GameStatus
uint8
type
GameStatus
uint8
const
(
const
(
...
...
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