diff --git a/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs b/etherlink/kernel_evm/evm_evaluation/src/evalhost.rs index 0ae2f6876fbcb99994c13b1a2af656d0aebf5b13..6fe08252f498229bd2d9d8c731b62684f5b3038d 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,9 +166,23 @@ 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)] + 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 5c538fa184ca380a0a387fde3f1828b583bf51db..67d5f7f8de307f807e9e55bd1c9626ea8caf96fa 100644 --- a/etherlink/kernel_evm/kernel/src/dal.rs +++ b/etherlink/kernel_evm/kernel/src/dal.rs @@ -41,7 +41,8 @@ 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( + // TODO/ADAL: Have a variant that uses ADAL at some moment + .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 ebb683d969a771b90a819e5e0b6d5b69fbe9a915..759ad49974cfad814703190659bc09882b2d1da9 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, @@ -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 bce9d0ac6af8d42b7ee14525ac0dec75f172c758..58fcf5f996c447f424eaee7f2794cca18ffd6f01 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,20 @@ 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)] + 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)] diff --git a/src/kernel_dal_echo/kernel/src/lib.rs b/src/kernel_dal_echo/kernel/src/lib.rs index 5909041763d122f0420f18d9a526ce3cc50d31bf..9aebd1ed69989d5c4ad04731fbc3a4e13c660509 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 5a11d81450514dbdb6053f1cf8a2ec1aa648c42d..9e8a965e3ce8745fcfb95278b61866e1d61f03c6 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 269e5b21d31b8659f5337e2e0ea2436d29bd6eb1..a4d02392c7042406a81a8cdbddbad7b8180789c7 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, @@ -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; @@ -598,7 +609,7 @@ where } #[cfg(feature = "alloc")] - fn reveal_dal_page( + fn reveal_dal_page2( &self, published_level: i32, slot_index: u8, @@ -630,6 +641,42 @@ 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: Handle this case for debug mode as well + let payload: &[u8] = &[ + &[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(); + + 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 63e89b58c0c4c373d9be6bbf1ad4fa03e22766b2..4428bc61b7ed1dfb7b8ee2220406c97e2e56b545 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, @@ -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 57010a3f1d60099ce6d00c28f7dc4a7611654196..1cd807c2996a453c80b8408c8a077c6852680db8 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 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_page + // 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_page( + do_reveal_dal_page( self, published_level, slot_index, @@ -519,7 +519,8 @@ mod tests { let mut offset = 0; for page_index in 0..number_of_pages { let page_len = mock - .reveal_dal_page( + // ADAL: no adaptive DAL version for tests currently + .reveal_dal_page2( published_level, slot_index, page_index, @@ -552,7 +553,8 @@ 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) + // 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 c71c17013183249baca5b5f1c7c84ada85141a7e..aae2e6fcc0cf67aeefb65227df528e6b1b167348 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,20 @@ 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)] + 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)] diff --git a/src/kernel_tx_demo/kernel/src/dal.rs b/src/kernel_tx_demo/kernel/src/dal.rs index ce0fe7cb9c4bcd1ec3dad6ae0aec6c03801a34e3..bb357d374d79ea96b94409e7b9d9fb3c98cd84ab 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")]