From bf3b813c4149b5d608f57ab0af0da3ea391324f5 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Fri, 28 Apr 2023 08:51:35 +0200 Subject: [PATCH 1/4] kernel/sequencer: remove old files --- src/kernel_sequencer/src/core.rs | 5 ----- src/kernel_sequencer/src/core/kernel.rs | 11 ----------- src/kernel_sequencer/src/lib.rs | 2 -- 3 files changed, 18 deletions(-) delete mode 100644 src/kernel_sequencer/src/core.rs delete mode 100644 src/kernel_sequencer/src/core/kernel.rs diff --git a/src/kernel_sequencer/src/core.rs b/src/kernel_sequencer/src/core.rs deleted file mode 100644 index 4d8d638bc3b8..000000000000 --- a/src/kernel_sequencer/src/core.rs +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Marigold -// -// SPDX-License-Identifier: MIT - -pub mod kernel; diff --git a/src/kernel_sequencer/src/core/kernel.rs b/src/kernel_sequencer/src/core/kernel.rs deleted file mode 100644 index 7a1e45bb5ade..000000000000 --- a/src/kernel_sequencer/src/core/kernel.rs +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Marigold -// -// SPDX-License-Identifier: MIT - -use tezos_smart_rollup_host::runtime::Runtime; - -/// Trait that represents a kernel -pub trait Kernel { - /// Represents the `kernel_entry` functions defined by kernels - fn entry(host: &mut Host); -} diff --git a/src/kernel_sequencer/src/lib.rs b/src/kernel_sequencer/src/lib.rs index e0aa32952e8b..db1be92a0461 100644 --- a/src/kernel_sequencer/src/lib.rs +++ b/src/kernel_sequencer/src/lib.rs @@ -1,5 +1,3 @@ // SPDX-FileCopyrightText: 2023 Marigold // // SPDX-License-Identifier: MIT - -pub mod core; -- GitLab From 060e2fcbeacabdad96a38a59589d71395adf7f41 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Fri, 28 Apr 2023 08:52:24 +0200 Subject: [PATCH 2/4] kernel/sequencer: use the published sdk --- src/kernel_sequencer/Cargo.lock | 82 +++++++++++++++++++++++++++++---- src/kernel_sequencer/Cargo.toml | 12 ++++- 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/src/kernel_sequencer/Cargo.lock b/src/kernel_sequencer/Cargo.lock index 4af6cdf37969..0c795115d410 100644 --- a/src/kernel_sequencer/Cargo.lock +++ b/src/kernel_sequencer/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" [[package]] name = "arrayref" @@ -113,9 +113,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cpufeatures" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] @@ -286,10 +286,18 @@ dependencies = [ ] [[package]] -name = "kernel_sequencer" +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "kernel-sequencer" version = "0.1.0" dependencies = [ + "tezos-smart-rollup-core", "tezos-smart-rollup-host", + "tezos-smart-rollup-mock", ] [[package]] @@ -576,18 +584,18 @@ checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6" dependencies = [ "proc-macro2", "quote", @@ -679,6 +687,23 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" name = "tezos-smart-rollup-core" version = "0.1.0" +[[package]] +name = "tezos-smart-rollup-encoding" +version = "0.1.0" +dependencies = [ + "hex", + "nom", + "num-bigint", + "num-traits", + "tezos-smart-rollup-core", + "tezos-smart-rollup-host", + "tezos_crypto_rs", + "tezos_data_encoding", + "tezos_data_encoding_derive", + "thiserror", + "time", +] + [[package]] name = "tezos-smart-rollup-host" version = "0.1.0" @@ -689,6 +714,18 @@ dependencies = [ "thiserror", ] +[[package]] +name = "tezos-smart-rollup-mock" +version = "0.1.0" +dependencies = [ + "hex", + "tezos-smart-rollup-core", + "tezos-smart-rollup-encoding", + "tezos-smart-rollup-host", + "tezos_crypto_rs", + "tezos_data_encoding", +] + [[package]] name = "tezos_crypto_rs" version = "0.4.4" @@ -775,6 +812,33 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "time" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +dependencies = [ + "itoa", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +dependencies = [ + "time-core", +] + [[package]] name = "typenum" version = "1.16.0" diff --git a/src/kernel_sequencer/Cargo.toml b/src/kernel_sequencer/Cargo.toml index 87e1f0c41e77..27340e0a7ddf 100644 --- a/src/kernel_sequencer/Cargo.toml +++ b/src/kernel_sequencer/Cargo.toml @@ -3,10 +3,20 @@ # SPDX-License-Identifier: MIT [package] -name = "kernel_sequencer" +name = "kernel-sequencer" version = "0.1.0" edition = "2021" description = "Sequencer framework for Tezos Smart Rollups" +[dependencies.tezos-smart-rollup-core] +path = "../kernel_sdk/core" +version = "0.1.0" +default-features = false + [dependencies.tezos-smart-rollup-host] path = "../kernel_sdk/host" +version = "0.1.0" + +[dev-dependencies.tezos-smart-rollup-mock] +path = "../kernel_sdk/mock" +version = "0.1.0" -- GitLab From 7ca34f175949e6ab0f0a105ade47494bdae09f25 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Fri, 5 May 2023 10:55:02 +0200 Subject: [PATCH 3/4] kernel/sequencer: initialize the sequencer runtime --- src/kernel_sequencer/src/delayed_inbox.rs | 41 +++++ src/kernel_sequencer/src/lib.rs | 3 + src/kernel_sequencer/src/sequencer_runtime.rs | 145 ++++++++++++++++++ 3 files changed, 189 insertions(+) create mode 100644 src/kernel_sequencer/src/delayed_inbox.rs create mode 100644 src/kernel_sequencer/src/sequencer_runtime.rs diff --git a/src/kernel_sequencer/src/delayed_inbox.rs b/src/kernel_sequencer/src/delayed_inbox.rs new file mode 100644 index 000000000000..21395d668426 --- /dev/null +++ b/src/kernel_sequencer/src/delayed_inbox.rs @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2023 Marigold +// +// SPDX-License-Identifier: MIT + +use tezos_smart_rollup_host::{ + input::Message, + runtime::{Runtime, RuntimeError}, +}; + +/// Return a message from the inbox +/// +/// This function drives the delayed inbox: +/// - add messages to the delayed inbox +/// - process messages from the sequencer +/// - returns message as "normal" message to the user kernel +pub fn read_input(host: &mut Host) -> Result, RuntimeError> { + host.read_input() +} + +#[cfg(test)] +mod tests { + use tezos_smart_rollup_mock::MockHost; + + use super::read_input; + + #[test] + fn test_read_input() { + let mut mock_host = MockHost::default(); + mock_host.add_external(16); + mock_host.add_external(16); + mock_host.add_external(16); + + let _ = read_input(&mut mock_host).unwrap().unwrap(); + let _ = read_input(&mut mock_host).unwrap().unwrap(); + let _ = read_input(&mut mock_host).unwrap().unwrap(); + + let res = read_input(&mut mock_host).unwrap(); + + assert!(res.is_none()); + } +} diff --git a/src/kernel_sequencer/src/lib.rs b/src/kernel_sequencer/src/lib.rs index db1be92a0461..2e9db9e4ce30 100644 --- a/src/kernel_sequencer/src/lib.rs +++ b/src/kernel_sequencer/src/lib.rs @@ -1,3 +1,6 @@ // SPDX-FileCopyrightText: 2023 Marigold // // SPDX-License-Identifier: MIT + +mod delayed_inbox; +pub mod sequencer_runtime; diff --git a/src/kernel_sequencer/src/sequencer_runtime.rs b/src/kernel_sequencer/src/sequencer_runtime.rs new file mode 100644 index 000000000000..2ff1d560f377 --- /dev/null +++ b/src/kernel_sequencer/src/sequencer_runtime.rs @@ -0,0 +1,145 @@ +// SPDX-FileCopyrightText: 2023 Marigold +// +// SPDX-License-Identifier: MIT + +use tezos_smart_rollup_core::PREIMAGE_HASH_SIZE; +use tezos_smart_rollup_host::{ + input::Message, + metadata::RollupMetadata, + path::Path, + runtime::{Runtime, RuntimeError, ValueType}, +}; + +use crate::delayed_inbox::read_input; + +pub struct SequencerRuntime +where + R: Runtime, +{ + host: R, +} + +/// Runtime that handles the delayed inbox and the sequencer protocol. +/// +/// The sequencer protocol is driven by the call of the read_input function. +/// That's why all the other functions of this runtime are calling the runtime passed in parameter. +impl SequencerRuntime +where + R: Runtime, +{ + pub fn new(host: R) -> Self { + Self { host } + } +} + +impl Runtime for SequencerRuntime +where + R: Runtime, +{ + fn write_output(&mut self, from: &[u8]) -> Result<(), RuntimeError> { + self.host.write_output(from) + } + + fn write_debug(&self, msg: &str) { + self.host.write_debug(msg) + } + + fn read_input(&mut self) -> Result, RuntimeError> { + read_input(&mut self.host) + } + + fn store_has(&self, path: &T) -> Result, RuntimeError> { + self.host.store_has(path) + } + + fn store_read( + &self, + path: &T, + from_offset: usize, + max_bytes: usize, + ) -> Result, RuntimeError> { + self.host.store_read(path, from_offset, max_bytes) + } + + fn store_read_slice( + &self, + path: &T, + from_offset: usize, + buffer: &mut [u8], + ) -> Result { + self.host.store_read_slice(path, from_offset, buffer) + } + + fn store_write( + &mut self, + path: &T, + src: &[u8], + at_offset: usize, + ) -> Result<(), RuntimeError> { + self.host.store_write(path, src, at_offset) + } + + fn store_delete(&mut self, path: &T) -> Result<(), RuntimeError> { + self.host.store_delete(path) + } + + fn store_count_subkeys(&self, prefix: &T) -> Result { + self.host.store_count_subkeys(prefix) + } + + fn store_move( + &mut self, + from_path: &impl Path, + to_path: &impl Path, + ) -> Result<(), RuntimeError> { + self.host.store_move(from_path, to_path) + } + + fn store_copy( + &mut self, + from_path: &impl Path, + to_path: &impl Path, + ) -> Result<(), RuntimeError> { + self.host.store_copy(from_path, to_path) + } + + fn reveal_preimage( + &self, + hash: &[u8; PREIMAGE_HASH_SIZE], + destination: &mut [u8], + ) -> Result { + self.host.reveal_preimage(hash, destination) + } + + fn store_value_size(&self, path: &impl Path) -> Result { + self.host.store_value_size(path) + } + + fn mark_for_reboot(&mut self) -> Result<(), RuntimeError> { + self.host.mark_for_reboot() + } + + fn reveal_metadata(&self) -> Result { + self.host.reveal_metadata() + } + + fn last_run_aborted(&self) -> Result { + self.host.last_run_aborted() + } + + fn upgrade_failed(&self) -> Result { + self.host.upgrade_failed() + } + + fn restart_forced(&self) -> Result { + self.host.restart_forced() + } + + fn reboot_left(&self) -> Result { + self.host.reboot_left() + } + + fn runtime_version(&self) -> Result { + self.host.runtime_version() + } +} -- GitLab From de3db02388de80c3d627619b06909c5787614501 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Fri, 5 May 2023 10:53:54 +0200 Subject: [PATCH 4/4] kernel/sequencer: sequencer framework macro --- src/kernel_sequencer/src/lib.rs | 1 + src/kernel_sequencer/src/sequencer_macro.rs | 30 +++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/kernel_sequencer/src/sequencer_macro.rs diff --git a/src/kernel_sequencer/src/lib.rs b/src/kernel_sequencer/src/lib.rs index 2e9db9e4ce30..7f624c19796f 100644 --- a/src/kernel_sequencer/src/lib.rs +++ b/src/kernel_sequencer/src/lib.rs @@ -3,4 +3,5 @@ // SPDX-License-Identifier: MIT mod delayed_inbox; +mod sequencer_macro; pub mod sequencer_runtime; diff --git a/src/kernel_sequencer/src/sequencer_macro.rs b/src/kernel_sequencer/src/sequencer_macro.rs new file mode 100644 index 000000000000..a14822b82ad5 --- /dev/null +++ b/src/kernel_sequencer/src/sequencer_macro.rs @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2023 Marigold +// +// SPDX-License-Identifier: MIT + +/// Derive `kernel_run` entrypoint. +/// +/// ```no_run +/// # use tezos_smart_rollup_host::runtime::Runtime; +/// use kernel_sequencer::sequencer_kernel_entry; +/// +/// fn run(host: &mut Host) { +/// host.write_debug("Hello Kernel"); +/// } +/// +/// sequencer_kernel_entry!(run); +/// ``` +#[macro_export] +macro_rules! sequencer_kernel_entry { + ($kernel_run: expr) => { + /// The `kernel_run` function is called by the wasm host at regular intervals. + #[cfg(target_arch = "wasm32")] + #[no_mangle] + pub extern "C" fn kernel_run() { + use tezos_smart_rollup::core_unsafe::rollup_host::RollupHost; + let host = unsafe { RollupHost::new() }; // Runtime from the tezos sdk + let mut host = $crate::sequencer_runtime::SequencerRuntime::new(host); // create a sequencer runtime that use the RollupHost runtime + $kernel_run(&mut host) + } + }; +} -- GitLab