1use scale::{Decode, Encode, MaxEncodedLen};
4use scale_info::TypeInfo;
5use serde::{Deserialize, Serialize};
6
7use crate::{
8 crypto::{
9 verify::{verify_app_data, Verifiable},
10 CryptoProvider, Signature,
11 },
12 metrics::MetricsToken,
13 primitives::{Address, WorkerPubkey},
14};
15
16#[derive(
19 Default,
20 Debug,
21 Serialize,
22 Deserialize,
23 Decode,
24 Encode,
25 TypeInfo,
26 MaxEncodedLen,
27 Clone,
28 PartialEq,
29 Eq,
30)]
31pub struct BenchScore {
32 pub gas_per_second: u64,
34 pub gas_consumed: u64,
36 pub timestamp_secs: u64,
38 pub metrics_token: MetricsToken,
40}
41
42#[derive(Decode, Encode, TypeInfo, MaxEncodedLen, Debug, Clone, PartialEq, Eq)]
44pub enum SigningMessage {
45 BenchScore(BenchScore),
47}
48
49#[derive(Decode, Encode, TypeInfo, MaxEncodedLen, Debug, Clone, PartialEq, Eq)]
51pub struct SignedMessage {
52 pub message: SigningMessage,
54 pub signature: Signature,
56 pub worker_pubkey: WorkerPubkey,
58 pub app_address: Address,
60}
61
62impl Verifiable for SignedMessage {
63 fn verify<Crypto: CryptoProvider>(&self) -> bool {
64 let encoded_message = self.message.encode();
65 verify_app_data::<Crypto>(
66 &self.app_address,
67 &encoded_message,
68 &self.signature,
69 &self.worker_pubkey,
70 )
71 }
72}