Commit 22d72617 authored by mergify[bot]'s avatar mergify[bot] Committed by GitHub

Merge branch 'develop' into refcell/challenger-touchup

parents 346d2d3e 406e1257
# Legacy codebases # Packages
/packages/chain-mon @ethereum-optimism/devxpod
/packages/common-ts @ethereum-optimism/typescript-reviewers /packages/common-ts @ethereum-optimism/typescript-reviewers
/packages/contracts @ethereum-optimism/contract-reviewers
/packages/contracts-bedrock @ethereum-optimism/contract-reviewers /packages/contracts-bedrock @ethereum-optimism/contract-reviewers
/packages/core-utils @ethereum-optimism/legacy-reviewers /packages/core-utils @ethereum-optimism/legacy-reviewers
/packages/chain-mon @ethereum-optimism/devxpod
/packages/replica-healthcheck @ethereum-optimism/legacy-reviewers /packages/replica-healthcheck @ethereum-optimism/legacy-reviewers
/packages/sdk @ethereum-optimism/devxpod /packages/sdk @ethereum-optimism/devxpod
/packages/atst @ethereum-optimism/devxpod
# Bedrock codebases # Bedrock codebases
/bedrock-devnet @ethereum-optimism/go-reviewers /bedrock-devnet @ethereum-optimism/go-reviewers
/cannon @ethereum-optimism/go-reviewers /cannon @ethereum-optimism/go-reviewers
/op-batcher @ethereum-optimism/go-reviewers /op-batcher @ethereum-optimism/go-reviewers
/op-bootnode @ethereum-optimism/go-reviewers
/op-chain-ops @ethereum-optimism/go-reviewers /op-chain-ops @ethereum-optimism/go-reviewers
/op-challenger @ethereum-optimism/go-reviewers
/op-e2e @ethereum-optimism/go-reviewers /op-e2e @ethereum-optimism/go-reviewers
/op-exporter @ethereum-optimism/go-reviewers
/op-heartbeat @ethereum-optimism/go-reviewers
/op-node @ethereum-optimism/go-reviewers /op-node @ethereum-optimism/go-reviewers
/op-node/rollup @protolambda @trianglesphere /op-node/rollup @protolambda @trianglesphere
/op-proposer @ethereum-optimism/go-reviewers /op-preimage @ethereum-optimism/go-reviewers
/op-bootnode @ethereum-optimism/go-reviewers
/op-program @ethereum-optimism/go-reviewers /op-program @ethereum-optimism/go-reviewers
/op-proposer @ethereum-optimism/go-reviewers
/op-service @ethereum-optimism/go-reviewers /op-service @ethereum-optimism/go-reviewers
/op-signer @ethereum-optimism/go-reviewers
/op-wheel @ethereum-optimism/go-reviewers
/ops-bedrock @ethereum-optimism/go-reviewers /ops-bedrock @ethereum-optimism/go-reviewers
# Ops # Ops
/.circleci @ethereum-optimism/infra-reviewers /.circleci @ethereum-optimism/infra-reviewers
/.github @ethereum-optimism/infra-reviewers /.github @ethereum-optimism/infra-reviewers
...@@ -37,8 +40,8 @@ ...@@ -37,8 +40,8 @@
/endpoint-monitor @ethereum-optimism/infra-reviewers /endpoint-monitor @ethereum-optimism/infra-reviewers
# Don't add owners if only package.json is updated # Don't add owners if only package.json is updated
/packages/*/package.json /packages/*/package.json
/*/package.json /*/package.json
# JavaScript Releases # JavaScript Releases
/packages/*/CHANGELOG.md @ethereum-optimism/release-managers /packages/*/CHANGELOG.md @ethereum-optimism/release-managers
......
...@@ -9,9 +9,12 @@ import ( ...@@ -9,9 +9,12 @@ import (
"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/log"
) )
const proofsDir = "proofs" const (
proofsDir = "proofs"
)
type proofData struct { type proofData struct {
ClaimValue hexutil.Bytes `json:"post"` ClaimValue hexutil.Bytes `json:"post"`
...@@ -19,13 +22,20 @@ type proofData struct { ...@@ -19,13 +22,20 @@ type proofData struct {
ProofData hexutil.Bytes `json:"proof-data"` ProofData hexutil.Bytes `json:"proof-data"`
} }
type Executor interface {
// GenerateProof executes cannon to generate a proof at the specified trace index in dataDir.
GenerateProof(dataDir string, proofAt uint64) error
}
type CannonTraceProvider struct { type CannonTraceProvider struct {
dir string dir string
executor Executor
} }
func NewCannonTraceProvider(dataDir string) *CannonTraceProvider { func NewCannonTraceProvider(logger log.Logger, dataDir string) *CannonTraceProvider {
return &CannonTraceProvider{ return &CannonTraceProvider{
dir: dataDir, dir: dataDir,
executor: newExecutor(logger),
} }
} }
...@@ -65,6 +75,13 @@ func (p *CannonTraceProvider) AbsolutePreState() []byte { ...@@ -65,6 +75,13 @@ func (p *CannonTraceProvider) AbsolutePreState() []byte {
func (p *CannonTraceProvider) loadProof(i uint64) (*proofData, error) { func (p *CannonTraceProvider) loadProof(i uint64) (*proofData, error) {
path := filepath.Join(p.dir, proofsDir, fmt.Sprintf("%d.json", i)) path := filepath.Join(p.dir, proofsDir, fmt.Sprintf("%d.json", i))
file, err := os.Open(path) file, err := os.Open(path)
if errors.Is(err, os.ErrNotExist) {
if err := p.executor.GenerateProof(p.dir, i); err != nil {
return nil, fmt.Errorf("generate cannon trace with proof at %v: %w", i, err)
}
// Try opening the file again now and it should exist.
file, err = os.Open(path)
}
if err != nil { if err != nil {
return nil, fmt.Errorf("cannot open proof file (%v): %w", path, err) return nil, fmt.Errorf("cannot open proof file (%v): %w", path, err)
} }
......
...@@ -15,63 +15,79 @@ import ( ...@@ -15,63 +15,79 @@ import (
var testData embed.FS var testData embed.FS
func TestGet(t *testing.T) { func TestGet(t *testing.T) {
provider := setupWithTestData(t) dataDir := setupTestData(t)
t.Run("ExistingProof", func(t *testing.T) { t.Run("ExistingProof", func(t *testing.T) {
provider, executor := setupWithTestData(dataDir)
value, err := provider.Get(0) value, err := provider.Get(0)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, common.HexToHash("0x45fd9aa59768331c726e719e76aa343e73123af888804604785ae19506e65e87"), value) require.Equal(t, common.HexToHash("0x45fd9aa59768331c726e719e76aa343e73123af888804604785ae19506e65e87"), value)
require.Empty(t, executor.generated)
}) })
t.Run("ProofUnavailable", func(t *testing.T) { t.Run("ProofUnavailable", func(t *testing.T) {
provider, executor := setupWithTestData(dataDir)
_, err := provider.Get(7) _, err := provider.Get(7)
require.ErrorIs(t, err, os.ErrNotExist) require.ErrorIs(t, err, os.ErrNotExist)
require.Contains(t, executor.generated, 7, "should have tried to generate the proof")
}) })
t.Run("MissingPostHash", func(t *testing.T) { t.Run("MissingPostHash", func(t *testing.T) {
provider, executor := setupWithTestData(dataDir)
_, err := provider.Get(1) _, err := provider.Get(1)
require.ErrorContains(t, err, "missing post hash") require.ErrorContains(t, err, "missing post hash")
require.Empty(t, executor.generated)
}) })
t.Run("IgnoreUnknownFields", func(t *testing.T) { t.Run("IgnoreUnknownFields", func(t *testing.T) {
provider, executor := setupWithTestData(dataDir)
value, err := provider.Get(2) value, err := provider.Get(2)
require.NoError(t, err) require.NoError(t, err)
expected := common.HexToHash("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") expected := common.HexToHash("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")
require.Equal(t, expected, value) require.Equal(t, expected, value)
require.Empty(t, executor.generated)
}) })
} }
func TestGetPreimage(t *testing.T) { func TestGetPreimage(t *testing.T) {
provider := setupWithTestData(t) dataDir := setupTestData(t)
t.Run("ExistingProof", func(t *testing.T) { t.Run("ExistingProof", func(t *testing.T) {
provider, executor := setupWithTestData(dataDir)
value, proof, err := provider.GetPreimage(0) value, proof, err := provider.GetPreimage(0)
require.NoError(t, err) require.NoError(t, err)
expected := common.Hex2Bytes("b8f068de604c85ea0e2acd437cdb47add074a2d70b81d018390c504b71fe26f400000000000000000000000000000000000000000000000000000000000000000000000000") expected := common.Hex2Bytes("b8f068de604c85ea0e2acd437cdb47add074a2d70b81d018390c504b71fe26f400000000000000000000000000000000000000000000000000000000000000000000000000")
require.Equal(t, expected, value) require.Equal(t, expected, value)
expectedProof := common.Hex2Bytes("08028e3c0000000000000000000000003c01000a24210b7c00200008000000008fa40004") expectedProof := common.Hex2Bytes("08028e3c0000000000000000000000003c01000a24210b7c00200008000000008fa40004")
require.Equal(t, expectedProof, proof) require.Equal(t, expectedProof, proof)
require.Empty(t, executor.generated)
}) })
t.Run("ProofUnavailable", func(t *testing.T) { t.Run("ProofUnavailable", func(t *testing.T) {
provider, executor := setupWithTestData(dataDir)
_, _, err := provider.GetPreimage(7) _, _, err := provider.GetPreimage(7)
require.ErrorIs(t, err, os.ErrNotExist) require.ErrorIs(t, err, os.ErrNotExist)
require.Contains(t, executor.generated, 7, "should have tried to generate the proof")
}) })
t.Run("MissingStateData", func(t *testing.T) { t.Run("MissingStateData", func(t *testing.T) {
provider, executor := setupWithTestData(dataDir)
_, _, err := provider.GetPreimage(1) _, _, err := provider.GetPreimage(1)
require.ErrorContains(t, err, "missing state data") require.ErrorContains(t, err, "missing state data")
require.Empty(t, executor.generated)
}) })
t.Run("IgnoreUnknownFields", func(t *testing.T) { t.Run("IgnoreUnknownFields", func(t *testing.T) {
provider, executor := setupWithTestData(dataDir)
value, proof, err := provider.GetPreimage(2) value, proof, err := provider.GetPreimage(2)
require.NoError(t, err) require.NoError(t, err)
expected := common.Hex2Bytes("cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc") expected := common.Hex2Bytes("cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc")
require.Equal(t, expected, value) require.Equal(t, expected, value)
expectedProof := common.Hex2Bytes("dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd") expectedProof := common.Hex2Bytes("dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd")
require.Equal(t, expectedProof, proof) require.Equal(t, expectedProof, proof)
require.Empty(t, executor.generated)
}) })
} }
func setupWithTestData(t *testing.T) *CannonTraceProvider { func setupTestData(t *testing.T) string {
srcDir := filepath.Join("test_data", "proofs") srcDir := filepath.Join("test_data", "proofs")
entries, err := testData.ReadDir(srcDir) entries, err := testData.ReadDir(srcDir)
require.NoError(t, err) require.NoError(t, err)
...@@ -84,5 +100,22 @@ func setupWithTestData(t *testing.T) *CannonTraceProvider { ...@@ -84,5 +100,22 @@ func setupWithTestData(t *testing.T) *CannonTraceProvider {
err = os.WriteFile(filepath.Join(dataDir, "proofs", entry.Name()), file, 0o644) err = os.WriteFile(filepath.Join(dataDir, "proofs", entry.Name()), file, 0o644)
require.NoErrorf(t, err, "writing %v", path) require.NoErrorf(t, err, "writing %v", path)
} }
return NewCannonTraceProvider(dataDir) return dataDir
}
func setupWithTestData(dataDir string) (*CannonTraceProvider, *stubExecutor) {
executor := &stubExecutor{}
return &CannonTraceProvider{
dir: dataDir,
executor: executor,
}, executor
}
type stubExecutor struct {
generated []int // Using int makes assertions easier
}
func (e *stubExecutor) GenerateProof(dir string, i uint64) error {
e.generated = append(e.generated, int(i))
return nil
} }
package cannon
import (
"fmt"
"github.com/ethereum/go-ethereum/log"
)
type executor struct {
logger log.Logger
}
func newExecutor(logger log.Logger) Executor {
return &executor{
logger: logger,
}
}
func (e *executor) GenerateProof(dir string, i uint64) error {
return fmt.Errorf("please execute cannon with --proof-at %v --proof-fmt %v/%v/%%d.json", i, dir, proofsDir)
}
...@@ -55,7 +55,7 @@ func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*se ...@@ -55,7 +55,7 @@ func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*se
var trace types.TraceProvider var trace types.TraceProvider
switch cfg.TraceType { switch cfg.TraceType {
case config.TraceTypeCannon: case config.TraceTypeCannon:
trace = cannon.NewCannonTraceProvider(cfg.CannonDatadir) trace = cannon.NewCannonTraceProvider(logger, cfg.CannonDatadir)
case config.TraceTypeAlphabet: case config.TraceTypeAlphabet:
trace = NewAlphabetProvider(cfg.AlphabetTrace, uint64(cfg.GameDepth)) trace = NewAlphabetProvider(cfg.AlphabetTrace, uint64(cfg.GameDepth))
default: default:
......
...@@ -30,7 +30,7 @@ FROM ethereum/client-go:alltools-v1.10.25 as geth ...@@ -30,7 +30,7 @@ FROM ethereum/client-go:alltools-v1.10.25 as geth
FROM ghcr.io/crytic/echidna/echidna:v2.0.4 as echidna-test FROM ghcr.io/crytic/echidna/echidna:v2.0.4 as echidna-test
FROM python:3.8.13-slim-bullseye FROM python:3.11.4-slim-bullseye
ENV GOPATH=/go ENV GOPATH=/go
ENV PATH=/usr/local/go/bin:$GOPATH/bin:$PATH ENV PATH=/usr/local/go/bin:$GOPATH/bin:$PATH
......
...@@ -10,12 +10,13 @@ import semver ...@@ -10,12 +10,13 @@ import semver
# Minimum version numbers for packages migrating from legacy versioning. # Minimum version numbers for packages migrating from legacy versioning.
MIN_VERSIONS = { MIN_VERSIONS = {
'ci-builder': '0.6.0',
'indexer': '0.5.0',
'op-node': '0.10.14', 'op-node': '0.10.14',
'op-batcher': '0.10.14', 'op-batcher': '0.10.14',
'op-proposer': '0.10.14', 'op-proposer': '0.10.14',
'proxyd': '3.16.0', 'op-ufm': '0.1.0',
'indexer': '0.5.0', 'proxyd': '3.16.0'
'ci-builder': '0.6.0'
} }
VALID_BUMPS = ('major', 'minor', 'patch', 'prerelease', 'finalize-prerelease') VALID_BUMPS = ('major', 'minor', 'patch', 'prerelease', 'finalize-prerelease')
......
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