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
aa6d64ea
Unverified
Commit
aa6d64ea
authored
Jun 16, 2023
by
protolambda
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
op-program: define as go module, de-duplicate preimage ABI bindings
parent
b1b5f085
Changes
26
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
1140 additions
and
471 deletions
+1140
-471
hints.go
op-preimage/hints.go
+3
-1
oracle.go
op-preimage/oracle.go
+2
-1
boot.go
op-program/client/boot.go
+1
-1
boot_test.go
op-program/client/boot_test.go
+1
-1
hints.go
op-program/client/l1/hints.go
+1
-1
oracle.go
op-program/client/l1/oracle.go
+1
-1
oracle_test.go
op-program/client/l1/oracle_test.go
+1
-1
hints.go
op-program/client/l2/hints.go
+1
-1
oracle.go
op-program/client/l2/oracle.go
+1
-1
oracle_test.go
op-program/client/l2/oracle_test.go
+1
-1
program.go
op-program/client/program.go
+1
-1
go.mod
op-program/go.mod
+175
-0
go.sum
op-program/go.sum
+942
-0
host.go
op-program/host/host.go
+1
-1
host_test.go
op-program/host/host_test.go
+1
-1
local.go
op-program/host/kvstore/local.go
+1
-1
local_test.go
op-program/host/kvstore/local_test.go
+1
-1
splitter.go
op-program/host/kvstore/splitter.go
+2
-2
splitter_test.go
op-program/host/kvstore/splitter_test.go
+1
-1
prefetcher.go
op-program/host/prefetcher/prefetcher.go
+1
-1
prefetcher_test.go
op-program/host/prefetcher/prefetcher_test.go
+1
-1
hints.go
op-program/preimage/hints.go
+0
-71
hints_test.go
op-program/preimage/hints_test.go
+0
-135
iface.go
op-program/preimage/iface.go
+0
-85
oracle.go
op-program/preimage/oracle.go
+0
-75
oracle_test.go
op-program/preimage/oracle_test.go
+0
-85
No files found.
op-preimage/hints.go
View file @
aa6d64ea
...
@@ -43,7 +43,9 @@ func NewHintReader(rw io.ReadWriter) *HintReader {
...
@@ -43,7 +43,9 @@ func NewHintReader(rw io.ReadWriter) *HintReader {
return
&
HintReader
{
rw
:
rw
}
return
&
HintReader
{
rw
:
rw
}
}
}
func
(
hr
*
HintReader
)
NextHint
(
router
func
(
hint
string
)
error
)
error
{
type
HintHandler
func
(
hint
string
)
error
func
(
hr
*
HintReader
)
NextHint
(
router
HintHandler
)
error
{
var
length
uint32
var
length
uint32
if
err
:=
binary
.
Read
(
hr
.
rw
,
binary
.
BigEndian
,
&
length
);
err
!=
nil
{
if
err
:=
binary
.
Read
(
hr
.
rw
,
binary
.
BigEndian
,
&
length
);
err
!=
nil
{
if
err
==
io
.
EOF
{
if
err
==
io
.
EOF
{
...
...
op-preimage/oracle.go
View file @
aa6d64ea
...
@@ -44,8 +44,9 @@ type OracleServer struct {
...
@@ -44,8 +44,9 @@ type OracleServer struct {
func
NewOracleServer
(
rw
io
.
ReadWriter
)
*
OracleServer
{
func
NewOracleServer
(
rw
io
.
ReadWriter
)
*
OracleServer
{
return
&
OracleServer
{
rw
:
rw
}
return
&
OracleServer
{
rw
:
rw
}
}
}
type
PreimageGetter
func
(
key
[
32
]
byte
)
([]
byte
,
error
)
func
(
o
*
OracleServer
)
NextPreimageRequest
(
getPreimage
func
(
key
[
32
]
byte
)
([]
byte
,
error
)
)
error
{
func
(
o
*
OracleServer
)
NextPreimageRequest
(
getPreimage
PreimageGetter
)
error
{
var
key
[
32
]
byte
var
key
[
32
]
byte
if
_
,
err
:=
io
.
ReadFull
(
o
.
rw
,
key
[
:
]);
err
!=
nil
{
if
_
,
err
:=
io
.
ReadFull
(
o
.
rw
,
key
[
:
]);
err
!=
nil
{
if
err
==
io
.
EOF
{
if
err
==
io
.
EOF
{
...
...
op-program/client/boot.go
View file @
aa6d64ea
...
@@ -5,7 +5,7 @@ import (
...
@@ -5,7 +5,7 @@ import (
"encoding/json"
"encoding/json"
"github.com/ethereum-optimism/optimism/op-node/rollup"
"github.com/ethereum-optimism/optimism/op-node/rollup"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/params"
)
)
...
...
op-program/client/boot_test.go
View file @
aa6d64ea
...
@@ -6,7 +6,7 @@ import (
...
@@ -6,7 +6,7 @@ import (
"testing"
"testing"
"github.com/ethereum-optimism/optimism/op-node/chaincfg"
"github.com/ethereum-optimism/optimism/op-node/chaincfg"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/params"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
...
...
op-program/client/l1/hints.go
View file @
aa6d64ea
...
@@ -3,7 +3,7 @@ package l1
...
@@ -3,7 +3,7 @@ package l1
import
(
import
(
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
)
)
const
(
const
(
...
...
op-program/client/l1/oracle.go
View file @
aa6d64ea
...
@@ -9,7 +9,7 @@ import (
...
@@ -9,7 +9,7 @@ import (
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
)
)
type
Oracle
interface
{
type
Oracle
interface
{
...
...
op-program/client/l1/oracle_test.go
View file @
aa6d64ea
...
@@ -16,7 +16,7 @@ import (
...
@@ -16,7 +16,7 @@ import (
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/testutils"
"github.com/ethereum-optimism/optimism/op-node/testutils"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
)
)
// testBlock tests that the given block with receipts can be passed through the preimage oracle.
// testBlock tests that the given block with receipts can be passed through the preimage oracle.
...
...
op-program/client/l2/hints.go
View file @
aa6d64ea
...
@@ -3,7 +3,7 @@ package l2
...
@@ -3,7 +3,7 @@ package l2
import
(
import
(
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
)
)
const
(
const
(
...
...
op-program/client/l2/oracle.go
View file @
aa6d64ea
...
@@ -9,7 +9,7 @@ import (
...
@@ -9,7 +9,7 @@ import (
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
)
)
// StateOracle defines the high-level API used to retrieve L2 state data pre-images
// StateOracle defines the high-level API used to retrieve L2 state data pre-images
...
...
op-program/client/l2/oracle_test.go
View file @
aa6d64ea
...
@@ -16,7 +16,7 @@ import (
...
@@ -16,7 +16,7 @@ import (
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/testutils"
"github.com/ethereum-optimism/optimism/op-node/testutils"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
)
)
func
mockPreimageOracle
(
t
*
testing
.
T
)
(
po
*
PreimageOracle
,
hintsMock
*
mock
.
Mock
,
preimages
map
[
common
.
Hash
][]
byte
)
{
func
mockPreimageOracle
(
t
*
testing
.
T
)
(
po
*
PreimageOracle
,
hintsMock
*
mock
.
Mock
,
preimages
map
[
common
.
Hash
][]
byte
)
{
...
...
op-program/client/program.go
View file @
aa6d64ea
...
@@ -17,7 +17,7 @@ import (
...
@@ -17,7 +17,7 @@ import (
"github.com/ethereum-optimism/optimism/op-program/client/l1"
"github.com/ethereum-optimism/optimism/op-program/client/l1"
"github.com/ethereum-optimism/optimism/op-program/client/l2"
"github.com/ethereum-optimism/optimism/op-program/client/l2"
oppio
"github.com/ethereum-optimism/optimism/op-program/io"
oppio
"github.com/ethereum-optimism/optimism/op-program/io"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
)
)
// Main executes the client program in a detached context and exits the current process.
// Main executes the client program in a detached context and exits the current process.
...
...
op-program/go.mod
0 → 100644
View file @
aa6d64ea
module github.com/ethereum-optimism/optimism/op-program
go 1.20
// Note: optimism, op-preimage, are replaced with local monorepo dependencies.
// go-ethereum is replaced with the remote op-geth dependency.
require (
github.com/ethereum-optimism/optimism v0.0.0
github.com/ethereum-optimism/optimism/op-preimage v0.0.0
github.com/ethereum/go-ethereum v1.11.6
github.com/hashicorp/golang-lru/v2 v2.0.1
github.com/stretchr/testify v1.8.2
github.com/urfave/cli v1.22.9
)
require (
github.com/DataDog/zstd v1.5.2 // indirect
github.com/VictoriaMetrics/fastcache v1.10.0 // indirect
github.com/benbjohnson/clock v1.3.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/btcsuite/btcd v0.23.3 // indirect
github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
github.com/btcsuite/btcd/btcutil v1.1.0 // indirect
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cockroachdb/errors v1.9.1 // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 // indirect
github.com/cockroachdb/redact v1.1.3 // indirect
github.com/containerd/cgroups v1.1.0 // indirect
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
github.com/deckarep/golang-set/v2 v2.1.0 // indirect
github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/edsrzf/mmap-go v1.1.0 // indirect
github.com/elastic/gosigar v0.14.2 // indirect
github.com/fjl/memsize v0.0.1 // indirect
github.com/flynn/noise v1.0.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect
github.com/getsentry/sentry-go v0.18.0 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-stack/stack v1.8.1 // indirect
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/gofrs/flock v0.8.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v4 v4.4.2 // indirect
github.com/golang/mock v1.6.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect
github.com/google/gopacket v1.1.19 // indirect
github.com/google/pprof v0.0.0-20230207041349-798e818bf904 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-bexpr v0.1.11 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect
github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c // indirect
github.com/huin/goupnp v1.1.0 // indirect
github.com/ipfs/go-cid v0.3.2 // indirect
github.com/ipfs/go-datastore v0.6.0 // indirect
github.com/ipfs/go-ds-leveldb v0.5.0 // indirect
github.com/ipfs/go-log/v2 v2.5.1 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
github.com/klauspost/compress v1.15.15 // indirect
github.com/klauspost/cpuid/v2 v2.2.3 // indirect
github.com/koron/go-ssdp v0.0.3 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-flow-metrics v0.1.0 // indirect
github.com/libp2p/go-libp2p v0.25.1 // indirect
github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect
github.com/libp2p/go-libp2p-pubsub v0.9.3 // indirect
github.com/libp2p/go-libp2p-testing v0.12.0 // indirect
github.com/libp2p/go-mplex v0.7.0 // indirect
github.com/libp2p/go-msgio v0.3.0 // indirect
github.com/libp2p/go-nat v0.1.0 // indirect
github.com/libp2p/go-netroute v0.2.1 // indirect
github.com/libp2p/go-reuseport v0.2.0 // indirect
github.com/libp2p/go-yamux/v4 v4.0.0 // indirect
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.17 // indirect
github.com/mattn/go-runewidth v0.0.14 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/miekg/dns v1.1.50 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mitchellh/pointerstructure v1.2.1 // indirect
github.com/mr-tron/base58 v1.2.0 // indirect
github.com/multiformats/go-base32 v0.1.0 // indirect
github.com/multiformats/go-base36 v0.2.0 // indirect
github.com/multiformats/go-multiaddr v0.8.0 // indirect
github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
github.com/multiformats/go-multibase v0.1.1 // indirect
github.com/multiformats/go-multicodec v0.8.1 // indirect
github.com/multiformats/go-multihash v0.2.1 // indirect
github.com/multiformats/go-multistream v0.4.1 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/onsi/ginkgo/v2 v2.8.1 // indirect
github.com/opencontainers/runtime-spec v1.0.2 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.14.0 // indirect
github.com/prometheus/client_model v0.3.0 // indirect
github.com/prometheus/common v0.39.0 // indirect
github.com/prometheus/procfs v0.9.0 // indirect
github.com/quic-go/qpack v0.4.0 // indirect
github.com/quic-go/qtls-go1-18 v0.2.0 // indirect
github.com/quic-go/qtls-go1-19 v0.2.0 // indirect
github.com/quic-go/qtls-go1-20 v0.1.0 // indirect
github.com/quic-go/quic-go v0.32.0 // indirect
github.com/quic-go/webtransport-go v0.5.1 // indirect
github.com/raulk/go-watchdog v1.3.0 // indirect
github.com/rivo/uniseg v0.4.3 // indirect
github.com/rogpeppe/go-internal v1.9.0 // indirect
github.com/rs/cors v1.8.2 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/status-im/keycard-go v0.2.0 // indirect
github.com/stretchr/objx v0.5.0 // indirect
github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect
github.com/tklauser/go-sysconf v0.3.10 // indirect
github.com/tklauser/numcpus v0.5.0 // indirect
github.com/tyler-smith/go-bip39 v1.1.0 // indirect
github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
go.uber.org/atomic v1.10.0 // indirect
go.uber.org/dig v1.16.1 // indirect
go.uber.org/fx v1.19.1 // indirect
go.uber.org/multierr v1.9.0 // indirect
go.uber.org/zap v1.24.0 // indirect
golang.org/x/crypto v0.8.0 // indirect
golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb // indirect
golang.org/x/mod v0.9.0 // indirect
golang.org/x/net v0.9.0 // indirect
golang.org/x/sync v0.1.0 // indirect
golang.org/x/sys v0.7.0 // indirect
golang.org/x/term v0.7.0 // indirect
golang.org/x/text v0.9.0 // indirect
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af // indirect
golang.org/x/tools v0.7.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
lukechampine.com/blake3 v1.1.7 // indirect
nhooyr.io/websocket v1.8.7 // indirect
)
replace (
github.com/ethereum-optimism/optimism v0.0.0 => ../
github.com/ethereum-optimism/optimism/op-preimage v0.0.0 => ../op-preimage
github.com/ethereum/go-ethereum v1.11.6 => github.com/ethereum-optimism/op-geth v1.101106.0-rc.2
)
op-program/go.sum
0 → 100644
View file @
aa6d64ea
This diff is collapsed.
Click to expand it.
op-program/host/host.go
View file @
aa6d64ea
...
@@ -20,7 +20,7 @@ import (
...
@@ -20,7 +20,7 @@ import (
"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
"github.com/ethereum-optimism/optimism/op-program/host/prefetcher"
"github.com/ethereum-optimism/optimism/op-program/host/prefetcher"
oppio
"github.com/ethereum-optimism/optimism/op-program/io"
oppio
"github.com/ethereum-optimism/optimism/op-program/io"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
opservice
"github.com/ethereum-optimism/optimism/op-service"
opservice
"github.com/ethereum-optimism/optimism/op-service"
opclient
"github.com/ethereum-optimism/optimism/op-service/client"
opclient
"github.com/ethereum-optimism/optimism/op-service/client"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
...
...
op-program/host/host_test.go
View file @
aa6d64ea
...
@@ -13,7 +13,7 @@ import (
...
@@ -13,7 +13,7 @@ import (
"github.com/ethereum-optimism/optimism/op-program/host/config"
"github.com/ethereum-optimism/optimism/op-program/host/config"
"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
"github.com/ethereum-optimism/optimism/op-program/io"
"github.com/ethereum-optimism/optimism/op-program/io"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/log"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
...
...
op-program/host/kvstore/local.go
View file @
aa6d64ea
...
@@ -27,7 +27,7 @@ var (
...
@@ -27,7 +27,7 @@ var (
)
)
func
(
s
*
LocalPreimageSource
)
Get
(
key
common
.
Hash
)
([]
byte
,
error
)
{
func
(
s
*
LocalPreimageSource
)
Get
(
key
common
.
Hash
)
([]
byte
,
error
)
{
switch
key
{
switch
[
32
]
byte
(
key
)
{
case
l1HeadKey
:
case
l1HeadKey
:
return
s
.
config
.
L1Head
.
Bytes
(),
nil
return
s
.
config
.
L1Head
.
Bytes
(),
nil
case
l2HeadKey
:
case
l2HeadKey
:
...
...
op-program/host/kvstore/local_test.go
View file @
aa6d64ea
...
@@ -7,7 +7,7 @@ import (
...
@@ -7,7 +7,7 @@ import (
"github.com/ethereum-optimism/optimism/op-node/chaincfg"
"github.com/ethereum-optimism/optimism/op-node/chaincfg"
"github.com/ethereum-optimism/optimism/op-program/host/config"
"github.com/ethereum-optimism/optimism/op-program/host/config"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/params"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
...
...
op-program/host/kvstore/splitter.go
View file @
aa6d64ea
package
kvstore
package
kvstore
import
(
import
(
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
)
)
...
@@ -19,7 +19,7 @@ func NewPreimageSourceSplitter(local PreimageSource, global PreimageSource) *Pre
...
@@ -19,7 +19,7 @@ func NewPreimageSourceSplitter(local PreimageSource, global PreimageSource) *Pre
}
}
}
}
func
(
s
*
PreimageSourceSplitter
)
Get
(
key
common
.
Hash
)
([]
byte
,
error
)
{
func
(
s
*
PreimageSourceSplitter
)
Get
(
key
[
32
]
byte
)
([]
byte
,
error
)
{
if
key
[
0
]
==
byte
(
preimage
.
LocalKeyType
)
{
if
key
[
0
]
==
byte
(
preimage
.
LocalKeyType
)
{
return
s
.
local
(
key
)
return
s
.
local
(
key
)
}
}
...
...
op-program/host/kvstore/splitter_test.go
View file @
aa6d64ea
...
@@ -3,7 +3,7 @@ package kvstore
...
@@ -3,7 +3,7 @@ package kvstore
import
(
import
(
"testing"
"testing"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
)
)
...
...
op-program/host/prefetcher/prefetcher.go
View file @
aa6d64ea
...
@@ -11,7 +11,7 @@ import (
...
@@ -11,7 +11,7 @@ import (
"github.com/ethereum-optimism/optimism/op-program/client/l2"
"github.com/ethereum-optimism/optimism/op-program/client/l2"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
"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/core/types"
"github.com/ethereum/go-ethereum/core/types"
...
...
op-program/host/prefetcher/prefetcher_test.go
View file @
aa6d64ea
...
@@ -19,7 +19,7 @@ import (
...
@@ -19,7 +19,7 @@ import (
"github.com/ethereum-optimism/optimism/op-program/client/l2"
"github.com/ethereum-optimism/optimism/op-program/client/l2"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
"github.com/ethereum-optimism/optimism/op-pr
ogram/pr
eimage"
"github.com/ethereum-optimism/optimism/op-preimage"
)
)
func
TestNoHint
(
t
*
testing
.
T
)
{
func
TestNoHint
(
t
*
testing
.
T
)
{
...
...
op-program/preimage/hints.go
deleted
100644 → 0
View file @
b1b5f085
package
preimage
import
(
"encoding/binary"
"fmt"
"io"
)
// HintWriter writes hints to an io.Writer (e.g. a special file descriptor, or a debug log),
// for a pre-image oracle service to prepare specific pre-images.
type
HintWriter
struct
{
rw
io
.
ReadWriter
}
var
_
Hinter
=
(
*
HintWriter
)(
nil
)
func
NewHintWriter
(
rw
io
.
ReadWriter
)
*
HintWriter
{
return
&
HintWriter
{
rw
:
rw
}
}
func
(
hw
*
HintWriter
)
Hint
(
v
Hint
)
{
hint
:=
v
.
Hint
()
var
hintBytes
[]
byte
hintBytes
=
binary
.
BigEndian
.
AppendUint32
(
hintBytes
,
uint32
(
len
(
hint
)))
hintBytes
=
append
(
hintBytes
,
[]
byte
(
hint
)
...
)
_
,
err
:=
hw
.
rw
.
Write
(
hintBytes
)
if
err
!=
nil
{
panic
(
fmt
.
Errorf
(
"failed to write pre-image hint: %w"
,
err
))
}
_
,
err
=
hw
.
rw
.
Read
([]
byte
{
0
})
if
err
!=
nil
{
panic
(
fmt
.
Errorf
(
"failed to read pre-image hint ack: %w"
,
err
))
}
}
// HintReader reads the hints of HintWriter and passes them to a router for preparation of the requested pre-images.
// Onchain the written hints are no-op.
type
HintReader
struct
{
rw
io
.
ReadWriter
}
func
NewHintReader
(
rw
io
.
ReadWriter
)
*
HintReader
{
return
&
HintReader
{
rw
:
rw
}
}
type
HintHandler
func
(
hint
string
)
error
func
(
hr
*
HintReader
)
NextHint
(
router
HintHandler
)
error
{
var
length
uint32
if
err
:=
binary
.
Read
(
hr
.
rw
,
binary
.
BigEndian
,
&
length
);
err
!=
nil
{
if
err
==
io
.
EOF
{
return
io
.
EOF
}
return
fmt
.
Errorf
(
"failed to read hint length prefix: %w"
,
err
)
}
payload
:=
make
([]
byte
,
length
)
if
length
>
0
{
if
_
,
err
:=
io
.
ReadFull
(
hr
.
rw
,
payload
);
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to read hint payload (length %d): %w"
,
length
,
err
)
}
}
if
err
:=
router
(
string
(
payload
));
err
!=
nil
{
// write back on error to unblock the HintWriter
_
,
_
=
hr
.
rw
.
Write
([]
byte
{
0
})
return
fmt
.
Errorf
(
"failed to handle hint: %w"
,
err
)
}
if
_
,
err
:=
hr
.
rw
.
Write
([]
byte
{
0
});
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to write trailing no-op byte to unblock hint writer: %w"
,
err
)
}
return
nil
}
op-program/preimage/hints_test.go
deleted
100644 → 0
View file @
b1b5f085
package
preimage
import
(
"bytes"
"crypto/rand"
"errors"
"io"
"sync"
"testing"
"time"
"github.com/stretchr/testify/require"
)
type
rawHint
string
func
(
rh
rawHint
)
Hint
()
string
{
return
string
(
rh
)
}
func
TestHints
(
t
*
testing
.
T
)
{
// Note: pretty much every string is valid communication:
// length, payload, 0. Worst case you run out of data, or allocate too much.
testHint
:=
func
(
hints
...
string
)
{
a
,
b
:=
bidirectionalPipe
()
var
wg
sync
.
WaitGroup
wg
.
Add
(
2
)
go
func
()
{
hw
:=
NewHintWriter
(
a
)
for
_
,
h
:=
range
hints
{
hw
.
Hint
(
rawHint
(
h
))
}
wg
.
Done
()
}()
got
:=
make
(
chan
string
,
len
(
hints
))
go
func
()
{
defer
wg
.
Done
()
hr
:=
NewHintReader
(
b
)
for
i
:=
0
;
i
<
len
(
hints
);
i
++
{
err
:=
hr
.
NextHint
(
func
(
hint
string
)
error
{
got
<-
hint
return
nil
})
if
err
==
io
.
EOF
{
break
}
require
.
NoError
(
t
,
err
)
}
}()
if
waitTimeout
(
&
wg
)
{
t
.
Error
(
"hint read/write stuck"
)
}
require
.
Equal
(
t
,
len
(
hints
),
len
(
got
),
"got all hints"
)
for
_
,
h
:=
range
hints
{
require
.
Equal
(
t
,
h
,
<-
got
,
"hints match"
)
}
}
t
.
Run
(
"empty hint"
,
func
(
t
*
testing
.
T
)
{
testHint
(
""
)
})
t
.
Run
(
"hello world"
,
func
(
t
*
testing
.
T
)
{
testHint
(
"hello world"
)
})
t
.
Run
(
"zero byte"
,
func
(
t
*
testing
.
T
)
{
testHint
(
string
([]
byte
{
0
}))
})
t
.
Run
(
"many zeroes"
,
func
(
t
*
testing
.
T
)
{
testHint
(
string
(
make
([]
byte
,
1000
)))
})
t
.
Run
(
"random data"
,
func
(
t
*
testing
.
T
)
{
dat
:=
make
([]
byte
,
1000
)
_
,
_
=
rand
.
Read
(
dat
[
:
])
testHint
(
string
(
dat
))
})
t
.
Run
(
"multiple hints"
,
func
(
t
*
testing
.
T
)
{
testHint
(
"give me header a"
,
"also header b"
,
"foo bar"
)
})
t
.
Run
(
"unexpected EOF"
,
func
(
t
*
testing
.
T
)
{
var
buf
bytes
.
Buffer
hw
:=
NewHintWriter
(
&
buf
)
hw
.
Hint
(
rawHint
(
"hello"
))
_
,
_
=
buf
.
Read
(
make
([]
byte
,
1
))
// read one byte so it falls short, see if it's detected
hr
:=
NewHintReader
(
&
buf
)
err
:=
hr
.
NextHint
(
func
(
hint
string
)
error
{
return
nil
})
require
.
ErrorIs
(
t
,
err
,
io
.
ErrUnexpectedEOF
)
})
t
.
Run
(
"cb error"
,
func
(
t
*
testing
.
T
)
{
a
,
b
:=
bidirectionalPipe
()
var
wg
sync
.
WaitGroup
wg
.
Add
(
2
)
go
func
()
{
hw
:=
NewHintWriter
(
a
)
hw
.
Hint
(
rawHint
(
"one"
))
hw
.
Hint
(
rawHint
(
"two"
))
wg
.
Done
()
}()
go
func
()
{
defer
wg
.
Done
()
hr
:=
NewHintReader
(
b
)
cbErr
:=
errors
.
New
(
"fail"
)
err
:=
hr
.
NextHint
(
func
(
hint
string
)
error
{
return
cbErr
})
require
.
ErrorIs
(
t
,
err
,
cbErr
)
var
readHint
string
err
=
hr
.
NextHint
(
func
(
hint
string
)
error
{
readHint
=
hint
return
nil
})
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
readHint
,
"two"
)
}()
if
waitTimeout
(
&
wg
)
{
t
.
Error
(
"read/write hint stuck"
)
}
})
}
// waitTimeout returns true iff wg.Wait timed out
func
waitTimeout
(
wg
*
sync
.
WaitGroup
)
bool
{
done
:=
make
(
chan
struct
{})
go
func
()
{
wg
.
Wait
()
close
(
done
)
}()
select
{
case
<-
time
.
After
(
time
.
Second
*
30
)
:
return
true
case
<-
done
:
return
false
}
}
op-program/preimage/iface.go
deleted
100644 → 0
View file @
b1b5f085
package
preimage
import
(
"encoding/binary"
"github.com/ethereum/go-ethereum/common"
)
type
Key
interface
{
// PreimageKey changes the Key commitment into a
// 32-byte type-prefixed preimage key.
PreimageKey
()
common
.
Hash
}
type
Oracle
interface
{
// Get the full pre-image of a given pre-image key.
// This returns no error: the client state-transition
// is invalid if there is any missing pre-image data.
Get
(
key
Key
)
[]
byte
}
type
OracleFn
func
(
key
Key
)
[]
byte
func
(
fn
OracleFn
)
Get
(
key
Key
)
[]
byte
{
return
fn
(
key
)
}
// KeyType is the key-type of a pre-image, used to prefix the pre-image key with.
type
KeyType
byte
const
(
// The zero key type is illegal to use, ensuring all keys are non-zero.
_
KeyType
=
0
// LocalKeyType is for input-type pre-images, specific to the local program instance.
LocalKeyType
KeyType
=
1
// Keccak256KeyType is for keccak256 pre-images, for any global shared pre-images.
Keccak256KeyType
KeyType
=
2
)
// LocalIndexKey is a key local to the program, indexing a special program input.
type
LocalIndexKey
uint64
func
(
k
LocalIndexKey
)
PreimageKey
()
(
out
common
.
Hash
)
{
out
[
0
]
=
byte
(
LocalKeyType
)
binary
.
BigEndian
.
PutUint64
(
out
[
24
:
],
uint64
(
k
))
return
}
// Keccak256Key wraps a keccak256 hash to use it as a typed pre-image key.
type
Keccak256Key
common
.
Hash
func
(
k
Keccak256Key
)
PreimageKey
()
(
out
common
.
Hash
)
{
out
=
common
.
Hash
(
k
)
// copy the keccak hash
out
[
0
]
=
byte
(
Keccak256KeyType
)
// apply prefix
return
}
func
(
k
Keccak256Key
)
String
()
string
{
return
common
.
Hash
(
k
)
.
String
()
}
func
(
k
Keccak256Key
)
TerminalString
()
string
{
return
common
.
Hash
(
k
)
.
String
()
}
// Hint is an interface to enable any program type to function as a hint,
// when passed to the Hinter interface, returning a string representation
// of what data the host should prepare pre-images for.
type
Hint
interface
{
Hint
()
string
}
// Hinter is an interface to write hints to the host.
// This may be implemented as a no-op or logging hinter
// if the program is executing in a read-only environment
// where the host is expected to have all pre-images ready.
type
Hinter
interface
{
Hint
(
v
Hint
)
}
type
HinterFn
func
(
v
Hint
)
func
(
fn
HinterFn
)
Hint
(
v
Hint
)
{
fn
(
v
)
}
op-program/preimage/oracle.go
deleted
100644 → 0
View file @
b1b5f085
package
preimage
import
(
"encoding/binary"
"fmt"
"io"
"github.com/ethereum/go-ethereum/common"
)
// OracleClient implements the Oracle by writing the pre-image key to the given stream,
// and reading back a length-prefixed value.
type
OracleClient
struct
{
rw
io
.
ReadWriter
}
func
NewOracleClient
(
rw
io
.
ReadWriter
)
*
OracleClient
{
return
&
OracleClient
{
rw
:
rw
}
}
var
_
Oracle
=
(
*
OracleClient
)(
nil
)
func
(
o
*
OracleClient
)
Get
(
key
Key
)
[]
byte
{
h
:=
key
.
PreimageKey
()
if
_
,
err
:=
o
.
rw
.
Write
(
h
[
:
]);
err
!=
nil
{
panic
(
fmt
.
Errorf
(
"failed to write key %s (%T) to pre-image oracle: %w"
,
key
,
key
,
err
))
}
var
length
uint64
if
err
:=
binary
.
Read
(
o
.
rw
,
binary
.
BigEndian
,
&
length
);
err
!=
nil
{
panic
(
fmt
.
Errorf
(
"failed to read pre-image length of key %s (%T) from pre-image oracle: %w"
,
key
,
key
,
err
))
}
payload
:=
make
([]
byte
,
length
)
if
_
,
err
:=
io
.
ReadFull
(
o
.
rw
,
payload
);
err
!=
nil
{
panic
(
fmt
.
Errorf
(
"failed to read pre-image payload (length %d) of key %s (%T) from pre-image oracle: %w"
,
length
,
key
,
key
,
err
))
}
return
payload
}
// OracleServer serves the pre-image requests of the OracleClient, implementing the same protocol as the onchain VM.
type
OracleServer
struct
{
rw
io
.
ReadWriter
}
func
NewOracleServer
(
rw
io
.
ReadWriter
)
*
OracleServer
{
return
&
OracleServer
{
rw
:
rw
}
}
type
PreimageGetter
func
(
key
common
.
Hash
)
([]
byte
,
error
)
func
(
o
*
OracleServer
)
NextPreimageRequest
(
getPreimage
PreimageGetter
)
error
{
var
key
common
.
Hash
if
_
,
err
:=
io
.
ReadFull
(
o
.
rw
,
key
[
:
]);
err
!=
nil
{
if
err
==
io
.
EOF
{
return
io
.
EOF
}
return
fmt
.
Errorf
(
"failed to read requested pre-image key: %w"
,
err
)
}
value
,
err
:=
getPreimage
(
key
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to serve pre-image %s request: %w"
,
key
,
err
)
}
if
err
:=
binary
.
Write
(
o
.
rw
,
binary
.
BigEndian
,
uint64
(
len
(
value
)));
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to write length-prefix %d: %w"
,
len
(
value
),
err
)
}
if
len
(
value
)
==
0
{
return
nil
}
if
_
,
err
:=
o
.
rw
.
Write
(
value
);
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to write pre-image value (%d long): %w"
,
len
(
value
),
err
)
}
return
nil
}
op-program/preimage/oracle_test.go
deleted
100644 → 0
View file @
b1b5f085
package
preimage
import
(
"bytes"
"crypto/rand"
"fmt"
"io"
"sync"
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/require"
)
type
readWritePair
struct
{
io
.
Reader
io
.
Writer
}
func
bidirectionalPipe
()
(
a
,
b
io
.
ReadWriter
)
{
ar
,
bw
:=
io
.
Pipe
()
br
,
aw
:=
io
.
Pipe
()
return
readWritePair
{
Reader
:
ar
,
Writer
:
aw
},
readWritePair
{
Reader
:
br
,
Writer
:
bw
}
}
func
TestOracle
(
t
*
testing
.
T
)
{
testPreimage
:=
func
(
preimages
...
[]
byte
)
{
a
,
b
:=
bidirectionalPipe
()
cl
:=
NewOracleClient
(
a
)
srv
:=
NewOracleServer
(
b
)
preimageByHash
:=
make
(
map
[
common
.
Hash
][]
byte
)
for
_
,
p
:=
range
preimages
{
k
:=
Keccak256Key
(
crypto
.
Keccak256Hash
(
p
))
preimageByHash
[
k
.
PreimageKey
()]
=
p
}
for
_
,
p
:=
range
preimages
{
k
:=
Keccak256Key
(
crypto
.
Keccak256Hash
(
p
))
var
wg
sync
.
WaitGroup
wg
.
Add
(
2
)
go
func
(
k
Key
,
p
[]
byte
)
{
result
:=
cl
.
Get
(
k
)
wg
.
Done
()
expected
:=
preimageByHash
[
k
.
PreimageKey
()]
require
.
True
(
t
,
bytes
.
Equal
(
expected
,
result
),
"need correct preimage %x, got %x"
,
expected
,
result
)
}(
k
,
p
)
go
func
()
{
err
:=
srv
.
NextPreimageRequest
(
func
(
key
common
.
Hash
)
([]
byte
,
error
)
{
dat
,
ok
:=
preimageByHash
[
key
]
if
!
ok
{
return
nil
,
fmt
.
Errorf
(
"cannot find %s"
,
key
)
}
return
dat
,
nil
})
wg
.
Done
()
require
.
NoError
(
t
,
err
)
}()
wg
.
Wait
()
}
}
t
.
Run
(
"empty preimage"
,
func
(
t
*
testing
.
T
)
{
testPreimage
([]
byte
{})
})
t
.
Run
(
"nil preimage"
,
func
(
t
*
testing
.
T
)
{
testPreimage
(
nil
)
})
t
.
Run
(
"zero"
,
func
(
t
*
testing
.
T
)
{
testPreimage
([]
byte
{
0
})
})
t
.
Run
(
"multiple"
,
func
(
t
*
testing
.
T
)
{
testPreimage
([]
byte
(
"tx from alice"
),
[]
byte
{
0x13
,
0x37
},
[]
byte
(
"tx from bob"
))
})
t
.
Run
(
"zeroes"
,
func
(
t
*
testing
.
T
)
{
testPreimage
(
make
([]
byte
,
1000
))
})
t
.
Run
(
"random"
,
func
(
t
*
testing
.
T
)
{
dat
:=
make
([]
byte
,
1000
)
_
,
_
=
rand
.
Read
(
dat
[
:
])
testPreimage
(
dat
)
})
}
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