From 4000347b33d58a88d48cf0568d3aada7257cd42f Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Thu, 3 Oct 2024 14:55:55 +0200 Subject: [PATCH 1/4] Rust SDK/DAL: identify where reveal_dal_page is used --- etherlink/kernel_evm/evm_evaluation/src/evalhost.rs | 4 ++-- etherlink/kernel_evm/kernel/src/dal.rs | 2 +- etherlink/kernel_evm/runtime/src/runtime.rs | 4 ++-- etherlink/kernel_evm/runtime/src/safe_storage.rs | 4 ++-- src/kernel_dal_echo/kernel/src/lib.rs | 2 +- src/kernel_sdk/CHANGES.md | 5 ++++- src/kernel_sdk/host/src/runtime.rs | 4 ++-- src/kernel_sdk/host/src/runtime/unwindable.rs | 4 ++-- src/kernel_sdk/mock/src/host.rs | 10 +++++----- .../sdk/src/entrypoint/internal/static_input_host.rs | 4 ++-- src/kernel_tx_demo/kernel/src/dal.rs | 2 +- 11 files changed, 24 insertions(+), 21 deletions(-) diff --git a/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs b/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs index 0ae2f6876fbc..c86f6c9ce898 100644 --- a/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs +++ b/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs @@ -158,7 +158,7 @@ impl SdkRuntime for EvalHost { } #[inline(always)] - fn reveal_dal_page( + fn reveal_dal_page2( &self, published_level: i32, slot_index: u8, @@ -166,7 +166,7 @@ impl SdkRuntime for EvalHost { destination: &mut [u8], ) -> Result { self.host - .reveal_dal_page(published_level, slot_index, page_index, destination) + .reveal_dal_page2(published_level, slot_index, page_index, destination) } #[inline(always)] diff --git a/etherlink/kernel_evm/kernel/src/dal.rs b/etherlink/kernel_evm/kernel/src/dal.rs index 5c538fa184ca..6dbbf8260a62 100644 --- a/etherlink/kernel_evm/kernel/src/dal.rs +++ b/etherlink/kernel_evm/kernel/src/dal.rs @@ -41,7 +41,7 @@ fn import_dal_slot( let mut page_start = 0usize; for page_index in 0..number_of_pages { let imported_page_len = host - .reveal_dal_page( + .reveal_dal_page2( published_level as i32, slot_index, page_index, diff --git a/etherlink/kernel_evm/runtime/src/runtime.rs b/etherlink/kernel_evm/runtime/src/runtime.rs index ebb683d969a7..9c454e4dc3f3 100644 --- a/etherlink/kernel_evm/runtime/src/runtime.rs +++ b/etherlink/kernel_evm/runtime/src/runtime.rs @@ -183,14 +183,14 @@ impl + Borrow, Internal: InternalRuntime> S } #[inline(always)] - fn reveal_dal_page( + fn reveal_dal_page2( &self, published_level: i32, slot_index: u8, page_index: i16, destination: &mut [u8], ) -> Result { - self.host.borrow().reveal_dal_page( + self.host.borrow().reveal_dal_page2( published_level, slot_index, page_index, diff --git a/etherlink/kernel_evm/runtime/src/safe_storage.rs b/etherlink/kernel_evm/runtime/src/safe_storage.rs index bce9d0ac6af8..16b1dff52f0b 100644 --- a/etherlink/kernel_evm/runtime/src/safe_storage.rs +++ b/etherlink/kernel_evm/runtime/src/safe_storage.rs @@ -184,7 +184,7 @@ impl SdkRuntime for SafeStorage<&mut Host> { } #[inline(always)] - fn reveal_dal_page( + fn reveal_dal_page2( &self, published_level: i32, slot_index: u8, @@ -192,7 +192,7 @@ impl SdkRuntime for SafeStorage<&mut Host> { destination: &mut [u8], ) -> Result { self.host - .reveal_dal_page(published_level, slot_index, page_index, destination) + .reveal_dal_page2(published_level, slot_index, page_index, destination) } #[inline(always)] diff --git a/src/kernel_dal_echo/kernel/src/lib.rs b/src/kernel_dal_echo/kernel/src/lib.rs index 5909041763d1..9aebd1ed6998 100644 --- a/src/kernel_dal_echo/kernel/src/lib.rs +++ b/src/kernel_dal_echo/kernel/src/lib.rs @@ -19,7 +19,7 @@ fn process_slot( let mut buffer = vec![0u8; page_size * num_pages]; for page_index in 0..num_pages { - let result = host.reveal_dal_page( + let result = host.reveal_dal_page2( published_level, slot_index, page_index.try_into().unwrap(), diff --git a/src/kernel_sdk/CHANGES.md b/src/kernel_sdk/CHANGES.md index 5a11d8145051..9e8a965e3ce8 100644 --- a/src/kernel_sdk/CHANGES.md +++ b/src/kernel_sdk/CHANGES.md @@ -3,6 +3,9 @@ ## Version next ### SDK +- Add `Runtime::reveal_dal_page2` to let a kernel request pages from Tezos’ Data + Availability Layer (DAL). +- Add Adaptive DAL reveal page - Add experimental support for compiling kernels to a Hermit RISC-V image behind the `proto-alpha` flag. - Add an experimental rollup host with an in-memory store behind the `experimental-host-in-memory-store` flag. - Add an `OutboxQueue` that can be used when more than 100 outbox messages are produced at a given level. @@ -36,7 +39,7 @@ - Add michelson `or` and `option`. - Add a feature flag `proto-alpha` to enable host functions introduced in unreleased protocols. -- Add `Runtime::reveal_dal_page` to let a kernel request pages from Tezos’ Data +- Add `Runtime::reveal_dal_page2` to let a kernel request pages from Tezos’ Data Availability Layer (DAL). - Add a new case `WhitelistUpdate(OutboxMessageWhitelistUpdate)` to the `OutboxMessage` encoding, behind the `proto-alpha` feature flag. diff --git a/src/kernel_sdk/host/src/runtime.rs b/src/kernel_sdk/host/src/runtime.rs index 269e5b21d31b..53e708d82234 100644 --- a/src/kernel_sdk/host/src/runtime.rs +++ b/src/kernel_sdk/host/src/runtime.rs @@ -192,7 +192,7 @@ pub trait Runtime { /// Reveal a DAL page. #[cfg(feature = "alloc")] - fn reveal_dal_page( + fn reveal_dal_page2( &self, published_level: i32, slot_index: u8, @@ -598,7 +598,7 @@ where } #[cfg(feature = "alloc")] - fn reveal_dal_page( + fn reveal_dal_page2( &self, published_level: i32, slot_index: u8, diff --git a/src/kernel_sdk/host/src/runtime/unwindable.rs b/src/kernel_sdk/host/src/runtime/unwindable.rs index 63e89b58c0c4..1423f33bd0f1 100644 --- a/src/kernel_sdk/host/src/runtime/unwindable.rs +++ b/src/kernel_sdk/host/src/runtime/unwindable.rs @@ -176,14 +176,14 @@ impl Runtime for UnwindableRuntime { } #[cfg(feature = "alloc")] - fn reveal_dal_page( + fn reveal_dal_page2( &self, published_level: i32, slot_index: u8, page_index: i16, destination: &mut [u8], ) -> Result { - self.runtime.read().unwrap().reveal_dal_page( + self.runtime.read().unwrap().reveal_dal_page2( published_level, slot_index, page_index, diff --git a/src/kernel_sdk/mock/src/host.rs b/src/kernel_sdk/mock/src/host.rs index 57010a3f1d60..c61bec5a5609 100644 --- a/src/kernel_sdk/mock/src/host.rs +++ b/src/kernel_sdk/mock/src/host.rs @@ -53,7 +53,7 @@ unsafe fn reveal_dal_parameters( len as i32 } -unsafe fn reveal_dal_page( +unsafe fn reveal_dal_page2( host: &MockHost, published_level: i32, slot_index: u8, @@ -262,7 +262,7 @@ unsafe impl SmartRollupCore for MockHost { self.reveal_metadata(destination_addr, max_bytes) } 2 => { - // Reveal_dal_page + // Reveal_dal_page2 const PAYLOAD_SIZE: usize = size_of::() + size_of::() + size_of::(); @@ -279,7 +279,7 @@ unsafe impl SmartRollupCore for MockHost { let slot_index = slot_index[0]; let page_index = i16::from_be_bytes(page_index.try_into().unwrap()); - reveal_dal_page( + reveal_dal_page2( self, published_level, slot_index, @@ -519,7 +519,7 @@ mod tests { let mut offset = 0; for page_index in 0..number_of_pages { let page_len = mock - .reveal_dal_page( + .reveal_dal_page2( published_level, slot_index, page_index, @@ -552,7 +552,7 @@ mod tests { mock.set_dal_slot(published_level, slot_index, &data); // The slot is in an attestable state, so we can read its content - mock.reveal_dal_page(published_level, slot_index, 0, page_buffer) + mock.reveal_dal_page2(published_level, slot_index, 0, page_buffer) .expect("Reveal of attested slot shouldn't fail") } diff --git a/src/kernel_sdk/sdk/src/entrypoint/internal/static_input_host.rs b/src/kernel_sdk/sdk/src/entrypoint/internal/static_input_host.rs index c71c17013183..13afea1a9200 100644 --- a/src/kernel_sdk/sdk/src/entrypoint/internal/static_input_host.rs +++ b/src/kernel_sdk/sdk/src/entrypoint/internal/static_input_host.rs @@ -205,7 +205,7 @@ impl<'runtime, R: Runtime> Runtime for StaticInputHost<'runtime, R> { } #[inline(always)] - fn reveal_dal_page( + fn reveal_dal_page2( &self, published_level: i32, slot_index: u8, @@ -213,7 +213,7 @@ impl<'runtime, R: Runtime> Runtime for StaticInputHost<'runtime, R> { destination: &mut [u8], ) -> Result { self.host - .reveal_dal_page(published_level, slot_index, page_index, destination) + .reveal_dal_page2(published_level, slot_index, page_index, destination) } #[inline(always)] diff --git a/src/kernel_tx_demo/kernel/src/dal.rs b/src/kernel_tx_demo/kernel/src/dal.rs index ce0fe7cb9c4b..bb357d374d79 100644 --- a/src/kernel_tx_demo/kernel/src/dal.rs +++ b/src/kernel_tx_demo/kernel/src/dal.rs @@ -29,7 +29,7 @@ pub(crate) fn store_dal_slot( ) { let mut buffer = vec![0u8; page_size]; for page_index in 0..(num_pages as i16) { - let result = host.reveal_dal_page(published_level, slot_index, page_index, &mut buffer); + let result = host.reveal_dal_page2(published_level, slot_index, page_index, &mut buffer); match result { Ok(size) => { #[cfg(feature = "debug")] -- GitLab From 7c4bac154dc4387fbc043cf2d90e6102c1ec49ce Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Fri, 4 Oct 2024 16:47:12 +0200 Subject: [PATCH 2/4] Refactoring: rename the function named reveal_dal_page(2) used for mockup to do_reveal_dal_page --- src/kernel_sdk/mock/src/host.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/kernel_sdk/mock/src/host.rs b/src/kernel_sdk/mock/src/host.rs index c61bec5a5609..1debb45b2d7d 100644 --- a/src/kernel_sdk/mock/src/host.rs +++ b/src/kernel_sdk/mock/src/host.rs @@ -53,7 +53,7 @@ unsafe fn reveal_dal_parameters( len as i32 } -unsafe fn reveal_dal_page2( +unsafe fn do_reveal_dal_page( host: &MockHost, published_level: i32, slot_index: u8, @@ -262,7 +262,7 @@ unsafe impl SmartRollupCore for MockHost { self.reveal_metadata(destination_addr, max_bytes) } 2 => { - // Reveal_dal_page2 + // do_reveal_dal_page const PAYLOAD_SIZE: usize = size_of::() + size_of::() + size_of::(); @@ -279,7 +279,7 @@ unsafe impl SmartRollupCore for MockHost { let slot_index = slot_index[0]; let page_index = i16::from_be_bytes(page_index.try_into().unwrap()); - reveal_dal_page2( + do_reveal_dal_page( self, published_level, slot_index, -- GitLab From 6d8bbde5e4664ef81151a51c3f2545e096ed8b8e Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Fri, 4 Oct 2024 17:24:34 +0200 Subject: [PATCH 3/4] DAL/Rust-SDK: add a reveal_adal_page primitive (not fully implemented) --- .../kernel_evm/evm_evaluation/src/evalhost.rs | 14 ++++++ etherlink/kernel_evm/kernel/src/dal.rs | 1 + etherlink/kernel_evm/runtime/src/runtime.rs | 18 ++++++++ .../kernel_evm/runtime/src/safe_storage.rs | 13 ++++++ src/kernel_sdk/host/src/runtime.rs | 46 +++++++++++++++++++ src/kernel_sdk/host/src/runtime/unwindable.rs | 18 ++++++++ src/kernel_sdk/mock/src/host.rs | 2 + .../entrypoint/internal/static_input_host.rs | 13 ++++++ 8 files changed, 125 insertions(+) diff --git a/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs b/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs index c86f6c9ce898..6fe08252f498 100644 --- a/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs +++ b/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs @@ -169,6 +169,20 @@ impl SdkRuntime for EvalHost { .reveal_dal_page2(published_level, slot_index, page_index, destination) } + #[inline(always)] + fn reveal_adal_page( + &self, + published_level: i32, + slot_index: u8, + page_index: i16, + attestation_threshold_per_mil : i16, + destination: &mut [u8], + ) -> Result { + self.host + .reveal_adal_page(published_level, slot_index, page_index, attestation_threshold_per_mil, destination) + } + + #[inline(always)] fn reveal_dal_parameters(&self) -> RollupDalParameters { self.host.reveal_dal_parameters() diff --git a/etherlink/kernel_evm/kernel/src/dal.rs b/etherlink/kernel_evm/kernel/src/dal.rs index 6dbbf8260a62..67d5f7f8de30 100644 --- a/etherlink/kernel_evm/kernel/src/dal.rs +++ b/etherlink/kernel_evm/kernel/src/dal.rs @@ -41,6 +41,7 @@ fn import_dal_slot( let mut page_start = 0usize; for page_index in 0..number_of_pages { let imported_page_len = host + // TODO/ADAL: Have a variant that uses ADAL at some moment .reveal_dal_page2( published_level as i32, slot_index, diff --git a/etherlink/kernel_evm/runtime/src/runtime.rs b/etherlink/kernel_evm/runtime/src/runtime.rs index 9c454e4dc3f3..759ad49974cf 100644 --- a/etherlink/kernel_evm/runtime/src/runtime.rs +++ b/etherlink/kernel_evm/runtime/src/runtime.rs @@ -198,6 +198,24 @@ impl + Borrow, Internal: InternalRuntime> S ) } + #[inline(always)] + fn reveal_adal_page( + &self, + published_level: i32, + slot_index: u8, + page_index: i16, + attestation_threshold_per_mil : i16, + destination: &mut [u8], + ) -> Result { + self.host.borrow().reveal_adal_page( + published_level, + slot_index, + page_index, + attestation_threshold_per_mil, + destination, + ) + } + #[inline(always)] fn reveal_dal_parameters(&self) -> RollupDalParameters { self.host.borrow().reveal_dal_parameters() diff --git a/etherlink/kernel_evm/runtime/src/safe_storage.rs b/etherlink/kernel_evm/runtime/src/safe_storage.rs index 16b1dff52f0b..58fcf5f996c4 100644 --- a/etherlink/kernel_evm/runtime/src/safe_storage.rs +++ b/etherlink/kernel_evm/runtime/src/safe_storage.rs @@ -195,6 +195,19 @@ impl SdkRuntime for SafeStorage<&mut Host> { .reveal_dal_page2(published_level, slot_index, page_index, destination) } + #[inline(always)] + fn reveal_adal_page( + &self, + published_level: i32, + slot_index: u8, + page_index: i16, + attestation_threshold_per_mil : i16, + destination: &mut [u8], + ) -> Result { + self.host + .reveal_adal_page(published_level, slot_index, page_index, attestation_threshold_per_mil, destination) + } + #[inline(always)] fn reveal_dal_parameters(&self) -> RollupDalParameters { self.host.reveal_dal_parameters() diff --git a/src/kernel_sdk/host/src/runtime.rs b/src/kernel_sdk/host/src/runtime.rs index 53e708d82234..e194320be5a6 100644 --- a/src/kernel_sdk/host/src/runtime.rs +++ b/src/kernel_sdk/host/src/runtime.rs @@ -200,6 +200,17 @@ pub trait Runtime { destination: &mut [u8], ) -> Result; + /// Reveal a DAL page. + #[cfg(feature = "alloc")] + fn reveal_adal_page( + &self, + published_level: i32, + slot_index: u8, + page_index: i16, + attestation_threshold_per_mil: i16, + destination: &mut [u8], + ) -> Result; + /// Reveal the DAL parameters. fn reveal_dal_parameters(&self) -> RollupDalParameters; @@ -630,6 +641,41 @@ where } } + #[cfg(feature = "alloc")] + fn reveal_adal_page( + &self, + published_level: i32, + slot_index: u8, + page_index: i16, + attestation_threshold_per_mil : i16, + destination: &mut [u8], + ) -> Result { + // This will match the encoding declared for a DAL page in the Tezos protocol. + // ADAL/FIXME: encode attestation_threshold_per_mil here as well + let payload: &[u8] = &[ + &[2u8], // tag + published_level.to_be_bytes().as_ref(), + &[slot_index], + page_index.to_be_bytes().as_ref(), + ] + .concat(); + + let res = unsafe { + SmartRollupCore::reveal( + self, + payload.as_ptr(), + payload.len(), + destination.as_mut_ptr(), + destination.len(), + ) + }; + + match Error::wrap(res) { + Ok(size) => Ok(size), + Err(e) => Err(RuntimeError::HostErr(e)), + } + } + fn reveal_dal_parameters(&self) -> RollupDalParameters { let mut destination = [0u8; DAL_PARAMETERS_SIZE]; // This will match the encoding declared for revealing DAL parameters in the Tezos protocol. diff --git a/src/kernel_sdk/host/src/runtime/unwindable.rs b/src/kernel_sdk/host/src/runtime/unwindable.rs index 1423f33bd0f1..4428bc61b7ed 100644 --- a/src/kernel_sdk/host/src/runtime/unwindable.rs +++ b/src/kernel_sdk/host/src/runtime/unwindable.rs @@ -191,6 +191,24 @@ impl Runtime for UnwindableRuntime { ) } + #[cfg(feature = "alloc")] + fn reveal_adal_page( + &self, + published_level: i32, + slot_index: u8, + page_index: i16, + attestation_threshold_per_mil : i16, + destination: &mut [u8], + ) -> Result { + self.runtime.read().unwrap().reveal_adal_page( + published_level, + slot_index, + page_index, + attestation_threshold_per_mil, + destination, + ) + } + fn reveal_dal_parameters(&self) -> RollupDalParameters { self.runtime.read().unwrap().reveal_dal_parameters() } diff --git a/src/kernel_sdk/mock/src/host.rs b/src/kernel_sdk/mock/src/host.rs index 1debb45b2d7d..1cd807c2996a 100644 --- a/src/kernel_sdk/mock/src/host.rs +++ b/src/kernel_sdk/mock/src/host.rs @@ -519,6 +519,7 @@ mod tests { let mut offset = 0; for page_index in 0..number_of_pages { let page_len = mock + // ADAL: no adaptive DAL version for tests currently .reveal_dal_page2( published_level, slot_index, @@ -552,6 +553,7 @@ mod tests { mock.set_dal_slot(published_level, slot_index, &data); // The slot is in an attestable state, so we can read its content + // ADAL: no adaptive DAL version for tests currently mock.reveal_dal_page2(published_level, slot_index, 0, page_buffer) .expect("Reveal of attested slot shouldn't fail") } diff --git a/src/kernel_sdk/sdk/src/entrypoint/internal/static_input_host.rs b/src/kernel_sdk/sdk/src/entrypoint/internal/static_input_host.rs index 13afea1a9200..aae2e6fcc0cf 100644 --- a/src/kernel_sdk/sdk/src/entrypoint/internal/static_input_host.rs +++ b/src/kernel_sdk/sdk/src/entrypoint/internal/static_input_host.rs @@ -216,6 +216,19 @@ impl<'runtime, R: Runtime> Runtime for StaticInputHost<'runtime, R> { .reveal_dal_page2(published_level, slot_index, page_index, destination) } + #[inline(always)] + fn reveal_adal_page( + &self, + published_level: i32, + slot_index: u8, + page_index: i16, + attestation_threshold_per_mil : i16, + destination: &mut [u8], + ) -> Result { + self.host + .reveal_adal_page(published_level, slot_index, page_index, attestation_threshold_per_mil, destination) + } + #[inline(always)] fn reveal_dal_parameters(&self) -> RollupDalParameters { self.host.reveal_dal_parameters() -- GitLab From e78d5aef46ff6ae5e5406da0efc3bc5b28b8bce7 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Mon, 7 Oct 2024 13:53:07 +0200 Subject: [PATCH 4/4] ADAL/Rust SDK: use attestation_threshold_per_mil in reveal_adal_page (attempt) --- src/kernel_sdk/host/src/runtime.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/kernel_sdk/host/src/runtime.rs b/src/kernel_sdk/host/src/runtime.rs index e194320be5a6..a4d02392c704 100644 --- a/src/kernel_sdk/host/src/runtime.rs +++ b/src/kernel_sdk/host/src/runtime.rs @@ -651,12 +651,13 @@ where destination: &mut [u8], ) -> Result { // This will match the encoding declared for a DAL page in the Tezos protocol. - // ADAL/FIXME: encode attestation_threshold_per_mil here as well + // ADAL/FIXME: Handle this case for debug mode as well let payload: &[u8] = &[ - &[2u8], // tag + &[4u8], // tag published_level.to_be_bytes().as_ref(), &[slot_index], page_index.to_be_bytes().as_ref(), + attestation_threshold_per_mil.to_be_bytes().as_ref(), ] .concat(); -- GitLab