Skip to content

Commit 6ff55c6

Browse files
author
Julian Ventura
committed
Add risc0 ffi panic catch
1 parent 9843472 commit 6ff55c6

File tree

4 files changed

+63
-14
lines changed

4 files changed

+63
-14
lines changed

operator/pkg/operator.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,8 +479,9 @@ func (o *Operator) verify(verificationData VerificationData, results chan bool)
479479
o.handleVerificationResult(results, verificationResult, err, "SP1 proof verification")
480480

481481
case common.Risc0:
482-
verificationResult := risc_zero.VerifyRiscZeroReceipt(verificationData.Proof,
482+
verificationResult, err := risc_zero.VerifyRiscZeroReceipt(verificationData.Proof,
483483
verificationData.VmProgramCode, verificationData.PubInput)
484+
o.handleVerificationResult(results, verificationResult, err, "RiscZero proof verification")
484485

485486
o.Logger.Infof("Risc0 proof verification result: %t", verificationResult)
486487
results <- verificationResult

operator/risc_zero/lib/risc_zero.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
#include <stdbool.h>
22
#include <stdint.h>
33

4-
bool verify_risc_zero_receipt_ffi(unsigned char *inner_receipt_bytes, uint32_t inner_receipt_len, unsigned char *image_id, uint32_t image_id_len, unsigned char *public_input, uint32_t public_input_len);
4+
int32_t verify_risc_zero_receipt_ffi(unsigned char *inner_receipt_bytes, uint32_t inner_receipt_len, unsigned char *image_id, uint32_t image_id_len, unsigned char *public_input, uint32_t public_input_len);

operator/risc_zero/lib/src/lib.rs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use log::error;
22
use risc0_zkvm::{InnerReceipt, Receipt};
33

44
#[no_mangle]
5-
pub extern "C" fn verify_risc_zero_receipt_ffi(
5+
extern "C" fn inner_verify_risc_zero_receipt_ffi(
66
inner_receipt_bytes: *const u8,
77
inner_receipt_len: u32,
88
image_id: *const u8,
@@ -43,6 +43,32 @@ pub extern "C" fn verify_risc_zero_receipt_ffi(
4343
false
4444
}
4545

46+
#[no_mangle]
47+
pub extern "C" fn verify_risc_zero_receipt_ffi(
48+
inner_receipt_bytes: *const u8,
49+
inner_receipt_len: u32,
50+
image_id: *const u8,
51+
image_id_len: u32,
52+
public_input: *const u8,
53+
public_input_len: u32,
54+
) -> i32 {
55+
let result = std::panic::catch_unwind(|| {
56+
inner_verify_risc_zero_receipt_ffi(
57+
inner_receipt_bytes,
58+
inner_receipt_len,
59+
image_id,
60+
image_id_len,
61+
public_input,
62+
public_input_len,
63+
)
64+
});
65+
66+
match result {
67+
Ok(v) => v as i32,
68+
Err(_) => -1,
69+
}
70+
}
71+
4672
#[cfg(test)]
4773
mod tests {
4874
use super::*;
@@ -69,7 +95,7 @@ mod tests {
6995
public_input,
7096
PUBLIC_INPUT.len() as u32,
7197
);
72-
assert!(result)
98+
assert_eq!(result, 1)
7399
}
74100

75101
#[test]
@@ -86,7 +112,7 @@ mod tests {
86112
public_input,
87113
PUBLIC_INPUT.len() as u32,
88114
);
89-
assert!(!result)
115+
assert_eq!(result, 0)
90116
}
91117

92118
#[test]
@@ -103,6 +129,6 @@ mod tests {
103129
public_input,
104130
0,
105131
);
106-
assert!(!result)
132+
assert_eq!(result, 0)
107133
}
108134
}

operator/risc_zero/risc_zero.go

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,44 @@ package risc_zero
77
#include "lib/risc_zero.h"
88
*/
99
import "C"
10-
import (
11-
"unsafe"
12-
)
10+
import "unsafe"
11+
import "fmt"
12+
13+
func VerifyRiscZeroReceipt(innerReceiptBuffer []byte, imageIdBuffer []byte, publicInputBuffer []byte) (isVerified bool, err error) {
14+
// Here we define the return value on failure
15+
isVerified = false
16+
err = nil
1317

14-
func VerifyRiscZeroReceipt(innerReceiptBuffer []byte, imageIdBuffer []byte, publicInputBuffer []byte) bool {
1518
if len(innerReceiptBuffer) == 0 || len(imageIdBuffer) == 0 {
16-
return false
19+
return isVerified, err
1720
}
1821

22+
// This will catch any go panic
23+
defer func() {
24+
rec := recover()
25+
if rec != nil {
26+
err = fmt.Errorf("Panic was caught while verifying risc0 proof: %s", rec)
27+
}
28+
}()
29+
1930
receiptPtr := (*C.uchar)(unsafe.Pointer(&innerReceiptBuffer[0]))
2031
imageIdPtr := (*C.uchar)(unsafe.Pointer(&imageIdBuffer[0]))
2132

33+
r := (C.int32_t)(0)
34+
2235
if len(publicInputBuffer) == 0 { // allow empty public input
23-
return (bool)(C.verify_risc_zero_receipt_ffi(receiptPtr, (C.uint32_t)(len(innerReceiptBuffer)), imageIdPtr, (C.uint32_t)(len(imageIdBuffer)), nil, (C.uint32_t)(0)))
36+
r = (C.int32_t)(C.verify_risc_zero_receipt_ffi(receiptPtr, (C.uint32_t)(len(innerReceiptBuffer)), imageIdPtr, (C.uint32_t)(len(imageIdBuffer)), nil, (C.uint32_t)(0)))
37+
} else {
38+
publicInputPtr := (*C.uchar)(unsafe.Pointer(&publicInputBuffer[0]))
39+
r = (C.int32_t)(C.verify_risc_zero_receipt_ffi(receiptPtr, (C.uint32_t)(len(innerReceiptBuffer)), imageIdPtr, (C.uint32_t)(len(imageIdBuffer)), publicInputPtr, (C.uint32_t)(len(publicInputBuffer))))
2440
}
2541

26-
publicInputPtr := (*C.uchar)(unsafe.Pointer(&publicInputBuffer[0]))
27-
return (bool)(C.verify_risc_zero_receipt_ffi(receiptPtr, (C.uint32_t)(len(innerReceiptBuffer)), imageIdPtr, (C.uint32_t)(len(imageIdBuffer)), publicInputPtr, (C.uint32_t)(len(publicInputBuffer))))
42+
if r == -1 {
43+
err = fmt.Errorf("Panic happened on FFI while verifying risc0 proof")
44+
return isVerified, err
45+
}
46+
47+
isVerified = (r == 1)
48+
49+
return isVerified, err
2850
}

0 commit comments

Comments
 (0)