Skip to content

Commit e78c314

Browse files
authored
Validate and Access all Parentchain Events in Enclave (#1272)
* Initial addition of retrieving event proof from parent-chain * Adding in events retrieval * removing old comments * Passing in events and proofs per block to enclave * refactoring a bit * Fixing compiler errors * slight refactor plus comment * Clippy and fmt * Addressing clippy concerns * Taplo * unpack events * validated events * adding in NodeMetaData extrinsic success and failed requests * Refactor and implement groundwork * passing events to correct place * Adding in infra for events * importing api client types and decoding events to log per block * refactoring for passing events to triggered dispatcher * Renaming module refactoring for triggered dispatcher refactor * adding in queue methods for events queue * cargo fmt * fixing bug with chris on generic type * Debugging decoding issue * Was using storage key call incorrectly... * small refactoring * cargo fmt and taplo fmt * adding in filtering of events for extrinsics * cargo fmt * taplo and cargo fmt in enclave * refactoring for clippy * cargo fmt * changing log back * minor comment removal * refactoring to include new traits for testing * cargo fmt * refactoring for addressing comments * cargo fmt * clippy satisfaction * cargo fmt * fix for top pool tests * cargo fmt * refactor for comments * making clippy happy * adding back pallet system * addressing comments * refactor for comments * adding some space * add debug trait for logging * cargo fmt * addressing comments * trace logs * name changes * couple log changes * indentation fix
1 parent ee0e1b3 commit e78c314

File tree

39 files changed

+592
-275
lines changed

39 files changed

+592
-275
lines changed

Cargo.lock

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2770,6 +2770,7 @@ dependencies = [
27702770
"itc-rest-client",
27712771
"itc-rpc-client",
27722772
"itc-rpc-server",
2773+
"itp-api-client-types",
27732774
"itp-enclave-api",
27742775
"itp-enclave-metrics",
27752776
"itp-node-api",
@@ -3034,7 +3035,7 @@ name = "itc-parentchain-block-import-dispatcher"
30343035
version = "0.9.0"
30353036
dependencies = [
30363037
"itc-parentchain-block-importer",
3037-
"itp-block-import-queue",
3038+
"itp-import-queue",
30383039
"itp-types",
30393040
"log 0.4.17",
30403041
"sgx_tstd",
@@ -3075,6 +3076,7 @@ dependencies = [
30753076
"futures 0.3.8",
30763077
"ita-stf",
30773078
"itc-parentchain-test",
3079+
"itp-api-client-types",
30783080
"itp-node-api",
30793081
"itp-ocall-api",
30803082
"itp-sgx-crypto",
@@ -3325,16 +3327,6 @@ dependencies = [
33253327
"yasna 0.3.1",
33263328
]
33273329

3328-
[[package]]
3329-
name = "itp-block-import-queue"
3330-
version = "0.8.0"
3331-
dependencies = [
3332-
"sgx_tstd",
3333-
"sgx_types",
3334-
"thiserror 1.0.40",
3335-
"thiserror 1.0.9",
3336-
]
3337-
33383330
[[package]]
33393331
name = "itp-component-container"
33403332
version = "0.8.0"
@@ -3408,6 +3400,16 @@ dependencies = [
34083400
"sp-core",
34093401
]
34103402

3403+
[[package]]
3404+
name = "itp-import-queue"
3405+
version = "0.8.0"
3406+
dependencies = [
3407+
"sgx_tstd",
3408+
"sgx_types",
3409+
"thiserror 1.0.40",
3410+
"thiserror 1.0.9",
3411+
]
3412+
34113413
[[package]]
34123414
name = "itp-networking-utils"
34133415
version = "0.9.0"
@@ -3895,8 +3897,8 @@ dependencies = [
38953897
"fork-tree",
38963898
"itc-parentchain-light-client",
38973899
"itc-parentchain-test",
3898-
"itp-block-import-queue",
38993900
"itp-extrinsics-factory",
3901+
"itp-import-queue",
39003902
"itp-node-api-metadata",
39013903
"itp-node-api-metadata-provider",
39023904
"itp-ocall-api",

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ members = [
1717
"core/rpc-server",
1818
"core/tls-websocket-server",
1919
"core-primitives/attestation-handler",
20-
"core-primitives/block-import-queue",
20+
"core-primitives/import-queue",
2121
"core-primitives/component-container",
2222
"core-primitives/enclave-api",
2323
"core-primitives/enclave-api/ffi",

core-primitives/block-import-queue/Cargo.toml renamed to core-primitives/import-queue/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[package]
2-
name = "itp-block-import-queue"
2+
name = "itp-import-queue"
33
version = "0.8.0"
44
authors = ["Integritee AG <[email protected]>"]
55
edition = "2021"

core-primitives/block-import-queue/src/block_import_queue.rs renamed to core-primitives/import-queue/src/import_queue.rs

Lines changed: 56 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
1616
*/
1717

18-
//! Block import queue implementation
18+
//! Import queue implementation
1919
2020
#[cfg(feature = "sgx")]
2121
use std::sync::SgxRwLock as RwLock;
@@ -25,64 +25,64 @@ use std::sync::RwLock;
2525

2626
use crate::{
2727
error::{Error, Result},
28-
PeekBlockQueue, PopFromBlockQueue, PushToBlockQueue,
28+
PeekQueue, PopFromQueue, PushToQueue,
2929
};
3030
use std::{collections::VecDeque, vec::Vec};
3131

32-
/// Block import queue.
32+
/// Any import queue.
3333
///
3434
/// Uses RwLock internally to guard against concurrent access and ensure all operations are atomic.
35-
pub struct BlockImportQueue<SignedBlock> {
36-
queue: RwLock<VecDeque<SignedBlock>>,
35+
pub struct ImportQueue<Item> {
36+
queue: RwLock<VecDeque<Item>>,
3737
}
3838

39-
impl<SignedBlock> BlockImportQueue<SignedBlock> {
39+
impl<Item> ImportQueue<Item> {
4040
pub fn is_empty(&self) -> Result<bool> {
4141
let queue_lock = self.queue.read().map_err(|_| Error::PoisonedLock)?;
4242
Ok(queue_lock.is_empty())
4343
}
4444
}
4545

46-
impl<SignedBlock> Default for BlockImportQueue<SignedBlock> {
46+
impl<Item> Default for ImportQueue<Item> {
4747
fn default() -> Self {
48-
BlockImportQueue { queue: Default::default() }
48+
ImportQueue { queue: Default::default() }
4949
}
5050
}
5151

52-
impl<SignedBlock> PushToBlockQueue<SignedBlock> for BlockImportQueue<SignedBlock> {
53-
fn push_multiple(&self, blocks: Vec<SignedBlock>) -> Result<()> {
52+
impl<Item> PushToQueue<Item> for ImportQueue<Item> {
53+
fn push_multiple(&self, items: Vec<Item>) -> Result<()> {
5454
let mut queue_lock = self.queue.write().map_err(|_| Error::PoisonedLock)?;
55-
queue_lock.extend(blocks);
55+
queue_lock.extend(items);
5656
Ok(())
5757
}
5858

59-
fn push_single(&self, block: SignedBlock) -> Result<()> {
59+
fn push_single(&self, item: Item) -> Result<()> {
6060
let mut queue_lock = self.queue.write().map_err(|_| Error::PoisonedLock)?;
61-
queue_lock.push_back(block);
61+
queue_lock.push_back(item);
6262
Ok(())
6363
}
6464
}
6565

66-
impl<SignedBlock> PopFromBlockQueue for BlockImportQueue<SignedBlock> {
67-
type BlockType = SignedBlock;
66+
impl<Item> PopFromQueue for ImportQueue<Item> {
67+
type ItemType = Item;
6868

69-
fn pop_all_but_last(&self) -> Result<Vec<SignedBlock>> {
69+
fn pop_all_but_last(&self) -> Result<Vec<Item>> {
7070
let mut queue_lock = self.queue.write().map_err(|_| Error::PoisonedLock)?;
7171
let queue_length = queue_lock.len();
7272
if queue_length < 2 {
73-
return Ok(Vec::<SignedBlock>::default())
73+
return Ok(Vec::<Item>::default())
7474
}
7575
Ok(queue_lock.drain(..queue_length - 1).collect::<Vec<_>>())
7676
}
7777

78-
fn pop_all(&self) -> Result<Vec<SignedBlock>> {
78+
fn pop_all(&self) -> Result<Vec<Item>> {
7979
let mut queue_lock = self.queue.write().map_err(|_| Error::PoisonedLock)?;
8080
Ok(queue_lock.drain(..).collect::<Vec<_>>())
8181
}
8282

83-
fn pop_until<Predicate>(&self, predicate: Predicate) -> Result<Vec<Self::BlockType>>
83+
fn pop_until<Predicate>(&self, predicate: Predicate) -> Result<Vec<Self::ItemType>>
8484
where
85-
Predicate: FnMut(&Self::BlockType) -> bool,
85+
Predicate: FnMut(&Self::ItemType) -> bool,
8686
{
8787
let mut queue_lock = self.queue.write().map_err(|_| Error::PoisonedLock)?;
8888
match queue_lock.iter().position(predicate) {
@@ -91,28 +91,38 @@ impl<SignedBlock> PopFromBlockQueue for BlockImportQueue<SignedBlock> {
9191
}
9292
}
9393

94-
fn pop_front(&self) -> Result<Option<Self::BlockType>> {
94+
fn pop_front(&self) -> Result<Option<Self::ItemType>> {
9595
let mut queue_lock = self.queue.write().map_err(|_| Error::PoisonedLock)?;
9696
Ok(queue_lock.pop_front())
9797
}
98+
99+
fn pop_from_front_until(&self, amount: usize) -> Result<Vec<Self::ItemType>> {
100+
let mut queue_lock = self.queue.write().map_err(|_| Error::PoisonedLock)?;
101+
if amount > queue_lock.len() {
102+
return Err(Error::Other(
103+
"Cannot Pop more items from the queue than are available".into(),
104+
))
105+
}
106+
Ok(queue_lock.drain(..amount).collect::<Vec<_>>())
107+
}
98108
}
99109

100-
impl<SignedBlock> PeekBlockQueue for BlockImportQueue<SignedBlock>
110+
impl<Item> PeekQueue for ImportQueue<Item>
101111
where
102-
SignedBlock: Clone,
112+
Item: Clone,
103113
{
104-
type BlockType = SignedBlock;
114+
type ItemType = Item;
105115

106-
fn peek_find<Predicate>(&self, predicate: Predicate) -> Result<Option<Self::BlockType>>
116+
fn peek_find<Predicate>(&self, predicate: Predicate) -> Result<Option<Self::ItemType>>
107117
where
108-
Predicate: Fn(&Self::BlockType) -> bool,
118+
Predicate: Fn(&Self::ItemType) -> bool,
109119
{
110120
let queue_lock = self.queue.read().map_err(|_| Error::PoisonedLock)?;
111-
let maybe_block = queue_lock.iter().find(|&b| predicate(b));
112-
Ok(maybe_block.cloned())
121+
let maybe_item = queue_lock.iter().find(|&b| predicate(b));
122+
Ok(maybe_item.cloned())
113123
}
114124

115-
fn peek_last(&self) -> Result<Option<Self::BlockType>> {
125+
fn peek_last(&self) -> Result<Option<Self::ItemType>> {
116126
let queue_lock = self.queue.read().map_err(|_| Error::PoisonedLock)?;
117127
Ok(queue_lock.back().cloned())
118128
}
@@ -132,26 +142,26 @@ mod tests {
132142

133143
#[test]
134144
fn default_queue_is_empty() {
135-
let queue = BlockImportQueue::<TestBlock>::default();
145+
let queue = ImportQueue::<TestBlock>::default();
136146
assert!(queue.is_empty().unwrap());
137147
}
138148

139149
#[test]
140150
fn pop_all_on_default_returns_empty_vec() {
141-
let queue = BlockImportQueue::<TestBlock>::default();
151+
let queue = ImportQueue::<TestBlock>::default();
142152
assert!(queue.pop_all().unwrap().is_empty());
143153
}
144154

145155
#[test]
146156
fn after_inserting_queue_is_not_empty() {
147-
let queue = BlockImportQueue::<TestBlock>::default();
157+
let queue = ImportQueue::<TestBlock>::default();
148158
queue.push_single(TestBlock::default()).unwrap();
149159
assert!(!queue.is_empty().unwrap());
150160
}
151161

152162
#[test]
153163
fn pop_all_after_inserting_leaves_empty_queue() {
154-
let queue = BlockImportQueue::<TestBlock>::default();
164+
let queue = ImportQueue::<TestBlock>::default();
155165
queue
156166
.push_multiple(vec![TestBlock::default(), TestBlock::default(), TestBlock::default()])
157167
.unwrap();
@@ -163,20 +173,20 @@ mod tests {
163173

164174
#[test]
165175
fn pop_all_except_last_on_default_returns_empty_vec() {
166-
let queue = BlockImportQueue::<TestBlock>::default();
176+
let queue = ImportQueue::<TestBlock>::default();
167177
assert!(queue.pop_all_but_last().unwrap().is_empty());
168178
}
169179

170180
#[test]
171181
fn pop_all_except_last_with_single_element_returns_empty_vec() {
172-
let queue = BlockImportQueue::<TestBlock>::default();
182+
let queue = ImportQueue::<TestBlock>::default();
173183
queue.push_single(TestBlock::default()).unwrap();
174184
assert!(queue.pop_all_but_last().unwrap().is_empty());
175185
}
176186

177187
#[test]
178188
fn pop_all_except_last_with_multiple_elements_returns_all_but_last_inserted() {
179-
let queue = BlockImportQueue::<TestBlock>::default();
189+
let queue = ImportQueue::<TestBlock>::default();
180190
queue.push_multiple(vec![1, 3, 5, 7]).unwrap();
181191
assert_eq!(3, queue.pop_all_but_last().unwrap().len());
182192
assert!(!queue.is_empty().unwrap());
@@ -185,7 +195,7 @@ mod tests {
185195

186196
#[test]
187197
fn pop_until_returns_empty_vec_if_nothing_matches() {
188-
let queue = BlockImportQueue::<TestBlock>::default();
198+
let queue = ImportQueue::<TestBlock>::default();
189199
queue.push_multiple(vec![1, 3, 5, 7]).unwrap();
190200

191201
let popped_elements = queue.pop_until(|i| i > &10u32).unwrap();
@@ -194,36 +204,36 @@ mod tests {
194204

195205
#[test]
196206
fn pop_until_returns_elements_until_and_including_match() {
197-
let queue = BlockImportQueue::<TestBlock>::default();
207+
let queue = ImportQueue::<TestBlock>::default();
198208
queue.push_multiple(vec![1, 2, 3, 10]).unwrap();
199209

200210
assert_eq!(queue.pop_until(|i| i == &3).unwrap(), vec![1, 2, 3]);
201211
}
202212

203213
#[test]
204214
fn pop_until_returns_all_elements_if_last_matches() {
205-
let queue = BlockImportQueue::<TestBlock>::default();
215+
let queue = ImportQueue::<TestBlock>::default();
206216
queue.push_multiple(vec![1, 2, 3, 10]).unwrap();
207217

208218
assert_eq!(queue.pop_until(|i| i == &10).unwrap(), vec![1, 2, 3, 10]);
209219
}
210220

211221
#[test]
212222
fn pop_until_returns_first_element_if_it_matches() {
213-
let queue = BlockImportQueue::<TestBlock>::default();
223+
let queue = ImportQueue::<TestBlock>::default();
214224
queue.push_single(4).unwrap();
215225
assert_eq!(queue.pop_until(|i| i == &4).unwrap(), vec![4])
216226
}
217227

218228
#[test]
219229
fn pop_front_returns_none_if_queue_is_empty() {
220-
let queue = BlockImportQueue::<TestBlock>::default();
230+
let queue = ImportQueue::<TestBlock>::default();
221231
assert_matches!(queue.pop_front().unwrap(), None);
222232
}
223233

224234
#[test]
225235
fn pop_front_works() {
226-
let queue = BlockImportQueue::<TestBlock>::default();
236+
let queue = ImportQueue::<TestBlock>::default();
227237
queue.push_multiple(vec![1, 2, 3, 5]).unwrap();
228238
assert_eq!(queue.pop_front().unwrap(), Some(1));
229239
assert_eq!(queue.pop_front().unwrap(), Some(2));
@@ -234,7 +244,7 @@ mod tests {
234244

235245
#[test]
236246
fn peek_find_works() {
237-
let queue = BlockImportQueue::<TestBlock>::default();
247+
let queue = ImportQueue::<TestBlock>::default();
238248
queue.push_multiple(vec![1, 2, 3, 5]).unwrap();
239249

240250
assert_eq!(None, queue.peek_find(|i| i == &4).unwrap());
@@ -244,20 +254,20 @@ mod tests {
244254

245255
#[test]
246256
fn peek_find_on_empty_queue_returns_none() {
247-
let queue = BlockImportQueue::<TestBlock>::default();
257+
let queue = ImportQueue::<TestBlock>::default();
248258
assert_eq!(None, queue.peek_find(|i| i == &1).unwrap());
249259
}
250260

251261
#[test]
252262
fn peek_last_works() {
253-
let queue = BlockImportQueue::<TestBlock>::default();
263+
let queue = ImportQueue::<TestBlock>::default();
254264
queue.push_multiple(vec![1, 2, 3, 5, 6, 9, 10]).unwrap();
255265
assert_eq!(queue.peek_last().unwrap(), Some(10));
256266
}
257267

258268
#[test]
259269
fn peek_last_on_empty_queue_returns_none() {
260-
let queue = BlockImportQueue::<TestBlock>::default();
270+
let queue = ImportQueue::<TestBlock>::default();
261271
assert_eq!(None, queue.peek_last().unwrap());
262272
}
263273
}

0 commit comments

Comments
 (0)