Skip to content

Commit 70d4c7b

Browse files
feat: use dataset address for improved error handling
1 parent c05a9a3 commit 70d4c7b

File tree

6 files changed

+133
-74
lines changed

6 files changed

+133
-74
lines changed

pre-compute/src/api/worker_api.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -154,12 +154,12 @@ mod tests {
154154
r#"{"cause":"PRE_COMPUTE_WORKER_ADDRESS_MISSING","message":"Worker address related environment variable is missing"}"#,
155155
),
156156
(
157-
ReplicateStatusCause::PreComputeDatasetUrlMissing(2),
158-
r#"{"cause":"PRE_COMPUTE_DATASET_URL_MISSING","message":"Dataset URL related environment variable is missing for dataset 2"}"#,
157+
ReplicateStatusCause::PreComputeDatasetUrlMissing("0xDataset2".to_string()),
158+
r#"{"cause":"PRE_COMPUTE_DATASET_URL_MISSING","message":"Dataset URL related environment variable is missing for dataset 0xDataset2"}"#,
159159
),
160160
(
161-
ReplicateStatusCause::PreComputeInvalidDatasetChecksum(1),
162-
r#"{"cause":"PRE_COMPUTE_INVALID_DATASET_CHECKSUM","message":"Invalid dataset checksum for dataset 1"}"#,
161+
ReplicateStatusCause::PreComputeInvalidDatasetChecksum("0xDataset1".to_string()),
162+
r#"{"cause":"PRE_COMPUTE_INVALID_DATASET_CHECKSUM","message":"Invalid dataset checksum for dataset 0xDataset1"}"#,
163163
),
164164
];
165165

