diff --git a/contrib/mir/Cargo.lock b/contrib/mir/Cargo.lock index bea2b2f36efec0df9e88f5c003e71ebd50205ed5..7b2e2389dda373b6629d5e9b0e1a9726fbf3de1a 100644 --- a/contrib/mir/Cargo.lock +++ b/contrib/mir/Cargo.lock @@ -25,9 +25,9 @@ checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "ascii-canvas" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +checksum = "ef1e3e699d84ab1b0911a1010c5c106aa34ae89aeac103be5ce0c3859db1e891" dependencies = [ "term", ] @@ -38,12 +38,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" -[[package]] -name = "base58" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" - [[package]] name = "base58" version = "0.2.0" @@ -68,7 +62,16 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ - "bit-vec", + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", ] [[package]] @@ -77,6 +80,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitflags" version = "2.6.0" @@ -126,6 +135,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -266,27 +284,6 @@ dependencies = [ "crypto-common", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "ecdsa" version = "0.12.4" @@ -461,9 +458,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -517,21 +514,30 @@ dependencies = [ [[package]] name = "itertools" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + [[package]] name = "lalrpop" -version = "0.20.2" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" +checksum = "06093b57658c723a21da679530e061a8c25340fa5a6f98e313b542268c7e2a1f" dependencies = [ "ascii-canvas", - "bit-set", + "bit-set 0.8.0", "ena", "itertools", "lalrpop-util", @@ -539,20 +545,21 @@ dependencies = [ "pico-args", "regex", "regex-syntax 0.8.4", + "sha3", "string_cache", "term", - "tiny-keccak", "unicode-xid", "walkdir", ] [[package]] name = "lalrpop-util" -version = "0.20.2" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" +checksum = "feee752d43abd0f4807a921958ab4131f692a44d4d599733d4419c5d586176ce" dependencies = [ "regex-automata", + "rustversion", ] [[package]] @@ -573,16 +580,6 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags", - "libc", -] - [[package]] name = "libsecp256k1" version = "0.7.1" @@ -652,32 +649,33 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "logos" -version = "0.13.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c000ca4d908ff18ac99b93a062cb8958d331c3220719c52e77cb19cc6ac5d2c1" +checksum = "1c6b6e02facda28ca5fb8dbe4b152496ba3b1bd5a4b40bb2b1b2d8ad74e0f39b" dependencies = [ "logos-derive", ] [[package]] name = "logos-codegen" -version = "0.13.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc487311295e0002e452025d6b580b77bb17286de87b57138f3b5db711cded68" +checksum = "b32eb6b5f26efacd015b000bfc562186472cd9b34bdba3f6b264e2a052676d10" dependencies = [ "beef", "fnv", + "lazy_static", "proc-macro2", "quote", - "regex-syntax 0.6.29", + "regex-syntax 0.8.4", "syn 2.0.69", ] [[package]] name = "logos-derive" -version = "0.13.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbfc0d229f1f42d790440136d941afd806bc9e949e2bcb8faa813b0f00d1267e" +checksum = "3e5d0c5463c911ef55624739fc353238b4e310f0144be1f875dc42fec6bfd5ec" dependencies = [ "logos-codegen", ] @@ -698,7 +696,7 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" name = "mir" version = "0.1.0" dependencies = [ - "base58 0.2.0", + "base58", "bitvec", "blst", "checked", @@ -714,8 +712,8 @@ dependencies = [ "num-traits", "proptest", "smallvec", - "strum 0.25.0", - "strum_macros 0.25.3", + "strum 0.26.3", + "strum_macros 0.26.4", "tezos_crypto_rs", "tezos_data_encoding", "thiserror", @@ -740,11 +738,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.3.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", "serde", @@ -902,8 +899,8 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ - "bit-set", - "bit-vec", + "bit-set 0.5.3", + "bit-vec 0.6.3", "bitflags", "lazy_static", "num-traits", @@ -1021,17 +1018,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "redox_users" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" -dependencies = [ - "getrandom", - "libredox", - "thiserror", -] - [[package]] name = "regex" version = "1.10.5" @@ -1172,6 +1158,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + [[package]] name = "signature" version = "1.3.2" @@ -1221,9 +1217,9 @@ checksum = "7318c509b5ba57f18533982607f24070a55d353e90d4cae30c467cdb2ad5ac5c" [[package]] name = "strum" -version = "0.25.0" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" [[package]] name = "strum_macros" @@ -1239,11 +1235,11 @@ dependencies = [ [[package]] name = "strum_macros" -version = "0.25.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "rustversion", @@ -1298,29 +1294,29 @@ dependencies = [ [[package]] name = "term" -version = "0.7.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +checksum = "4df4175de05129f31b80458c6df371a15e7fc3fd367272e6bf938e5c351c7ea0" dependencies = [ - "dirs-next", - "rustversion", - "winapi", + "home", + "windows-sys", ] [[package]] name = "tezos_crypto_rs" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284fa6f4be10eff67ca5b2f9e8ec9544be81a07223f6a4c8d3a49a13aecce768" +checksum = "8954f27b00228b1fc669cddfa0e604a40adc5ee443002d3d31abdea0b911fcb6" dependencies = [ "anyhow", - "base58 0.1.0", "blst", + "bs58", "byteorder", "cryptoxide", "ed25519-dalek", "hex", "libsecp256k1", + "nom", "num-bigint", "num-traits", "p256", @@ -1328,17 +1324,18 @@ dependencies = [ "serde", "strum 0.20.0", "strum_macros 0.20.1", + "tezos_data_encoding", "thiserror", "zeroize", ] [[package]] name = "tezos_data_encoding" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c34be797025fcab7a9e417a4cc374925ee796af21f8d7df5e2330cdc2595af" +checksum = "b1fff433d41c778d27df21b91e766e182b05d9a7c1331e1156ee081273d704a4" dependencies = [ - "bit-vec", + "bit-vec 0.6.3", "bitvec", "hex", "lazy_static", @@ -1346,16 +1343,15 @@ dependencies = [ "num-bigint", "num-traits", "serde", - "tezos_crypto_rs", "tezos_data_encoding_derive", "thiserror", ] [[package]] name = "tezos_data_encoding_derive" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e0c104555ce4d8c790567d725dc49f519d721e114202e38e851c1ac5769f08" +checksum = "f614c81c10c1ac47fdb792ce23e928591fca685d534260e073f83bc5d5f080e0" dependencies = [ "lazy_static", "once_cell", @@ -1395,14 +1391,20 @@ dependencies = [ ] [[package]] -name = "tiny-keccak" -version = "2.0.2" +name = "tinyvec" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ - "crunchy", + "tinyvec_macros", ] +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "typed-arena" version = "2.0.2" @@ -1482,22 +1484,6 @@ dependencies = [ "rustix", ] -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" version = "0.1.8" @@ -1507,12 +1493,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-sys" version = "0.52.0" diff --git a/contrib/mir/Cargo.toml b/contrib/mir/Cargo.toml index 476f82edaa6d06dd0193d19ef668cbddb0846f03..fa3fd930d1e8868a0a32d602c7222e12593df016 100644 --- a/contrib/mir/Cargo.toml +++ b/contrib/mir/Cargo.toml @@ -4,30 +4,30 @@ version = "0.1.0" edition = "2021" [build-dependencies] -lalrpop = "0.20.2" +lalrpop = "0.22.0" [dependencies] -lalrpop-util = "0.20.2" +lalrpop-util = "0.22.0" checked = "0.5" -tezos_data_encoding = "0.5.1" +tezos_data_encoding = "0.6.0" thiserror = "1.0" -logos = "0.13" +logos = "0.14.2" hex = "0.4" -tezos_crypto_rs = { version = "0.5", default-features = false, features = [ +tezos_crypto_rs = { version = "0.6.0", default-features = false, features = [ "bls", ] } typed-arena = "2" base58 = "0.2" cryptoxide = "0.4" -num-bigint = "0.3" +num-bigint = { version = "0.4.6", default-features = false } num-integer = "0.1.46" num-traits = "0.2" chrono = { version = "0.4", default-features = false } integer-sqrt = "0.1" blst = "0.3" bitvec = "1.0" -strum = "0.25" -strum_macros = "0.25" +strum = "0.26.3" +strum_macros = "0.26.4" smallvec = { version = "1.11", features = [ "const_new" ] } [dev-dependencies] diff --git a/contrib/mir/proptest-regressions/ast.txt b/contrib/mir/proptest-regressions/ast.txt new file mode 100644 index 0000000000000000000000000000000000000000..733c6121ef40610e8e23110b566b80693b4ec4ed --- /dev/null +++ b/contrib/mir/proptest-regressions/ast.txt @@ -0,0 +1,7 @@ +# Seeds for failure cases proptest has generated in the past. It is +# automatically read and these particular cases re-run before any +# novel cases are generated. +# +# It is recommended to check this file in to source control so that +# everyone who runs the test benefits from these saved cases. +cc 5a1ca8269e88d6e28cf6eae6a80d563c77f81d2567f363ae1a080e38bc7f4260 # shrinks to typed = TypedValueAndType { ty: Or((Or((Timestamp, Address)), List(KeyHash))), val: Or(Right(List(MichelsonList([KeyHash(Tz1(ContractTz1Hash("tz1Nw5nr152qddEjKT2dKBH8XcBMDAg72iLw"))), KeyHash(Tz1(ContractTz1Hash("tz1Nw5nr152qddEjKT2dKBH8XcBMDAg72iLw")))])))) } diff --git a/contrib/mir/src/ast/michelson_address/address_hash.rs b/contrib/mir/src/ast/michelson_address/address_hash.rs index 98f8a3833869608da2e99b1610245ab27bb92c55..7ff822726556046ca460739f72cd154bd985aa86 100644 --- a/contrib/mir/src/ast/michelson_address/address_hash.rs +++ b/contrib/mir/src/ast/michelson_address/address_hash.rs @@ -14,7 +14,7 @@ use crate::ast::michelson_key_hash::KeyHash; use super::{ByteReprError, ByteReprTrait}; use tezos_crypto_rs::hash::{ - ContractKt1Hash, ContractTz1Hash, ContractTz2Hash, ContractTz3Hash, ContractTz4Hash, Hash, + ContractKt1Hash, ContractTz1Hash, ContractTz2Hash, ContractTz3Hash, ContractTz4Hash, HashTrait, SmartRollupHash, }; @@ -184,7 +184,7 @@ impl ByteReprTrait for AddressHash { fn to_bytes(&self, out: &mut Vec) { use AddressHash::*; - fn originated_account(out: &mut Vec, tag: u8, hash: impl AsRef) { + fn originated_account(out: &mut Vec, tag: u8, hash: impl AsRef<[u8]>) { out.push(tag); out.extend_from_slice(hash.as_ref()); out.extend_from_slice(PADDING_ORIGINATED); diff --git a/contrib/mir/src/ast/michelson_key.rs b/contrib/mir/src/ast/michelson_key.rs index b4103907307800c67664e7eb877d6142b43a85e3..a4491b789b45070b7aa590a0593cf704b767789d 100644 --- a/contrib/mir/src/ast/michelson_key.rs +++ b/contrib/mir/src/ast/michelson_key.rs @@ -8,7 +8,7 @@ //! Representation for typed Michelson `key` values. use tezos_crypto_rs::{ - hash::{Hash, HashTrait, PublicKeyBls, PublicKeyEd25519, PublicKeyP256, PublicKeySecp256k1}, + hash::{HashTrait, PublicKeyBls, PublicKeyEd25519, PublicKeyP256, PublicKeySecp256k1}, PublicKeyWithHash, }; @@ -34,7 +34,7 @@ macro_rules! key_type_and_impls { impl AsRef<[u8]> for Key { fn as_ref(&self) -> &[u8] { match self { - $(Key::$con($ty(h)))|* => h, + $(Key::$con(h) => h.as_ref(),)* } } } @@ -42,7 +42,7 @@ macro_rules! key_type_and_impls { impl From for Vec { fn from(value: Key) -> Self { match value { - $(Key::$con($ty(h)))|* => h, + $(Key::$con(h) => h.as_ref().to_vec(),)* } } } @@ -99,13 +99,11 @@ impl Key { /// Construct a [KeyHash] from the key. Essentially hashes the key. pub fn hash(&self) -> KeyHash { use Key::*; - // unwrap because errors should be literally impossible, any bytestring - // can be hashed, and hash size is constant. match self { - Ed25519(hash) => KeyHash::Tz1(hash.pk_hash().unwrap()), - Secp256k1(hash) => KeyHash::Tz2(hash.pk_hash().unwrap()), - P256(hash) => KeyHash::Tz3(hash.pk_hash().unwrap()), - Bls(hash) => KeyHash::Tz4(hash.pk_hash().unwrap()), + Ed25519(hash) => KeyHash::Tz1(hash.pk_hash()), + Secp256k1(hash) => KeyHash::Tz2(hash.pk_hash()), + P256(hash) => KeyHash::Tz3(hash.pk_hash()), + Bls(hash) => KeyHash::Tz4(hash.pk_hash()), } } } @@ -156,7 +154,7 @@ impl ByteReprTrait for Key { fn to_bytes(&self, out: &mut Vec) { use Key::*; - fn go(out: &mut Vec, tag: u8, hash: impl AsRef) { + fn go(out: &mut Vec, tag: u8, hash: impl AsRef<[u8]>) { out.push(tag); out.extend_from_slice(hash.as_ref()); } diff --git a/contrib/mir/src/ast/michelson_key_hash.rs b/contrib/mir/src/ast/michelson_key_hash.rs index cc98dfffaf7c53299b83cc383ad45c6ac3b47180..dc5dae0411e2f8753637cff40aa526f9393ab69c 100644 --- a/contrib/mir/src/ast/michelson_key_hash.rs +++ b/contrib/mir/src/ast/michelson_key_hash.rs @@ -8,7 +8,7 @@ //! Representation for typed Michelson `key_hash` values. use tezos_crypto_rs::hash::{ - ContractTz1Hash, ContractTz2Hash, ContractTz3Hash, ContractTz4Hash, Hash, HashTrait, + ContractTz1Hash, ContractTz2Hash, ContractTz3Hash, ContractTz4Hash, HashTrait, }; use super::{ByteReprError, ByteReprTrait}; @@ -31,7 +31,7 @@ macro_rules! key_hash_type_and_impls { impl AsRef<[u8]> for KeyHash { fn as_ref(&self) -> &[u8] { match self { - $(KeyHash::$con($ty(h)))|* => h, + $(KeyHash::$con(h) => h.as_ref(),)* } } } @@ -39,7 +39,7 @@ macro_rules! key_hash_type_and_impls { impl From for Vec { fn from(value: KeyHash) -> Self { match value { - $(KeyHash::$con($ty(h)))|* => h, + $(KeyHash::$con(h) => h.as_ref().to_vec(),)* } } } @@ -143,7 +143,7 @@ impl ByteReprTrait for KeyHash { fn to_bytes(&self, out: &mut Vec) { use KeyHash::*; - fn go(out: &mut Vec, tag: u8, hash: impl AsRef) { + fn go(out: &mut Vec, tag: u8, hash: impl AsRef<[u8]>) { out.push(tag); out.extend_from_slice(hash.as_ref()); } diff --git a/contrib/mir/src/ast/michelson_signature.rs b/contrib/mir/src/ast/michelson_signature.rs index 74e5ccf40b833b84bbd81c77f45b3dc734237857..f90dfaa5ecca15eb3e00bc2e8be5d0971ad34a12 100644 --- a/contrib/mir/src/ast/michelson_signature.rs +++ b/contrib/mir/src/ast/michelson_signature.rs @@ -9,7 +9,6 @@ use tezos_crypto_rs::{ base58::*, - blake2b, hash::{self, HashTrait}, hash::{BlsSignature, FromBytesError}, PublicKeySignatureVerifier, @@ -68,7 +67,6 @@ pub trait SignatureTrait: Sized + AsRef<[u8]> { hash.extend_from_slice(Self::BASE58_PREFIX); hash.extend_from_slice(data); hash.to_base58check() - .expect("should always be convertible to base58") } /// Try to construct a signature from its base58-check representation. @@ -97,13 +95,15 @@ macro_rules! defsignature { ($(#[$meta:meta])* $name:ident, $size:literal, $prefix:expr) => { $(#[$meta])* #[derive(Debug, Clone, Eq, PartialOrd, Ord, PartialEq)] - pub struct $name(hash::Signature); + pub struct $name(hash::UnknownSignature); impl SignatureTrait for $name { const BYTE_SIZE: usize = $size; const BASE58_PREFIX: &'static [u8] = &$prefix; // spsig1(99) + // We can unwrap here, as this is supposed to be an unsafe function + // with an alternative to check the size before calling, guaranteeing correctness. fn from_bytes(bs: &[u8]) -> Self { - $name(hash::Signature(bs.to_vec())) + $name(hash::UnknownSignature::try_from(bs.to_vec()).unwrap()) } } @@ -161,7 +161,7 @@ macro_rules! key_type_and_impls { impl AsRef<[u8]> for Signature { fn as_ref(&self) -> &[u8] { match self { - $(Signature::$con($ty(h)) => h.as_ref()),* + $(Signature::$con(h) => h.as_ref(),)* } } } @@ -169,7 +169,7 @@ macro_rules! key_type_and_impls { impl From for Vec { fn from(value: Signature) -> Self { match value { - $(Signature::$con($ty(h)) => h.into()),* + $(Signature::$con(h) => h.as_ref().to_vec(),)* } } } @@ -256,7 +256,7 @@ impl ByteReprTrait for Signature { // BLS signatures are broken in tezos_crypto_rs let raw_bytes = from_b58check(data)?; let bytes = &raw_bytes[4..]; // strip 4-byte prefix - Bls(BlsSignature(bytes.to_vec())) + Bls(BlsSignature::try_from(bytes)?) } else if data.starts_with("sig") { Generic(SignatureTrait::from_b58check(data)?) } else { @@ -316,24 +316,20 @@ impl Signature { pub fn check(&self, key: &super::michelson_key::Key, msg: &[u8]) -> bool { use super::michelson_key::Key; use Signature::*; - fn hash_msg(data: &[u8]) -> Vec { - // error is, in fact, impossible - blake2b::digest_256(data).unwrap() - } match key { Key::Ed25519(key) => match self { - Ed25519(sig) => key.verify_signature(&sig.0, &hash_msg(msg)), - Generic(sig) => key.verify_signature(&sig.0, &hash_msg(msg)), + Ed25519(sig) => key.verify_signature(&sig.0.clone().into(), msg), + Generic(sig) => key.verify_signature(&sig.0.clone().into(), msg), P256(..) | Secp256k1(..) | Bls(..) => Ok(false), }, Key::Secp256k1(key) => match self { - Secp256k1(sig) => key.verify_signature(&sig.0, &hash_msg(msg)), - Generic(sig) => key.verify_signature(&sig.0, &hash_msg(msg)), + Secp256k1(sig) => key.verify_signature(&sig.0.clone().into(), msg), + Generic(sig) => key.verify_signature(&sig.0.clone().into(), msg), P256(..) | Ed25519(..) | Bls(..) => Ok(false), }, Key::P256(key) => match self { - P256(sig) => key.verify_signature(&sig.0, &hash_msg(msg)), - Generic(sig) => key.verify_signature(&sig.0, &hash_msg(msg)), + P256(sig) => key.verify_signature(&sig.0.clone().into(), msg), + Generic(sig) => key.verify_signature(&sig.0.clone().into(), msg), Ed25519(..) | Secp256k1(..) | Bls(..) => Ok(false), }, Key::Bls(key) => match self { diff --git a/contrib/mir/src/context.rs b/contrib/mir/src/context.rs index 9536b371cb070030fabdbc65b966f8ba6f697c20..d3d10f20c5951345f002e40e4e6f326593034d9e 100644 --- a/contrib/mir/src/context.rs +++ b/contrib/mir/src/context.rs @@ -15,7 +15,7 @@ use crate::ast::michelson_key_hash::KeyHash; use crate::gas::Gas; use num_bigint::{BigInt, BigUint}; use std::collections::HashMap; -use tezos_crypto_rs::hash::OperationListHash; +use tezos_crypto_rs::hash::OperationHash; /// [Ctx] includes "outer context" required for typechecking and interpreting /// Michelson. @@ -139,7 +139,7 @@ impl Default for Ctx<'_> { now: 0i32.into(), min_block_time: 1u32.into(), // the default chain id is NetXynUjJNZm7wi, which is also the default chain id of octez-client in mockup mode - chain_id: tezos_crypto_rs::hash::ChainId(vec![0xf3, 0xd4, 0x85, 0x54]), + chain_id: tezos_crypto_rs::hash::ChainId::try_from(vec![0xf3, 0xd4, 0x85, 0x54]).unwrap(), self_address: "KT1BEqzn5Wx8uJrZNvuS9DVHmLvG9td3fDLi".try_into().unwrap(), sender: "KT1BEqzn5Wx8uJrZNvuS9DVHmLvG9td3fDLi".try_into().unwrap(), source: "tz1TSbthBCECxmnABv73icw7yyyvUWFLAoSP".try_into().unwrap(), @@ -148,12 +148,12 @@ impl Default for Ctx<'_> { total_voting_power: 0u32.into(), big_map_storage: Box::new(InMemoryLazyStorage::new()), operation_counter: 0, - operation_group_hash: OperationListHash::from_base58_check( + operation_group_hash: OperationHash::from_base58_check( "onvsLP3JFZia2mzZKWaFuFkWg2L5p3BDUhzh5Kr6CiDDN3rtQ1D", + // "2EouXpxkPGxAvVKCpdCJnfp2wEMWR7Up5DERRZ1Yo99xCLjkCVuq", ) .unwrap() - .0 - .as_slice() + .as_ref() .try_into() .unwrap(), origination_counter: 0, diff --git a/contrib/mir/src/interpreter.rs b/contrib/mir/src/interpreter.rs index 082ebc3ca65dbfd1000e609f2a9d69a0503fd8af..ddbed8cd39ccb039140d26dc5fbf59bc1fbb16a2 100644 --- a/contrib/mir/src/interpreter.rs +++ b/contrib/mir/src/interpreter.rs @@ -6478,15 +6478,15 @@ mod interpreter_tests { #[test] fn contract_address_computation() { - use tezos_crypto_rs::hash::OperationListHash; + use tezos_crypto_rs::hash::OperationHash; assert_eq!( compute_contract_address( - &OperationListHash::from_base58_check( + &OperationHash::from_base58_check( "onvsLP3JFZia2mzZKWaFuFkWg2L5p3BDUhzh5Kr6CiDDN3rtQ1D" ) .unwrap() - .0 + .as_ref() .try_into() .unwrap(), 0 diff --git a/contrib/mir/src/lib.rs b/contrib/mir/src/lib.rs index 474763fad4f7e5194aceba542c921020fdfa9e9c..16f04c092df6e0431d323232aad021184977389b 100644 --- a/contrib/mir/src/lib.rs +++ b/contrib/mir/src/lib.rs @@ -1048,7 +1048,7 @@ mod tests { #[test] fn create_contract() { - use tezos_crypto_rs::hash::OperationListHash; + use tezos_crypto_rs::hash::OperationHash; let mut ctx = Ctx::default(); let cs_mich = parse("{ parameter unit; storage unit; code { DROP; UNIT; NIL operation; PAIR; }}") @@ -1085,12 +1085,11 @@ mod tests { let mut ctx = Ctx::default(); ctx.set_operation_counter(100); ctx.set_origination_counter(0); - ctx.operation_group_hash = OperationListHash::from_base58_check( + ctx.operation_group_hash = OperationHash::from_base58_check( "onvsLP3JFZia2mzZKWaFuFkWg2L5p3BDUhzh5Kr6CiDDN3rtQ1D", ) .unwrap() - .0 - .as_slice() + .as_ref() .try_into() .unwrap(); ctx @@ -1182,7 +1181,7 @@ mod multisig_tests { fn make_ctx<'a>() -> Ctx<'a> { let mut ctx = Ctx::default(); ctx.self_address = "KT1BFATQpdP5xJGErJyk2vfL46dvFanWz87H".try_into().unwrap(); - ctx.chain_id = tezos_crypto_rs::hash::ChainId(hex::decode("f3d48554").unwrap()); + ctx.chain_id = tezos_crypto_rs::hash::ChainId::try_from(hex::decode("f3d48554").unwrap()).unwrap(); ctx } diff --git a/contrib/mir/src/typechecker.rs b/contrib/mir/src/typechecker.rs index 749d423912716fc0435aa1c615701b18879d8e36..e7c9b007012cef2c6d0708401f6ad9de5ded65c9 100644 --- a/contrib/mir/src/typechecker.rs +++ b/contrib/mir/src/typechecker.rs @@ -54,7 +54,7 @@ pub enum TcError { /// Failed to interpret a number as a value of some type due to a numeric /// conversion error. #[error("numeric conversion failed: {0}")] - NumericConversion(#[from] TryFromBigIntError<()>), + NumericConversion(TryFromBigIntError<()>), /// Types are not equal when they should be. #[error(transparent)] TypesNotEqual(#[from] TypesNotEqual), @@ -162,6 +162,12 @@ pub enum TcError { MapBlockFail, } +impl From> for TcError { + fn from(error: TryFromBigIntError<()>) -> Self { + TcError::NumericConversion(error) + } +} + /// Errors happening when typechecking a value of type `chain_id`. #[derive(Debug, PartialEq, Eq, Clone, thiserror::Error)] pub enum ChainIdError { @@ -6059,9 +6065,13 @@ mod typecheck_tests { &exp ); } - fn hex>(con: fn(Vec) -> T, hex: &str, ep: &str) -> addr::Address { + fn hex>( + con: fn(Vec) -> Result, + hex: &str, + ep: &str, + ) -> addr::Address { addr::Address { - hash: con(hex::decode(hex).unwrap()).into(), + hash: con(hex::decode(hex).unwrap()).unwrap().into(), entrypoint: Entrypoint::try_from(ep).unwrap(), } } @@ -6071,7 +6081,7 @@ mod typecheck_tests { r#""tz1WrbkDrzKVqcGXkjw4Qk4fXkjXpAJuNP1j""#, "0x00007b09f782e0bcd67739510afa819d85976119d5ef", hex( - ContractTz1Hash, + ContractTz1Hash::try_from, "7b09f782e0bcd67739510afa819d85976119d5ef", "default", ), @@ -6080,7 +6090,7 @@ mod typecheck_tests { r#""tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH""#, "0x00010a053e3d8b622a993d3182e3f6cc5638ff5f12fe", hex( - ContractTz2Hash, + ContractTz2Hash::try_from, "0a053e3d8b622a993d3182e3f6cc5638ff5f12fe", "default", ), @@ -6089,7 +6099,7 @@ mod typecheck_tests { r#""tz3UoffC7FG7zfpmvmjUmUeAaHvzdcUvAj6r""#, "0x00025cfa532f50de3e12befc0ad21603835dd7698d35", hex( - ContractTz3Hash, + ContractTz3Hash::try_from, "5cfa532f50de3e12befc0ad21603835dd7698d35", "default", ), @@ -6098,7 +6108,7 @@ mod typecheck_tests { r#""tz4J46gb6DxDFYxkex8k9sKiYZwjuiaoNSqN""#, "0x00036342f30484dd46b6074373aa6ddca9dfb70083d6", hex( - ContractTz4Hash, + ContractTz4Hash::try_from, "6342f30484dd46b6074373aa6ddca9dfb70083d6", "default", ), @@ -6107,7 +6117,7 @@ mod typecheck_tests { r#""KT1BRd2ka5q2cPRdXALtXD1QZ38CPam2j1ye""#, "0x011f2d825fdd9da219235510335e558520235f4f5400", hex( - ContractKt1Hash, + ContractKt1Hash::try_from, "1f2d825fdd9da219235510335e558520235f4f54", "default", ), @@ -6116,7 +6126,7 @@ mod typecheck_tests { r#""sr1RYurGZtN8KNSpkMcCt9CgWeUaNkzsAfXf""#, "0x03d601f22256d2ad1faec0c64374e527c6e62f2e5a00", hex( - SmartRollupHash, + SmartRollupHash::try_from, "d601f22256d2ad1faec0c64374e527c6e62f2e5a", "default", ), @@ -6126,7 +6136,7 @@ mod typecheck_tests { r#""tz1WrbkDrzKVqcGXkjw4Qk4fXkjXpAJuNP1j%foo""#, "0x00007b09f782e0bcd67739510afa819d85976119d5ef666f6f", hex( - ContractTz1Hash, + ContractTz1Hash::try_from, "7b09f782e0bcd67739510afa819d85976119d5ef", "foo", ), @@ -6135,7 +6145,7 @@ mod typecheck_tests { r#""tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH%foo""#, "0x00010a053e3d8b622a993d3182e3f6cc5638ff5f12fe666f6f", hex( - ContractTz2Hash, + ContractTz2Hash::try_from, "0a053e3d8b622a993d3182e3f6cc5638ff5f12fe", "foo", ), @@ -6144,7 +6154,7 @@ mod typecheck_tests { r#""tz3UoffC7FG7zfpmvmjUmUeAaHvzdcUvAj6r%foo""#, "0x00025cfa532f50de3e12befc0ad21603835dd7698d35666f6f", hex( - ContractTz3Hash, + ContractTz3Hash::try_from, "5cfa532f50de3e12befc0ad21603835dd7698d35", "foo", ), @@ -6153,7 +6163,7 @@ mod typecheck_tests { r#""tz4J46gb6DxDFYxkex8k9sKiYZwjuiaoNSqN%foo""#, "0x00036342f30484dd46b6074373aa6ddca9dfb70083d6666f6f", hex( - ContractTz4Hash, + ContractTz4Hash::try_from, "6342f30484dd46b6074373aa6ddca9dfb70083d6", "foo", ), @@ -6162,7 +6172,7 @@ mod typecheck_tests { r#""KT1BRd2ka5q2cPRdXALtXD1QZ38CPam2j1ye%foo""#, "0x011f2d825fdd9da219235510335e558520235f4f5400666f6f", hex( - ContractKt1Hash, + ContractKt1Hash::try_from, "1f2d825fdd9da219235510335e558520235f4f54", "foo", ), @@ -6171,7 +6181,7 @@ mod typecheck_tests { r#""sr1RYurGZtN8KNSpkMcCt9CgWeUaNkzsAfXf%foo""#, "0x03d601f22256d2ad1faec0c64374e527c6e62f2e5a00666f6f", hex( - SmartRollupHash, + SmartRollupHash::try_from, "d601f22256d2ad1faec0c64374e527c6e62f2e5a", "foo", ), @@ -6283,7 +6293,7 @@ mod typecheck_tests { fn test_push_chain_id() { let bytes = "f3d48554"; let exp = hex::decode(bytes).unwrap(); - let exp = Ok(Push(TypedValue::ChainId(super::ChainId(exp)))); + let exp = Ok(Push(TypedValue::ChainId(super::ChainId::try_from(exp).unwrap()))); let lit = "NetXynUjJNZm7wi"; assert_eq!( &typecheck_instruction(