Skip to content

Commit

Permalink
refactor: move machine hash logic to osp
Browse files Browse the repository at this point in the history
  • Loading branch information
gzeoneth committed Apr 24, 2024
1 parent 6c4da9d commit 8c22b28
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 50 deletions.
45 changes: 0 additions & 45 deletions src/challenge/ChallengeLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -48,51 +48,6 @@ library ChallengeLib {
return challenge.timeUsedSinceLastMove() > challenge.current.timeLeft;
}

function getStartMachineHash(bytes32 globalStateHash, bytes32 wasmModuleRoot)
internal
pure
returns (bytes32)
{
// Start the value stack with the function call ABI for the entrypoint
Value[] memory startingValues = new Value[](3);
startingValues[0] = ValueLib.newRefNull();
startingValues[1] = ValueLib.newI32(0);
startingValues[2] = ValueLib.newI32(0);
ValueArray memory valuesArray = ValueArray({inner: startingValues});
ValueStack memory values = ValueStack({proved: valuesArray, remainingHash: 0});
ValueStack memory internalStack;
StackFrameWindow memory frameStack;

Machine memory mach = Machine({
status: MachineStatus.RUNNING,
valueStack: values,
internalStack: internalStack,
frameStack: frameStack,
globalStateHash: globalStateHash,
moduleIdx: 0,
functionIdx: 0,
functionPc: 0,
modulesRoot: wasmModuleRoot
});
return mach.hash();
}

function getEndMachineHash(MachineStatus status, bytes32 globalStateHash)
internal
pure
returns (bytes32)
{
if (status == MachineStatus.FINISHED) {
return keccak256(abi.encodePacked("Machine finished:", globalStateHash));
} else if (status == MachineStatus.ERRORED) {
return keccak256(abi.encodePacked("Machine errored:"));
} else if (status == MachineStatus.TOO_FAR) {
return keccak256(abi.encodePacked("Machine too far:"));
} else {
revert("BAD_BLOCK_STATUS");
}
}

function extractChallengeSegment(SegmentSelection calldata selection)
internal
pure
Expand Down
7 changes: 2 additions & 5 deletions src/challenge/ChallengeManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -233,11 +233,8 @@ contract ChallengeManager is DelegateCallAware, IChallengeManager {
}

bytes32[] memory segments = new bytes32[](2);
segments[0] = ChallengeLib.getStartMachineHash(
globalStateHashes[0],
challenge.wasmModuleRoot
);
segments[1] = ChallengeLib.getEndMachineHash(machineStatuses[1], globalStateHashes[1]);
segments[0] = osp.getStartMachineHash(globalStateHashes[0], challenge.wasmModuleRoot);
segments[1] = osp.getEndMachineHash(machineStatuses[1], globalStateHashes[1]);

challenge.mode = ChallengeLib.ChallengeMode.EXECUTION;

Expand Down
10 changes: 10 additions & 0 deletions src/osp/IOneStepProofEntry.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ library OneStepProofEntryLib {
}

interface IOneStepProofEntry {
function getStartMachineHash(bytes32 globalStateHash, bytes32 wasmModuleRoot)
external
pure
returns (bytes32);

function getEndMachineHash(MachineStatus status, bytes32 globalStateHash)
external
pure
returns (bytes32);

function proveOneStep(
ExecutionContext calldata execCtx,
uint256 machineStep,
Expand Down
47 changes: 47 additions & 0 deletions src/osp/OneStepProofEntry.sol
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,53 @@ contract OneStepProofEntry is IOneStepProofEntry {
proverHostIo = proverHostIo_;
}

// Copied from ChallengeLib.sol
function getStartMachineHash(bytes32 globalStateHash, bytes32 wasmModuleRoot)
external
pure
returns (bytes32)
{
// Start the value stack with the function call ABI for the entrypoint
Value[] memory startingValues = new Value[](3);
startingValues[0] = ValueLib.newRefNull();
startingValues[1] = ValueLib.newI32(0);
startingValues[2] = ValueLib.newI32(0);
ValueArray memory valuesArray = ValueArray({inner: startingValues});
ValueStack memory values = ValueStack({proved: valuesArray, remainingHash: 0});
ValueStack memory internalStack;
StackFrameWindow memory frameStack;

Machine memory mach = Machine({
status: MachineStatus.RUNNING,
valueStack: values,
internalStack: internalStack,
frameStack: frameStack,
globalStateHash: globalStateHash,
moduleIdx: 0,
functionIdx: 0,
functionPc: 0,
modulesRoot: wasmModuleRoot
});
return mach.hash();
}

// Copied from ChallengeLib.sol
function getEndMachineHash(MachineStatus status, bytes32 globalStateHash)
external
pure
returns (bytes32)
{
if (status == MachineStatus.FINISHED) {
return keccak256(abi.encodePacked("Machine finished:", globalStateHash));
} else if (status == MachineStatus.ERRORED) {
return keccak256(abi.encodePacked("Machine errored:"));
} else if (status == MachineStatus.TOO_FAR) {
return keccak256(abi.encodePacked("Machine too far:"));
} else {
revert("BAD_BLOCK_STATUS");
}
}

function proveOneStep(
ExecutionContext calldata execCtx,
uint256 machineStep,
Expand Down

0 comments on commit 8c22b28

Please sign in to comment.