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
581df616
Unverified
Commit
581df616
authored
Aug 04, 2023
by
Adrian Sutton
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
op-challenger: Load local inputs from the game contract.
parent
0bbd440c
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
212 additions
and
13 deletions
+212
-13
executor.go
op-challenger/fault/cannon/executor.go
+9
-2
executor_test.go
op-challenger/fault/cannon/executor_test.go
+19
-1
local.go
op-challenger/fault/cannon/local.go
+67
-0
local_test.go
op-challenger/fault/cannon/local_test.go
+87
-0
provider.go
op-challenger/fault/cannon/provider.go
+19
-3
service.go
op-challenger/fault/service.go
+11
-7
No files found.
op-challenger/fault/cannon/executor.go
View file @
581df616
...
@@ -29,6 +29,7 @@ type Executor struct {
...
@@ -29,6 +29,7 @@ type Executor struct {
logger
log
.
Logger
logger
log
.
Logger
l1
string
l1
string
l2
string
l2
string
inputs
localGameInputs
cannon
string
cannon
string
server
string
server
string
absolutePreState
string
absolutePreState
string
...
@@ -38,11 +39,12 @@ type Executor struct {
...
@@ -38,11 +39,12 @@ type Executor struct {
cmdExecutor
cmdExecutor
cmdExecutor
cmdExecutor
}
}
func
NewExecutor
(
logger
log
.
Logger
,
cfg
*
config
.
Config
)
*
Executor
{
func
NewExecutor
(
logger
log
.
Logger
,
cfg
*
config
.
Config
,
inputs
localGameInputs
)
*
Executor
{
return
&
Executor
{
return
&
Executor
{
logger
:
logger
,
logger
:
logger
,
l1
:
cfg
.
L1EthRpc
,
l1
:
cfg
.
L1EthRpc
,
l2
:
cfg
.
CannonL2
,
l2
:
cfg
.
CannonL2
,
inputs
:
inputs
,
cannon
:
cfg
.
CannonBin
,
cannon
:
cfg
.
CannonBin
,
server
:
cfg
.
CannonServer
,
server
:
cfg
.
CannonServer
,
absolutePreState
:
cfg
.
CannonAbsolutePreState
,
absolutePreState
:
cfg
.
CannonAbsolutePreState
,
...
@@ -71,7 +73,12 @@ func (e *Executor) GenerateProof(ctx context.Context, dir string, i uint64) erro
...
@@ -71,7 +73,12 @@ func (e *Executor) GenerateProof(ctx context.Context, dir string, i uint64) erro
"--l1"
,
e
.
l1
,
"--l1"
,
e
.
l1
,
"--l2"
,
e
.
l2
,
"--l2"
,
e
.
l2
,
"--datadir"
,
filepath
.
Join
(
e
.
dataDir
,
preimagesDir
),
"--datadir"
,
filepath
.
Join
(
e
.
dataDir
,
preimagesDir
),
// TODO(CLI-4240): Pass local game inputs (l1.head, l2.head, l2.claim etc)
"--l1.head"
,
e
.
inputs
.
l1Head
.
Hex
(),
"--l2.head"
,
e
.
inputs
.
l2Head
.
Hex
(),
"--l2.outputroot"
,
e
.
inputs
.
l2OutputRoot
.
Hex
(),
"--l2.claim"
,
e
.
inputs
.
l2Claim
.
Hex
(),
"--l2.blocknumber"
,
e
.
inputs
.
l2BlockNumber
.
Text
(
10
),
"--l2.chainid"
,
e
.
inputs
.
l2ChainId
.
Text
(
10
),
}
}
e
.
logger
.
Info
(
"Generating trace"
,
"proof"
,
i
,
"cmd"
,
e
.
cannon
,
"args"
,
args
)
e
.
logger
.
Info
(
"Generating trace"
,
"proof"
,
i
,
"cmd"
,
e
.
cannon
,
"args"
,
args
)
...
...
op-challenger/fault/cannon/executor_test.go
View file @
581df616
...
@@ -3,6 +3,7 @@ package cannon
...
@@ -3,6 +3,7 @@ package cannon
import
(
import
(
"context"
"context"
"fmt"
"fmt"
"math/big"
"os"
"os"
"path/filepath"
"path/filepath"
"testing"
"testing"
...
@@ -27,7 +28,16 @@ func TestGenerateProof(t *testing.T) {
...
@@ -27,7 +28,16 @@ func TestGenerateProof(t *testing.T) {
cfg
.
CannonL2
=
"http://localhost:9999"
cfg
.
CannonL2
=
"http://localhost:9999"
cfg
.
CannonSnapshotFreq
=
500
cfg
.
CannonSnapshotFreq
=
500
executor
:=
NewExecutor
(
testlog
.
Logger
(
t
,
log
.
LvlInfo
),
&
cfg
)
inputs
:=
localGameInputs
{
l1Head
:
common
.
Hash
{
0x11
},
l2ChainId
:
big
.
NewInt
(
2342
),
l2Head
:
common
.
Hash
{
0x22
},
l2OutputRoot
:
common
.
Hash
{
0x33
},
l2Claim
:
common
.
Hash
{
0x44
},
l2BlockNumber
:
big
.
NewInt
(
3333
),
}
executor
:=
NewExecutor
(
testlog
.
Logger
(
t
,
log
.
LvlInfo
),
&
cfg
,
inputs
)
executor
.
selectSnapshot
=
func
(
logger
log
.
Logger
,
dir
string
,
absolutePreState
string
,
i
uint64
)
(
string
,
error
)
{
executor
.
selectSnapshot
=
func
(
logger
log
.
Logger
,
dir
string
,
absolutePreState
string
,
i
uint64
)
(
string
,
error
)
{
return
input
,
nil
return
input
,
nil
}
}
...
@@ -56,6 +66,14 @@ func TestGenerateProof(t *testing.T) {
...
@@ -56,6 +66,14 @@ func TestGenerateProof(t *testing.T) {
require
.
Equal
(
t
,
filepath
.
Join
(
cfg
.
CannonDatadir
,
preimagesDir
),
args
[
"--datadir"
])
require
.
Equal
(
t
,
filepath
.
Join
(
cfg
.
CannonDatadir
,
preimagesDir
),
args
[
"--datadir"
])
require
.
Equal
(
t
,
filepath
.
Join
(
cfg
.
CannonDatadir
,
proofsDir
,
"%d.json"
),
args
[
"--proof-fmt"
])
require
.
Equal
(
t
,
filepath
.
Join
(
cfg
.
CannonDatadir
,
proofsDir
,
"%d.json"
),
args
[
"--proof-fmt"
])
require
.
Equal
(
t
,
filepath
.
Join
(
cfg
.
CannonDatadir
,
snapsDir
,
"%d.json"
),
args
[
"--snapshot-fmt"
])
require
.
Equal
(
t
,
filepath
.
Join
(
cfg
.
CannonDatadir
,
snapsDir
,
"%d.json"
),
args
[
"--snapshot-fmt"
])
// Local game inputs
require
.
Equal
(
t
,
inputs
.
l1Head
.
Hex
(),
args
[
"--l1.head"
])
require
.
Equal
(
t
,
inputs
.
l2Head
.
Hex
(),
args
[
"--l2.head"
])
require
.
Equal
(
t
,
inputs
.
l2OutputRoot
.
Hex
(),
args
[
"--l2.outputroot"
])
require
.
Equal
(
t
,
inputs
.
l2Claim
.
Hex
(),
args
[
"--l2.claim"
])
require
.
Equal
(
t
,
"3333"
,
args
[
"--l2.blocknumber"
])
require
.
Equal
(
t
,
"2342"
,
args
[
"--l2.chainid"
])
}
}
func
TestRunCmdLogsOutput
(
t
*
testing
.
T
)
{
func
TestRunCmdLogsOutput
(
t
*
testing
.
T
)
{
...
...
op-challenger/fault/cannon/local.go
0 → 100644
View file @
581df616
package
cannon
import
(
"context"
"fmt"
"math/big"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
ethtypes
"github.com/ethereum/go-ethereum/core/types"
)
type
localGameInputs
struct
{
l1Head
common
.
Hash
l2ChainId
*
big
.
Int
l2Head
common
.
Hash
l2OutputRoot
common
.
Hash
l2Claim
common
.
Hash
l2BlockNumber
*
big
.
Int
}
type
L2DataSource
interface
{
ChainID
(
context
.
Context
)
(
*
big
.
Int
,
error
)
HeaderByNumber
(
context
.
Context
,
*
big
.
Int
)
(
*
ethtypes
.
Header
,
error
)
}
type
GameInputsSource
interface
{
L1Head
(
opts
*
bind
.
CallOpts
)
([
32
]
byte
,
error
)
Proposals
(
opts
*
bind
.
CallOpts
)
(
struct
{
Starting
bindings
.
IFaultDisputeGameOutputProposal
Disputed
bindings
.
IFaultDisputeGameOutputProposal
},
error
)
}
func
fetchLocalInputs
(
ctx
context
.
Context
,
gameAddr
common
.
Address
,
caller
GameInputsSource
,
l2Client
L2DataSource
)
(
localGameInputs
,
error
)
{
opts
:=
&
bind
.
CallOpts
{
Context
:
ctx
}
l1Head
,
err
:=
caller
.
L1Head
(
opts
)
if
err
!=
nil
{
return
localGameInputs
{},
fmt
.
Errorf
(
"fetch L1 head for game %v: %w"
,
gameAddr
,
err
)
}
l2ChainId
,
err
:=
l2Client
.
ChainID
(
ctx
)
if
err
!=
nil
{
return
localGameInputs
{},
fmt
.
Errorf
(
"fetch L2 chain ID: %w"
,
err
)
}
proposals
,
err
:=
caller
.
Proposals
(
opts
)
if
err
!=
nil
{
return
localGameInputs
{},
fmt
.
Errorf
(
"fetch proposals: %w"
,
err
)
}
claimedOutput
:=
proposals
.
Disputed
agreedOutput
:=
proposals
.
Starting
agreedHeader
,
err
:=
l2Client
.
HeaderByNumber
(
ctx
,
agreedOutput
.
L2BlockNumber
)
if
err
!=
nil
{
return
localGameInputs
{},
fmt
.
Errorf
(
"fetch L2 block header %v: %w"
,
agreedOutput
.
L2BlockNumber
,
err
)
}
l2Head
:=
agreedHeader
.
Hash
()
return
localGameInputs
{
l1Head
:
l1Head
,
l2ChainId
:
l2ChainId
,
l2Head
:
l2Head
,
l2OutputRoot
:
agreedOutput
.
OutputRoot
,
l2Claim
:
claimedOutput
.
OutputRoot
,
l2BlockNumber
:
claimedOutput
.
L2BlockNumber
,
},
nil
}
op-challenger/fault/cannon/local_test.go
0 → 100644
View file @
581df616
package
cannon
import
(
"context"
"math/big"
"testing"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
ethtypes
"github.com/ethereum/go-ethereum/core/types"
"github.com/stretchr/testify/require"
)
func
TestFetchLocalInputs
(
t
*
testing
.
T
)
{
ctx
:=
context
.
Background
()
gameAddr
:=
common
.
Address
{
0xab
}
l1Client
:=
&
mockGameInputsSource
{
l1Head
:
common
.
Hash
{
0xcc
},
starting
:
bindings
.
IFaultDisputeGameOutputProposal
{
Index
:
big
.
NewInt
(
6
),
L2BlockNumber
:
big
.
NewInt
(
2222
),
OutputRoot
:
common
.
Hash
{
0xdd
},
},
disputed
:
bindings
.
IFaultDisputeGameOutputProposal
{
Index
:
big
.
NewInt
(
7
),
L2BlockNumber
:
big
.
NewInt
(
3333
),
OutputRoot
:
common
.
Hash
{
0xee
},
},
}
l2Client
:=
&
mockL2DataSource
{
chainID
:
big
.
NewInt
(
88422
),
header
:
ethtypes
.
Header
{
Number
:
l1Client
.
starting
.
L2BlockNumber
,
},
}
inputs
,
err
:=
fetchLocalInputs
(
ctx
,
gameAddr
,
l1Client
,
l2Client
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
l1Client
.
l1Head
,
inputs
.
l1Head
)
require
.
Equal
(
t
,
l2Client
.
chainID
,
inputs
.
l2ChainId
)
require
.
Equal
(
t
,
l2Client
.
header
.
Hash
(),
inputs
.
l2Head
)
require
.
EqualValues
(
t
,
l1Client
.
starting
.
OutputRoot
,
inputs
.
l2OutputRoot
)
require
.
EqualValues
(
t
,
l1Client
.
disputed
.
OutputRoot
,
inputs
.
l2Claim
)
require
.
Equal
(
t
,
l1Client
.
disputed
.
L2BlockNumber
,
inputs
.
l2BlockNumber
)
}
type
mockGameInputsSource
struct
{
l1Head
common
.
Hash
starting
bindings
.
IFaultDisputeGameOutputProposal
disputed
bindings
.
IFaultDisputeGameOutputProposal
}
func
(
s
*
mockGameInputsSource
)
L1Head
(
opts
*
bind
.
CallOpts
)
([
32
]
byte
,
error
)
{
return
s
.
l1Head
,
nil
}
func
(
s
*
mockGameInputsSource
)
Proposals
(
opts
*
bind
.
CallOpts
)
(
struct
{
Starting
bindings
.
IFaultDisputeGameOutputProposal
Disputed
bindings
.
IFaultDisputeGameOutputProposal
},
error
)
{
return
struct
{
Starting
bindings
.
IFaultDisputeGameOutputProposal
Disputed
bindings
.
IFaultDisputeGameOutputProposal
}{
Starting
:
s
.
starting
,
Disputed
:
s
.
disputed
,
},
nil
}
type
mockL2DataSource
struct
{
chainID
*
big
.
Int
header
ethtypes
.
Header
}
func
(
s
*
mockL2DataSource
)
ChainID
(
ctx
context
.
Context
)
(
*
big
.
Int
,
error
)
{
return
s
.
chainID
,
nil
}
func
(
s
*
mockL2DataSource
)
HeaderByNumber
(
ctx
context
.
Context
,
num
*
big
.
Int
)
(
*
ethtypes
.
Header
,
error
)
{
if
s
.
header
.
Number
.
Cmp
(
num
)
==
0
{
return
&
s
.
header
,
nil
}
return
nil
,
ethereum
.
NotFound
}
op-challenger/fault/cannon/provider.go
View file @
581df616
...
@@ -9,10 +9,13 @@ import (
...
@@ -9,10 +9,13 @@ import (
"path/filepath"
"path/filepath"
"github.com/ethereum-optimism/optimism/cannon/mipsevm"
"github.com/ethereum-optimism/optimism/cannon/mipsevm"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-challenger/config"
"github.com/ethereum-optimism/optimism/op-challenger/config"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/ethereum-optimism/optimism/op-challenger/fault/types"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/log"
)
)
...
@@ -40,12 +43,25 @@ type CannonTraceProvider struct {
...
@@ -40,12 +43,25 @@ type CannonTraceProvider struct {
generator
ProofGenerator
generator
ProofGenerator
}
}
func
NewTraceProvider
(
logger
log
.
Logger
,
cfg
*
config
.
Config
)
*
CannonTraceProvider
{
func
NewTraceProvider
(
ctx
context
.
Context
,
logger
log
.
Logger
,
cfg
*
config
.
Config
,
l1Client
bind
.
ContractCaller
)
(
*
CannonTraceProvider
,
error
)
{
l2Client
,
err
:=
ethclient
.
DialContext
(
ctx
,
cfg
.
CannonL2
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"dial l2 cleint %v: %w"
,
cfg
.
CannonL2
,
err
)
}
defer
l2Client
.
Close
()
// Not needed after fetching the inputs
gameCaller
,
err
:=
bindings
.
NewFaultDisputeGameCaller
(
cfg
.
GameAddress
,
l1Client
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"create caller for game %v: %w"
,
cfg
.
GameAddress
,
err
)
}
l1Head
,
err
:=
fetchLocalInputs
(
ctx
,
cfg
.
GameAddress
,
gameCaller
,
l2Client
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"fetch local game inputs: %w"
,
err
)
}
return
&
CannonTraceProvider
{
return
&
CannonTraceProvider
{
dir
:
cfg
.
CannonDatadir
,
dir
:
cfg
.
CannonDatadir
,
prestate
:
cfg
.
CannonAbsolutePreState
,
prestate
:
cfg
.
CannonAbsolutePreState
,
generator
:
NewExecutor
(
logger
,
cfg
),
generator
:
NewExecutor
(
logger
,
cfg
,
l1Head
),
}
}
,
nil
}
}
func
(
p
*
CannonTraceProvider
)
GetOracleData
(
ctx
context
.
Context
,
i
uint64
)
(
*
types
.
PreimageOracleData
,
error
)
{
func
(
p
*
CannonTraceProvider
)
GetOracleData
(
ctx
context
.
Context
,
i
uint64
)
(
*
types
.
PreimageOracleData
,
error
)
{
...
...
op-challenger/fault/service.go
View file @
581df616
...
@@ -36,11 +36,19 @@ func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*se
...
@@ -36,11 +36,19 @@ func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*se
return
nil
,
fmt
.
Errorf
(
"failed to create the transaction manager: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"failed to create the transaction manager: %w"
,
err
)
}
}
client
,
err
:=
ethclient
.
Dial
(
cfg
.
L1EthRpc
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed to dial L1: %w"
,
err
)
}
var
trace
types
.
TraceProvider
var
trace
types
.
TraceProvider
var
updater
types
.
OracleUpdater
var
updater
types
.
OracleUpdater
switch
cfg
.
TraceType
{
switch
cfg
.
TraceType
{
case
config
.
TraceTypeCannon
:
case
config
.
TraceTypeCannon
:
trace
=
cannon
.
NewTraceProvider
(
logger
,
cfg
)
trace
,
err
=
cannon
.
NewTraceProvider
(
ctx
,
logger
,
cfg
,
client
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"create cannon trace provider: %w"
,
err
)
}
updater
,
err
=
cannon
.
NewOracleUpdater
(
logger
,
txMgr
,
cfg
.
GameAddress
,
cfg
.
PreimageOracleAddress
)
updater
,
err
=
cannon
.
NewOracleUpdater
(
logger
,
txMgr
,
cfg
.
GameAddress
,
cfg
.
PreimageOracleAddress
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed to create the cannon updater: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"failed to create the cannon updater: %w"
,
err
)
...
@@ -52,15 +60,11 @@ func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*se
...
@@ -52,15 +60,11 @@ func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*se
return
nil
,
fmt
.
Errorf
(
"unsupported trace type: %v"
,
cfg
.
TraceType
)
return
nil
,
fmt
.
Errorf
(
"unsupported trace type: %v"
,
cfg
.
TraceType
)
}
}
return
newTypedService
(
ctx
,
logger
,
cfg
,
trace
,
updater
,
txMgr
)
return
newTypedService
(
ctx
,
logger
,
cfg
,
client
,
trace
,
updater
,
txMgr
)
}
}
// newTypedService creates a new Service from a provided trace provider.
// newTypedService creates a new Service from a provided trace provider.
func
newTypedService
(
ctx
context
.
Context
,
logger
log
.
Logger
,
cfg
*
config
.
Config
,
provider
types
.
TraceProvider
,
uploader
types
.
OracleUpdater
,
txMgr
txmgr
.
TxManager
)
(
*
service
,
error
)
{
func
newTypedService
(
ctx
context
.
Context
,
logger
log
.
Logger
,
cfg
*
config
.
Config
,
client
*
ethclient
.
Client
,
provider
types
.
TraceProvider
,
uploader
types
.
OracleUpdater
,
txMgr
txmgr
.
TxManager
)
(
*
service
,
error
)
{
client
,
err
:=
ethclient
.
Dial
(
cfg
.
L1EthRpc
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed to dial L1: %w"
,
err
)
}
contract
,
err
:=
bindings
.
NewFaultDisputeGameCaller
(
cfg
.
GameAddress
,
client
)
contract
,
err
:=
bindings
.
NewFaultDisputeGameCaller
(
cfg
.
GameAddress
,
client
)
if
err
!=
nil
{
if
err
!=
nil
{
...
...
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