Skip to content

Commit a81c70c

Browse files
authored
cannon: Add mtcannon64 state versioning (ethereum-optimism#13582)
* cannon: Add new state version and start migrating * cannon: Add new test state for version 4 * cannon: Update cannon commands to use new state version * cannon: Update cannon embeds command * cannon: Update Dockerfile to include cannon version 3 binary
1 parent d32c41e commit a81c70c

File tree

10 files changed

+27
-17
lines changed

10 files changed

+27
-17
lines changed

Diff for: Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ cannon-prestate: op-program cannon ## Generates prestate using cannon and op-pro
148148
mv op-program/bin/0.json op-program/bin/prestate-proof.json
149149
.PHONY: cannon-prestate
150150

151-
cannon-prestate-mt: op-program cannon ## Generates prestate using cannon and op-program in the multithreaded64 cannon format
152-
./cannon/bin/cannon load-elf --type multithreaded64 --path op-program/bin/op-program-client64.elf --out op-program/bin/prestate-mt.bin.gz --meta op-program/bin/meta-mt.json
151+
cannon-prestate-mt: op-program cannon ## Generates prestate using cannon and op-program in the multithreaded64-2 cannon format
152+
./cannon/bin/cannon load-elf --type multithreaded64-2 --path op-program/bin/op-program-client64.elf --out op-program/bin/prestate-mt.bin.gz --meta op-program/bin/meta-mt.json
153153
./cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input op-program/bin/prestate-mt.bin.gz --meta op-program/bin/meta-mt.json --proof-fmt 'op-program/bin/%d-mt.json' --output ""
154154
mv op-program/bin/0-mt.json op-program/bin/prestate-proof-mt.json
155155
.PHONY: cannon-prestate-mt

Diff for: cannon/Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ cannon-embeds: cannon32-impl cannon64-impl
3636
@cp bin/cannon32-impl ./multicannon/embeds/cannon-2
3737
# multithreaded
3838
@cp bin/cannon32-impl ./multicannon/embeds/cannon-1
39-
# 64-bit multithreaded
40-
@cp bin/cannon64-impl ./multicannon/embeds/cannon-3
39+
# 64-bit multithreaded v2
40+
@cp bin/cannon64-impl ./multicannon/embeds/cannon-4
4141

4242
cannon: cannon-embeds
4343
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/cannon ./multicannon/

Diff for: cannon/cmd/load_elf.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func LoadELF(ctx *cli.Context) error {
8080
}
8181
return program.PatchStack(state)
8282
}
83-
case versions.VersionMultiThreaded, versions.VersionMultiThreaded64:
83+
case versions.VersionMultiThreaded, versions.VersionMultiThreaded64_v2:
8484
createInitialState = func(f *elf.File) (mipsevm.FPVMState, error) {
8585
return program.LoadELF(f, multithreaded.CreateInitialState)
8686
}

Diff for: cannon/mipsevm/versions/detect.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func DetectVersion(path string) (StateVersion, error) {
2727
}
2828

