Commit bb2c99c8 authored by John Chase's avatar John Chase Committed by GitHub

MTCannon: improve consistency & add EmptyThreadStack test (#12389)

* Add EmptyThreadStacks test

* add go evm check

* improve consistency and update test

* delete emptyThreadedProofGenerator

* forge lint update

* fix solidity versioning and hash & add proof variations in test
parent 5c1e1983
...@@ -1193,6 +1193,39 @@ func TestEVM_UnsupportedSyscall(t *testing.T) { ...@@ -1193,6 +1193,39 @@ func TestEVM_UnsupportedSyscall(t *testing.T) {
} }
} }
func TestEVM_EmptyThreadStacks(t *testing.T) {
t.Parallel()
var tracer *tracing.Hooks
cases := []struct {
name string
otherStackSize int
traverseRight bool
}{
{name: "Traverse right with empty stacks", otherStackSize: 0, traverseRight: true},
{name: "Traverse left with empty stacks", otherStackSize: 0, traverseRight: false},
{name: "Traverse right with one non-empty stack on the other side", otherStackSize: 1, traverseRight: true},
{name: "Traverse left with one non-empty stack on the other side", otherStackSize: 1, traverseRight: false},
}
// Generate proof variations
proofVariations := GenerateEmptyThreadProofVariations(t)
for i, c := range cases {
for _, proofCase := range proofVariations {
testName := fmt.Sprintf("%v (proofCase=%v)", c.name, proofCase.Name)
t.Run(testName, func(t *testing.T) {
goVm, state, contracts := setup(t, i*123, nil)
mttestutil.SetupThreads(int64(i*123), state, c.traverseRight, 0, c.otherStackSize)
require.PanicsWithValue(t, "Active thread stack is empty", func() { _, _ = goVm.Step(false) })
errorMessage := "MIPS2: active thread stack is empty"
testutil.AssertEVMReverts(t, state, contracts, tracer, proofCase.Proof, errorMessage)
})
}
}
}
func TestEVM_NormalTraversalStep_HandleWaitingThread(t *testing.T) { func TestEVM_NormalTraversalStep_HandleWaitingThread(t *testing.T) {
var tracer *tracing.Hooks var tracer *tracing.Hooks
cases := []struct { cases := []struct {
......
...@@ -129,3 +129,20 @@ func GetMipsVersionTestCases(t require.TestingT) []VersionedVMTestCase { ...@@ -129,3 +129,20 @@ func GetMipsVersionTestCases(t require.TestingT) []VersionedVMTestCase {
} }
} }
} }
type threadProofTestcase struct {
Name string
Proof []byte
}
func GenerateEmptyThreadProofVariations(t require.TestingT) []threadProofTestcase {
defaultThreadProof := multiThreadedProofGenerator(t, multithreaded.CreateEmptyState())
zeroBytesThreadProof := make([]byte, multithreaded.THREAD_WITNESS_SIZE)
copy(zeroBytesThreadProof[multithreaded.SERIALIZED_THREAD_SIZE:], defaultThreadProof[multithreaded.SERIALIZED_THREAD_SIZE:])
nilBytesThreadProof := defaultThreadProof[multithreaded.SERIALIZED_THREAD_SIZE:]
return []threadProofTestcase{
{Name: "default thread proof", Proof: defaultThreadProof},
{Name: "zeroed thread bytes proof", Proof: zeroBytesThreadProof},
{Name: "nil thread bytes proof", Proof: nilBytesThreadProof},
}
}
...@@ -136,8 +136,8 @@ ...@@ -136,8 +136,8 @@
"sourceCodeHash": "0xaf7416f27db1b393092f51d290a29293184105bc5f0d89cd6048f687cebc7d69" "sourceCodeHash": "0xaf7416f27db1b393092f51d290a29293184105bc5f0d89cd6048f687cebc7d69"
}, },
"src/cannon/MIPS2.sol": { "src/cannon/MIPS2.sol": {
"initCodeHash": "0xbb203b0d83efddfa0f664dbc63ec55844318b48fe8133758307f64e87c892a47", "initCodeHash": "0x9ba94a69090a8c89786cdb2a5980deba4b5b16bbf5909f8275e090dbcd65e5c3",
"sourceCodeHash": "0x16614cc0e6abf7e81e1e5dc2c0773ee7101cb38af40e0907a8800ca7eddd3b5a" "sourceCodeHash": "0x3859b4bf63f485800b0eb6ffb83a79c8d134f7e4cbbe93fbc72cc2ccd4f91b82"
}, },
"src/cannon/PreimageOracle.sol": { "src/cannon/PreimageOracle.sol": {
"initCodeHash": "0x64ea814bf9769257c91da57928675d3f8462374b0c23bdf860ccfc79f41f7801", "initCodeHash": "0x64ea814bf9769257c91da57928675d3f8462374b0c23bdf860ccfc79f41f7801",
......
...@@ -57,8 +57,8 @@ contract MIPS2 is ISemver { ...@@ -57,8 +57,8 @@ contract MIPS2 is ISemver {
} }
/// @notice The semantic version of the MIPS2 contract. /// @notice The semantic version of the MIPS2 contract.
/// @custom:semver 1.0.0-beta.14 /// @custom:semver 1.0.0-beta.15
string public constant version = "1.0.0-beta.14"; string public constant version = "1.0.0-beta.15";
/// @notice The preimage oracle contract. /// @notice The preimage oracle contract.
IPreimageOracle internal immutable ORACLE; IPreimageOracle internal immutable ORACLE;
...@@ -162,8 +162,11 @@ contract MIPS2 is ISemver { ...@@ -162,8 +162,11 @@ contract MIPS2 is ISemver {
return outputState(); return outputState();
} }
if (state.leftThreadStack == EMPTY_THREAD_ROOT && state.rightThreadStack == EMPTY_THREAD_ROOT) { if (
revert("MIPS2: illegal vm state"); (state.leftThreadStack == EMPTY_THREAD_ROOT && !state.traverseRight)
|| (state.rightThreadStack == EMPTY_THREAD_ROOT && state.traverseRight)
) {
revert("MIPS2: active thread stack is empty");
} }
state.step += 1; state.step += 1;
......
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