@@ -172,12 +172,12 @@ mod tests {
172172
#[test]
173173
fn serialize_vec_of_causes_succeeds_when_multiple_causes() {
174174
let causes = vec![
175-
ReplicateStatusCause::PreComputeDatasetUrlMissing(0),
176-
ReplicateStatusCause::PreComputeInvalidDatasetChecksum(1),
175+
ReplicateStatusCause::PreComputeDatasetUrlMissing("0xDatasetA".to_string()),
176+
ReplicateStatusCause::PreComputeInvalidDatasetChecksum("0xDatasetB".to_string()),
177177
];
178178

179179
let serialized = to_string(&causes).expect("Failed to serialize");
180-
let expected = r#"[{"cause":"PRE_COMPUTE_DATASET_URL_MISSING","message":"Dataset URL related environment variable is missing for dataset 0"},{"cause":"PRE_COMPUTE_INVALID_DATASET_CHECKSUM","message":"Invalid dataset checksum for dataset 1"}]"#;
180+
let expected = r#"[{"cause":"PRE_COMPUTE_DATASET_URL_MISSING","message":"Dataset URL related environment variable is missing for dataset 0xDatasetA"},{"cause":"PRE_COMPUTE_INVALID_DATASET_CHECKSUM","message":"Invalid dataset checksum for dataset 0xDatasetB"}]"#;
181181
assert_eq!(serialized, expected);
182182
}
183183
// endregion

pre-compute/src/compute/dataset.rs

Lines changed: 46 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,23 @@ const AES_IV_LENGTH: usize = 16;
2727
#[cfg_attr(test, derive(Debug))]
2828
#[derive(Clone, Default)]
2929
pub struct Dataset {
30+
pub address: String,
3031
pub url: String,
3132
pub checksum: String,
3233
pub filename: String,
3334
pub key: String,
3435
}
3536

3637
impl Dataset {
37-
pub fn new(url: String, checksum: String, filename: String, key: String) -> Self {
38+
pub fn new(
39+
address: String,
40+
url: String,
41+
checksum: String,
42+
filename: String,
43+
key: String,
44+
) -> Self {
3845
Dataset {
46+
address,
3947
url,
4048
checksum,
4149
filename,
@@ -48,7 +56,6 @@ impl Dataset {
4856
/// # Arguments
4957
///
5058
/// * `chain_task_id` - The chain task ID for logging
51-
/// * `index` - The dataset index for error reporting
5259
///
5360
/// # Returns
5461
///
@@ -58,7 +65,6 @@ impl Dataset {
5865
pub fn download_encrypted_dataset(
5966
&self,
6067
chain_task_id: &str,
61-
index: usize,
6268
) -> Result<Vec<u8>, ReplicateStatusCause> {
6369
info!(
6470
"Downloading encrypted dataset file [chainTaskId:{chain_task_id}, url:{}]",
@@ -81,7 +87,9 @@ impl Dataset {
8187
} else {
8288
download_from_url(&self.url)
8389
}
84-
.ok_or(ReplicateStatusCause::PreComputeDatasetDownloadFailed(index))?;
90+
.ok_or(ReplicateStatusCause::PreComputeDatasetDownloadFailed(
91+
self.address.clone(),
92+
))?;
8593

8694
info!("Checking encrypted dataset checksum [chainTaskId:{chain_task_id}]");
8795
let actual_checksum = sha256_from_bytes(&encrypted_content);
@@ -92,7 +100,7 @@ impl Dataset {
92100
self.checksum
93101
);
94102
return Err(ReplicateStatusCause::PreComputeInvalidDatasetChecksum(
95-
index,
103+
self.address.clone(),
96104
));
97105
}
98106

@@ -108,7 +116,6 @@ impl Dataset {
108116
/// # Arguments
109117
///
110118
/// * `encrypted_content` - Full encrypted dataset, including the IV prefix.
111-
/// * `index` - The dataset index for error reporting
112119
///
113120
/// # Returns
114121
///
@@ -117,15 +124,14 @@ impl Dataset {
117124
pub fn decrypt_dataset(
118125
&self,
119126
encrypted_content: &[u8],
120-
index: usize,
121127
) -> Result<Vec<u8>, ReplicateStatusCause> {
122-
let key = general_purpose::STANDARD
123-
.decode(&self.key)
124-
.map_err(|_| ReplicateStatusCause::PreComputeDatasetDecryptionFailed(index))?;
128+
let key = general_purpose::STANDARD.decode(&self.key).map_err(|_| {
129+
ReplicateStatusCause::PreComputeDatasetDecryptionFailed(self.address.clone())
130+
})?;
125131

126132
if encrypted_content.len() < AES_IV_LENGTH || key.len() != AES_KEY_LENGTH {
127133
return Err(ReplicateStatusCause::PreComputeDatasetDecryptionFailed(
128-
index,
134+
self.address.clone(),
129135
));
130136
}
131137

@@ -135,7 +141,9 @@ impl Dataset {
135141

136142
Aes256CbcDec::new(key_slice.into(), iv_slice.into())
137143
.decrypt_padded_vec_mut::<Pkcs7>(ciphertext)
138-
.map_err(|_| ReplicateStatusCause::PreComputeDatasetDecryptionFailed(index))
144+
.map_err(|_| {
145+
ReplicateStatusCause::PreComputeDatasetDecryptionFailed(self.address.clone())
146+
})
139147
}
140148
}
141149

@@ -157,6 +165,7 @@ mod tests {
157165

158166
fn get_test_dataset() -> Dataset {
159167
Dataset::new(
168+
"0xDatasetAddress".to_string(),
160169
HTTP_DATASET_URL.to_string(),
161170
DATASET_CHECKSUM.to_string(),
162171
PLAIN_DATA_FILE.to_string(),
@@ -168,18 +177,21 @@ mod tests {
168177
#[test]
169178
fn download_encrypted_dataset_success() {
170179
let dataset = get_test_dataset();
171-
let actual_content = dataset.download_encrypted_dataset(CHAIN_TASK_ID, 0);
180+
let actual_content = dataset.download_encrypted_dataset(CHAIN_TASK_ID);
172181
assert!(actual_content.is_ok());
173182
}
174183

175184
#[test]
176185
fn download_encrypted_dataset_failure_with_invalid_dataset_url() {
177186
let mut dataset = get_test_dataset();
178187
dataset.url = "http://bad-url".to_string();
179-
let actual_content = dataset.download_encrypted_dataset(CHAIN_TASK_ID, 10);
188+
dataset.address = "0xbaddataset".to_string();
189+
let actual_content = dataset.download_encrypted_dataset(CHAIN_TASK_ID);
180190
assert_eq!(
181191
actual_content,
182-
Err(ReplicateStatusCause::PreComputeDatasetDownloadFailed(10))
192+
Err(ReplicateStatusCause::PreComputeDatasetDownloadFailed(
193+
"0xbaddataset".to_string()
194+
))
183195
);
184196
}
185197

@@ -189,7 +201,7 @@ mod tests {
189201
dataset.url = IPFS_DATASET_URL.to_string();
190202
dataset.checksum =
191203
"0x323b1637c7999942fbebfe5d42fe15dbfe93737577663afa0181938d7ad4a2ac".to_string();
192-
let actual_content = dataset.download_encrypted_dataset(CHAIN_TASK_ID, 0);
204+
let actual_content = dataset.download_encrypted_dataset(CHAIN_TASK_ID);
193205
let expected_content = Ok("hello world !\n".as_bytes().to_vec());
194206
assert_eq!(actual_content, expected_content);
195207
}
@@ -198,17 +210,23 @@ mod tests {
198210
fn download_encrypted_dataset_failure_with_invalid_gateway() {
199211
let mut dataset = get_test_dataset();
200212
dataset.url = "/ipfs/INVALID_IPFS_DATASET_URL".to_string();
201-
let actual_content = dataset.download_encrypted_dataset(CHAIN_TASK_ID, 1);
202-
let expected_content = Err(ReplicateStatusCause::PreComputeDatasetDownloadFailed(1));
213+
dataset.address = "0xinvalidgateway".to_string();
214+
let actual_content = dataset.download_encrypted_dataset(CHAIN_TASK_ID);
215+
let expected_content = Err(ReplicateStatusCause::PreComputeDatasetDownloadFailed(
216+
"0xinvalidgateway".to_string(),
217+
));
203218
assert_eq!(actual_content, expected_content);
204219
}
205220

206221
#[test]
207222
fn download_encrypted_dataset_failure_with_invalid_dataset_checksum() {
208223
let mut dataset = get_test_dataset();
209224
dataset.checksum = "invalid_dataset_checksum".to_string();
210-
let actual_content = dataset.download_encrypted_dataset(CHAIN_TASK_ID, 9999);
211-
let expected_content = Err(ReplicateStatusCause::PreComputeInvalidDatasetChecksum(9999));
225+
dataset.address = "0xinvalidchecksum".to_string();
226+
let actual_content = dataset.download_encrypted_dataset(CHAIN_TASK_ID);
227+
let expected_content = Err(ReplicateStatusCause::PreComputeInvalidDatasetChecksum(
228+
"0xinvalidchecksum".to_string(),
229+
));
212230
assert_eq!(actual_content, expected_content);
213231
}
214232
// endregion
@@ -218,11 +236,9 @@ mod tests {
218236
fn decrypt_dataset_success_with_valid_dataset() {
219237
let dataset = get_test_dataset();
220238

221-
let encrypted_data = dataset
222-
.download_encrypted_dataset(CHAIN_TASK_ID, 3)
223-
.unwrap();
239+
let encrypted_data = dataset.download_encrypted_dataset(CHAIN_TASK_ID).unwrap();
224240
let expected_plain_data = Ok("Some very useful data.".as_bytes().to_vec());
225-
let actual_plain_data = dataset.decrypt_dataset(&encrypted_data, 3);
241+
let actual_plain_data = dataset.decrypt_dataset(&encrypted_data);
226242

227243
assert_eq!(actual_plain_data, expected_plain_data);
228244
}
@@ -231,14 +247,15 @@ mod tests {
231247
fn decrypt_dataset_failure_with_bad_key() {
232248
let mut dataset = get_test_dataset();
233249
dataset.key = "bad_key".to_string();
234-
let encrypted_data = dataset
235-
.download_encrypted_dataset(CHAIN_TASK_ID, 55)
236-
.unwrap();
237-
let actual_plain_data = dataset.decrypt_dataset(&encrypted_data, 55);
250+
dataset.address = "0xbadkey".to_string();
251+
let encrypted_data = dataset.download_encrypted_dataset(CHAIN_TASK_ID).unwrap();
252+
let actual_plain_data = dataset.decrypt_dataset(&encrypted_data);
238253

239254
assert_eq!(
240255
actual_plain_data,
241-
Err(ReplicateStatusCause::PreComputeDatasetDecryptionFailed(55))
256+
Err(ReplicateStatusCause::PreComputeDatasetDecryptionFailed(
257+
"0xbadkey".to_string()
258+
))
242259
);
243260
}
244261
// endregion

pre-compute/src/compute/errors.rs

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@ pub enum ReplicateStatusCause {
1010
#[error("input file URL {0} is missing")]
1111
PreComputeAtLeastOneInputFileUrlMissing(usize),
1212
#[error("Dataset checksum related environment variable is missing for dataset {0}")]
13-
PreComputeDatasetChecksumMissing(usize),
13+
PreComputeDatasetChecksumMissing(String),
1414
#[error("Failed to decrypt dataset {0}")]
15-
PreComputeDatasetDecryptionFailed(usize),
15+
PreComputeDatasetDecryptionFailed(String),
1616
#[error("Failed to download encrypted dataset file for dataset {0}")]
17-
PreComputeDatasetDownloadFailed(usize),
17+
PreComputeDatasetDownloadFailed(String),
1818
#[error("Dataset filename related environment variable is missing for dataset {0}")]
19-
PreComputeDatasetFilenameMissing(usize),
19+
PreComputeDatasetFilenameMissing(String),
2020
#[error("Dataset key related environment variable is missing for dataset {0}")]
21-
PreComputeDatasetKeyMissing(usize),
21+
PreComputeDatasetKeyMissing(String),
2222
#[error("Dataset URL related environment variable is missing for dataset {0}")]
23-
PreComputeDatasetUrlMissing(usize),
23+
PreComputeDatasetUrlMissing(String),
2424
#[error("Unexpected error occurred")]
2525
PreComputeFailedUnknownIssue,
2626
#[error("Invalid TEE signature")]
@@ -32,7 +32,7 @@ pub enum ReplicateStatusCause {
3232
#[error("Input files number related environment variable is missing")]
3333
PreComputeInputFilesNumberMissing,
3434
#[error("Invalid dataset checksum for dataset {0}")]
35-
PreComputeInvalidDatasetChecksum(usize),
35+
PreComputeInvalidDatasetChecksum(String),
3636
#[error("Output folder related environment variable is missing")]
3737
PreComputeOutputFolderNotFound,
3838
#[error("Output path related environment variable is missing")]
@@ -64,13 +64,15 @@ mod tests {
6464
use super::*;
6565
use serde_json::to_string;
6666

67+
const DATASET_ADDRESS: &str = "0xDatasetAddress";
68+
6769
#[test]
6870
fn serialize_produces_correct_json_when_error_has_dataset_index() {
69-
let cause = ReplicateStatusCause::PreComputeDatasetUrlMissing(2);
71+
let cause = ReplicateStatusCause::PreComputeDatasetUrlMissing(DATASET_ADDRESS.to_string());
7072
let serialized = to_string(&cause).unwrap();
7173
assert_eq!(
7274
serialized,
73-
r#"{"cause":"PRE_COMPUTE_DATASET_URL_MISSING","message":"Dataset URL related environment variable is missing for dataset 2"}"#
75+
r#"{"cause":"PRE_COMPUTE_DATASET_URL_MISSING","message":"Dataset URL related environment variable is missing for dataset 0xDatasetAddress"}"#
7476
);
7577
}
7678

@@ -92,20 +94,22 @@ mod tests {
9294
r#"{"cause":"PRE_COMPUTE_AT_LEAST_ONE_INPUT_FILE_URL_MISSING","message":"input file URL 1 is missing"}"#,
9395
),
9496
(
95-
ReplicateStatusCause::PreComputeDatasetChecksumMissing(3),
96-
r#"{"cause":"PRE_COMPUTE_DATASET_CHECKSUM_MISSING","message":"Dataset checksum related environment variable is missing for dataset 3"}"#,
97+
ReplicateStatusCause::PreComputeDatasetChecksumMissing(DATASET_ADDRESS.to_string()),
98+
r#"{"cause":"PRE_COMPUTE_DATASET_CHECKSUM_MISSING","message":"Dataset checksum related environment variable is missing for dataset 0xDatasetAddress"}"#,
9799
),
98100
(
99-
ReplicateStatusCause::PreComputeDatasetDecryptionFailed(0),
100-
r#"{"cause":"PRE_COMPUTE_DATASET_DECRYPTION_FAILED","message":"Failed to decrypt dataset 0"}"#,
101+
ReplicateStatusCause::PreComputeDatasetDecryptionFailed(
102+
DATASET_ADDRESS.to_string(),
103+
),
104+
r#"{"cause":"PRE_COMPUTE_DATASET_DECRYPTION_FAILED","message":"Failed to decrypt dataset 0xDatasetAddress"}"#,
101105
),
102106
(
103-
ReplicateStatusCause::PreComputeDatasetDownloadFailed(5),
104-
r#"{"cause":"PRE_COMPUTE_DATASET_DOWNLOAD_FAILED","message":"Failed to download encrypted dataset file for dataset 5"}"#,
107+
ReplicateStatusCause::PreComputeDatasetDownloadFailed(DATASET_ADDRESS.to_string()),
108+
r#"{"cause":"PRE_COMPUTE_DATASET_DOWNLOAD_FAILED","message":"Failed to download encrypted dataset file for dataset 0xDatasetAddress"}"#,
105109
),
106110
(
107-
ReplicateStatusCause::PreComputeInvalidDatasetChecksum(2),
108-
r#"{"cause":"PRE_COMPUTE_INVALID_DATASET_CHECKSUM","message":"Invalid dataset checksum for dataset 2"}"#,
111+
ReplicateStatusCause::PreComputeInvalidDatasetChecksum(DATASET_ADDRESS.to_string()),
112+
r#"{"cause":"PRE_COMPUTE_INVALID_DATASET_CHECKSUM","message":"Invalid dataset checksum for dataset 0xDatasetAddress"}"#,
109113
),
110114
];
111115

@@ -118,12 +122,12 @@ mod tests {
118122
#[test]
119123
fn serialize_produces_correct_json_when_vector_of_multiple_errors() {
120124
let causes = vec![
121-
ReplicateStatusCause::PreComputeDatasetUrlMissing(5),
122-
ReplicateStatusCause::PreComputeInvalidDatasetChecksum(99),
125+
ReplicateStatusCause::PreComputeDatasetUrlMissing(DATASET_ADDRESS.to_string()),
126+
ReplicateStatusCause::PreComputeInvalidDatasetChecksum("0xAnotherDataset".to_string()),
123127
];
124128

125129
let serialized = to_string(&causes).unwrap();
126-
let expected = r#"[{"cause":"PRE_COMPUTE_DATASET_URL_MISSING","message":"Dataset URL related environment variable is missing for dataset 5"},{"cause":"PRE_COMPUTE_INVALID_DATASET_CHECKSUM","message":"Invalid dataset checksum for dataset 99"}]"#;
130+
let expected = r#"[{"cause":"PRE_COMPUTE_DATASET_URL_MISSING","message":"Dataset URL related environment variable is missing for dataset 0xDatasetAddress"},{"cause":"PRE_COMPUTE_INVALID_DATASET_CHECKSUM","message":"Invalid dataset checksum for dataset 0xAnotherDataset"}]"#;
127131
assert_eq!(serialized, expected);
128132
}
129133
}

pre-compute/src/compute/pre_compute_app.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,9 @@ impl PreComputeAppTrait for PreComputeApp {
5959
// TODO: Collect all errors instead of propagating immediately, and return the list of errors
6060
self.pre_compute_args = PreComputeArgs::read_args()?;
6161
self.check_output_folder()?;
62-
for (index, dataset) in self.pre_compute_args.datasets.iter().enumerate() {
63-
let encrypted_content =
64-
dataset.download_encrypted_dataset(&self.chain_task_id, index)?;
65-
let plain_content = dataset.decrypt_dataset(&encrypted_content, index)?;
62+
for dataset in self.pre_compute_args.datasets.iter() {
63+
let encrypted_content = dataset.download_encrypted_dataset(&self.chain_task_id)?;
64+
let plain_content = dataset.decrypt_dataset(&encrypted_content)?;
6665
self.save_plain_dataset_file(&plain_content, &dataset.filename)?;
6766
}
6867
self.download_input_files()?;
@@ -190,6 +189,7 @@ mod tests {
190189
is_dataset_required: true,
191190
iexec_bulk_slice_size: 0,
192191
datasets: vec![Dataset {
192+
address: "0xDatasetAddress".to_string(),
193193
url: HTTP_DATASET_URL.to_string(),
194194
checksum: DATASET_CHECKSUM.to_string(),
195195
filename: PLAIN_DATA_FILE.to_string(),

0 commit comments

Comments
 (0)