From ed6a215fe68c35290fb9b941cac790183755f8c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Wed, 19 Jun 2024 11:21:30 +0200 Subject: [PATCH 1/6] Kernel SDK: implement serialization of DAL params --- src/kernel_sdk/host/src/dal_parameters.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/kernel_sdk/host/src/dal_parameters.rs b/src/kernel_sdk/host/src/dal_parameters.rs index 3f978ae38db0..1b1ab22160f1 100644 --- a/src/kernel_sdk/host/src/dal_parameters.rs +++ b/src/kernel_sdk/host/src/dal_parameters.rs @@ -52,3 +52,14 @@ impl TryFrom<[u8; DAL_PARAMETERS_SIZE]> for RollupDalParameters { }) } } + +impl From<&RollupDalParameters> for [u8; DAL_PARAMETERS_SIZE] { + fn from(value: &RollupDalParameters) -> [u8; DAL_PARAMETERS_SIZE] { + let mut data = [0; 4]; + data[0] = (value.number_of_slots as i64).to_be(); + data[1] = (value.attestation_lag as i64).to_be(); + data[2] = (value.slot_size as i64).to_be(); + data[3] = (value.page_size as i64).to_be(); + unsafe { core::mem::transmute(data) } + } +} -- GitLab From 967ca5bbdeb737136555a8d3d4e977b21ada57ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Wed, 19 Jun 2024 11:22:21 +0200 Subject: [PATCH 2/6] Kernel SDK/Mockup: implement reveal host function in DAL param case --- src/kernel_sdk/mock/src/host.rs | 55 +++++++++++++++++++++++++--- src/kernel_sdk/mock/src/state/mod.rs | 17 ++++++++- 2 files changed, 65 insertions(+), 7 deletions(-) diff --git a/src/kernel_sdk/mock/src/host.rs b/src/kernel_sdk/mock/src/host.rs index 2c2d9c67ed86..ae500f67872c 100644 --- a/src/kernel_sdk/mock/src/host.rs +++ b/src/kernel_sdk/mock/src/host.rs @@ -12,11 +12,13 @@ use crate::state::{HostState, NextInput}; use crate::MockHost; use core::{ cell::RefCell, + cmp::min, ptr, slice::{from_raw_parts, from_raw_parts_mut}, }; use tezos_smart_rollup_core::smart_rollup_core::{ReadInputMessageInfo, SmartRollupCore}; use tezos_smart_rollup_core::PREIMAGE_HASH_SIZE; +use tezos_smart_rollup_host::dal_parameters::DAL_PARAMETERS_SIZE; use tezos_smart_rollup_host::metadata::METADATA_SIZE; use tezos_smart_rollup_host::Error; @@ -37,6 +39,19 @@ impl AsMut for MockHost { } } +unsafe fn reveal_dal_parameters( + host: &MockHost, + destination_addr: *mut u8, + max_bytes: usize, +) -> i32 { + let params: [u8; DAL_PARAMETERS_SIZE] = + host.state.borrow().get_dal_parameters().into(); + let len = min(max_bytes, params.len()); + let slice = from_raw_parts_mut(destination_addr, len); + slice.copy_from_slice(¶ms[..len]); + len as i32 +} + unsafe impl SmartRollupCore for MockHost { unsafe fn read_input( &self, @@ -194,13 +209,41 @@ unsafe impl SmartRollupCore for MockHost { unsafe fn reveal( &self, - _payload_addr: *const u8, - _payload_len: usize, - _destination_addr: *mut u8, - _max_bytes: usize, + payload_addr: *const u8, + payload_len: usize, + destination_addr: *mut u8, + max_bytes: usize, ) -> i32 { - // TODO: https://gitlab.com/tezos/tezos/-/issues/6171 - unimplemented!("The `reveal` host function is not yet mocked.") + let payload: &[u8] = from_raw_parts(payload_addr, payload_len); + match payload[0] { + 0 => { + // Reveal_raw_data + self.reveal_preimage( + payload_addr.add(1), + payload_len.saturating_sub(1), + destination_addr, + max_bytes, + ) + } + 1 => { + // Reveal_metadata + self.reveal_metadata(destination_addr, max_bytes) + } + 2 => { + // Reveal_dal_page + unimplemented!( + "The `reveal` host function is not yet mocked for DAL pages." + ) + } + 3 => { + // Reveal_dal_parameters + reveal_dal_parameters(self, destination_addr, max_bytes) + } + tag => unimplemented!( + "The `reveal` host function is not yet mocked for tag {}.", + tag + ), + } } } diff --git a/src/kernel_sdk/mock/src/state/mod.rs b/src/kernel_sdk/mock/src/state/mod.rs index cc3aae2244fc..32fee86ca2ea 100644 --- a/src/kernel_sdk/mock/src/state/mod.rs +++ b/src/kernel_sdk/mock/src/state/mod.rs @@ -10,7 +10,9 @@ use crypto::hash::SmartRollupHash; use tezos_smart_rollup_core::{ MAX_INPUT_MESSAGE_SIZE, MAX_OUTPUT_SIZE, PREIMAGE_HASH_SIZE, }; -use tezos_smart_rollup_host::{metadata::RollupMetadata, Error}; +use tezos_smart_rollup_host::{ + dal_parameters::RollupDalParameters, metadata::RollupMetadata, Error, +}; pub(crate) mod in_memory_store; pub(crate) mod store; @@ -32,6 +34,7 @@ pub(crate) struct HostState { /// Key-value store of runtime state. pub store: InMemoryStore, pub metadata: RollupMetadata, + pub dal_parameters: RollupDalParameters, // Inbox metadata pub(crate) curr_level: u32, pub(crate) curr_input_id: usize, @@ -52,9 +55,17 @@ impl Default for HostState { raw_rollup_address, origination_level: crate::NAIROBI_ACTIVATION_LEVEL, }; + + let dal_parameters = RollupDalParameters { + number_of_slots: 16, + attestation_lag: 8, + slot_size: 126944, + page_size: 3967, + }; Self { store, metadata, + dal_parameters, curr_level: crate::NAIROBI_ACTIVATION_LEVEL, curr_input_id: 0, input: vec![], @@ -133,6 +144,10 @@ impl HostState { pub(crate) fn get_metadata(&self) -> &RollupMetadata { &self.metadata } + + pub(crate) fn get_dal_parameters(&self) -> &RollupDalParameters { + &self.dal_parameters + } } #[cfg(test)] -- GitLab From 1841b09ef737188012f5bb9b7d3f9fe1689af0a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Wed, 19 Jun 2024 15:08:04 +0200 Subject: [PATCH 3/6] Kernel SDK/Mockup: implement DAL reveal page host function --- src/kernel_sdk/mock/src/host.rs | 43 ++++++++++++++++++++++++-- src/kernel_sdk/mock/src/state/mod.rs | 8 +++++ src/kernel_sdk/mock/src/state/store.rs | 9 ++++++ 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/src/kernel_sdk/mock/src/host.rs b/src/kernel_sdk/mock/src/host.rs index ae500f67872c..3f99a9dc5ae4 100644 --- a/src/kernel_sdk/mock/src/host.rs +++ b/src/kernel_sdk/mock/src/host.rs @@ -13,6 +13,7 @@ use crate::MockHost; use core::{ cell::RefCell, cmp::min, + mem::size_of, ptr, slice::{from_raw_parts, from_raw_parts_mut}, }; @@ -52,6 +53,27 @@ unsafe fn reveal_dal_parameters( len as i32 } +unsafe fn reveal_dal_page( + host: &MockHost, + published_level: i32, + slot_index: u8, + page_index: i16, + destination_addr: *mut u8, + max_bytes: usize, +) -> i32 { + let state = host.state.borrow(); + let params = state.get_dal_parameters(); + let page_size = params.page_size as usize; + let len = min(max_bytes, page_size); + let start = ((page_index as u64) * params.page_size) as usize; + let Some(slot) = state.get_dal_slot(published_level, slot_index) else { + return 0; + }; + let slice = from_raw_parts_mut(destination_addr, len); + slice.copy_from_slice(&slot[start..start + len]); + len as i32 +} + unsafe impl SmartRollupCore for MockHost { unsafe fn read_input( &self, @@ -215,7 +237,8 @@ unsafe impl SmartRollupCore for MockHost { max_bytes: usize, ) -> i32 { let payload: &[u8] = from_raw_parts(payload_addr, payload_len); - match payload[0] { + let (tag, payload) = payload.split_at(size_of::()); + match tag[0] { 0 => { // Reveal_raw_data self.reveal_preimage( @@ -231,8 +254,22 @@ unsafe impl SmartRollupCore for MockHost { } 2 => { // Reveal_dal_page - unimplemented!( - "The `reveal` host function is not yet mocked for DAL pages." + let (published_level, remaining) = payload.split_at(size_of::()); + let (slot_index, remaining) = remaining.split_at(size_of::()); + let (page_index, _) = remaining.split_at(size_of::()); + + let published_level = + i32::from_be_bytes(published_level.try_into().unwrap()); + let slot_index = slot_index[0]; + let page_index = i16::from_be_bytes(page_index.try_into().unwrap()); + + reveal_dal_page( + self, + published_level, + slot_index, + page_index, + destination_addr, + max_bytes, ) } 3 => { diff --git a/src/kernel_sdk/mock/src/state/mod.rs b/src/kernel_sdk/mock/src/state/mod.rs index 32fee86ca2ea..adf90c2489e0 100644 --- a/src/kernel_sdk/mock/src/state/mod.rs +++ b/src/kernel_sdk/mock/src/state/mod.rs @@ -148,6 +148,14 @@ impl HostState { pub(crate) fn get_dal_parameters(&self) -> &RollupDalParameters { &self.dal_parameters } + + pub(crate) fn get_dal_slot( + &self, + published_level: i32, + slot_index: u8, + ) -> Option<&Vec> { + self.store.0.retrieve_dal_slot(published_level, slot_index) + } } #[cfg(test)] diff --git a/src/kernel_sdk/mock/src/state/store.rs b/src/kernel_sdk/mock/src/state/store.rs index f6f083b0255f..0235f481fbd7 100644 --- a/src/kernel_sdk/mock/src/state/store.rs +++ b/src/kernel_sdk/mock/src/state/store.rs @@ -13,6 +13,7 @@ use tezos_smart_rollup_core::PREIMAGE_HASH_SIZE; pub(crate) struct Store { pub(crate) durable: Rc, preimages: HashMap<[u8; PREIMAGE_HASH_SIZE], Vec>, + dal_slots: HashMap<(i32, u8), Vec>, outbox: HashMap>>, inbox: HashMap>>, } @@ -187,6 +188,14 @@ impl Store { .expect("Cannot retrieve preimage") .as_ref() } + + pub fn retrieve_dal_slot( + &self, + published_level: i32, + slot_index: u8, + ) -> Option<&Vec> { + self.dal_slots.get(&(published_level, slot_index)) + } } fn path_steps(path: &str) -> impl Iterator { -- GitLab From 2e75cb5faf2eb07df4fd3359ee3e8b09c24c7ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Wed, 10 Jul 2024 08:53:07 +0200 Subject: [PATCH 4/6] Kernel SDK/Mockup: add an unused setter for DAL parameters --- src/kernel_sdk/mock/src/state/mod.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/kernel_sdk/mock/src/state/mod.rs b/src/kernel_sdk/mock/src/state/mod.rs index adf90c2489e0..25b43e5e2991 100644 --- a/src/kernel_sdk/mock/src/state/mod.rs +++ b/src/kernel_sdk/mock/src/state/mod.rs @@ -149,6 +149,11 @@ impl HostState { &self.dal_parameters } + #[allow(dead_code)] + pub(crate) fn set_dal_parameters(&mut self, params: RollupDalParameters) { + self.dal_parameters = params + } + pub(crate) fn get_dal_slot( &self, published_level: i32, -- GitLab From e17664fe5dbf1094afc6cd8d53c5901762e208ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Tue, 16 Jul 2024 11:41:13 +0200 Subject: [PATCH 5/6] Changes/Kernel SDK: mention changes from !13846 Closes #6171 --- src/kernel_sdk/CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/kernel_sdk/CHANGES.md b/src/kernel_sdk/CHANGES.md index e75d30f0a736..b59bc990de1b 100644 --- a/src/kernel_sdk/CHANGES.md +++ b/src/kernel_sdk/CHANGES.md @@ -23,6 +23,7 @@ of `OutboxMessageTransaction` with potentially different parameter types. - Add `--keep-going` option to native cli, to control whether the kernel should exit once the inbox has been drained. - Bump `tezos_crypto_rs`/`tezos_data_encoding` to `0.6.0` release. +- Implement the generic `reveal` host function in the `MockHost`, this allows in particular to use the DAL host functions in the mockup. ### Installer client/kernel -- GitLab From 0bc5246f71c528178be338a9d1273fb6c9a5ea0e Mon Sep 17 00:00:00 2001 From: phink Date: Tue, 16 Jul 2024 17:05:36 +0200 Subject: [PATCH 6/6] Kernel SDK/Mockup: add links to current issues --- src/kernel_sdk/mock/src/host.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/kernel_sdk/mock/src/host.rs b/src/kernel_sdk/mock/src/host.rs index 3f99a9dc5ae4..6104c15f1ad2 100644 --- a/src/kernel_sdk/mock/src/host.rs +++ b/src/kernel_sdk/mock/src/host.rs @@ -220,6 +220,8 @@ unsafe impl SmartRollupCore for MockHost { self.state.borrow().store.store_value_size(path, path_len) } + // TODO adapt reveal_metadata + // https://gitlab.com/tezos/tezos/-/issues/7378 unsafe fn reveal_metadata(&self, destination_addr: *mut u8, max_bytes: usize) -> i32 { assert!(METADATA_SIZE <= max_bytes); let metadata: [u8; METADATA_SIZE] = @@ -229,6 +231,8 @@ unsafe impl SmartRollupCore for MockHost { metadata.len().try_into().unwrap() } + // TODO turn payload.split_at into a read or error code helper function. + // https://gitlab.com/tezos/tezos/-/issues/7377 unsafe fn reveal( &self, payload_addr: *const u8, -- GitLab