From 8f927de634d5cb65f3c4e3cd7e873bbe7c35b5cf Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Tue, 2 May 2023 11:57:07 +0200 Subject: [PATCH 1/2] kernel/sequencer: add an input predicate --- src/kernel_sequencer/Cargo.lock | 456 ++++++++++++++++-- src/kernel_sequencer/Cargo.toml | 7 + src/kernel_sequencer/src/delayed_inbox.rs | 45 +- src/kernel_sequencer/src/lib.rs | 3 + src/kernel_sequencer/src/routing.rs | 252 ++++++++++ src/kernel_sequencer/src/sequencer_macro.rs | 2 +- src/kernel_sequencer/src/sequencer_runtime.rs | 13 +- 7 files changed, 717 insertions(+), 61 deletions(-) create mode 100644 src/kernel_sequencer/src/routing.rs diff --git a/src/kernel_sequencer/Cargo.lock b/src/kernel_sequencer/Cargo.lock index 49be2c7f759b..424518cae333 100644 --- a/src/kernel_sequencer/Cargo.lock +++ b/src/kernel_sequencer/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aho-corasick" -version = "0.7.15" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" dependencies = [ "memchr", ] @@ -41,12 +41,27 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + [[package]] name = "bit-vec" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitvec" version = "1.0.1" @@ -253,6 +268,36 @@ dependencies = [ "zeroize", ] +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "ff" version = "0.10.1" @@ -269,6 +314,12 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "funty" version = "2.0.0" @@ -285,6 +336,28 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + [[package]] name = "glob" version = "0.3.1" @@ -320,6 +393,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.4.3" @@ -336,6 +415,26 @@ dependencies = [ "digest 0.9.0", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "itoa" version = "1.0.6" @@ -347,8 +446,10 @@ name = "kernel-sequencer" version = "0.1.0" dependencies = [ "tezos-smart-rollup-core", + "tezos-smart-rollup-encoding", "tezos-smart-rollup-host", "tezos-smart-rollup-mock", + "tezos_crypto_rs", ] [[package]] @@ -359,9 +460,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" [[package]] name = "libm" @@ -369,6 +470,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" +[[package]] +name = "libm" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" + [[package]] name = "libsecp256k1" version = "0.7.1" @@ -383,6 +490,7 @@ dependencies = [ "libsecp256k1-gen-genmult", "rand 0.8.5", "serde", + "sha2 0.9.9", ] [[package]] @@ -414,11 +522,17 @@ dependencies = [ "libsecp256k1-core", ] +[[package]] +name = "linux-raw-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" + [[package]] name = "memchr" -version = "2.3.4" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "minimal-lexical" @@ -445,6 +559,7 @@ dependencies = [ "autocfg", "num-integer", "num-traits", + "rand 0.7.3", "serde", ] @@ -465,6 +580,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", + "libm 0.2.7", ] [[package]] @@ -473,7 +589,7 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] @@ -507,7 +623,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" dependencies = [ "cfg-if", - "libm", + "libm 0.1.4", ] [[package]] @@ -531,7 +647,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "regex-syntax", + "regex-syntax 0.6.29", "syn 1.0.109", ] @@ -549,18 +665,51 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "c4ec6d5fe0b140acb27c9a0444118cf55bfbb4e0b259739429abb4521dd67c16" dependencies = [ "unicode-ident", ] +[[package]] +name = "proptest" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29f1b898011ce9595050a68e60f90bad083ff2987a695a42357134c8381fba70" +dependencies = [ + "bit-set", + "bitflags", + "byteorder", + "lazy_static", + "num-traits", + "quick-error 2.0.1", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax 0.6.29", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quote" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" dependencies = [ "proc-macro2", ] @@ -577,7 +726,9 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "rand_chacha", + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", "rand_core 0.5.1", "rand_hc", ] @@ -588,6 +739,8 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ + "libc", + "rand_chacha 0.3.1", "rand_core 0.6.4", ] @@ -601,17 +754,33 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + [[package]] name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.9", +] [[package]] name = "rand_hc" @@ -622,15 +791,33 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + [[package]] name = "regex" -version = "1.4.6" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a26af418b574bd56588335b3a3659a65725d4e636eb1016c2f9e3b38c7cc759" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.1", ] [[package]] @@ -639,24 +826,56 @@ version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +[[package]] +name = "regex-syntax" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" + +[[package]] +name = "rustix" +version = "0.37.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error 1.2.3", + "tempfile", + "wait-timeout", +] + [[package]] name = "serde" -version = "1.0.162" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.162" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -736,9 +955,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" dependencies = [ "proc-macro2", "quote", @@ -751,6 +970,19 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "tempfile" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall", + "rustix", + "windows-sys 0.45.0", +] + [[package]] name = "tezos-smart-rollup-core" version = "0.1.0" @@ -811,6 +1043,7 @@ dependencies = [ "num-bigint", "num-traits", "p256", + "proptest", "rand 0.7.3", "serde", "strum", @@ -869,7 +1102,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] [[package]] @@ -883,9 +1116,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.20" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" dependencies = [ "itoa", "serde", @@ -895,15 +1128,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" dependencies = [ "time-core", ] @@ -914,6 +1147,12 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-ident" version = "1.0.8" @@ -932,6 +1171,27 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "which" version = "4.4.0" @@ -943,6 +1203,138 @@ dependencies = [ "once_cell", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + [[package]] name = "wyz" version = "0.5.1" @@ -969,5 +1361,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.16", ] diff --git a/src/kernel_sequencer/Cargo.toml b/src/kernel_sequencer/Cargo.toml index 27340e0a7ddf..a5c5b67a6a3f 100644 --- a/src/kernel_sequencer/Cargo.toml +++ b/src/kernel_sequencer/Cargo.toml @@ -20,3 +20,10 @@ version = "0.1.0" [dev-dependencies.tezos-smart-rollup-mock] path = "../kernel_sdk/mock" version = "0.1.0" + +[dev-dependencies.tezos-smart-rollup-encoding] +path = "../kernel_sdk/encoding" +version = "0.1.0" + +[dev-dependencies.tezos_crypto_rs] +version = "0.5.0" diff --git a/src/kernel_sequencer/src/delayed_inbox.rs b/src/kernel_sequencer/src/delayed_inbox.rs index 21395d668426..50b5a2553ae2 100644 --- a/src/kernel_sequencer/src/delayed_inbox.rs +++ b/src/kernel_sequencer/src/delayed_inbox.rs @@ -4,38 +4,35 @@ use tezos_smart_rollup_host::{ input::Message, + metadata::RollupMetadata, runtime::{Runtime, RuntimeError}, }; +use crate::routing::FilterBehavior; + /// 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()); +pub fn read_input( + host: &mut Host, + filter_behavior: FilterBehavior, +) -> Result, RuntimeError> { + let RollupMetadata { + raw_rollup_address, .. + } = host.reveal_metadata()?; + loop { + let msg = host.read_input()?; + match msg { + None => return Ok(None), // No more messages to be processed + Some(msg) => { + let payload = msg.as_ref(); + if filter_behavior.predicate(payload, &raw_rollup_address) { + return Ok(Some(msg)); // The message is needed by the kernel so it's returned + } + } + } } } diff --git a/src/kernel_sequencer/src/lib.rs b/src/kernel_sequencer/src/lib.rs index 7f624c19796f..d3dbac3fdb12 100644 --- a/src/kernel_sequencer/src/lib.rs +++ b/src/kernel_sequencer/src/lib.rs @@ -3,5 +3,8 @@ // SPDX-License-Identifier: MIT mod delayed_inbox; +pub mod routing; mod sequencer_macro; pub mod sequencer_runtime; + +pub use routing::FilterBehavior; diff --git a/src/kernel_sequencer/src/routing.rs b/src/kernel_sequencer/src/routing.rs new file mode 100644 index 000000000000..ae13c0f16eba --- /dev/null +++ b/src/kernel_sequencer/src/routing.rs @@ -0,0 +1,252 @@ +// SPDX-FileCopyrightText: 2023 Marigold +// +// SPDX-License-Identifier: MIT + +#[derive(Clone, Copy)] +pub enum FilterBehavior { + /// All Internal/External messages will be added to the delayed inbox. + AllowAll, + /// All Internal messages will be added to the delayed inbox. + /// Transfer will be added only if the destination is the current rollup. + /// External messages have to use the framing protocol. + OnlyThisRollup, +} + +impl FilterBehavior { + /// Indicate if a message has to be included in the delayed inbox or not. + pub fn predicate(&self, payload: &[u8], rollup_address: &[u8]) -> bool { + match self { + FilterBehavior::AllowAll => true, + FilterBehavior::OnlyThisRollup => match payload { + [] => unreachable!("All messages contain an internal/external tag"), + // If it's a transfer then the last n bytes should be the rollup address + [0x00, 0x00, transfer @ ..] => transfer.ends_with(rollup_address), + // All protocol-injected internal messages are sent to the kernel + [0x00, ..] => true, + // Base case for external message framing protocol + [0x01, 0x00, remaining @ ..] => remaining.starts_with(rollup_address), + // Unknown encoding + _ => false, + }, + } + } +} + +#[cfg(test)] +mod tests { + use tezos_crypto_rs::hash::{BlockHash, ContractKt1Hash, HashTrait}; + use tezos_smart_rollup_encoding::{ + inbox::{InboxMessage, InfoPerLevel, InternalInboxMessage, Transfer}, + michelson::MichelsonUnit, + public_key_hash::PublicKeyHash, + smart_rollup::SmartRollupAddress, + timestamp::Timestamp, + }; + + use super::FilterBehavior; + + fn address() -> SmartRollupAddress { + SmartRollupAddress::from_b58check("sr1UNDWPUYVeomgG15wn5jSw689EJ4RNnVQa") + .expect("decoding should work") + } + + fn other_address() -> SmartRollupAddress { + SmartRollupAddress::from_b58check("sr1UXY5i5Z1sF8xd8ZUyzur827MAaFWREzvj") + .expect("decoding should work") + } + + fn start_of_level() -> Vec { + let start_of_level = + InboxMessage::::Internal(InternalInboxMessage::StartOfLevel); + let mut encoded = Vec::new(); + start_of_level + .serialize(&mut encoded) + .expect("encoding should work"); + encoded + } + + fn end_of_level() -> Vec { + let end_of_level = + InboxMessage::::Internal(InternalInboxMessage::EndOfLevel); + let mut encoded = Vec::new(); + end_of_level + .serialize(&mut encoded) + .expect("encoding should work"); + encoded + } + + fn info_per_level() -> Vec { + let predecessor = + BlockHash::from_base58_check("BLockGenesisGenesisGenesisGenesisGenesisb83baZgbyZe") + .expect("decoding should work"); + + let info_per_level = InfoPerLevel { + predecessor_timestamp: Timestamp::from(0), + predecessor, + }; + + let info_per_level = InboxMessage::::Internal( + InternalInboxMessage::InfoPerLevel(info_per_level), + ); + let mut encoded = Vec::new(); + info_per_level + .serialize(&mut encoded) + .expect("encoding should work"); + encoded + } + + fn transfer(rollup_address: &SmartRollupAddress) -> Vec { + let transfer = Transfer { + payload: MichelsonUnit {}, + sender: ContractKt1Hash::from_b58check("KT1NRLjyE7wxeSZ6La6DfuhSKCAAnc9Lnvdg") + .expect("decoding should work"), + source: PublicKeyHash::from_b58check("tz1bonDYXPijpBMA2kntUr87VqNe3oaLzpP1") + .expect("decoding should work"), + destination: rollup_address.clone(), + }; + + let transfer = + InboxMessage::::Internal(InternalInboxMessage::Transfer(transfer)); + let mut encoded = Vec::new(); + transfer + .serialize(&mut encoded) + .expect("encoding should work"); + encoded + } + + fn predicate(filter: FilterBehavior, msg: &[u8], rollup_address: &SmartRollupAddress) -> bool { + let rollup_address_bytes = rollup_address.hash().as_ref(); + filter.predicate(msg, rollup_address_bytes) + } + + #[test] + fn test_allow_all_start_of_level() { + assert!(predicate( + FilterBehavior::AllowAll, + &start_of_level(), + &address(), + )); + } + + #[test] + fn test_allow_all_end_of_level() { + assert!(predicate( + FilterBehavior::AllowAll, + &end_of_level(), + &address(), + )); + } + + #[test] + fn test_allow_all_info_per_level() { + assert!(predicate( + FilterBehavior::AllowAll, + &info_per_level(), + &address(), + )); + } + + #[test] + fn test_allow_all_transfer() { + assert!(predicate( + FilterBehavior::AllowAll, + &transfer(&address()), + &address(), + )); + } + + #[test] + fn test_allow_all_external() { + let external = [0x01, 0x0, 0x0]; + assert!(predicate(FilterBehavior::AllowAll, &external, &address(),)); + } + + #[test] + fn test_only_this_rollup_start_of_level() { + assert!(predicate( + FilterBehavior::OnlyThisRollup, + &start_of_level(), + &address(), + )); + } + + #[test] + fn test_only_this_rollup_info_per_level() { + assert!(predicate( + FilterBehavior::OnlyThisRollup, + &info_per_level(), + &address(), + )); + } + + #[test] + fn test_only_this_rollup_end_of_level() { + assert!(predicate( + FilterBehavior::OnlyThisRollup, + &end_of_level(), + &address(), + )); + } + + #[test] + fn test_only_this_rollup_accept_transfer() { + assert!(predicate( + FilterBehavior::OnlyThisRollup, + &transfer(&address()), + &address(), + )); + } + + #[test] + fn test_only_this_rollup_refuse_transfer() { + assert!(!predicate( + FilterBehavior::OnlyThisRollup, + &transfer(&other_address()), + &address(), + )); + } + + #[test] + fn test_only_this_rollup_accept_external() { + // The external message starts by 0x01, 0x0 because we are using the framing protocol + let mut external = vec![0x01, 0x0]; + let rollup_address = address(); + let mut rollup_address = rollup_address.hash().as_ref().clone(); + external.append(&mut rollup_address); + + assert!(predicate( + FilterBehavior::OnlyThisRollup, + &external, + &address(), + )); + } + + #[test] + fn test_only_this_rollup_refuse_external() { + let mut external = vec![0x01, 0x0]; + let rollup_address = other_address(); + let mut rollup_address = rollup_address.hash().as_ref().clone(); + external.append(&mut rollup_address); + + assert!(!predicate( + FilterBehavior::OnlyThisRollup, + &external, + &address(), + )); + } + + #[test] + fn test_only_this_rollup_refuse_unknown_external_framing_protocol() { + // Unknown framing protocol + let mut external = vec![0x01, 0x99]; + let rollup_address = other_address(); + let mut rollup_address = rollup_address.hash().as_ref().clone(); + external.append(&mut rollup_address); + + assert!(!predicate( + FilterBehavior::OnlyThisRollup, + &external, + &address(), + )); + } +} diff --git a/src/kernel_sequencer/src/sequencer_macro.rs b/src/kernel_sequencer/src/sequencer_macro.rs index a14822b82ad5..f17d17de2fd9 100644 --- a/src/kernel_sequencer/src/sequencer_macro.rs +++ b/src/kernel_sequencer/src/sequencer_macro.rs @@ -23,7 +23,7 @@ macro_rules! sequencer_kernel_entry { 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 + let mut host = $crate::sequencer_runtime::SequencerRuntime::new(host, |bytes| true); // create a sequencer runtime that use the RollupHost runtime $kernel_run(&mut host) } }; diff --git a/src/kernel_sequencer/src/sequencer_runtime.rs b/src/kernel_sequencer/src/sequencer_runtime.rs index 2ff1d560f377..8568c491cac3 100644 --- a/src/kernel_sequencer/src/sequencer_runtime.rs +++ b/src/kernel_sequencer/src/sequencer_runtime.rs @@ -10,13 +10,15 @@ use tezos_smart_rollup_host::{ runtime::{Runtime, RuntimeError, ValueType}, }; -use crate::delayed_inbox::read_input; +use crate::{delayed_inbox::read_input, routing::FilterBehavior}; pub struct SequencerRuntime where R: Runtime, { host: R, + /// if true then the input is added to the delayed inbox + input_predicate: FilterBehavior, } /// Runtime that handles the delayed inbox and the sequencer protocol. @@ -27,8 +29,11 @@ impl SequencerRuntime where R: Runtime, { - pub fn new(host: R) -> Self { - Self { host } + pub fn new(host: R, input_predicate: FilterBehavior) -> Self { + Self { + host, + input_predicate, + } } } @@ -45,7 +50,7 @@ where } fn read_input(&mut self) -> Result, RuntimeError> { - read_input(&mut self.host) + read_input(&mut self.host, self.input_predicate) } fn store_has(&self, path: &T) -> Result, RuntimeError> { -- GitLab From b806a2406251b9eddd5f7269b68d1ca86d142e09 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Tue, 9 May 2023 11:04:57 +0200 Subject: [PATCH 2/2] kernel/sequencer: add input predicate to macro --- src/kernel_sequencer/src/sequencer_macro.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/kernel_sequencer/src/sequencer_macro.rs b/src/kernel_sequencer/src/sequencer_macro.rs index f17d17de2fd9..fe7d28c46946 100644 --- a/src/kernel_sequencer/src/sequencer_macro.rs +++ b/src/kernel_sequencer/src/sequencer_macro.rs @@ -16,15 +16,18 @@ /// ``` #[macro_export] macro_rules! sequencer_kernel_entry { - ($kernel_run: expr) => { + ($kernel_run: expr, $filter_behavior: 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, |bytes| true); // create a sequencer runtime that use the RollupHost runtime + let mut host = $crate::sequencer_runtime::SequencerRuntime::new(host, $filter_behavior); // create a sequencer runtime that use the RollupHost runtime $kernel_run(&mut host) } }; + ($kernel_run: expr) => { + sequencer_kernel_entry!($kernel_run, $crate::routing::FilterBehavior::AllowAll); + }; } -- GitLab