From 81ceccd1d117d689193a51e3b208bfdc319e4944 Mon Sep 17 00:00:00 2001 From: martoon Date: Tue, 31 Oct 2023 13:54:45 +0400 Subject: [PATCH 1/2] MIR: Fill implementation for numbers For now I just used conversion logic from `tezos_data_encoding` package, because I already depend on this package in MRs about rollups. --- contrib/mir/Cargo.lock | 118 ++++++++++++++++++++++++++- contrib/mir/Cargo.toml | 1 + contrib/mir/src/serializer/encode.rs | 62 +++++++++++++- 3 files changed, 178 insertions(+), 3 deletions(-) diff --git a/contrib/mir/Cargo.lock b/contrib/mir/Cargo.lock index e59f9023f67c..8efd202f581a 100644 --- a/contrib/mir/Cargo.lock +++ b/contrib/mir/Cargo.lock @@ -89,6 +89,18 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "block-buffer" version = "0.9.0" @@ -405,6 +417,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "generic-array" version = "0.14.7" @@ -686,6 +704,12 @@ version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "mir" version = "0.1.0" @@ -698,6 +722,7 @@ dependencies = [ "lalrpop-util", "logos", "tezos_crypto_rs", + "tezos_data_encoding", "thiserror", "typed-arena", ] @@ -708,6 +733,16 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-bigint" version = "0.3.3" @@ -797,6 +832,31 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "parse-display" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7271152b3c46c07c729698e7a5248e2744466b3446d222c97a0b1315925a97b1" +dependencies = [ + "once_cell", + "parse-display-derive", + "regex", +] + +[[package]] +name = "parse-display-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6a9f3e41b237b77c99c09686481c235964ff5878229412b226c451f3e809f4f" +dependencies = [ + "once_cell", + "proc-macro2", + "quote", + "regex", + "regex-syntax 0.6.29", + "syn 1.0.109", +] + [[package]] name = "petgraph" version = "0.6.4" @@ -884,6 +944,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.7.3" @@ -1211,6 +1277,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" version = "3.8.0" @@ -1237,9 +1309,9 @@ dependencies = [ [[package]] name = "tezos_crypto_rs" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576b69129eabf1edca392ff5e763610d448275fd2724d05464bb3542829c6d64" +checksum = "284fa6f4be10eff67ca5b2f9e8ec9544be81a07223f6a4c8d3a49a13aecce768" dependencies = [ "anyhow", "base58 0.1.0", @@ -1261,6 +1333,39 @@ dependencies = [ "zeroize", ] +[[package]] +name = "tezos_data_encoding" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66c34be797025fcab7a9e417a4cc374925ee796af21f8d7df5e2330cdc2595af" +dependencies = [ + "bit-vec", + "bitvec", + "hex", + "lazy_static", + "nom", + "num-bigint", + "num-traits", + "serde", + "tezos_crypto_rs", + "tezos_data_encoding_derive", + "thiserror", +] + +[[package]] +name = "tezos_data_encoding_derive" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e0c104555ce4d8c790567d725dc49f519d721e114202e38e851c1ac5769f08" +dependencies = [ + "lazy_static", + "once_cell", + "parse-display", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "thiserror" version = "1.0.48" @@ -1462,6 +1567,15 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zeroize" version = "1.6.0" diff --git a/contrib/mir/Cargo.toml b/contrib/mir/Cargo.toml index 5414324dbfd0..7d4d25bfdb28 100644 --- a/contrib/mir/Cargo.toml +++ b/contrib/mir/Cargo.toml @@ -9,6 +9,7 @@ lalrpop = "0.20.0" [dependencies] lalrpop-util = "0.20.0" checked = "0.5" +tezos_data_encoding = "0.5.1" thiserror = "1.0" logos = "0.13" hex = "0.4" diff --git a/contrib/mir/src/serializer/encode.rs b/contrib/mir/src/serializer/encode.rs index b68f66d1ef21..a1c7c858610b 100644 --- a/contrib/mir/src/serializer/encode.rs +++ b/contrib/mir/src/serializer/encode.rs @@ -8,12 +8,15 @@ //! Micheline serialization. use std::mem::size_of; +use tezos_data_encoding::{enc::BinWriter, types::Zarith}; use crate::{ ast::{annotations::Annotations, Micheline}, lexer::{Annotation, Prim}, }; +/// Prefix denoting an encoded number. +const NUMBER_TAG: u8 = 0x00; /// Prefix denoting an encoded string. const STRING_TAG: u8 = 0x01; /// Prefix denoting an encoded sequence. @@ -158,7 +161,12 @@ fn put_seq(list: &[V], out: &mut Vec, encoder: fn(&V, &mut Vec)) { fn encode_micheline(mich: &Micheline, out: &mut Vec) { use Micheline::*; match mich { - Int(_) => todo!(), // for a later MR + Int(n) => { + let z = Zarith((*n).into()); + out.push(NUMBER_TAG); + z.bin_write(out) + .unwrap_or_else(|err| panic!("Encoding zarith number unexpectedly failed: {err}")) + } String(s) => put_string(s, out), Bytes(b) => put_bytes(b, out), Seq(s) => put_seq(s, out, encode_micheline), @@ -212,6 +220,58 @@ mod test_encoding { check(false, "0x0303"); } + mod number { + use super::*; + + #[test] + fn zero() { + check(0, "0x0000"); + } + + #[test] + fn few_trivial_samples() { + check(1, "0x0001"); + check(13, "0x000d"); + } + + #[test] + fn largest_1_byte_long() { + check(63, "0x003f"); + } + + #[test] + fn smallest_2_bytes_long() { + check(64, "0x008001"); + } + + #[test] + fn large() { + check(123456789, "0x0095b4de75"); + } + + #[test] + fn negative() { + check(-1, "0x0041"); + check(-36, "0x0064"); + } + + // Don't mind this "largest", it is in absolute numeric value sense + #[test] + fn negative_largest_1_byte_long() { + check(-63, "0x007f"); + } + + #[test] + fn negative_smallest_2_bytes_long() { + check(-64, "0x00c001"); + } + + #[test] + fn negative_large() { + check(-987654321, "0x00f1a2f3ad07"); + } + } + #[test] fn simple_nested() { check(app!(Pair[true, ""]), "0x0707030a0100000000"); -- GitLab From 7eeed74115a8b68efd45f6e9392e8320e0158b36 Mon Sep 17 00:00:00 2001 From: martoon Date: Tue, 21 Nov 2023 19:50:39 +0400 Subject: [PATCH 2/2] MIR: Add BinWriter instance for Micheline --- contrib/mir/src/serializer/encode.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/contrib/mir/src/serializer/encode.rs b/contrib/mir/src/serializer/encode.rs index a1c7c858610b..4f8bae38d7d4 100644 --- a/contrib/mir/src/serializer/encode.rs +++ b/contrib/mir/src/serializer/encode.rs @@ -190,6 +190,13 @@ impl<'a> Micheline<'a> { } } +impl<'a> BinWriter for Micheline<'a> { + fn bin_write(&self, out: &mut Vec) -> tezos_data_encoding::enc::BinResult { + encode_micheline(self, out); + Ok(()) + } +} + #[cfg(test)] mod test_encoding { use super::*; -- GitLab