commit 8dc7308cf5224cbc92db0ed52bd902f0514d0fcc
parent 2b1abc86f020fa1a33656e0a7fd298ad6956f654
Author: triesap <tyson@radroots.org>
Date: Tue, 14 Jul 2026 11:29:25 +0000
runtime: align transport tests with sealed events
- verify runtime signed-event payloads through RadrootsNip01EventWire instead of a private ad hoc wire shape
- update transport-worker and SP1 host tests to use sealed event accessors and constructors
- validates with fmt, full workspace check/test all-features, contract validation, hygiene, and release preflight DTO blocker
Diffstat:
2 files changed, 37 insertions(+), 47 deletions(-)
diff --git a/crates/runtime/src/transport.rs b/crates/runtime/src/transport.rs
@@ -3,7 +3,7 @@ use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
-use radroots_event::draft::RadrootsSignedEvent;
+use radroots_event::{draft::RadrootsSignedEvent, wire::RadrootsNip01EventWire};
#[cfg(feature = "transport-workers")]
use radroots_transport::RadrootsTransportTargetReceipt;
use radroots_transport::{
@@ -60,23 +60,12 @@ pub enum RadrootsRuntimeTransportPayload {
OpaqueBytes { label: String, bytes: Vec<u8> },
}
-#[derive(serde::Deserialize)]
-struct RuntimeSignedEventJsonWire {
- id: String,
- pubkey: String,
- created_at: u32,
- kind: u32,
- tags: Vec<Vec<String>>,
- content: String,
- sig: String,
-}
-
impl RadrootsRuntimeTransportPayload {
pub fn verified_signed_event_json(
event: &RadrootsSignedEvent,
) -> Result<RadrootsTransportPayload, RadrootsTransportError> {
verify_signed_event_raw_json_matches_event(event)?;
- RadrootsTransportPayload::unchecked_signed_event_json(&event.id, &event.raw_json)
+ RadrootsTransportPayload::unchecked_signed_event_json(event.id_str(), event.raw_json())
}
pub fn transport_payload(&self) -> Result<RadrootsTransportPayload, RadrootsTransportError> {
@@ -92,21 +81,14 @@ impl RadrootsRuntimeTransportPayload {
fn verify_signed_event_raw_json_matches_event(
event: &RadrootsSignedEvent,
) -> Result<(), RadrootsTransportError> {
- let wire: RuntimeSignedEventJsonWire = serde_json::from_str(event.raw_json.as_str())
+ let wire = RadrootsNip01EventWire::parse_json(event.raw_json())
.map_err(|_| RadrootsTransportError::InvalidPayloadBytes)?;
- if wire.id != event.id {
+ if wire.id.as_str() != event.id_str() {
return Err(RadrootsTransportError::InvalidPayloadId);
}
- if wire.pubkey != event.pubkey
- || wire.created_at != event.created_at
- || wire.kind != event.kind
- || wire.tags != event.tags
- || wire.content != event.content
- || wire.sig != event.sig
- {
- return Err(RadrootsTransportError::InvalidPayloadBytes);
- }
- Ok(())
+ (wire == *event.wire())
+ .then_some(())
+ .ok_or(RadrootsTransportError::InvalidPayloadBytes)
}
#[derive(Clone, Debug, PartialEq, Eq)]
@@ -595,7 +577,7 @@ impl RadrootsRuntimeInboundObservation {
observed_at_ms: i64,
) -> Self {
Self {
- event_id: event.id.clone(),
+ event_id: event.id_str().to_owned(),
verified: true,
transport_kind,
endpoint_uri: endpoint_uri.into(),
@@ -614,11 +596,11 @@ impl RadrootsRuntimeInboundObservation {
},
);
}
- if self.event_id != event.id {
+ if self.event_id != event.id_str() {
return Err(
RadrootsRuntimeTransportError::InboundObservationEventMismatch {
observation_event_id: self.event_id.clone(),
- signed_event_id: event.id.clone(),
+ signed_event_id: event.id_str().to_owned(),
},
);
}
@@ -666,7 +648,7 @@ mod tests {
RadrootsRuntimeLeaseRecord, record_verified_inbound_observation, recover_expired_leases,
};
#[cfg(feature = "transport-workers")]
- use radroots_event::draft::{RadrootsSignedEvent, RadrootsSignedEventParts};
+ use radroots_event::{draft::RadrootsSignedEvent, wire::RadrootsNip01EventWire};
use radroots_transport::{
RadrootsTransport, RadrootsTransportCapabilities, RadrootsTransportDeliveryReceipt,
RadrootsTransportDeliveryRequest, RadrootsTransportDeliveryTargetStatus,
@@ -800,22 +782,27 @@ mod tests {
#[cfg(feature = "transport-workers")]
fn signed_event() -> RadrootsSignedEvent {
- let id = "d".repeat(64);
let pubkey = "e".repeat(64);
let sig = "f".repeat(128);
- RadrootsSignedEvent::new(RadrootsSignedEventParts {
- id: id.clone(),
+ let mut wire = RadrootsNip01EventWire {
+ id: String::new(),
pubkey: pubkey.clone(),
created_at: 10,
kind: 1,
tags: Vec::new(),
content: "hello".to_owned(),
sig: sig.clone(),
- raw_json: format!(
- "{{\"id\":\"{id}\",\"pubkey\":\"{pubkey}\",\"created_at\":10,\"kind\":1,\"tags\":[],\"content\":\"hello\",\"sig\":\"{sig}\"}}"
- ),
- })
- .expect("signed event")
+ extra: Default::default(),
+ };
+ wire.id = wire
+ .computed_event_id()
+ .expect("computed event id")
+ .into_string();
+ let raw_json = format!(
+ "{{\"id\":\"{id}\",\"pubkey\":\"{pubkey}\",\"created_at\":10,\"kind\":1,\"tags\":[],\"content\":\"hello\",\"sig\":\"{sig}\"}}",
+ id = wire.id.as_str()
+ );
+ RadrootsSignedEvent::from_wire_verified_id(wire, raw_json).expect("signed event")
}
#[cfg(feature = "transport-workers")]
@@ -835,11 +822,11 @@ mod tests {
};
assert_eq!(payload, via_variant);
- assert_eq!(event_id, event.id);
- assert_eq!(raw_json, event.raw_json);
+ assert_eq!(event_id, event.id_str());
+ assert_eq!(raw_json, event.raw_json());
- let mut mismatched = event;
- mismatched.raw_json = "{}".to_owned();
+ let mismatched = RadrootsSignedEvent::from_wire_unchecked(event.wire().clone(), "{}")
+ .expect("mismatched raw event");
assert_eq!(
RadrootsRuntimeTransportPayload::verified_signed_event_json(&mismatched)
.expect_err("mismatched raw json"),
@@ -860,7 +847,7 @@ mod tests {
observation: RadrootsRuntimeInboundObservation,
) -> RadrootsRuntimeTransportFuture<'a, ()> {
Box::pin(async move {
- assert_eq!(event.id, self.expected_event_id);
+ assert_eq!(event.id_str(), self.expected_event_id);
assert_eq!(observation.event_id, self.expected_event_id);
assert!(observation.verified);
Ok(())
@@ -1392,7 +1379,7 @@ mod tests {
async fn inbound_observation_sink_requires_verified_signed_events() {
let event = signed_event();
let sink = RecordingInboundSink {
- expected_event_id: event.id.clone(),
+ expected_event_id: event.id_str().to_owned(),
};
let observation = RadrootsRuntimeInboundObservation::verified_signed_event(
@@ -1406,7 +1393,7 @@ mod tests {
.expect("record observation");
let unverified = RadrootsRuntimeInboundObservation {
- event_id: event.id.clone(),
+ event_id: event.id_str().to_owned(),
verified: false,
transport_kind: RadrootsTransportKind::Nostr,
endpoint_uri: "wss://relay.example".to_owned(),
diff --git a/crates/trade_sp1_host/src/lib.rs b/crates/trade_sp1_host/src/lib.rs
@@ -1753,7 +1753,9 @@ mod tests {
validation_receipt_result_label, verify_order_acceptance_proof_artifact_structure,
};
use base64::Engine;
- use radroots_event::{RadrootsEventEnvelope, kinds::KIND_TRADE_VALIDATION_RECEIPT};
+ use radroots_event::{
+ RadrootsEventEnvelope, RadrootsEventEnvelopeParts, kinds::KIND_TRADE_VALIDATION_RECEIPT,
+ };
use radroots_trade::validation_receipt::{
RadrootsValidationReceiptExpectedBinding, RadrootsValidationReceiptProof,
RadrootsValidationReceiptProofSystem, RadrootsValidationReceiptResult,
@@ -2501,7 +2503,7 @@ mod tests {
);
let parts = validation_receipt_event_build("order-1", &receipt).expect("event parts");
- let event = RadrootsEventEnvelope {
+ let event = RadrootsEventEnvelope::new(RadrootsEventEnvelopeParts {
id: "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd".to_string(),
author: "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
.to_string(),
@@ -2510,7 +2512,8 @@ mod tests {
tags: parts.tags,
content: parts.content,
sig: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff".to_string(),
- };
+ })
+ .expect("validation receipt event");
verify_validation_receipt_event(
&event,
RadrootsValidationReceiptExpectedBinding {