Skip to content

Commit

Permalink
cannon: Introduce a new state version for supporting get_fd.
Browse files Browse the repository at this point in the history
Switches singlethreaded prestate to use .bin.gz instead of json since it now needs to detect the new state version.
  • Loading branch information
ajsutton committed Sep 25, 2024
1 parent bbe3c35 commit 901834c
Show file tree
Hide file tree
Showing 14 changed files with 34 additions and 25 deletions.
4 changes: 2 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1055,7 +1055,7 @@ jobs:
key: cannon-prestate-{{ checksum "./cannon/bin/cannon" }}-{{ checksum "op-program/bin/op-program-client.elf" }}
name: Save Cannon prestate to cache
paths:
- "op-program/bin/prestate.json"
- "op-program/bin/prestate.bin.gz"
- "op-program/bin/meta.json"
- "op-program/bin/prestate-proof.json"
- run:
Expand All @@ -1076,7 +1076,7 @@ jobs:
- persist_to_workspace:
root: .
paths:
- "op-program/bin/prestate.json"
- "op-program/bin/prestate.bin.gz"
- "op-program/bin/meta.json"
- "op-program/bin/prestate-proof.json"

Expand Down
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -134,16 +134,16 @@ reproducible-prestate: ## Builds reproducible-prestate binary
.PHONY: reproducible-prestate

# Include any files required for the devnet to build and run.
DEVNET_CANNON_PRESTATE_FILES := op-program/bin/prestate-proof.json op-program/bin/prestate.json op-program/bin/prestate-proof-mt.json op-program/bin/prestate-mt.bin.gz
DEVNET_CANNON_PRESTATE_FILES := op-program/bin/prestate-proof.json op-program/bin/prestate.bin.gz op-program/bin/prestate-proof-mt.json op-program/bin/prestate-mt.bin.gz


$(DEVNET_CANNON_PRESTATE_FILES):
make cannon-prestate
make cannon-prestate-mt

cannon-prestate: op-program cannon ## Generates prestate using cannon and op-program
./cannon/bin/cannon load-elf --type singlethreaded --path op-program/bin/op-program-client.elf --out op-program/bin/prestate.json --meta op-program/bin/meta.json
./cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input op-program/bin/prestate.json --meta op-program/bin/meta.json --proof-fmt 'op-program/bin/%d.json' --output ""
./cannon/bin/cannon load-elf --type singlethreaded-getfd --path op-program/bin/op-program-client.elf --out op-program/bin/prestate.bin.gz --meta op-program/bin/meta.json
./cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input op-program/bin/prestate.bin.gz --meta op-program/bin/meta.json --proof-fmt 'op-program/bin/%d.json' --output ""
mv op-program/bin/0.json op-program/bin/prestate-proof.json
.PHONY: cannon-prestate

Expand Down
2 changes: 1 addition & 1 deletion cannon/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ cannon-impl:
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/cannon-impl .

cannon-embeds: cannon-impl
@cp bin/cannon-impl ./multicannon/embeds/cannon-0
@cp bin/cannon-impl ./multicannon/embeds/cannon-2
@cp bin/cannon-impl ./multicannon/embeds/cannon-1

