Commit 57c833ae authored by Inphi's avatar Inphi Committed by GitHub

cannon: Revert to original state JSON schema (#10948)

* cannon: Revert to original state JSON schema

* fix test_data state.json
parent 6062bc14
...@@ -2,6 +2,7 @@ package mipsevm ...@@ -2,6 +2,7 @@ package mipsevm
import ( import (
"encoding/binary" "encoding/binary"
"encoding/json"
"fmt" "fmt"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
...@@ -47,6 +48,62 @@ type State struct { ...@@ -47,6 +48,62 @@ type State struct {
LastHint hexutil.Bytes `json:"lastHint,omitempty"` LastHint hexutil.Bytes `json:"lastHint,omitempty"`
} }
type stateMarshaling struct {
Memory *Memory `json:"memory"`
PreimageKey common.Hash `json:"preimageKey"`
PreimageOffset uint32 `json:"preimageOffset"`
PC uint32 `json:"pc"`
NextPC uint32 `json:"nextPC"`
LO uint32 `json:"lo"`
HI uint32 `json:"hi"`
Heap uint32 `json:"heap"`
ExitCode uint8 `json:"exit"`
Exited bool `json:"exited"`
Step uint64 `json:"step"`
Registers [32]uint32 `json:"registers"`
LastHint hexutil.Bytes `json:"lastHint,omitempty"`
}
func (s *State) MarshalJSON() ([]byte, error) { // nosemgrep
sm := &stateMarshaling{
Memory: s.Memory,
PreimageKey: s.PreimageKey,
PreimageOffset: s.PreimageOffset,
PC: s.Cpu.PC,
NextPC: s.Cpu.NextPC,
LO: s.Cpu.LO,
HI: s.Cpu.HI,
Heap: s.Heap,
ExitCode: s.ExitCode,
Exited: s.Exited,
Step: s.Step,
Registers: s.Registers,
LastHint: s.LastHint,
}
return json.Marshal(sm)
}
func (s *State) UnmarshalJSON(data []byte) error {
sm := new(stateMarshaling)
if err := json.Unmarshal(data, sm); err != nil {
return err
}
s.Memory = sm.Memory
s.PreimageKey = sm.PreimageKey
s.PreimageOffset = sm.PreimageOffset
s.Cpu.PC = sm.PC
s.Cpu.NextPC = sm.NextPC
s.Cpu.LO = sm.LO
s.Cpu.HI = sm.HI
s.Heap = sm.Heap
s.ExitCode = sm.ExitCode
s.Exited = sm.Exited
s.Step = sm.Step
s.Registers = sm.Registers
s.LastHint = sm.LastHint
return nil
}
func (s *State) GetStep() uint64 { return s.Step } func (s *State) GetStep() uint64 { return s.Step }
func (s *State) VMStatus() uint8 { func (s *State) VMStatus() uint8 {
......
...@@ -301,3 +301,26 @@ func selectOracleFixture(t *testing.T, programName string) PreimageOracle { ...@@ -301,3 +301,26 @@ func selectOracleFixture(t *testing.T, programName string) PreimageOracle {
return nil return nil
} }
} }
func TestStateJSONCodec(t *testing.T) {
elfProgram, err := elf.Open("../example/bin/hello.elf")
require.NoError(t, err, "open ELF file")
state, err := LoadELF(elfProgram)
require.NoError(t, err, "load ELF into state")
stateJSON, err := state.MarshalJSON()
require.NoError(t, err)
newState := new(State)
require.NoError(t, newState.UnmarshalJSON(stateJSON))
require.Equal(t, state.PreimageKey, newState.PreimageKey)
require.Equal(t, state.PreimageOffset, newState.PreimageOffset)
require.Equal(t, state.Cpu, newState.Cpu)
require.Equal(t, state.Heap, newState.Heap)
require.Equal(t, state.ExitCode, newState.ExitCode)
require.Equal(t, state.Exited, newState.Exited)
require.Equal(t, state.Memory.MerkleRoot(), newState.Memory.MerkleRoot())
require.Equal(t, state.Registers, newState.Registers)
require.Equal(t, state.Step, newState.Step)
}
...@@ -2,12 +2,10 @@ ...@@ -2,12 +2,10 @@
"memory": [], "memory": [],
"preimageKey": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "preimageKey": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"preimageOffset": 0, "preimageOffset": 0,
"cpu": { "pc": 0,
"pc": 0, "nextPC": 1,
"nextPC": 1, "lo": 0,
"lo": 0, "hi": 0,
"hi": 0
},
"heap": 0, "heap": 0,
"exit": 0, "exit": 0,
"exited": false, "exited": false,
......
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