Commit 07a0d782 authored by clabby's avatar clabby

:broom: `MIPS.sol` switch for VM status

dedup
parent 20d41c4a
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -5,6 +5,7 @@ import ( ...@@ -5,6 +5,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/ethereum-optimism/optimism/cannon/mipsevm"
"github.com/ethereum-optimism/optimism/op-bindings/bindings" "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/game/fault/responder" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/responder"
...@@ -169,12 +170,13 @@ func ValidateAbsolutePrestate(ctx context.Context, trace types.TraceProvider, lo ...@@ -169,12 +170,13 @@ func ValidateAbsolutePrestate(ctx context.Context, trace types.TraceProvider, lo
return fmt.Errorf("failed to get the trace provider's absolute prestate: %w", err) return fmt.Errorf("failed to get the trace provider's absolute prestate: %w", err)
} }
providerPrestateHash := crypto.Keccak256(providerPrestate) providerPrestateHash := crypto.Keccak256(providerPrestate)
providerPrestateHash[0] = mipsevm.VMStatusUnfinished
onchainPrestate, err := loader.FetchAbsolutePrestateHash(ctx) onchainPrestate, err := loader.FetchAbsolutePrestateHash(ctx)
if err != nil { if err != nil {
return fmt.Errorf("failed to get the onchain absolute prestate: %w", err) return fmt.Errorf("failed to get the onchain absolute prestate: %w", err)
} }
if !bytes.Equal(providerPrestateHash, onchainPrestate[:]) { if !bytes.Equal(providerPrestateHash, onchainPrestate[:]) {
return fmt.Errorf("trace provider's absolute prestate does not match onchain absolute prestate") return fmt.Errorf("trace provider's absolute prestate does not match onchain absolute prestate: Provider: %s | Chain %s", common.Bytes2Hex(providerPrestateHash), onchainPrestate.Hex())
} }
return nil return nil
} }
...@@ -6,6 +6,7 @@ import ( ...@@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"testing" "testing"
"github.com/ethereum-optimism/optimism/cannon/mipsevm"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/ethereum-optimism/optimism/op-node/testlog" "github.com/ethereum-optimism/optimism/op-node/testlog"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
...@@ -119,6 +120,7 @@ func TestValidateAbsolutePrestate(t *testing.T) { ...@@ -119,6 +120,7 @@ func TestValidateAbsolutePrestate(t *testing.T) {
t.Run("ValidPrestates", func(t *testing.T) { t.Run("ValidPrestates", func(t *testing.T) {
prestate := []byte{0x00, 0x01, 0x02, 0x03} prestate := []byte{0x00, 0x01, 0x02, 0x03}
prestateHash := crypto.Keccak256(prestate) prestateHash := crypto.Keccak256(prestate)
prestateHash[0] = mipsevm.VMStatusUnfinished
mockTraceProvider := newMockTraceProvider(false, prestate) mockTraceProvider := newMockTraceProvider(false, prestate)
mockLoader := newMockPrestateLoader(false, common.BytesToHash(prestateHash)) mockLoader := newMockPrestateLoader(false, common.BytesToHash(prestateHash))
err := ValidateAbsolutePrestate(context.Background(), mockTraceProvider, mockLoader) err := ValidateAbsolutePrestate(context.Background(), mockTraceProvider, mockLoader)
......
...@@ -6,6 +6,7 @@ import ( ...@@ -6,6 +6,7 @@ import (
"math/big" "math/big"
"strings" "strings"
"github.com/ethereum-optimism/optimism/cannon/mipsevm"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
...@@ -78,7 +79,7 @@ func BuildAlphabetPreimage(i uint64, letter string) []byte { ...@@ -78,7 +79,7 @@ func BuildAlphabetPreimage(i uint64, letter string) []byte {
func alphabetStateHash(state []byte) common.Hash { func alphabetStateHash(state []byte) common.Hash {
h := crypto.Keccak256Hash(state) h := crypto.Keccak256Hash(state)
// In the alphabet game, we ignore the VM status code and always set it to 1. // In the alphabet game, we ignore the VM status code and always set it to 1.
h[0] = 1 h[0] = mipsevm.VMStatusInvalid
return h return h
} }
......
...@@ -110,13 +110,6 @@ type TraceProvider interface { ...@@ -110,13 +110,6 @@ type TraceProvider interface {
StateHash(ctx context.Context, state []byte) (common.Hash, error) StateHash(ctx context.Context, state []byte) (common.Hash, error)
} }
const (
VMStatusValid = 0
VMStatusInvalid = 1
VMStatusPanic = 2
VMStatusUnfinished = 3
)
// ClaimData is the core of a claim. It must be unique inside a specific game. // ClaimData is the core of a claim. It must be unique inside a specific game.
type ClaimData struct { type ClaimData struct {
Value common.Hash Value common.Hash
......
...@@ -298,81 +298,81 @@ LegacyERC20ETH_Test:test_transferFrom_doesNotExist_reverts() (gas: 12957) ...@@ -298,81 +298,81 @@ LegacyERC20ETH_Test:test_transferFrom_doesNotExist_reverts() (gas: 12957)
LegacyERC20ETH_Test:test_transfer_doesNotExist_reverts() (gas: 10755) LegacyERC20ETH_Test:test_transfer_doesNotExist_reverts() (gas: 10755)
LegacyMessagePasser_Test:test_passMessageToL1_succeeds() (gas: 34524) LegacyMessagePasser_Test:test_passMessageToL1_succeeds() (gas: 34524)
LibPosition_Test:test_pos_correctness_succeeds() (gas: 38689) LibPosition_Test:test_pos_correctness_succeeds() (gas: 38689)
MIPS_Test:test_add_succeeds() (gas: 122488) MIPS_Test:test_add_succeeds() (gas: 122424)
MIPS_Test:test_addiSign_succeeds() (gas: 122479) MIPS_Test:test_addiSign_succeeds() (gas: 122415)
MIPS_Test:test_addi_succeeds() (gas: 122676) MIPS_Test:test_addi_succeeds() (gas: 122612)
MIPS_Test:test_addu_succeeds() (gas: 122530) MIPS_Test:test_addu_succeeds() (gas: 122466)
MIPS_Test:test_addui_succeeds() (gas: 122738) MIPS_Test:test_addui_succeeds() (gas: 122674)
MIPS_Test:test_and_succeeds() (gas: 122549) MIPS_Test:test_and_succeeds() (gas: 122485)
MIPS_Test:test_andi_succeeds() (gas: 122482) MIPS_Test:test_andi_succeeds() (gas: 122418)
MIPS_Test:test_beq_succeeds() (gas: 202937) MIPS_Test:test_beq_succeeds() (gas: 202809)
MIPS_Test:test_bgez_succeeds() (gas: 121775) MIPS_Test:test_bgez_succeeds() (gas: 121711)
MIPS_Test:test_bgtz_succeeds() (gas: 121696) MIPS_Test:test_bgtz_succeeds() (gas: 121632)
MIPS_Test:test_blez_succeeds() (gas: 121652) MIPS_Test:test_blez_succeeds() (gas: 121588)
MIPS_Test:test_bltz_succeeds() (gas: 121795) MIPS_Test:test_bltz_succeeds() (gas: 121731)
MIPS_Test:test_bne_succeeds() (gas: 121861) MIPS_Test:test_bne_succeeds() (gas: 121797)
MIPS_Test:test_branch_inDelaySlot_fails() (gas: 85999) MIPS_Test:test_branch_inDelaySlot_fails() (gas: 85999)
MIPS_Test:test_brk_succeeds() (gas: 122160) MIPS_Test:test_brk_succeeds() (gas: 122096)
MIPS_Test:test_clo_succeeds() (gas: 122217) MIPS_Test:test_clo_succeeds() (gas: 122153)
MIPS_Test:test_clone_succeeds() (gas: 122113) MIPS_Test:test_clone_succeeds() (gas: 122049)
MIPS_Test:test_clz_succeeds() (gas: 122688) MIPS_Test:test_clz_succeeds() (gas: 122624)
MIPS_Test:test_div_succeeds() (gas: 122667) MIPS_Test:test_div_succeeds() (gas: 122603)
MIPS_Test:test_divu_succeeds() (gas: 122652) MIPS_Test:test_divu_succeeds() (gas: 122588)
MIPS_Test:test_exit_succeeds() (gas: 122160) MIPS_Test:test_exit_succeeds() (gas: 122096)
MIPS_Test:test_fcntl_succeeds() (gas: 204409) MIPS_Test:test_fcntl_succeeds() (gas: 204281)
MIPS_Test:test_illegal_instruction_fails() (gas: 91462) MIPS_Test:test_illegal_instruction_fails() (gas: 91462)
MIPS_Test:test_invalid_root_fails() (gas: 435636) MIPS_Test:test_invalid_root_fails() (gas: 435636)
MIPS_Test:test_jal_nonzeroRegion_succeeds() (gas: 120805) MIPS_Test:test_jal_nonzeroRegion_succeeds() (gas: 120741)
MIPS_Test:test_jal_succeeds() (gas: 120794) MIPS_Test:test_jal_succeeds() (gas: 120730)
MIPS_Test:test_jalr_succeeds() (gas: 121913) MIPS_Test:test_jalr_succeeds() (gas: 121849)
MIPS_Test:test_jr_succeeds() (gas: 121607) MIPS_Test:test_jr_succeeds() (gas: 121543)
MIPS_Test:test_jump_inDelaySlot_fails() (gas: 85367) MIPS_Test:test_jump_inDelaySlot_fails() (gas: 85367)
MIPS_Test:test_jump_nonzeroRegion_succeeds() (gas: 120549) MIPS_Test:test_jump_nonzeroRegion_succeeds() (gas: 120485)
MIPS_Test:test_jump_succeeds() (gas: 120479) MIPS_Test:test_jump_succeeds() (gas: 120415)
MIPS_Test:test_lb_succeeds() (gas: 127720) MIPS_Test:test_lb_succeeds() (gas: 127656)
MIPS_Test:test_lbu_succeeds() (gas: 127618) MIPS_Test:test_lbu_succeeds() (gas: 127554)
MIPS_Test:test_lh_succeeds() (gas: 127741) MIPS_Test:test_lh_succeeds() (gas: 127677)
MIPS_Test:test_lhu_succeeds() (gas: 127658) MIPS_Test:test_lhu_succeeds() (gas: 127594)
MIPS_Test:test_ll_succeeds() (gas: 127880) MIPS_Test:test_ll_succeeds() (gas: 127816)
MIPS_Test:test_lui_succeeds() (gas: 121761) MIPS_Test:test_lui_succeeds() (gas: 121697)
MIPS_Test:test_lw_succeeds() (gas: 127509) MIPS_Test:test_lw_succeeds() (gas: 127445)
MIPS_Test:test_lwl_succeeds() (gas: 242182) MIPS_Test:test_lwl_succeeds() (gas: 242054)
MIPS_Test:test_lwr_succeeds() (gas: 242470) MIPS_Test:test_lwr_succeeds() (gas: 242342)
MIPS_Test:test_mfhi_succeeds() (gas: 122122) MIPS_Test:test_mfhi_succeeds() (gas: 122058)
MIPS_Test:test_mflo_succeeds() (gas: 122251) MIPS_Test:test_mflo_succeeds() (gas: 122187)
MIPS_Test:test_mmap_succeeds() (gas: 119080) MIPS_Test:test_mmap_succeeds() (gas: 119016)
MIPS_Test:test_movn_succeeds() (gas: 203609) MIPS_Test:test_movn_succeeds() (gas: 203481)
MIPS_Test:test_movz_succeeds() (gas: 203477) MIPS_Test:test_movz_succeeds() (gas: 203349)
MIPS_Test:test_mthi_succeeds() (gas: 122166) MIPS_Test:test_mthi_succeeds() (gas: 122102)
MIPS_Test:test_mtlo_succeeds() (gas: 122274) MIPS_Test:test_mtlo_succeeds() (gas: 122210)
MIPS_Test:test_mul_succeeds() (gas: 121766) MIPS_Test:test_mul_succeeds() (gas: 121702)
MIPS_Test:test_mult_succeeds() (gas: 122470) MIPS_Test:test_mult_succeeds() (gas: 122406)
MIPS_Test:test_multu_succeeds() (gas: 122507) MIPS_Test:test_multu_succeeds() (gas: 122443)
MIPS_Test:test_nor_succeeds() (gas: 122599) MIPS_Test:test_nor_succeeds() (gas: 122535)
MIPS_Test:test_or_succeeds() (gas: 122556) MIPS_Test:test_or_succeeds() (gas: 122492)
MIPS_Test:test_ori_succeeds() (gas: 122559) MIPS_Test:test_ori_succeeds() (gas: 122495)
MIPS_Test:test_preimage_read_succeeds() (gas: 234476) MIPS_Test:test_preimage_read_succeeds() (gas: 234412)
MIPS_Test:test_preimage_write_succeeds() (gas: 127102) MIPS_Test:test_preimage_write_succeeds() (gas: 127038)
MIPS_Test:test_prestate_exited_succeeds() (gas: 113346) MIPS_Test:test_prestate_exited_succeeds() (gas: 113282)
MIPS_Test:test_sb_succeeds() (gas: 160591) MIPS_Test:test_sb_succeeds() (gas: 160527)
MIPS_Test:test_sc_succeeds() (gas: 160785) MIPS_Test:test_sc_succeeds() (gas: 160721)
MIPS_Test:test_sh_succeeds() (gas: 160628) MIPS_Test:test_sh_succeeds() (gas: 160564)
MIPS_Test:test_sll_succeeds() (gas: 121727) MIPS_Test:test_sll_succeeds() (gas: 121663)
MIPS_Test:test_sllv_succeeds() (gas: 121956) MIPS_Test:test_sllv_succeeds() (gas: 121892)
MIPS_Test:test_slt_succeeds() (gas: 204804) MIPS_Test:test_slt_succeeds() (gas: 204676)
MIPS_Test:test_sltu_succeeds() (gas: 122773) MIPS_Test:test_sltu_succeeds() (gas: 122709)
MIPS_Test:test_sra_succeeds() (gas: 121978) MIPS_Test:test_sra_succeeds() (gas: 121914)
MIPS_Test:test_srav_succeeds() (gas: 122246) MIPS_Test:test_srav_succeeds() (gas: 122182)
MIPS_Test:test_srl_succeeds() (gas: 121809) MIPS_Test:test_srl_succeeds() (gas: 121745)
MIPS_Test:test_srlv_succeeds() (gas: 121974) MIPS_Test:test_srlv_succeeds() (gas: 121910)
MIPS_Test:test_step_abi_succeeds() (gas: 58481) MIPS_Test:test_step_abi_succeeds() (gas: 58417)
MIPS_Test:test_sub_succeeds() (gas: 122583) MIPS_Test:test_sub_succeeds() (gas: 122519)
MIPS_Test:test_subu_succeeds() (gas: 122580) MIPS_Test:test_subu_succeeds() (gas: 122516)
MIPS_Test:test_sw_succeeds() (gas: 160603) MIPS_Test:test_sw_succeeds() (gas: 160539)
MIPS_Test:test_swl_succeeds() (gas: 160664) MIPS_Test:test_swl_succeeds() (gas: 160600)
MIPS_Test:test_swr_succeeds() (gas: 160739) MIPS_Test:test_swr_succeeds() (gas: 160675)
MIPS_Test:test_xor_succeeds() (gas: 122584) MIPS_Test:test_xor_succeeds() (gas: 122520)
MIPS_Test:test_xori_succeeds() (gas: 122636) MIPS_Test:test_xori_succeeds() (gas: 122572)
MerkleTrie_get_Test:test_get_corruptedProof_reverts() (gas: 5733) MerkleTrie_get_Test:test_get_corruptedProof_reverts() (gas: 5733)
MerkleTrie_get_Test:test_get_extraProofElements_reverts() (gas: 58889) MerkleTrie_get_Test:test_get_extraProofElements_reverts() (gas: 58889)
MerkleTrie_get_Test:test_get_invalidDataRemainder_reverts() (gas: 35845) MerkleTrie_get_Test:test_get_invalidDataRemainder_reverts() (gas: 35845)
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
"src/L2/L2StandardBridge.sol": "0xe025dcccbf21d48828ecf588941c9ba04c91b87bdd177a653d3f1b265b0b02a8", "src/L2/L2StandardBridge.sol": "0xe025dcccbf21d48828ecf588941c9ba04c91b87bdd177a653d3f1b265b0b02a8",
"src/L2/L2ToL1MessagePasser.sol": "0xda56ba2e5b2c28fa8ca2df24077d49e96155a00ecc99cd0778d681be6ed166fe", "src/L2/L2ToL1MessagePasser.sol": "0xda56ba2e5b2c28fa8ca2df24077d49e96155a00ecc99cd0778d681be6ed166fe",
"src/L2/SequencerFeeVault.sol": "0x37816035c992d38cf7e3d5a1846b02d017dd7bdca46abe6e5c5171b9ee6225ab", "src/L2/SequencerFeeVault.sol": "0x37816035c992d38cf7e3d5a1846b02d017dd7bdca46abe6e5c5171b9ee6225ab",
"src/dispute/FaultDisputeGame.sol": "0x1ee46e383f6017c8a381c54ff26958659d54995c97144879586a0d827f4a82c8", "src/dispute/FaultDisputeGame.sol": "0xf990d243b117e7ba7e765e1aee433adcd01cf20dcc7088065691b09ae204ae47",
"src/legacy/DeployerWhitelist.sol": "0xf2129ec3da75307ba8e21bc943c332bb04704642e6e263149b5c8ee92dbcb7a8", "src/legacy/DeployerWhitelist.sol": "0xf2129ec3da75307ba8e21bc943c332bb04704642e6e263149b5c8ee92dbcb7a8",
"src/legacy/L1BlockNumber.sol": "0x30aae1fc85103476af0226b6e98c71c01feebbdc35d93401390b1ad438a37be6", "src/legacy/L1BlockNumber.sol": "0x30aae1fc85103476af0226b6e98c71c01feebbdc35d93401390b1ad438a37be6",
"src/legacy/LegacyMessagePasser.sol": "0x5c08b0a663cc49d30e4e38540f6aefab19ef287c3ecd31c8d8c3decd5f5bd497", "src/legacy/LegacyMessagePasser.sol": "0x5c08b0a663cc49d30e4e38540f6aefab19ef287c3ecd31c8d8c3decd5f5bd497",
......
...@@ -119,23 +119,22 @@ contract MIPS { ...@@ -119,23 +119,22 @@ contract MIPS {
// Log the resulting MIPS state, for debugging // Log the resulting MIPS state, for debugging
log0(start, sub(to, start)) log0(start, sub(to, start))
function vmStatus(_exited, _exitCode) -> status_ { // Determine the VM status
switch _exited let status := 0
case 1 { switch exited
switch _exitCode case 1 {
// VMStatusValid switch exitCode
case 0 { status_ := 0 } // VMStatusValid
// VMStatusInvalid case 0 { status := 0 }
case 1 { status_ := 1 } // VMStatusInvalid
// VMStatusPanic case 1 { status := 1 }
default { status_ := 2 } // VMStatusPanic
} default { status := 2 }
// VMStatusUnfinished
default { status_ := 3 }
} }
let status := vmStatus(exited, exitCode) // VMStatusUnfinished
default { status := 3 }
// Compute the hash of the resulting MIPS state // Compute the hash of the resulting MIPS state and set the status byte
out_ := keccak256(start, sub(to, start)) out_ := keccak256(start, sub(to, start))
out_ := or(and(not(shl(248, 0xFF)), out_), shl(248, status)) out_ := or(and(not(shl(248, 0xFF)), out_), shl(248, status))
} }
......
...@@ -85,7 +85,7 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, Semver { ...@@ -85,7 +85,7 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, Semver {
/// @param _blockOracle The block oracle, used for loading block hashes further back /// @param _blockOracle The block oracle, used for loading block hashes further back
/// than the `BLOCKHASH` opcode allows as well as their estimated /// than the `BLOCKHASH` opcode allows as well as their estimated
/// timestamps. /// timestamps.
/// @custom:semver 0.0.8 /// @custom:semver 0.0.9
constructor( constructor(
GameType _gameType, GameType _gameType,
Claim _absolutePrestate, Claim _absolutePrestate,
...@@ -95,7 +95,7 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, Semver { ...@@ -95,7 +95,7 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, Semver {
L2OutputOracle _l2oo, L2OutputOracle _l2oo,
BlockOracle _blockOracle BlockOracle _blockOracle
) )
Semver(0, 0, 8) Semver(0, 0, 9)
{ {
GAME_TYPE = _gameType; GAME_TYPE = _gameType;
ABSOLUTE_PRESTATE = _absolutePrestate; ABSOLUTE_PRESTATE = _absolutePrestate;
...@@ -150,7 +150,7 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, Semver { ...@@ -150,7 +150,7 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, Semver {
// INVARIANT: The prestate is always invalid if the passed `_stateData` is not the // INVARIANT: The prestate is always invalid if the passed `_stateData` is not the
// preimage of the prestate claim hash. // preimage of the prestate claim hash.
// We ignore the highest order byte of the digest because it is used to // We ignore the highest order byte of the digest because it is used to
// indicate the VM Status. // indicate the VM Status and is added after the digest is computed.
if (cleanHighByte(keccak256(_stateData)) != cleanHighByte(Claim.unwrap(preStateClaim))) { if (cleanHighByte(keccak256(_stateData)) != cleanHighByte(Claim.unwrap(preStateClaim))) {
revert InvalidPrestate(); revert InvalidPrestate();
} }
......
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