sp1_sdk/network/tee/
api.rs1use crate::{
2 network::{signer::NetworkSigner, utils::sign_raw},
3 SP1Stdin,
4};
5use alloy_primitives::{Address, Signature as AlloySignature};
6use serde::{Deserialize, Serialize};
7
8use k256::ecdsa::Signature;
9
10#[derive(Debug, Serialize, Deserialize)]
12pub struct TEERequest {
13 pub id: [u8; 32],
15 pub program: Vec<u8>,
17 pub cycle_limit: u64,
19 pub stdin: SP1Stdin,
21 pub signature: AlloySignature,
23}
24
25impl TEERequest {
26 pub(crate) async fn new(
28 signer: &NetworkSigner,
29 id: [u8; 32],
30 program: Vec<u8>,
31 stdin: SP1Stdin,
32 cycle_limit: u64,
33 ) -> Result<Self, anyhow::Error> {
34 let signature = sign_raw(&id, signer).await?;
35
36 Ok(Self { id, program, cycle_limit, stdin, signature })
37 }
38}
39
40#[derive(Clone, Debug, Serialize, Deserialize)]
42pub struct TEEResponse {
43 pub vkey: [u8; 32],
45 pub public_values: Vec<u8>,
47 pub signature: Signature,
50 pub recovery_id: u8,
52}
53
54impl TEEResponse {
55 #[must_use]
57 pub fn as_prefix_bytes(&self) -> Vec<u8> {
58 let mut bytes = Vec::new();
59
60 let version_bytes = super::SP1_TEE_VERSION.to_le_bytes();
62
63 let version_bytes_len: u8 = version_bytes.len().try_into().unwrap();
65
66 bytes.extend_from_slice(&Self::selector());
68 bytes.extend_from_slice(&self.recovery_id.to_be_bytes());
70 bytes.extend_from_slice(&self.signature.to_bytes());
72 bytes.push(version_bytes_len);
74 bytes.extend_from_slice(&version_bytes);
76
77 bytes
78 }
79
80 fn selector() -> [u8; 4] {
82 alloy_primitives::keccak256("SP1TeeVerifier")[0..4].try_into().unwrap()
83 }
84}
85
86#[derive(Debug, Serialize, Deserialize)]
88pub struct GetAddressResponse {
89 pub address: Address,
91}
92
93#[derive(Debug, Serialize, Deserialize)]
97pub enum EventPayload {
98 Success(TEEResponse),
100 Error(String),
102}