1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
use super::*;
impl<N: Network> FromBytes for Request<N> {
fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
let version = u16::read_le(&mut reader)?;
if version != 0 {
return Err(error("Invalid verifying key version"));
}
let caller = FromBytes::read_le(&mut reader)?;
let network_id = FromBytes::read_le(&mut reader)?;
let program_id = FromBytes::read_le(&mut reader)?;
let function_name = FromBytes::read_le(&mut reader)?;
let inputs_len = u16::read_le(&mut reader)?;
let input_ids = (0..inputs_len).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
let inputs = (0..inputs_len).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
let signature = FromBytes::read_le(&mut reader)?;
let sk_tag = FromBytes::read_le(&mut reader)?;
let tvk = FromBytes::read_le(&mut reader)?;
let tsk = FromBytes::read_le(&mut reader)?;
let tcm = FromBytes::read_le(&mut reader)?;
Ok(Self::from((
caller,
network_id,
program_id,
function_name,
input_ids,
inputs,
signature,
sk_tag,
tvk,
tsk,
tcm,
)))
}
}
impl<N: Network> ToBytes for Request<N> {
fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
0u16.write_le(&mut writer)?;
self.caller.write_le(&mut writer)?;
self.network_id.write_le(&mut writer)?;
self.program_id.write_le(&mut writer)?;
self.function_name.write_le(&mut writer)?;
if self.input_ids.len() != self.inputs.len() {
return Err(error("Invalid request: mismatching number of input IDs and inputs"));
}
u16::try_from(self.input_ids.len())
.or_halt_with::<N>("Request inputs length exceeds u16")
.write_le(&mut writer)?;
for input_id in &self.input_ids {
input_id.write_le(&mut writer)?;
}
for input in &self.inputs {
input.write_le(&mut writer)?;
}
self.signature.write_le(&mut writer)?;
self.sk_tag.write_le(&mut writer)?;
self.tvk.write_le(&mut writer)?;
self.tsk.write_le(&mut writer)?;
self.tcm.write_le(&mut writer)
}
}
#[cfg(test)]
mod tests {
use super::*;
use snarkvm_console_network::Testnet3;
type CurrentNetwork = Testnet3;
#[test]
fn test_bytes() {
let mut rng = TestRng::default();
for expected in test_helpers::sample_requests(&mut rng).into_iter() {
let expected_bytes = expected.to_bytes_le().unwrap();
assert_eq!(expected, Request::read_le(&expected_bytes[..]).unwrap());
assert!(Request::<CurrentNetwork>::read_le(&expected_bytes[1..]).is_err());
}
}
}