2929
switch ver {
30-
case VersionSingleThreaded, VersionMultiThreaded, VersionSingleThreaded2, VersionMultiThreaded64:
30+
case VersionSingleThreaded, VersionMultiThreaded, VersionSingleThreaded2, VersionMultiThreaded64, VersionMultiThreaded64_v2:
3131
return ver, nil
3232
default:
3333
return 0, fmt.Errorf("%w: %d", ErrUnknownVersion, ver)

Diff for: cannon/mipsevm/versions/detect_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func TestDetectVersion_singleThreadedBinary(t *testing.T) {
6666
func TestDetectVersion_multiThreadedBinary(t *testing.T) {
6767
targetVersion := VersionMultiThreaded
6868
if !arch.IsMips32 {
69-
targetVersion = VersionMultiThreaded64
69+
targetVersion = VersionMultiThreaded64_v2
7070
}
7171

7272
state, err := NewFromState(multithreaded.CreateEmptyState())

Diff for: cannon/mipsevm/versions/state.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ const (
2222
VersionMultiThreaded
2323
// VersionSingleThreaded2 is based on VersionSingleThreaded with the addition of support for fcntl(F_GETFD) syscall
2424
VersionSingleThreaded2
25+
// VersionMultiThreaded64 is the original 64-bit MTCannon implementation (pre-audit), tagged at cannon/v1.2.0
2526
VersionMultiThreaded64
27+
VersionMultiThreaded64_v2
2628
)
2729

2830
var (
@@ -31,7 +33,7 @@ var (
3133
ErrUnsupportedMipsArch = errors.New("mips architecture is not supported")
3234
)
3335

34-
var StateVersionTypes = []StateVersion{VersionSingleThreaded, VersionMultiThreaded, VersionSingleThreaded2, VersionMultiThreaded64}
36+
var StateVersionTypes = []StateVersion{VersionSingleThreaded, VersionMultiThreaded, VersionSingleThreaded2, VersionMultiThreaded64, VersionMultiThreaded64_v2}
3537

3638
func LoadStateFromFile(path string) (*VersionedState, error) {
3739
if !serialize.IsBinaryFile(path) {
@@ -63,7 +65,7 @@ func NewFromState(state mipsevm.FPVMState) (*VersionedState, error) {
6365
}, nil
6466
} else {
6567
return &VersionedState{
66-
Version: VersionMultiThreaded64,
68+
Version: VersionMultiThreaded64_v2,
6769
FPVMState: state,
6870
}, nil
6971
}
@@ -114,7 +116,7 @@ func (s *VersionedState) Deserialize(in io.Reader) error {
114116
}
115117
s.FPVMState = state
116118
return nil
117-
case VersionMultiThreaded64:
119+
case VersionMultiThreaded64_v2:
118120
if arch.IsMips32 {
119121
return ErrUnsupportedMipsArch
120122
}
@@ -151,6 +153,8 @@ func (s StateVersion) String() string {
151153
return "singlethreaded-2"
152154
case VersionMultiThreaded64:
153155
return "multithreaded64"
156+
case VersionMultiThreaded64_v2:
157+
return "multithreaded64-2"
154158
default:
155159
return "unknown"
156160
}
@@ -166,6 +170,8 @@ func ParseStateVersion(ver string) (StateVersion, error) {
166170
return VersionSingleThreaded2, nil
167171
case "multithreaded64":
168172
return VersionMultiThreaded64, nil
173+
case "multithreaded64-2":
174+
return VersionMultiThreaded64_v2, nil
169175
default:
170176
return StateVersion(0), errors.New("unknown state version")
171177
}

Diff for: cannon/mipsevm/versions/state64_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ import (
1515
)
1616

1717
func TestNewFromState(t *testing.T) {
18-
t.Run("multithreaded64", func(t *testing.T) {
18+
t.Run("multithreaded64-2", func(t *testing.T) {
1919
actual, err := NewFromState(multithreaded.CreateEmptyState())
2020
require.NoError(t, err)
2121
require.IsType(t, &multithreaded.State{}, actual.FPVMState)
22-
require.Equal(t, VersionMultiThreaded64, actual.Version)
22+
require.Equal(t, VersionMultiThreaded64_v2, actual.Version)
2323
})
2424
}
2525

2626
func TestLoadStateFromFile(t *testing.T) {
27-
t.Run("Multithreaded64FromBinary", func(t *testing.T) {
27+
t.Run("Multithreaded64_v2_FromBinary", func(t *testing.T) {
2828
expected, err := NewFromState(multithreaded.CreateEmptyState())
2929
require.NoError(t, err)
3030

@@ -40,7 +40,7 @@ func TestVersionsOtherThanZeroDoNotSupportJSON(t *testing.T) {
4040
version StateVersion
4141
createState func() mipsevm.FPVMState
4242
}{
43-
{VersionMultiThreaded64, func() mipsevm.FPVMState { return multithreaded.CreateEmptyState() }},
43+
{VersionMultiThreaded64_v2, func() mipsevm.FPVMState { return multithreaded.CreateEmptyState() }},
4444
}
4545
for _, test := range tests {
4646
test := test

Diff for: cannon/mipsevm/versions/testdata/states/4.bin.gz

44 Bytes
Binary file not shown.

Diff for: op-program/Dockerfile.repro

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ RUN --mount=type=cache,target=/root/.cache/go-build cd op-program && make op-pro
3535
# Run the op-program-client.elf binary directly through cannon's load-elf subcommand.
3636
RUN /app/cannon/bin/cannon load-elf --type singlethreaded-2 --path /app/op-program/bin/op-program-client.elf --out /app/op-program/bin/prestate.bin.gz --meta "/app/op-program/bin/meta.json"
3737
RUN /app/cannon/bin/cannon load-elf --type multithreaded --path /app/op-program/bin/op-program-client.elf --out /app/op-program/bin/prestate-mt.bin.gz --meta "/app/op-program/bin/meta-mt.json"
38-
RUN /app/cannon/bin/cannon load-elf --type multithreaded64 --path /app/op-program/bin/op-program-client64.elf --out /app/op-program/bin/prestate-mt64.bin.gz --meta "/app/op-program/bin/meta-mt64.json"
38+
RUN /app/cannon/bin/cannon load-elf --type multithreaded64-2 --path /app/op-program/bin/op-program-client64.elf --out /app/op-program/bin/prestate-mt64.bin.gz --meta "/app/op-program/bin/meta-mt64.json"
3939

4040
# Generate the prestate proof containing the absolute pre-state hash.
4141
RUN /app/cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input /app/op-program/bin/prestate.bin.gz --meta "" --proof-fmt '/app/op-program/bin/%d.json' --output ""

Diff for: ops/docker/op-stack-go/Dockerfile

+6-2
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,15 @@ ARG TARGETARCH
6363
# The "id" defaults to the value of "target", the cache will thus be reused during this build.
6464
# "sharing" defaults to "shared", the cache will thus be available to other concurrent docker builds.
6565

66-
FROM --platform=$BUILDPLATFORM us-docker.pkg.dev/oplabs-tools-artifacts/images/cannon:v1.0.0 AS cannon-builder-0
66+
FROM --platform=$BUILDPLATFORM us-docker.pkg.dev/oplabs-tools-artifacts/images/cannon:v1.0.0 AS cannon-builder-v1-0-0
67+
FROM --platform=$BUILDPLATFORM us-docker.pkg.dev/oplabs-tools-artifacts/images/cannon:v1.2.0 AS cannon-builder-v1-2-0
6768

6869
FROM --platform=$BUILDPLATFORM builder AS cannon-builder
6970
ARG CANNON_VERSION=v0.0.0
70-
COPY --from=cannon-builder-0 /usr/local/bin/cannon ./cannon/multicannon/embeds/cannon-0
71+
# Copy cannon binaries from previous versions
72+
COPY --from=cannon-builder-v1-0-0 /usr/local/bin/cannon ./cannon/multicannon/embeds/cannon-0
73+
COPY --from=cannon-builder-v1-2-0 /usr/local/bin/cannon-3 ./cannon/multicannon/embeds/cannon-3
74+
# Build current binaries
7175
RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build cd cannon && make cannon \
7276
GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$CANNON_VERSION"
7377

0 commit comments

Comments
 (0)