cannon: cannon-embeds
Expand Down
2 changes: 1 addition & 1 deletion cannon/cmd/load_elf.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func LoadELF(ctx *cli.Context) error {
return err
}
switch ver {
case versions.VersionSingleThreaded:
case versions.VersionSingleThreadedGetFd:
createInitialState = func(f *elf.File) (mipsevm.FPVMState, error) {
return program.LoadELF(f, singlethreaded.CreateInitialState)
}
Expand Down
2 changes: 1 addition & 1 deletion cannon/mipsevm/versions/detect.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func DetectVersion(path string) (StateVersion, error) {
}

switch ver {
case VersionSingleThreaded, VersionMultiThreaded:
case VersionSingleThreaded, VersionMultiThreaded, VersionSingleThreadedGetFd:
return ver, nil
default:
return 0, fmt.Errorf("%w: %d", ErrUnknownVersion, ver)
Expand Down
11 changes: 8 additions & 3 deletions cannon/mipsevm/versions/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,15 @@ const (
// VersionSingleThreaded is the version of the Cannon STF found in op-contracts/v1.6.0 - https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.6.0/packages/contracts-bedrock/src/cannon/MIPS.sol
VersionSingleThreaded StateVersion = iota
VersionMultiThreaded
VersionSingleThreadedGetFd
)

var (
ErrUnknownVersion = errors.New("unknown version")
ErrJsonNotSupported = errors.New("json not supported")
)

var StateVersionTypes = []StateVersion{VersionSingleThreaded, VersionMultiThreaded}
var StateVersionTypes = []StateVersion{VersionSingleThreaded, VersionMultiThreaded, VersionSingleThreadedGetFd}

func LoadStateFromFile(path string) (*VersionedState, error) {
if !serialize.IsBinaryFile(path) {
Expand All @@ -44,7 +45,7 @@ func NewFromState(state mipsevm.FPVMState) (*VersionedState, error) {
switch state := state.(type) {
case *singlethreaded.State:
return &VersionedState{
Version: VersionSingleThreaded,
Version: VersionSingleThreadedGetFd,
FPVMState: state,
}, nil
case *multithreaded.State:
Expand Down Expand Up @@ -79,7 +80,7 @@ func (s *VersionedState) Deserialize(in io.Reader) error {
}

switch s.Version {
case VersionSingleThreaded:
case VersionSingleThreadedGetFd:
state := &singlethreaded.State{}
if err := state.Deserialize(in); err != nil {
return err
Expand Down Expand Up @@ -113,6 +114,8 @@ func (s StateVersion) String() string {
return "singlethreaded"
case VersionMultiThreaded:
return "multithreaded"
case VersionSingleThreadedGetFd:
return "singlethreaded-getfd"
default:
return "unknown"
}
Expand All @@ -124,6 +127,8 @@ func ParseStateVersion(ver string) (StateVersion, error) {
return VersionSingleThreaded, nil
case "multithreaded":
return VersionMultiThreaded, nil
case "singlethreaded-getfd":
return VersionSingleThreadedGetFd, nil
default:
return StateVersion(0), errors.New("unknown state version")
}
Expand Down
2 changes: 1 addition & 1 deletion cannon/multicannon/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const baseDir = "embeds"

func ExecuteCannon(ctx context.Context, args []string, ver versions.StateVersion) error {
switch ver {
case versions.VersionSingleThreaded, versions.VersionMultiThreaded:
case versions.VersionSingleThreaded, versions.VersionSingleThreadedGetFd, versions.VersionMultiThreaded:
default:
return errors.New("unsupported version")
}
Expand Down
2 changes: 1 addition & 1 deletion op-challenger/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ DISPUTE_GAME_FACTORY=$(jq -r .DisputeGameFactoryProxy .devnet/addresses.json)
--cannon-l2-genesis .devnet/genesis-l2.json \
--cannon-bin ./cannon/bin/cannon \
--cannon-server ./op-program/bin/op-program \
--cannon-prestate ./op-program/bin/prestate.json \
--cannon-prestate ./op-program/bin/prestate.bin.gz \
--l2-eth-rpc http://localhost:9545 \
--mnemonic "test test test test test test test test test test test junk" \
--hd-path "m/44'/60'/0'/0/8" \
Expand Down
2 changes: 1 addition & 1 deletion op-e2e/e2eutils/challenger/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ func applyCannonConfig(c *config.Config, t *testing.T, rollupCfg *rollup.Config,
t.Log("Using MT-Cannon absolute prestate")
c.CannonAbsolutePreState = root + "op-program/bin/prestate-mt.bin.gz"
} else {
c.CannonAbsolutePreState = root + "op-program/bin/prestate.json"
c.CannonAbsolutePreState = root + "op-program/bin/prestate.bin.gz"
}
c.Cannon.SnapshotFreq = 10_000_000

Expand Down
6 changes: 3 additions & 3 deletions op-program/Dockerfile.repro
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@ RUN --mount=type=cache,target=/root/.cache/go-build cd op-program && make op-pro
GOOS=linux GOARCH=mips GOMIPS=softfloat GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_PROGRAM_VERSION"

# Run the op-program-client.elf binary directly through cannon's load-elf subcommand.
RUN /app/cannon/bin/cannon load-elf --type singlethreaded --path /app/op-program/bin/op-program-client.elf --out /app/op-program/bin/prestate.json --meta ""
RUN /app/cannon/bin/cannon load-elf --type singlethreaded-getfd --path /app/op-program/bin/op-program-client.elf --out /app/op-program/bin/prestate.bin.gz --meta ""
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 ""

# Generate the prestate proof containing the absolute pre-state hash.
RUN /app/cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input /app/op-program/bin/prestate.json --meta "" --proof-fmt '/app/op-program/bin/%d.json' --output ""
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 ""
RUN mv /app/op-program/bin/0.json /app/op-program/bin/prestate-proof.json

RUN /app/cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input /app/op-program/bin/prestate-mt.bin.gz --meta "" --proof-fmt '/app/op-program/bin/%d-mt.json' --output ""
Expand All @@ -51,7 +51,7 @@ RUN mv /app/op-program/bin/0-mt.json /app/op-program/bin/prestate-proof-mt.json
FROM scratch AS export-stage
COPY --from=builder /app/op-program/bin/op-program .
COPY --from=builder /app/op-program/bin/op-program-client.elf .
COPY --from=builder /app/op-program/bin/prestate.json .
COPY --from=builder /app/op-program/bin/prestate.bin.gz .
COPY --from=builder /app/op-program/bin/prestate-proof.json .
COPY --from=builder /app/op-program/bin/prestate-mt.bin.gz .
COPY --from=builder /app/op-program/bin/prestate-proof-mt.json .
2 changes: 1 addition & 1 deletion op-program/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ After running `make reproducible-prestate`, the following files can be found in
[./bin/](./bin/):
- [`op-program`](./bin/op-program)
- [`op-program-client.elf`](./bin/op-program-client.elf)
- [`prestate.json`](./bin/prestate.json)
- [`prestate.bin.gz`](./bin/prestate.bin.gz)
- [`prestate-proof.json`](./bin/prestate-proof.json)

The `prestate-proof.json` file is what contains the absolute pre-state hash under
Expand Down
8 changes: 7 additions & 1 deletion op-program/scripts/build-prestates.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,15 @@ do
LOG_FILE="${LOGS_DIR}/build-$(echo "${VERSION}" | cut -c 12-).txt"
echo "Building Version: ${VERSION} Logs: ${LOG_FILE}"
git checkout "${VERSION}" > "${LOG_FILE}" 2>&1
rm -rf "${BIN_DIR}"
make reproducible-prestate >> "${LOG_FILE}" 2>&1
HASH=$(cat "${BIN_DIR}/prestate-proof.json" | jq -r .pre)
cp "${BIN_DIR}/prestate.json" "${STATES_DIR}/${HASH}.json"
if [ -f "${BIN_DIR}/prestate.bin.gz" ]
then
cp "${BIN_DIR}/prestate.bin.gz" "${STATES_DIR}/${HASH}.bin.gz"
else
cp "${BIN_DIR}/prestate.json" "${STATES_DIR}/${HASH}.json"
fi
echo "Built ${VERSION}: ${HASH}"
done

Expand Down
2 changes: 1 addition & 1 deletion ops-bedrock/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ services:
OP_CHALLENGER_CANNON_L2_GENESIS: ./.devnet/genesis-l2.json
OP_CHALLENGER_CANNON_BIN: ./cannon/bin/cannon
OP_CHALLENGER_CANNON_SERVER: /op-program/op-program
OP_CHALLENGER_CANNON_PRESTATE: /op-program/prestate.json
OP_CHALLENGER_CANNON_PRESTATE: /op-program/prestate.bin.gz
OP_CHALLENGER_L2_ETH_RPC: http://l2:8545
OP_CHALLENGER_MNEMONIC: test test test test test test test test test test test junk
OP_CHALLENGER_HD_PATH: "m/44'/60'/0'/0/4"
Expand Down
8 changes: 3 additions & 5 deletions ops/docker/op-stack-go/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,12 @@ ARG TARGETARCH
# "sharing" defaults to "shared", the cache will thus be available to other concurrent docker builds.

# For now fetch the v1 cannon binary from the op-challenger image
#FROM --platform=$BUILDPLATFORM us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.1.0 AS cannon-builder-0
FROM --platform=$BUILDPLATFORM us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.1.0 AS cannon-builder-0

FROM --platform=$BUILDPLATFORM builder AS cannon-builder
# note: bump this CANNON_VERSION when the VM behavior changes
ARG CANNON_VERSION=v1.0.0
# uncomment these lines once there's a new Cannon version available
#COPY --from=cannon-builder-0 /usr/local/bin/cannon ./cannon/multicannon/embeds/cannon-0
#COPY --from=cannon-builder-0 /usr/local/bin/cannon ./cannon/multicannon/embeds/cannon-1
ARG CANNON_VERSION=v2.0.0
COPY --from=cannon-builder-0 /usr/local/bin/cannon ./cannon/multicannon/embeds/cannon-0
RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build cd cannon && make cannon \
GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$CANNON_VERSION"

Expand Down

0 comments on commit 901834c

Please sign in to comment.