1
0
Fork 0
mirror of synced 2025-09-23 20:28:36 +00:00

remove usize cast in abi encoding

This commit is contained in:
dark64 2022-02-08 21:00:15 +01:00
parent cf538e5273
commit 4fcb24af56
5 changed files with 74 additions and 50 deletions

View file

@ -5,7 +5,7 @@ pub enum Inputs<T> {
Abi(Values<T>),
}
impl<T: From<usize>> Encode<T> for Inputs<T> {
impl<T: Field> Encode<T> for Inputs<T> {
fn encode(self) -> Vec<T> {
match self {
Inputs::Raw(v) => v,
@ -90,15 +90,15 @@ pub trait Decode<T> {
fn decode(raw: Vec<T>, expected: Self::Expected) -> Self;
}
impl<T: From<usize>> Encode<T> for Value<T> {
impl<T: Field> Encode<T> for Value<T> {
fn encode(self) -> Vec<T> {
match self {
Value::Field(t) => vec![t],
Value::U8(t) => vec![T::from(t as usize)],
Value::U16(t) => vec![T::from(t as usize)],
Value::U32(t) => vec![T::from(t as usize)],
Value::U64(t) => vec![T::from(t as usize)],
Value::Boolean(b) => vec![if b { 1.into() } else { 0.into() }],
Value::U8(v) => vec![T::from(v)],
Value::U16(v) => vec![T::from(v)],
Value::U32(v) => vec![T::from(v)],
Value::U64(v) => vec![T::from(v)],
Value::Boolean(b) => vec![T::from(b)],
Value::Array(a) => a.into_iter().flat_map(|v| v.encode()).collect(),
Value::Struct(s) => s.into_iter().flat_map(|(_, v)| v.encode()).collect(),
}
@ -174,7 +174,7 @@ impl<T: Field> Decode<T> for Value<T> {
}
}
impl<T: From<usize>> Encode<T> for Values<T> {
impl<T: Field> Encode<T> for Values<T> {
fn encode(self) -> Vec<T> {
self.0.into_iter().flat_map(|v| v.encode()).collect()
}
@ -542,39 +542,39 @@ mod tests {
#[test]
fn fields() {
let v = Values(vec![Value::Field(1), Value::Field(2)]);
assert_eq!(v.encode(), vec![1, 2]);
let v = Values::<Bn128Field>(vec![Value::Field(1.into()), Value::Field(2.into())]);
assert_eq!(v.encode(), vec![1.into(), 2.into()]);
}
#[test]
fn u8s() {
let v = Values::<usize>(vec![Value::U8(1), Value::U8(2)]);
assert_eq!(v.encode(), vec![1, 2]);
let v = Values::<Bn128Field>(vec![Value::U8(1), Value::U8(2)]);
assert_eq!(v.encode(), vec![1.into(), 2.into()]);
}
#[test]
fn bools() {
let v: Values<usize> = Values(vec![Value::Boolean(true), Value::Boolean(false)]);
assert_eq!(v.encode(), vec![1, 0]);
let v: Values<Bn128Field> = Values(vec![Value::Boolean(true), Value::Boolean(false)]);
assert_eq!(v.encode(), vec![1.into(), 0.into()]);
}
#[test]
fn array() {
let v: Values<usize> = Values(vec![Value::Array(vec![
let v: Values<Bn128Field> = Values(vec![Value::Array(vec![
Value::Boolean(true),
Value::Boolean(false),
])]);
assert_eq!(v.encode(), vec![1, 0]);
assert_eq!(v.encode(), vec![1.into(), 0.into()]);
}
#[test]
fn struc() {
let v: Values<usize> = Values(vec![Value::Struct(
vec![("a".to_string(), Value::Field(42))]
let v: Values<Bn128Field> = Values(vec![Value::Struct(
vec![("a".to_string(), Value::Field(42.into()))]
.into_iter()
.collect(),
)]);
assert_eq!(v.encode(), vec![42]);
assert_eq!(v.encode(), vec![42.into()]);
}
}
}

View file

@ -12,14 +12,19 @@ pub use self::scheme::*;
pub use self::solidity::*;
use crate::ir;
use rand_0_4::Rng;
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use std::io::{Read, Write};
#[cfg(feature = "bellman")]
use zokrates_field::BellmanFieldExtensions;
use zokrates_field::{Bls12_377Field, Bls12_381Field, Bn128Field, Field};
cfg_if::cfg_if! {
if #[cfg(feature = "bellman")] {
use rand_0_4::Rng;
use std::io::{Read, Write};
use zokrates_field::BellmanFieldExtensions;
}
}
pub trait NotBw6_761Field {}
impl NotBw6_761Field for Bls12_377Field {}
impl NotBw6_761Field for Bls12_381Field {}

View file

@ -13,7 +13,7 @@ type Constants<'ast, T> = HashMap<Identifier<'ast>, ZirExpression<'ast, T>>;
#[derive(Debug, PartialEq)]
pub enum Error {
OutOfBounds(u128, u128),
OutOfBounds(usize, usize),
DivisionByZero,
AssertionFailed(RuntimeError),
}
@ -147,7 +147,7 @@ impl<'ast, T: Field> ResultFolder<'ast, T> for ZirPropagator<'ast, T> {
UExpressionInner::Value(v) => e
.get(v as usize)
.cloned()
.ok_or(Error::OutOfBounds(v, e.len() as u128)),
.ok_or(Error::OutOfBounds(v as usize, e.len())),
i => Ok(FieldElementExpression::Select(
e,
box i.annotate(UBitwidth::B32),
@ -279,7 +279,7 @@ impl<'ast, T: Field> ResultFolder<'ast, T> for ZirPropagator<'ast, T> {
UExpressionInner::Value(v) => e
.get(*v as usize)
.cloned()
.ok_or(Error::OutOfBounds(*v, e.len() as u128)),
.ok_or(Error::OutOfBounds(*v as usize, e.len())),
_ => Ok(BooleanExpression::Select(e, box index)),
}
}
@ -510,7 +510,7 @@ impl<'ast, T: Field> ResultFolder<'ast, T> for ZirPropagator<'ast, T> {
UExpressionInner::Value(v) => e
.get(v as usize)
.cloned()
.ok_or(Error::OutOfBounds(v, e.len() as u128))
.ok_or(Error::OutOfBounds(v as usize, e.len()))
.map(|e| e.into_inner()),
i => Ok(UExpressionInner::Select(e, box i.annotate(UBitwidth::B32))),
}

View file

@ -544,7 +544,7 @@ pub enum UBitwidth {
impl UBitwidth {
pub fn to_usize(self) -> usize {
self as u32 as usize
self as usize
}
}

View file

@ -53,11 +53,14 @@ pub trait Field:
'static
+ Sync
+ Send
+ From<u128>
+ From<u64>
+ From<u32>
+ From<u16>
+ From<u8>
+ From<usize>
+ From<bool>
+ From<i32>
+ From<u32>
+ From<usize>
+ From<u128>
+ TryFrom<BigUint, Error = ()>
+ Zero
+ One
@ -266,25 +269,15 @@ mod prime_field {
}
}
impl From<i32> for FieldPrime {
fn from(num: i32) -> Self {
if num < 0 {
FieldPrime {
v: -Fr::from((-num) as u32),
}
} else {
FieldPrime {
v: Fr::from(num as u32),
}
}
impl From<u128> for FieldPrime {
fn from(num: u128) -> Self {
FieldPrime { v: Fr::from(num) }
}
}
impl From<bool> for FieldPrime {
fn from(num: bool) -> Self {
FieldPrime {
v: Fr::from(num as u32),
}
impl From<u64> for FieldPrime {
fn from(num: u64) -> Self {
FieldPrime { v: Fr::from(num) }
}
}
@ -294,6 +287,18 @@ mod prime_field {
}
}
impl From<u16> for FieldPrime {
fn from(num: u16) -> Self {
FieldPrime { v: Fr::from(num) }
}
}
impl From<u8> for FieldPrime {
fn from(num: u8) -> Self {
FieldPrime { v: Fr::from(num) }
}
}
impl From<usize> for FieldPrime {
fn from(num: usize) -> Self {
FieldPrime {
@ -302,9 +307,23 @@ mod prime_field {
}
}
impl From<u128> for FieldPrime {
fn from(num: u128) -> Self {
FieldPrime { v: Fr::from(num) }
impl From<bool> for FieldPrime {
fn from(b: bool) -> Self {
FieldPrime { v: Fr::from(b) }
}
}
impl From<i32> for FieldPrime {
fn from(num: i32) -> Self {
if num < 0 {
FieldPrime {
v: -Fr::from((-num) as u32),
}
} else {
FieldPrime {
v: Fr::from(num as u32),
}
}
}
}