diff --git a/Cargo.lock b/Cargo.lock index 2894db2e..8e8f5072 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -506,7 +506,7 @@ dependencies = [ [[package]] name = "derive_tasm_object" version = "0.1.0" -source = "git+https://github.com/TritonVM/tasm-lib.git?branch=sponge-hasher-trait#50aacf01b37294baef28be53f1689a2542004e64" +source = "git+https://github.com/TritonVM/tasm-lib.git?rev=8d146b44#8d146b445488052ec512e1fccf1760b98b2269d0" dependencies = [ "quote", "syn 2.0.48", @@ -2080,12 +2080,12 @@ dependencies = [ [[package]] name = "tasm-lib" version = "0.2.1" -source = "git+https://github.com/TritonVM/tasm-lib.git?branch=sponge-hasher-trait#50aacf01b37294baef28be53f1689a2542004e64" +source = "git+https://github.com/TritonVM/tasm-lib.git?rev=8d146b44#8d146b445488052ec512e1fccf1760b98b2269d0" dependencies = [ "anyhow", "derive_tasm_object", "hex", - "itertools 0.12.0", + "itertools 0.10.5", "num", "num-traits", "rand", @@ -2243,7 +2243,7 @@ dependencies = [ [[package]] name = "triton-vm" version = "0.36.1" -source = "git+https://github.com/TritonVM/triton-vm?branch=sponge-hasher-trait#04e74456fc8488b537c3ba88cae0f86e7a799320" +source = "git+https://github.com/TritonVM/triton-vm?rev=ce8a6d3e#ce8a6d3e63ace28f213c858cf18cc1b1f4ddfc82" dependencies = [ "arbitrary", "bincode", @@ -2277,7 +2277,7 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "twenty-first" version = "0.36.0" -source = "git+https://github.com/Neptune-Crypto/twenty-first?branch=sponge-hasher-trait#4fb16e51f4ba7ce4eb085752dd1ae7691c34ace5" +source = "git+https://github.com/Neptune-Crypto/twenty-first?rev=59944288#59944288a6f5094cde994d9a1929744cbc70d6fd" dependencies = [ "arbitrary", "bfieldcodec_derive", diff --git a/Cargo.toml b/Cargo.toml index 39ee8289..400d5d5d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ itertools = "0.12" num = "0.4" rand = "0" syn = { version = "1.0", features = ["full", "extra-traits"] } -tasm-lib = { git = "https://github.com/TritonVM/tasm-lib.git", branch = "sponge-hasher-trait" } +tasm-lib = { git = "https://github.com/TritonVM/tasm-lib.git", rev = "8d146b44" } quote = "1.0" [dev-dependencies] diff --git a/src/ast.rs b/src/ast.rs index 1723750b..0a7ac428 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -768,7 +768,7 @@ pub(crate) struct MethodCall { pub(crate) annot: T, /// To type does this method belong? Not the same - /// same as receiver type, since receiver type can be + /// as receiver type, since receiver type can be /// `&self` or `Box`. pub(crate) associated_type: Option, } diff --git a/src/libraries/hasher.rs b/src/libraries/hasher.rs index f2c3445d..16ca60df 100644 --- a/src/libraries/hasher.rs +++ b/src/libraries/hasher.rs @@ -1,3 +1,6 @@ +use tasm_lib::triton_vm::prelude::*; +use tasm_lib::twenty_first::prelude::tip5::DIGEST_LENGTH; + use crate::ast; use crate::ast::FnSignature; use crate::ast_types::DataType; @@ -12,8 +15,6 @@ use crate::libraries::Library; use crate::subroutine::SubRoutine; use crate::tasm_code_generator::CompilerState; use crate::type_checker::CheckState; -use tasm_lib::triton_vm::prelude::*; -use tasm_lib::twenty_first::prelude::tip5::DIGEST_LENGTH; use super::bfe::BfeLibrary; diff --git a/src/libraries/hasher/sponge_hasher.rs b/src/libraries/hasher/sponge_hasher.rs index 276c59a2..4f0b8432 100644 --- a/src/libraries/hasher/sponge_hasher.rs +++ b/src/libraries/hasher/sponge_hasher.rs @@ -1,19 +1,18 @@ +use itertools::Itertools; +use num::One; +use tasm_lib::traits::basic_snippet::BasicSnippet; + use crate::ast; use crate::ast::FnCall; use crate::ast::UnaryOp; -use crate::ast_types::ArrayType; use crate::ast_types::DataType; use crate::graft::Graft; use crate::libraries::Annotation; -use itertools::Itertools; -use num::One; -use tasm_lib::traits::basic_snippet::BasicSnippet; -use tasm_lib::twenty_first::shared_math::tip5::RATE; pub(super) const SPONGE_HASHER_INDICATOR: &str = "Tip5::"; const SPONGE_HASHER_INIT_NAME: &str = "Tip5::init"; -const SPONGE_HASHER_ABSORB_NAME: &str = "Tip5::absorb_once"; -const SPONGE_HASHER_SQUEEZE_NAME: &str = "Tip5::squeeze_once"; +const SPONGE_HASHER_ABSORB_NAME: &str = "Tip5::absorb"; +const SPONGE_HASHER_SQUEEZE_NAME: &str = "Tip5::squeeze"; const SPONGE_HASHER_PAD_AND_ABSORB_ALL_NAME: &str = "Tip5::pad_and_absorb_all"; pub(super) fn graft_sponge_hasher_functions( @@ -37,8 +36,7 @@ fn graft_init_function_call( ) -> ast::Expr { assert!( args.is_empty(), - "{SPONGE_HASHER_INIT_NAME} does not take any arguments. Got: args:\n{:?}", - args + "{SPONGE_HASHER_INIT_NAME} does not take any arguments. Got: args:\n{args:?}", ); let tasm_lib_snippet = tasm_lib::hashing::sponge_hasher::init::Init; @@ -55,22 +53,21 @@ fn graft_absorb_once_function_call( grafter: &mut Graft, args: &syn::punctuated::Punctuated, ) -> ast::Expr { - // Ignore 1st argument, as it's the `SpongeState` in the source code, but from - // the perspective of the VM, this value is handled through its own co-processor. - // The 2nd argument has its reference stripped, as it's supposed to be an array, - // not a boxed array. - let args = args.iter().map(|x| grafter.graft_expr(x)).collect_vec(); - let ast::Expr::Unary(UnaryOp::Ref(_mutable), arg, _) = &args[1] else { - panic!("Incorrect argument to {SPONGE_HASHER_ABSORB_NAME}. Got:\n{args:?}") + // From the perspective of the VM, the Sponge state is handled through its own co-processor. + let [_state, arg] = args.iter().collect_vec()[..] else { + panic!("{SPONGE_HASHER_ABSORB_NAME} expects exactly two arguments"); }; + let arg = grafter.graft_expr(arg); + + let tasm_lib_snippet = tasm_lib::hashing::sponge_hasher::absorb::Absorb; + let entrypoint = tasm_lib_snippet.entrypoint(); - let tasm_lib_snippet = tasm_lib::hashing::sponge_hasher::absorb_once::AbsorbOnce; ast::Expr::FnCall(FnCall { - name: format!("tasm::{}", tasm_lib_snippet.entrypoint()), - args: vec![*arg.to_owned()], + name: format!("tasm::{entrypoint}"), + args: vec![arg], type_parameter: None, arg_evaluation_order: Default::default(), - annot: crate::type_checker::Typing::KnownType(DataType::unit()), + annot: Default::default(), }) } @@ -79,21 +76,18 @@ fn graft_squeeze_once_function_call( ) -> ast::Expr { // Ignore 1st argument, as it's the `SpongeState` in the source code, but from // the perspective of the VM, this value is handled through its own co-processor. - assert![ + assert!( args.len().is_one(), "{SPONGE_HASHER_SQUEEZE_NAME} expects exactly one argument" - ]; + ); - let tasm_lib_snippet = tasm_lib::hashing::sponge_hasher::squeeze_once::SqueezeOnce; + let tasm_lib_snippet = tasm_lib::hashing::sponge_hasher::squeeze::Squeeze; ast::Expr::FnCall(FnCall { name: format!("tasm::{}", tasm_lib_snippet.entrypoint()), args: vec![], type_parameter: None, arg_evaluation_order: Default::default(), - annot: crate::type_checker::Typing::KnownType(DataType::Array(ArrayType { - element_type: Box::new(DataType::Bfe), - length: RATE, - })), + annot: Default::default(), }) } @@ -101,20 +95,18 @@ fn graft_pad_and_absorb_all_function_call( grafter: &mut Graft, args: &syn::punctuated::Punctuated, ) -> ast::Expr { - assert_eq!( - 2, - args.len(), - "{SPONGE_HASHER_PAD_AND_ABSORB_ALL_NAME} expects exactly two arguments" - ); + let [_state, arg] = args.iter().collect_vec()[..] else { + panic!("{SPONGE_HASHER_PAD_AND_ABSORB_ALL_NAME} expects exactly two arguments"); + }; + let tasm_lib_snippet = tasm_lib::hashing::sponge_hasher::pad_and_absorb_all::PadAndAbsorbAll { list_type: grafter.list_type.into(), }; // Ignore 1st argument, as it's the `SpongeState` in the source code, but from // the perspective of the VM, this value is handled through its own co-processor. - let args = args.iter().map(|x| grafter.graft_expr(x)).collect_vec(); - let ast::Expr::Unary(UnaryOp::Ref(_mutable), arg, _) = &args[1] else { - panic!("Incorrect argument to {SPONGE_HASHER_ABSORB_NAME}. Got:\n{args:?}") + let ast::Expr::Unary(UnaryOp::Ref(_mutable), arg, _) = grafter.graft_expr(arg) else { + panic!("Incorrect argument to {SPONGE_HASHER_PAD_AND_ABSORB_ALL_NAME}. Got:\n{args:?}"); }; ast::Expr::FnCall(FnCall { diff --git a/src/tests_and_benchmarks/ozk/programs/sponge_hasher/absorb_once_squeeze_once.rs b/src/tests_and_benchmarks/ozk/programs/sponge_hasher/absorb_once_squeeze_once.rs index 55eafc65..c310b6e7 100644 --- a/src/tests_and_benchmarks/ozk/programs/sponge_hasher/absorb_once_squeeze_once.rs +++ b/src/tests_and_benchmarks/ozk/programs/sponge_hasher/absorb_once_squeeze_once.rs @@ -16,8 +16,8 @@ fn absorb_and_squeeze() { } } - Tip5::absorb_once(&mut sponge, &preimage); - let squeezed: [BFieldElement; 10] = Tip5::squeeze_once(&mut sponge); + Tip5::absorb(&mut sponge, preimage); + let squeezed: [BFieldElement; 10] = Tip5::squeeze(&mut sponge); { let mut i: usize = 0; while i < 10 { diff --git a/src/tests_and_benchmarks/ozk/programs/sponge_hasher/init.rs b/src/tests_and_benchmarks/ozk/programs/sponge_hasher/init.rs index bc1df9e9..43b3728d 100644 --- a/src/tests_and_benchmarks/ozk/programs/sponge_hasher/init.rs +++ b/src/tests_and_benchmarks/ozk/programs/sponge_hasher/init.rs @@ -44,7 +44,7 @@ fn initialized_sponge_behaves_correctly_deep_in_stack() { let _j: u128 = 1000; tasm::tasm_io_write_to_stdout___u128(b); tasm::tasm_io_write_to_stdout___u128(a); - Tip5::absorb_once(&mut sponge, &preimage); + Tip5::absorb(&mut sponge, preimage); return; } diff --git a/src/tests_and_benchmarks/ozk/programs/sponge_hasher/pad_and_absorb_all.rs b/src/tests_and_benchmarks/ozk/programs/sponge_hasher/pad_and_absorb_all.rs index 5cade8ba..db509ca4 100644 --- a/src/tests_and_benchmarks/ozk/programs/sponge_hasher/pad_and_absorb_all.rs +++ b/src/tests_and_benchmarks/ozk/programs/sponge_hasher/pad_and_absorb_all.rs @@ -18,7 +18,7 @@ fn pad_and_absorb_all() { } Tip5::pad_and_absorb_all(&mut sponge, &preimage); - let produce: [BFieldElement; 10] = Tip5::squeeze_once(&mut sponge); + let produce: [BFieldElement; 10] = Tip5::squeeze(&mut sponge); { let mut i: usize = 0; while i < 10 { diff --git a/src/tests_and_benchmarks/ozk/rust_shadows.rs b/src/tests_and_benchmarks/ozk/rust_shadows.rs index d08acba6..ab0d509f 100644 --- a/src/tests_and_benchmarks/ozk/rust_shadows.rs +++ b/src/tests_and_benchmarks/ozk/rust_shadows.rs @@ -1,12 +1,10 @@ -use crate::triton_vm::twenty_first::shared_math::bfield_codec::BFieldCodec; -use crate::triton_vm::twenty_first::shared_math::x_field_element::XFieldElement; -use num::Zero; use std::cell::RefCell; use std::collections::HashMap; use std::thread_local; use std::vec::Vec; + +use num::Zero; use tasm_lib::triton_vm::prelude::*; -use tasm_lib::twenty_first::prelude::*; // This module contains functions for interacting with the input/output monad // implicit in a VM execution. It contains functions for mutating and verifying