From 605932d149eeba4558b404b52180e9ac20daca87 Mon Sep 17 00:00:00 2001 From: Matteo Muraca <56828990+muraca@users.noreply.github.com> Date: Tue, 7 Nov 2023 23:10:44 +0100 Subject: [PATCH] restore `no-std` support (#1335) * perform test action on `x86_64-unknown-linux-gnu` and `wasm32-unknown-unknown` Signed-off-by: muraca * make `plonky2` build on `wasm32-unknown-unknown` Signed-off-by: muraca * make `starky` build on `wasm32-unknown-unknown` small oversight on `plonky2` fixed Signed-off-by: muraca * skip `evm` folder if target is `wasm32-unknown-unknown` Signed-off-by: muraca * add `default: true` to toolchain Signed-off-by: muraca * skip `test` if target is `wasm32-unknown-unknown` Signed-off-by: muraca * single ticks instead of double Signed-off-by: muraca * explicit target Signed-off-by: muraca * wasm32 job Signed-off-by: muraca * added `--no-default-features` to checks Signed-off-by: muraca --------- Signed-off-by: muraca --- .../continuous-integration-workflow.yml | 53 ++++++++++++++++++- plonky2/src/gadgets/arithmetic.rs | 1 + plonky2/src/gadgets/arithmetic_extension.rs | 1 + plonky2/src/gadgets/lookup.rs | 3 ++ plonky2/src/gadgets/range_check.rs | 1 + plonky2/src/gadgets/split_base.rs | 1 + plonky2/src/gadgets/split_join.rs | 1 + plonky2/src/gates/arithmetic_base.rs | 2 +- plonky2/src/gates/arithmetic_extension.rs | 2 +- plonky2/src/gates/base_sum.rs | 2 +- plonky2/src/gates/coset_interpolation.rs | 6 +-- plonky2/src/gates/exponentiation.rs | 2 +- plonky2/src/gates/lookup.rs | 4 +- plonky2/src/gates/lookup_table.rs | 4 +- plonky2/src/gates/multiplication_extension.rs | 2 +- plonky2/src/gates/poseidon.rs | 2 +- plonky2/src/gates/poseidon_mds.rs | 2 +- plonky2/src/gates/random_access.rs | 2 +- plonky2/src/gates/reducing.rs | 2 +- plonky2/src/gates/reducing_extension.rs | 2 +- plonky2/src/hash/hashing.rs | 9 ++-- plonky2/src/hash/keccak.rs | 3 +- plonky2/src/hash/merkle_proofs.rs | 2 +- plonky2/src/hash/poseidon.rs | 2 +- plonky2/src/iop/challenger.rs | 4 +- plonky2/src/iop/generator.rs | 2 + plonky2/src/lib.rs | 2 +- plonky2/src/recursion/cyclic_recursion.rs | 2 + plonky2/src/recursion/dummy_circuit.rs | 1 + .../util/serialization/gate_serialization.rs | 12 ++++- .../serialization/generator_serialization.rs | 10 +++- plonky2/src/util/serialization/mod.rs | 2 +- starky/src/recursive_verifier.rs | 1 + 33 files changed, 111 insertions(+), 36 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index a0ac3ec7..7c0e4794 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -10,7 +10,7 @@ on: branches: - "**" -jobs: +jobs: test: name: Test Suite runs-on: ubuntu-latest @@ -82,6 +82,57 @@ jobs: CARGO_INCREMENTAL: 1 RUST_BACKTRACE: 1 + wasm32: + name: wasm32 compatibility + runs-on: ubuntu-latest + if: "! contains(toJSON(github.event.commits.*.message), '[skip-ci]')" + steps: + - name: Checkout sources + uses: actions/checkout@v2 + + - name: Install nightly wasm32 toolchain + id: rustc-toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + target: wasm32-unknown-unknown + default: true + override: true + + - name: rust-cache + uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: rustc-wasm32-${{ steps.rustc-toolchain.outputs.rustc_hash }}-cargo-${{ hashFiles('**/Cargo.toml') }} + + - name: Check in plonky2 subdirectory + uses: actions-rs/cargo@v1 + with: + command: check + args: --manifest-path plonky2/Cargo.toml --target wasm32-unknown-unknown --no-default-features + env: + RUSTFLAGS: -Copt-level=3 -Cdebug-assertions -Coverflow-checks=y -Cdebuginfo=0 + RUST_LOG: 1 + CARGO_INCREMENTAL: 1 + RUST_BACKTRACE: 1 + + - name: Check in starky subdirectory + uses: actions-rs/cargo@v1 + with: + command: check + args: --manifest-path starky/Cargo.toml --target wasm32-unknown-unknown --no-default-features + env: + RUSTFLAGS: -Copt-level=3 -Cdebug-assertions -Coverflow-checks=y -Cdebuginfo=0 + RUST_LOG: 1 + CARGO_INCREMENTAL: 1 + RUST_BACKTRACE: 1 + lints: name: Formatting and Clippy runs-on: ubuntu-latest diff --git a/plonky2/src/gadgets/arithmetic.rs b/plonky2/src/gadgets/arithmetic.rs index 858a4eaf..e3af60e9 100644 --- a/plonky2/src/gadgets/arithmetic.rs +++ b/plonky2/src/gadgets/arithmetic.rs @@ -1,3 +1,4 @@ +use alloc::string::{String, ToString}; use alloc::vec; use alloc::vec::Vec; use core::borrow::Borrow; diff --git a/plonky2/src/gadgets/arithmetic_extension.rs b/plonky2/src/gadgets/arithmetic_extension.rs index 0fe8083a..3c1deac3 100644 --- a/plonky2/src/gadgets/arithmetic_extension.rs +++ b/plonky2/src/gadgets/arithmetic_extension.rs @@ -1,3 +1,4 @@ +use alloc::string::{String, ToString}; use alloc::vec; use alloc::vec::Vec; use core::borrow::Borrow; diff --git a/plonky2/src/gadgets/lookup.rs b/plonky2/src/gadgets/lookup.rs index 826f3e29..4ab765ba 100644 --- a/plonky2/src/gadgets/lookup.rs +++ b/plonky2/src/gadgets/lookup.rs @@ -1,3 +1,6 @@ +use alloc::borrow::ToOwned; +use alloc::vec; + use crate::field::extension::Extendable; use crate::gates::lookup::LookupGate; use crate::gates::lookup_table::{LookupTable, LookupTableGate}; diff --git a/plonky2/src/gadgets/range_check.rs b/plonky2/src/gadgets/range_check.rs index bdb35f9e..41af064a 100644 --- a/plonky2/src/gadgets/range_check.rs +++ b/plonky2/src/gadgets/range_check.rs @@ -1,3 +1,4 @@ +use alloc::string::{String, ToString}; use alloc::vec; use alloc::vec::Vec; diff --git a/plonky2/src/gadgets/split_base.rs b/plonky2/src/gadgets/split_base.rs index 0a39b8f0..1562323c 100644 --- a/plonky2/src/gadgets/split_base.rs +++ b/plonky2/src/gadgets/split_base.rs @@ -1,3 +1,4 @@ +use alloc::string::{String, ToString}; use alloc::vec; use alloc::vec::Vec; use core::borrow::Borrow; diff --git a/plonky2/src/gadgets/split_join.rs b/plonky2/src/gadgets/split_join.rs index fb83c3a6..6901c8ca 100644 --- a/plonky2/src/gadgets/split_join.rs +++ b/plonky2/src/gadgets/split_join.rs @@ -1,3 +1,4 @@ +use alloc::string::{String, ToString}; use alloc::vec; use alloc::vec::Vec; diff --git a/plonky2/src/gates/arithmetic_base.rs b/plonky2/src/gates/arithmetic_base.rs index 631b1c37..dca1c506 100644 --- a/plonky2/src/gates/arithmetic_base.rs +++ b/plonky2/src/gates/arithmetic_base.rs @@ -1,5 +1,5 @@ use alloc::format; -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::vec::Vec; use crate::field::extension::Extendable; diff --git a/plonky2/src/gates/arithmetic_extension.rs b/plonky2/src/gates/arithmetic_extension.rs index 294c0902..b43d8d3a 100644 --- a/plonky2/src/gates/arithmetic_extension.rs +++ b/plonky2/src/gates/arithmetic_extension.rs @@ -1,5 +1,5 @@ use alloc::format; -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::vec::Vec; use core::ops::Range; diff --git a/plonky2/src/gates/base_sum.rs b/plonky2/src/gates/base_sum.rs index 181252a2..28131c1b 100644 --- a/plonky2/src/gates/base_sum.rs +++ b/plonky2/src/gates/base_sum.rs @@ -1,4 +1,4 @@ -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::vec::Vec; use alloc::{format, vec}; use core::ops::Range; diff --git a/plonky2/src/gates/coset_interpolation.rs b/plonky2/src/gates/coset_interpolation.rs index c701b8cf..99046ec4 100644 --- a/plonky2/src/gates/coset_interpolation.rs +++ b/plonky2/src/gates/coset_interpolation.rs @@ -1,4 +1,4 @@ -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::vec::Vec; use alloc::{format, vec}; use core::marker::PhantomData; @@ -631,8 +631,6 @@ fn partial_interpolate_ext_algebra_target, const D: #[cfg(test)] mod tests { - use core::iter::repeat_with; - use anyhow::Result; use plonky2_field::polynomial::PolynomialValues; use plonky2_util::log2_strict; @@ -832,7 +830,7 @@ mod tests { // Get a working row for InterpolationGate. let shift = F::rand(); - let values = PolynomialValues::new(repeat_with(FF::rand).take(4).collect()); + let values = PolynomialValues::new(core::iter::repeat_with(FF::rand).take(4).collect()); let eval_point = FF::rand(); let gate = CosetInterpolationGate::::with_max_degree(2, 3); let vars = EvaluationVars { diff --git a/plonky2/src/gates/exponentiation.rs b/plonky2/src/gates/exponentiation.rs index 521520e8..8e708b97 100644 --- a/plonky2/src/gates/exponentiation.rs +++ b/plonky2/src/gates/exponentiation.rs @@ -1,4 +1,4 @@ -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::vec::Vec; use alloc::{format, vec}; use core::marker::PhantomData; diff --git a/plonky2/src/gates/lookup.rs b/plonky2/src/gates/lookup.rs index f682be23..3c03f6ba 100644 --- a/plonky2/src/gates/lookup.rs +++ b/plonky2/src/gates/lookup.rs @@ -1,6 +1,6 @@ -use alloc::format; -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::vec::Vec; +use alloc::{format, vec}; use core::usize; use itertools::Itertools; diff --git a/plonky2/src/gates/lookup_table.rs b/plonky2/src/gates/lookup_table.rs index 9f9d967e..a683a87d 100644 --- a/plonky2/src/gates/lookup_table.rs +++ b/plonky2/src/gates/lookup_table.rs @@ -1,7 +1,7 @@ -use alloc::format; -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::sync::Arc; use alloc::vec::Vec; +use alloc::{format, vec}; use core::usize; use itertools::Itertools; diff --git a/plonky2/src/gates/multiplication_extension.rs b/plonky2/src/gates/multiplication_extension.rs index 8f6b27db..ba578d8b 100644 --- a/plonky2/src/gates/multiplication_extension.rs +++ b/plonky2/src/gates/multiplication_extension.rs @@ -1,5 +1,5 @@ use alloc::format; -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::vec::Vec; use core::ops::Range; diff --git a/plonky2/src/gates/poseidon.rs b/plonky2/src/gates/poseidon.rs index f6d06572..0842930d 100644 --- a/plonky2/src/gates/poseidon.rs +++ b/plonky2/src/gates/poseidon.rs @@ -1,4 +1,4 @@ -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::vec::Vec; use alloc::{format, vec}; use core::marker::PhantomData; diff --git a/plonky2/src/gates/poseidon_mds.rs b/plonky2/src/gates/poseidon_mds.rs index 8e2f4a76..75f9ae5c 100644 --- a/plonky2/src/gates/poseidon_mds.rs +++ b/plonky2/src/gates/poseidon_mds.rs @@ -1,4 +1,4 @@ -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::vec::Vec; use alloc::{format, vec}; use core::marker::PhantomData; diff --git a/plonky2/src/gates/random_access.rs b/plonky2/src/gates/random_access.rs index 9110a59b..df1bb576 100644 --- a/plonky2/src/gates/random_access.rs +++ b/plonky2/src/gates/random_access.rs @@ -1,4 +1,4 @@ -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::vec::Vec; use alloc::{format, vec}; use core::marker::PhantomData; diff --git a/plonky2/src/gates/reducing.rs b/plonky2/src/gates/reducing.rs index b313efe6..46ff69c8 100644 --- a/plonky2/src/gates/reducing.rs +++ b/plonky2/src/gates/reducing.rs @@ -1,4 +1,4 @@ -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::vec::Vec; use alloc::{format, vec}; use core::ops::Range; diff --git a/plonky2/src/gates/reducing_extension.rs b/plonky2/src/gates/reducing_extension.rs index 5492c506..77c1f39a 100644 --- a/plonky2/src/gates/reducing_extension.rs +++ b/plonky2/src/gates/reducing_extension.rs @@ -1,4 +1,4 @@ -use alloc::string::String; +use alloc::string::{String, ToString}; use alloc::vec::Vec; use alloc::{format, vec}; use core::ops::Range; diff --git a/plonky2/src/hash/hashing.rs b/plonky2/src/hash/hashing.rs index 28d3b89f..f5fe1f1e 100644 --- a/plonky2/src/hash/hashing.rs +++ b/plonky2/src/hash/hashing.rs @@ -2,7 +2,6 @@ use alloc::vec::Vec; use core::fmt::Debug; -use std::iter::repeat; use crate::field::extension::Extendable; use crate::field::types::Field; @@ -34,7 +33,7 @@ impl, const D: usize> CircuitBuilder { num_outputs: usize, ) -> Vec { let zero = self.zero(); - let mut state = H::AlgebraicPermutation::new(std::iter::repeat(zero)); + let mut state = H::AlgebraicPermutation::new(core::iter::repeat(zero)); // Absorb all input chunks. for input_chunk in inputs.chunks(H::AlgebraicPermutation::RATE) { @@ -71,7 +70,7 @@ pub trait PlonkyPermutation: /// received; remaining state (if any) initialised with /// `T::default()`. To initialise remaining elements with a /// different value, instead of your original `iter` pass - /// `iter.chain(std::iter::repeat(F::from_canonical_u64(12345)))` + /// `iter.chain(core::iter::repeat(F::from_canonical_u64(12345)))` /// or similar. fn new>(iter: I) -> Self; @@ -103,7 +102,7 @@ pub fn compress>(x: HashOut, y: HashOut) debug_assert_eq!(y.elements.len(), NUM_HASH_OUT_ELTS); debug_assert!(P::RATE >= NUM_HASH_OUT_ELTS); - let mut perm = P::new(repeat(F::ZERO)); + let mut perm = P::new(core::iter::repeat(F::ZERO)); perm.set_from_slice(&x.elements, 0); perm.set_from_slice(&y.elements, NUM_HASH_OUT_ELTS); @@ -120,7 +119,7 @@ pub fn hash_n_to_m_no_pad>( inputs: &[F], num_outputs: usize, ) -> Vec { - let mut perm = P::new(repeat(F::ZERO)); + let mut perm = P::new(core::iter::repeat(F::ZERO)); // Absorb all input chunks. for input_chunk in inputs.chunks(P::RATE) { diff --git a/plonky2/src/hash/keccak.rs b/plonky2/src/hash/keccak.rs index 43b02db4..281220f3 100644 --- a/plonky2/src/hash/keccak.rs +++ b/plonky2/src/hash/keccak.rs @@ -1,6 +1,5 @@ use alloc::vec; use alloc::vec::Vec; -use core::iter; use core::mem::size_of; use itertools::Itertools; @@ -68,7 +67,7 @@ impl PlonkyPermutation for KeccakPermutation { .copy_from_slice(&self.state[i].to_canonical_u64().to_le_bytes()); } - let hash_onion = iter::repeat_with(|| { + let hash_onion = core::iter::repeat_with(|| { let output = keccak(state_bytes.clone()).to_fixed_bytes(); state_bytes = output.to_vec(); output diff --git a/plonky2/src/hash/merkle_proofs.rs b/plonky2/src/hash/merkle_proofs.rs index 14eb3a1c..c848f66e 100644 --- a/plonky2/src/hash/merkle_proofs.rs +++ b/plonky2/src/hash/merkle_proofs.rs @@ -132,7 +132,7 @@ impl, const D: usize> CircuitBuilder { perm_inputs.set_from_slice(&state.elements, 0); perm_inputs.set_from_slice(&sibling.elements, NUM_HASH_OUT_ELTS); // Ensure the rest of the state, if any, is zero: - perm_inputs.set_from_iter(std::iter::repeat(zero), 2 * NUM_HASH_OUT_ELTS); + perm_inputs.set_from_iter(core::iter::repeat(zero), 2 * NUM_HASH_OUT_ELTS); let perm_outs = self.permute_swapped::(perm_inputs, bit); let hash_outs = perm_outs.squeeze()[0..NUM_HASH_OUT_ELTS] .try_into() diff --git a/plonky2/src/hash/poseidon.rs b/plonky2/src/hash/poseidon.rs index a89deda7..8858bc7b 100644 --- a/plonky2/src/hash/poseidon.rs +++ b/plonky2/src/hash/poseidon.rs @@ -3,7 +3,7 @@ use alloc::vec; use alloc::vec::Vec; -use std::fmt::Debug; +use core::fmt::Debug; use unroll::unroll_for_loops; diff --git a/plonky2/src/iop/challenger.rs b/plonky2/src/iop/challenger.rs index 9df49996..d5de2831 100644 --- a/plonky2/src/iop/challenger.rs +++ b/plonky2/src/iop/challenger.rs @@ -30,7 +30,7 @@ pub struct Challenger> { impl> Challenger { pub fn new() -> Challenger { Challenger { - sponge_state: H::Permutation::new(std::iter::repeat(F::ZERO)), + sponge_state: H::Permutation::new(core::iter::repeat(F::ZERO)), input_buffer: Vec::with_capacity(H::Permutation::RATE), output_buffer: Vec::with_capacity(H::Permutation::RATE), } @@ -175,7 +175,7 @@ impl, H: AlgebraicHasher, const D: usize> pub fn new(builder: &mut CircuitBuilder) -> Self { let zero = builder.zero(); Self { - sponge_state: H::AlgebraicPermutation::new(std::iter::repeat(zero)), + sponge_state: H::AlgebraicPermutation::new(core::iter::repeat(zero)), input_buffer: Vec::new(), output_buffer: Vec::new(), __: PhantomData, diff --git a/plonky2/src/iop/generator.rs b/plonky2/src/iop/generator.rs index 22d0fe07..1704b347 100644 --- a/plonky2/src/iop/generator.rs +++ b/plonky2/src/iop/generator.rs @@ -1,3 +1,5 @@ +use alloc::boxed::Box; +use alloc::string::{String, ToString}; use alloc::vec; use alloc::vec::Vec; use core::fmt::Debug; diff --git a/plonky2/src/lib.rs b/plonky2/src/lib.rs index c2913023..b02fc21b 100644 --- a/plonky2/src/lib.rs +++ b/plonky2/src/lib.rs @@ -2,7 +2,7 @@ #![allow(clippy::needless_range_loop)] #![cfg_attr(not(feature = "std"), no_std)] -extern crate alloc; +pub extern crate alloc; #[doc(inline)] pub use plonky2_field as field; diff --git a/plonky2/src/recursion/cyclic_recursion.rs b/plonky2/src/recursion/cyclic_recursion.rs index 4d5fc602..60d5342a 100644 --- a/plonky2/src/recursion/cyclic_recursion.rs +++ b/plonky2/src/recursion/cyclic_recursion.rs @@ -1,5 +1,7 @@ #![allow(clippy::int_plus_one)] // Makes more sense for some inequalities below. +use alloc::vec::Vec; + use anyhow::{ensure, Result}; use crate::field::extension::Extendable; diff --git a/plonky2/src/recursion/dummy_circuit.rs b/plonky2/src/recursion/dummy_circuit.rs index 620c979f..ee73105a 100644 --- a/plonky2/src/recursion/dummy_circuit.rs +++ b/plonky2/src/recursion/dummy_circuit.rs @@ -1,3 +1,4 @@ +use alloc::string::{String, ToString}; use alloc::vec; use alloc::vec::Vec; diff --git a/plonky2/src/util/serialization/gate_serialization.rs b/plonky2/src/util/serialization/gate_serialization.rs index 008e29c0..d858a057 100644 --- a/plonky2/src/util/serialization/gate_serialization.rs +++ b/plonky2/src/util/serialization/gate_serialization.rs @@ -1,3 +1,7 @@ +//! A module to help with GateRef serialization + +use alloc::vec::Vec; + use plonky2_field::extension::Extendable; use crate::gates::gate::GateRef; @@ -44,7 +48,11 @@ macro_rules! get_gate_tag_impl { Ok(tag) } else)* { - log::log!(log::Level::Error, "attempted to serialize gate with id `{}` which is unsupported by this gate serializer", $gate.0.id()); + log::log!( + log::Level::Error, + "attempted to serialize gate with id `{}` which is unsupported by this gate serializer", + $gate.0.id() + ); Err($crate::util::serialization::IoError) } }}; @@ -68,7 +76,7 @@ macro_rules! impl_gate_serializer { fn write_gate( &self, - buf: &mut Vec, + buf: &mut $crate::alloc::vec::Vec, gate: &$crate::gates::gate::GateRef, common: &$crate::plonk::circuit_data::CommonCircuitData, ) -> $crate::util::serialization::IoResult<()> { diff --git a/plonky2/src/util/serialization/generator_serialization.rs b/plonky2/src/util/serialization/generator_serialization.rs index 6e003400..19a22a77 100644 --- a/plonky2/src/util/serialization/generator_serialization.rs +++ b/plonky2/src/util/serialization/generator_serialization.rs @@ -1,5 +1,7 @@ //! A module to help with WitnessGeneratorRef serialization +use alloc::vec::Vec; + use plonky2_field::extension::Extendable; use crate::hash::hash_types::RichField; @@ -50,7 +52,11 @@ macro_rules! get_generator_tag_impl { Ok(tag) } else)* { - log::log!(log::Level::Error, "attempted to serialize generator with id {} which is unsupported by this generator serializer", $generator.0.id()); + log::log!( + log::Level::Error, + "attempted to serialize generator with id {} which is unsupported by this generator serializer", + $generator.0.id() + ); Err($crate::util::serialization::IoError) } }}; @@ -74,7 +80,7 @@ macro_rules! impl_generator_serializer { fn write_generator( &self, - buf: &mut Vec, + buf: &mut $crate::alloc::vec::Vec, generator: &$crate::iop::generator::WitnessGeneratorRef, common: &$crate::plonk::circuit_data::CommonCircuitData, ) -> $crate::util::serialization::IoResult<()> { diff --git a/plonky2/src/util/serialization/mod.rs b/plonky2/src/util/serialization/mod.rs index ca95b4a1..1861cba2 100644 --- a/plonky2/src/util/serialization/mod.rs +++ b/plonky2/src/util/serialization/mod.rs @@ -134,7 +134,7 @@ pub trait Read { /// Reads a `usize` value from `self`. #[inline] fn read_usize(&mut self) -> IoResult { - let mut buf = [0; std::mem::size_of::()]; + let mut buf = [0; core::mem::size_of::()]; self.read_exact(&mut buf)?; Ok(u64::from_le_bytes(buf) as usize) } diff --git a/starky/src/recursive_verifier.rs b/starky/src/recursive_verifier.rs index bd5d2f19..18db561b 100644 --- a/starky/src/recursive_verifier.rs +++ b/starky/src/recursive_verifier.rs @@ -1,3 +1,4 @@ +use alloc::vec::Vec; use core::iter::once; use anyhow::{ensure, Result};