delete old sha variants
This commit is contained in:
parent
b0e48e03a5
commit
a1a2de56f3
6 changed files with 5 additions and 415 deletions
|
@ -42,140 +42,6 @@ vector<unsigned long> bit_list_to_ints(vector<bool> bit_list, const size_t words
|
|||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
class ethereum_sha256 : gadget<FieldT>
|
||||
{
|
||||
private:
|
||||
std::shared_ptr<block_variable<FieldT>> block1;
|
||||
std::shared_ptr<block_variable<FieldT>> block2;
|
||||
std::shared_ptr<digest_variable<FieldT>> intermediate_hash;
|
||||
|
||||
public:
|
||||
std::shared_ptr<sha256_compression_function_gadget<FieldT>> hasher2;
|
||||
std::shared_ptr<sha256_compression_function_gadget<FieldT>> hasher1;
|
||||
ethereum_sha256(
|
||||
protoboard<FieldT> &pb,
|
||||
pb_variable<FieldT>& ZERO,
|
||||
pb_variable_array<FieldT>& a,
|
||||
pb_variable_array<FieldT>& b,
|
||||
digest_variable<FieldT> result
|
||||
) : gadget<FieldT>(pb, "ethereum_sha256") {
|
||||
|
||||
intermediate_hash.reset(new digest_variable<FieldT>(pb, 256, "intermediate"));
|
||||
|
||||
// As the hash is computed on the full 512bit block size
|
||||
// padding does not fit in the primary block
|
||||
// => add dummy block (single "1" followed by "0" + total length)
|
||||
pb_variable_array<FieldT> length_padding =
|
||||
from_bits({
|
||||
//dummy padding block
|
||||
1,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
|
||||
//total length of message (512 bits)
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,1,0,
|
||||
0,0,0,0,0,0,0,0
|
||||
}, ZERO);
|
||||
|
||||
block1.reset(new block_variable<FieldT>(pb, {
|
||||
a,
|
||||
b
|
||||
}, "block1"));
|
||||
|
||||
block2.reset(new block_variable<FieldT>(pb, {
|
||||
length_padding
|
||||
}, "block2"));
|
||||
|
||||
pb_linear_combination_array<FieldT> IV = SHA256_default_IV(pb);
|
||||
|
||||
hasher1.reset(new sha256_compression_function_gadget<FieldT>(
|
||||
pb,
|
||||
IV,
|
||||
block1->bits,
|
||||
*intermediate_hash,
|
||||
"hasher1"));
|
||||
|
||||
pb_linear_combination_array<FieldT> IV2(intermediate_hash->bits);
|
||||
|
||||
hasher2.reset(new sha256_compression_function_gadget<FieldT>(
|
||||
pb,
|
||||
IV2,
|
||||
block2->bits,
|
||||
result,
|
||||
"hasher2"));
|
||||
}
|
||||
|
||||
void generate_r1cs_constraints() {
|
||||
hasher1->generate_r1cs_constraints();
|
||||
hasher2->generate_r1cs_constraints();
|
||||
}
|
||||
|
||||
void generate_r1cs_witness() {
|
||||
hasher1->generate_r1cs_witness();
|
||||
hasher2->generate_r1cs_witness();
|
||||
}
|
||||
};
|
||||
|
||||
// conversion byte[32] <-> libsnark bigint.
|
||||
libff::bigint<libff::alt_bn128_r_limbs> libsnarkBigintFromBytesAux(const uint8_t* _x)
|
||||
{
|
||||
|
@ -234,33 +100,6 @@ std::string r1cs_to_json(protoboard<FieldT> pb)
|
|||
return ss.str();
|
||||
}
|
||||
|
||||
char* _shaEth256Constraints()
|
||||
{
|
||||
libff::alt_bn128_pp::init_public_params();
|
||||
protoboard<FieldT> pb;
|
||||
|
||||
pb_variable_array<FieldT> left;
|
||||
left.allocate(pb, 256, "left");
|
||||
|
||||
pb_variable_array<FieldT> right;
|
||||
right.allocate(pb, 256, "right");
|
||||
|
||||
digest_variable<FieldT> output(pb, 256, "output");
|
||||
|
||||
pb_variable<FieldT> ZERO;
|
||||
ZERO.allocate(pb, "ZERO");
|
||||
pb.val(ZERO) = 0;
|
||||
|
||||
ethereum_sha256 g(pb, ZERO, left, right, output);
|
||||
g.generate_r1cs_constraints();
|
||||
|
||||
auto json = r1cs_to_json(pb);
|
||||
|
||||
auto result = new char[json.size()];
|
||||
memcpy(result, json.c_str(), json.size() + 1);
|
||||
return result;
|
||||
}
|
||||
|
||||
std::string array_to_json(protoboard<FieldT> pb)
|
||||
{
|
||||
std::stringstream ss;
|
||||
|
@ -284,138 +123,6 @@ std::string array_to_json(protoboard<FieldT> pb)
|
|||
return(ss.str());
|
||||
}
|
||||
|
||||
char* _shaEth256Witness(const uint8_t* inputs, int inputs_length)
|
||||
{
|
||||
|
||||
libff::alt_bn128_pp::init_public_params();
|
||||
protoboard<FieldT> pb;
|
||||
|
||||
pb_variable_array<FieldT> left;
|
||||
left.allocate(pb, 256, "left");
|
||||
pb_variable_array<FieldT> right;
|
||||
right.allocate(pb, 256, "right");
|
||||
//TODO: replace with digest variable?
|
||||
digest_variable<FieldT> output(pb, 256, "output");
|
||||
|
||||
pb_variable<FieldT> ZERO;
|
||||
ZERO.allocate(pb, "ZERO");
|
||||
pb.val(ZERO) = 0;
|
||||
|
||||
libff::bit_vector left_bv;
|
||||
libff::bit_vector right_bv;
|
||||
|
||||
for (int i = 0; i < inputs_length / 2; i++) {
|
||||
std::cerr << libsnarkBigintFromBytesAux(inputs + i*32) << "\n";
|
||||
left_bv.push_back(libsnarkBigintFromBytesAux(inputs + i*32) == 1);
|
||||
}
|
||||
|
||||
for (int i = inputs_length / 2; i < inputs_length; i++) {
|
||||
std::cerr << libsnarkBigintFromBytesAux(inputs + i*32) << "\n";
|
||||
right_bv.push_back(libsnarkBigintFromBytesAux(inputs + i*32) == 1);
|
||||
}
|
||||
|
||||
left.fill_with_bits(pb, left_bv);
|
||||
right.fill_with_bits(pb, right_bv);
|
||||
|
||||
ethereum_sha256 g(pb, ZERO, left, right, output);
|
||||
g.generate_r1cs_constraints();
|
||||
g.generate_r1cs_witness();
|
||||
|
||||
assert(pb.is_satisfied());
|
||||
|
||||
auto json = array_to_json(pb);
|
||||
|
||||
auto result = new char[json.size()];
|
||||
memcpy(result, json.c_str(), json.size() + 1);
|
||||
return result;
|
||||
}
|
||||
|
||||
char* _sha256Constraints()
|
||||
{
|
||||
libff::alt_bn128_pp::init_public_params();
|
||||
protoboard<FieldT> pb;
|
||||
|
||||
digest_variable<FieldT> left(pb, SHA256_digest_size, "left");
|
||||
digest_variable<FieldT> right(pb, SHA256_digest_size, "right");
|
||||
digest_variable<FieldT> output(pb, SHA256_digest_size, "output");
|
||||
|
||||
pb_variable<FieldT> single;
|
||||
single.allocate(pb, "single");
|
||||
pb.val(single) = 13373;
|
||||
|
||||
sha256_two_to_one_hash_gadget<FieldT> f(pb, left, right, output, "f");
|
||||
f.generate_r1cs_constraints();
|
||||
|
||||
auto json = r1cs_to_json(pb);
|
||||
|
||||
auto result = new char[json.size()];
|
||||
memcpy(result, json.c_str(), json.size() + 1);
|
||||
return result;
|
||||
}
|
||||
|
||||
char* _sha256Witness(const uint8_t* inputs, int inputs_length)
|
||||
{
|
||||
|
||||
libff::alt_bn128_pp::init_public_params();
|
||||
protoboard<FieldT> pb;
|
||||
|
||||
digest_variable<FieldT> left(pb, SHA256_digest_size, "left");
|
||||
digest_variable<FieldT> right(pb, SHA256_digest_size, "right");
|
||||
digest_variable<FieldT> output(pb, SHA256_digest_size, "output");
|
||||
|
||||
pb_variable<FieldT> single;
|
||||
single.allocate(pb, "single");
|
||||
pb.val(single) = 13373;
|
||||
|
||||
sha256_two_to_one_hash_gadget<FieldT> f(pb, left, right, output, "f");
|
||||
f.generate_r1cs_constraints(true);
|
||||
|
||||
libff::bit_vector left_bv;
|
||||
libff::bit_vector right_bv;
|
||||
|
||||
for (int i = 0; i < inputs_length / 2; i++) {
|
||||
left_bv.push_back(libsnarkBigintFromBytesAux(inputs + i*32) == 1);
|
||||
}
|
||||
for (int i = inputs_length / 2; i < inputs_length; i++) {
|
||||
right_bv.push_back(libsnarkBigintFromBytesAux(inputs + i*32) == 1);
|
||||
}
|
||||
|
||||
left.generate_r1cs_witness(left_bv);
|
||||
right.generate_r1cs_witness(right_bv);
|
||||
|
||||
f.generate_r1cs_witness();
|
||||
|
||||
assert(pb.is_satisfied());
|
||||
|
||||
auto json = array_to_json(pb);
|
||||
auto result = new char[json.size()];
|
||||
memcpy(result, json.c_str(), json.size() + 1);
|
||||
return result;
|
||||
}
|
||||
|
||||
const unsigned long mySHA256_H[8] = {
|
||||
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
|
||||
};
|
||||
|
||||
pb_linear_combination_array<FieldT> SHA256_IV(protoboard<FieldT> &pb)
|
||||
{
|
||||
pb_linear_combination_array<FieldT> result;
|
||||
result.reserve(SHA256_digest_size);
|
||||
|
||||
for (size_t i = 0; i < SHA256_digest_size; ++i)
|
||||
{
|
||||
int iv_val = (mySHA256_H[i / 32] >> (31-(i % 32))) & 1;
|
||||
|
||||
pb_linear_combination<FieldT> iv_element;
|
||||
iv_element.assign(pb, iv_val * ONE);
|
||||
iv_element.evaluate(pb);
|
||||
|
||||
result.emplace_back(iv_element);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
class sha256round: gadget<FieldT>
|
||||
{
|
||||
private:
|
||||
|
|
|
@ -12,12 +12,6 @@ extern "C" {
|
|||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
char* _sha256Constraints();
|
||||
char* _sha256Witness(const uint8_t* input, int input_length);
|
||||
|
||||
char* _shaEth256Constraints();
|
||||
char* _shaEth256Witness(const uint8_t* input, int input_length);
|
||||
|
||||
char* _sha256RoundConstraints();
|
||||
char* _sha256RoundWitness(const uint8_t* input, int input_length);
|
||||
|
||||
|
|
|
@ -1,22 +1,18 @@
|
|||
use field::Field;
|
||||
use helpers::{Executable, Signed};
|
||||
use libsnark::{get_ethsha256_witness, get_sha256_witness, get_sha256round_witness};
|
||||
use libsnark::{get_sha256round_witness};
|
||||
use serde_json;
|
||||
use standard;
|
||||
use std::fmt;
|
||||
|
||||
#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)]
|
||||
pub enum LibsnarkGadgetHelper {
|
||||
Sha256Compress,
|
||||
Sha256Ethereum,
|
||||
Sha256Round
|
||||
}
|
||||
|
||||
impl fmt::Display for LibsnarkGadgetHelper {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
match *self {
|
||||
LibsnarkGadgetHelper::Sha256Compress => write!(f, "Sha256Compress"),
|
||||
LibsnarkGadgetHelper::Sha256Ethereum => write!(f, "Sha256Ethereum"),
|
||||
LibsnarkGadgetHelper::Sha256Round => write!(f, "Sha256Round"),
|
||||
}
|
||||
}
|
||||
|
@ -25,12 +21,6 @@ impl fmt::Display for LibsnarkGadgetHelper {
|
|||
impl<T: Field> Executable<T> for LibsnarkGadgetHelper {
|
||||
fn execute(&self, inputs: &Vec<T>) -> Result<Vec<T>, String> {
|
||||
let witness_result: Result<standard::Witness, serde_json::Error> = match self {
|
||||
LibsnarkGadgetHelper::Sha256Compress => {
|
||||
serde_json::from_str(&get_sha256_witness(inputs))
|
||||
}
|
||||
LibsnarkGadgetHelper::Sha256Ethereum => {
|
||||
serde_json::from_str(&get_ethsha256_witness(inputs))
|
||||
}
|
||||
LibsnarkGadgetHelper::Sha256Round => {
|
||||
serde_json::from_str(&get_sha256round_witness(inputs))
|
||||
}
|
||||
|
@ -39,23 +29,19 @@ impl<T: Field> Executable<T> for LibsnarkGadgetHelper {
|
|||
if let Err(e) = witness_result {
|
||||
return Err(format!("{}", e));
|
||||
}
|
||||
|
||||
let lol : Vec<T> = witness_result
|
||||
|
||||
Ok(witness_result
|
||||
.unwrap()
|
||||
.variables
|
||||
.iter()
|
||||
.map(|&i| T::from(i))
|
||||
.collect();
|
||||
|
||||
Ok(lol)
|
||||
.collect())
|
||||
}
|
||||
}
|
||||
|
||||
impl Signed for LibsnarkGadgetHelper {
|
||||
fn get_signature(&self) -> (usize, usize) {
|
||||
match self {
|
||||
LibsnarkGadgetHelper::Sha256Compress => (512, 25562),
|
||||
LibsnarkGadgetHelper::Sha256Ethereum => (512, 50610),
|
||||
LibsnarkGadgetHelper::Sha256Round => (768, 25818)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -127,25 +127,12 @@ impl Importer {
|
|||
#[cfg(feature = "libsnark")]
|
||||
{
|
||||
use helpers::LibsnarkGadgetHelper;
|
||||
use libsnark::{get_ethsha256_constraints, get_sha256_constraints, get_sha256round_constraints};
|
||||
use libsnark::{get_sha256round_constraints};
|
||||
use serde_json::from_str;
|
||||
use standard::{DirectiveR1CS, R1CS};
|
||||
use std::io::BufReader;
|
||||
|
||||
match import.source.as_ref() {
|
||||
"LIBSNARK/sha256" => {
|
||||
let r1cs: R1CS = from_str(&get_ethsha256_constraints()).unwrap();
|
||||
let dr1cs: DirectiveR1CS = DirectiveR1CS {
|
||||
r1cs,
|
||||
directive: LibsnarkGadgetHelper::Sha256Ethereum,
|
||||
};
|
||||
let compiled = FlatProg::from(dr1cs);
|
||||
let alias = match import.alias {
|
||||
Some(ref alias) => alias.clone(),
|
||||
None => String::from("sha256"),
|
||||
};
|
||||
origins.push(CompiledImport::new(compiled, alias));
|
||||
}
|
||||
"LIBSNARK/sha256round" => {
|
||||
let r1cs: R1CS = from_str(&get_sha256round_constraints()).unwrap();
|
||||
let dr1cs: DirectiveR1CS = DirectiveR1CS {
|
||||
|
@ -159,19 +146,6 @@ impl Importer {
|
|||
};
|
||||
origins.push(CompiledImport::new(compiled, alias));
|
||||
}
|
||||
"LIBSNARK/sha256compression" => {
|
||||
let r1cs: R1CS = from_str(&get_sha256_constraints()).unwrap();
|
||||
let dr1cs: DirectiveR1CS = DirectiveR1CS {
|
||||
r1cs,
|
||||
directive: LibsnarkGadgetHelper::Sha256Compress,
|
||||
};
|
||||
let compiled = FlatProg::from(dr1cs);
|
||||
let alias = match import.alias {
|
||||
Some(ref alias) => alias.clone(),
|
||||
None => String::from("sha256compression"),
|
||||
};
|
||||
origins.push(CompiledImport::new(compiled, alias));
|
||||
}
|
||||
"LIBSNARK/sha256packed" => {
|
||||
let source = sha_packed_typed();
|
||||
let mut reader = BufReader::new(source.as_bytes());
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
// @author Dennis Kuhnert <dennis.kuhnert@campus.tu-berlin.de>
|
||||
// @date 2017
|
||||
|
||||
//TODO: delte sha256ethereum, add tests
|
||||
|
||||
extern crate libc;
|
||||
|
||||
use self::libc::{c_char, c_int, uint8_t};
|
||||
|
@ -15,54 +13,10 @@ use std::string::String;
|
|||
use field::Field;
|
||||
|
||||
extern "C" {
|
||||
fn _sha256Constraints() -> *mut c_char;
|
||||
fn _sha256Witness(inputs: *const uint8_t, inputs_length: c_int) -> *mut c_char;
|
||||
|
||||
fn _shaEth256Constraints() -> *mut c_char;
|
||||
fn _shaEth256Witness(inputs: *const uint8_t, inputs_length: c_int) -> *mut c_char;
|
||||
|
||||
fn _sha256RoundConstraints() -> *mut c_char;
|
||||
fn _sha256RoundWitness(inputs: *const uint8_t, inputs_length: c_int) -> *mut c_char;
|
||||
}
|
||||
|
||||
pub fn get_sha256_constraints() -> String {
|
||||
let a = unsafe { CString::from_raw(_sha256Constraints()) };
|
||||
a.into_string().unwrap()
|
||||
}
|
||||
|
||||
pub fn get_sha256_witness<T: Field>(inputs: &Vec<T>) -> String {
|
||||
let mut inputs_arr: Vec<[u8; 32]> = vec![[0u8; 32]; inputs.len()];
|
||||
|
||||
for (index, value) in inputs.into_iter().enumerate() {
|
||||
inputs_arr[index] = vec_as_u8_32_array(&value.into_byte_vector());
|
||||
}
|
||||
|
||||
let a =
|
||||
unsafe { CString::from_raw(_sha256Witness(inputs_arr[0].as_ptr(), inputs.len() as i32)) };
|
||||
a.into_string().unwrap()
|
||||
}
|
||||
|
||||
pub fn get_ethsha256_constraints() -> String {
|
||||
let a = unsafe { CString::from_raw(_shaEth256Constraints()) };
|
||||
a.into_string().unwrap()
|
||||
}
|
||||
|
||||
pub fn get_ethsha256_witness<T: Field>(inputs: &Vec<T>) -> String {
|
||||
let mut inputs_arr: Vec<[u8; 32]> = vec![[0u8; 32]; inputs.len()];
|
||||
|
||||
for (index, value) in inputs.into_iter().enumerate() {
|
||||
inputs_arr[index] = vec_as_u8_32_array(&value.into_byte_vector());
|
||||
}
|
||||
|
||||
let a = unsafe {
|
||||
CString::from_raw(_shaEth256Witness(
|
||||
inputs_arr[0].as_ptr(),
|
||||
inputs.len() as i32,
|
||||
))
|
||||
};
|
||||
a.into_string().unwrap()
|
||||
}
|
||||
|
||||
pub fn get_sha256round_constraints() -> String {
|
||||
let a = unsafe { CString::from_raw(_sha256RoundConstraints()) };
|
||||
a.into_string().unwrap()
|
||||
|
@ -70,13 +24,9 @@ pub fn get_sha256round_constraints() -> String {
|
|||
|
||||
pub fn get_sha256round_witness<T: Field>(inputs: &Vec<T>) -> String {
|
||||
let mut inputs_arr: Vec<[u8; 32]> = vec![[0u8; 32]; inputs.len()];
|
||||
println!("#Debug Libsnark {}", inputs.len());
|
||||
// let inputs = &inputs[0..512];
|
||||
//TODO: vector of arrays or 8*32 bit elements => 256bit
|
||||
for (index, value) in inputs.into_iter().enumerate() {
|
||||
inputs_arr[index] = vec_as_u8_32_array(&value.into_byte_vector());
|
||||
}
|
||||
//TODO: what is into_byte_vector?
|
||||
|
||||
let a = unsafe {
|
||||
CString::from_raw(_sha256RoundWitness(
|
||||
|
|
|
@ -167,27 +167,6 @@ impl<T: Field> Into<FlatFunction<T>> for DirectiveR1CS {
|
|||
|
||||
// insert a directive to set the witness based on the libsnark gadget and inputs
|
||||
match self.directive {
|
||||
LibsnarkGadgetHelper::Sha256Compress => {
|
||||
statements.insert(
|
||||
0,
|
||||
FlatStatement::Directive(DirectiveStatement {
|
||||
outputs: variables,
|
||||
inputs: inputs,
|
||||
helper: Helper::LibsnarkGadget(LibsnarkGadgetHelper::Sha256Compress),
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
LibsnarkGadgetHelper::Sha256Ethereum => {
|
||||
statements.insert(
|
||||
0,
|
||||
FlatStatement::Directive(DirectiveStatement {
|
||||
outputs: variables,
|
||||
inputs: inputs,
|
||||
helper: Helper::LibsnarkGadget(LibsnarkGadgetHelper::Sha256Ethereum),
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
LibsnarkGadgetHelper::Sha256Round => {
|
||||
statements.insert(
|
||||
|
|
Loading…
Reference in a new issue