jam_pvm_common/
service.rs1use jam_types::{CoreIndex, Hash, ServiceId, Slot, WorkOutput, WorkPackageHash, WorkPayload};
2
3#[macro_export]
8macro_rules! declare_service {
9 ($service_impl: ty) => {
10 #[polkavm_derive::polkavm_export]
11 extern "C" fn refine_ext(ptr: u32, size: u32) -> (u64, u64) {
12 $crate::startup::load_protocol_parameters();
13 let $crate::jam_types::RefineParams {
14 core_index,
15 item_index,
16 service_id,
17 payload,
18 package_hash,
19 } = $crate::mem::decode_buf(ptr, size);
20 let result = <$service_impl as $crate::Service>::refine(
21 core_index,
22 item_index as _,
23 service_id,
24 payload,
25 package_hash,
26 );
27 let result = result.leak();
28 (result.as_ptr() as u64, result.len() as u64)
29 }
30 #[polkavm_derive::polkavm_export]
31 extern "C" fn accumulate_ext(ptr: u32, size: u32) -> (u64, u64) {
32 $crate::startup::load_protocol_parameters();
33 let $crate::jam_types::AccumulateParams { slot, service_id, item_count } =
34 $crate::mem::decode_buf(ptr, size);
35 let maybe_hash =
36 <$service_impl as $crate::Service>::accumulate(slot, service_id, item_count as _);
37 if let Some(hash) = maybe_hash {
38 let hash = ::alloc::boxed::Box::leak(::alloc::boxed::Box::new(hash));
39 (hash.as_ptr() as u64, hash.len() as u64)
40 } else {
41 (0, 0)
42 }
43 }
44 };
45}
46
47pub trait Service {
51 fn refine(
62 core_index: CoreIndex,
63 item_index: usize,
64 service_id: ServiceId,
65 payload: WorkPayload,
66 package_hash: WorkPackageHash,
67 ) -> WorkOutput;
68
69 fn accumulate(slot: Slot, service_id: ServiceId, item_count: usize) -> Option<Hash>;
76}