commit 3e8fa15999ccedcb39b96db8984e5b44ffda80cf
parent cd4ca6facbebbd4374d604a146cbdf74fe7d6fc7
Author: triesap <tyson@radroots.org>
Date: Sun, 17 May 2026 18:44:57 +0000
sp1: add order acceptance guest entrypoint
- add the feature-gated SP1 order acceptance guest binary
- commit canonical public values through guest io
- expose canonical public value bytes for guest execution
- cover the guest output boundary with deterministic tests
Diffstat:
3 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/crates/sp1_guest_trade/Cargo.toml b/crates/sp1_guest_trade/Cargo.toml
@@ -10,6 +10,11 @@ description = "Deterministic Radroots trade public-values reducer for SP1 guests
repository.workspace = true
homepage.workspace = true
+[[bin]]
+name = "radroots_sp1_trade_order_acceptance_guest"
+path = "src/bin/order_acceptance_guest.rs"
+required-features = ["sp1_guest"]
+
[features]
default = []
sp1_guest = ["dep:sp1-zkvm"]
diff --git a/crates/sp1_guest_trade/src/bin/order_acceptance_guest.rs b/crates/sp1_guest_trade/src/bin/order_acceptance_guest.rs
@@ -0,0 +1,14 @@
+#![cfg_attr(target_os = "zkvm", no_main)]
+
+use radroots_sp1_guest_trade::{
+ RadrootsSp1TradeOrderAcceptanceWitness, reduce_order_acceptance_canonical_public_values,
+};
+
+sp1_zkvm::entrypoint!(main);
+
+fn main() {
+ let witness = sp1_zkvm::io::read::<RadrootsSp1TradeOrderAcceptanceWitness>();
+ let public_values = reduce_order_acceptance_canonical_public_values(&witness)
+ .expect("valid radroots order acceptance witness");
+ sp1_zkvm::io::commit_slice(&public_values);
+}
diff --git a/crates/sp1_guest_trade/src/lib.rs b/crates/sp1_guest_trade/src/lib.rs
@@ -220,6 +220,12 @@ pub fn canonical_public_values_bytes(
serde_json::to_vec(public_values).map_err(|_| RadrootsSp1TradeGuestError::PublicValuesEncoding)
}
+pub fn reduce_order_acceptance_canonical_public_values(
+ witness: &RadrootsSp1TradeOrderAcceptanceWitness,
+) -> Result<Vec<u8>, RadrootsSp1TradeGuestError> {
+ Ok(reduce_order_acceptance_public_values(witness)?.canonical_public_values)
+}
+
pub fn public_values_hash_hex(
public_values: &RadrootsSp1TradeProofPublicValues,
) -> Result<String, RadrootsSp1TradeGuestError> {
@@ -491,7 +497,7 @@ mod tests {
RadrootsSp1TradeGuestError, RadrootsSp1TradeInventoryBinWitness,
RadrootsSp1TradeOrderAcceptanceWitness, RadrootsSp1TradeProofResult,
RadrootsSp1TradeProofTransitionKind, canonical_public_values_bytes,
- reduce_order_acceptance_public_values,
+ reduce_order_acceptance_canonical_public_values, reduce_order_acceptance_public_values,
};
use radroots_core::{
RadrootsCoreCurrency, RadrootsCoreDecimal, RadrootsCoreMoney, RadrootsCoreUnit,
@@ -634,6 +640,14 @@ mod tests {
}
#[test]
+ fn guest_public_values_output_is_canonical_bytes() {
+ let execution = reduce_order_acceptance_public_values(&witness()).expect("execution");
+ let bytes =
+ reduce_order_acceptance_canonical_public_values(&witness()).expect("guest bytes");
+ assert_eq!(bytes, execution.canonical_public_values);
+ }
+
+ #[test]
fn overcommitted_inventory_is_rejected() {
let mut input = witness();
input.inventory_bins[0].listing_capacity = 2;