diff --git a/crates/go-runtime/zkvm_runtime/runtime.go b/crates/go-runtime/zkvm_runtime/runtime.go index 875f9f06..94f089e7 100644 --- a/crates/go-runtime/zkvm_runtime/runtime.go +++ b/crates/go-runtime/zkvm_runtime/runtime.go @@ -17,6 +17,7 @@ func SyscallHintRead(ptr []byte, len int) func SyscallCommit(index int, word uint32) func SyscallExit(code int) func SyscallKeccakSponge(input unsafe.Pointer, result unsafe.Pointer) +func SyscallVerifyZkmProof(vkDigest *[8]uint32, pvDigest *[32]byte) var PublicValuesHasher hash.Hash = sha256.New() @@ -127,6 +128,13 @@ func Keccak256(data []byte) [32]byte { return result } +// VerifyZkmProof verifies a ZK proof using the VERIFY_ZKM_PROOF syscall +// vkDigest: 8 uint32 values representing the verification key digest +// pvDigest: 32-byte SHA256 hash of the public values +func VerifyZkmProof(vkDigest [8]uint32, pvDigest [32]byte) { + SyscallVerifyZkmProof(&vkDigest, &pvDigest) +} + func init() { // Explicit reference, prevent optimization _ = reflect.ValueOf(RuntimeExit) diff --git a/crates/go-runtime/zkvm_runtime/syscall_mipsle.s b/crates/go-runtime/zkvm_runtime/syscall_mipsle.s index f106c148..02d86c6f 100644 --- a/crates/go-runtime/zkvm_runtime/syscall_mipsle.s +++ b/crates/go-runtime/zkvm_runtime/syscall_mipsle.s @@ -42,3 +42,10 @@ TEXT ·SyscallKeccakSponge(SB), $0-8 MOVW result+4(FP), R5 // a1 = result pointer SYSCALL RET + +TEXT ·SyscallVerifyZkmProof(SB), $0-8 + MOVW $0x1B, R2 // v0 = VERIFY_ZKM_PROOF syscall (0x00_00_00_1B) + MOVW vkDigest+0(FP), R4 // a0 = vkDigest pointer (pointer to [8]uint32) + MOVW pvDigest+4(FP), R5 // a1 = pvDigest pointer (pointer to [32]byte) + SYSCALL + RET