Skip to content

Commit 16e22a2

Browse files
committed
EVIL
make the work with v0.8.0 Please squash this into the merge commit
1 parent 80caef4 commit 16e22a2

File tree

1 file changed

+47
-3
lines changed

1 file changed

+47
-3
lines changed

arm/src/rustler_util.rs

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use bincode;
1919
use k256::ecdsa::{RecoveryId, Signature, SigningKey};
2020
use k256::AffinePoint;
2121
use risc0_zkvm::Digest;
22+
use rustler::types::atom;
2223
use rustler::types::map::map_new;
2324
use rustler::{atoms, Binary, Decoder, Encoder, NifResult};
2425
use rustler::{Env, Error, OwnedBinary, Term};
@@ -78,6 +79,7 @@ atoms! {
7879
at_nk_commitment = "nk_commitment",
7980
at_rand_seed = "rand_seed",
8081
at_delta_proof = "Elixir.Anoma.Arm.DeltaProof",
82+
at_aggregation_proof = "aggregation_proof",
8183
at_signature = "signature",
8284
at_recid = "recid",
8385
at_delta_witness = "Elixir.Anoma.Arm.DeltaWitness",
@@ -98,6 +100,36 @@ pub trait RustlerDecoder<'a>: Sized + 'a {
98100
fn rustler_decode(term: Term<'a>) -> NifResult<Self>;
99101
}
100102

103+
impl<T> RustlerEncoder for Option<T>
104+
where
105+
T: RustlerEncoder,
106+
{
107+
fn rustler_encode<'c>(&self, env: Env<'c>) -> Result<Term<'c>, Error> {
108+
match *self {
109+
Some(ref value) => value.rustler_encode(env),
110+
None => Ok(atom::nil().encode(env)),
111+
}
112+
}
113+
}
114+
115+
impl<'a, T> RustlerDecoder<'a> for Option<T>
116+
where
117+
T: RustlerDecoder<'a>,
118+
{
119+
fn rustler_decode(term: Term<'a>) -> NifResult<Self> {
120+
if let Ok(term) = RustlerDecoder::rustler_decode(term) {
121+
Ok(Some(term))
122+
} else {
123+
let decoded_atom: atom::Atom = term.decode()?;
124+
if decoded_atom == atom::nil() {
125+
Ok(None)
126+
} else {
127+
Err(Error::BadArg)
128+
}
129+
}
130+
}
131+
}
132+
101133
impl RustlerEncoder for Vec<u8> {
102134
fn rustler_encode<'a>(&self, env: Env<'a>) -> Result<Term<'a>, Error> {
103135
let mut erl_bin = OwnedBinary::new(self.len())
@@ -229,7 +261,7 @@ impl RustlerEncoder for ComplianceUnit {
229261
impl<'a> RustlerDecoder<'a> for ComplianceUnit {
230262
fn rustler_decode(term: Term<'a>) -> NifResult<Self> {
231263
let proof_term = term.map_get(at_proof().encode(term.get_env()));
232-
let proof: Vec<u8> = RustlerDecoder::rustler_decode(proof_term?)?;
264+
let proof = RustlerDecoder::rustler_decode(proof_term?)?;
233265
let instance_term = term.map_get(at_instance().encode(term.get_env()));
234266
let instance: Vec<u8> = RustlerDecoder::rustler_decode(instance_term?)?;
235267
Ok(ComplianceUnit { proof, instance })
@@ -384,7 +416,7 @@ impl<'a> RustlerDecoder<'a> for LogicVerifierInputs {
384416
let app_data_term = term.map_get(at_app_data_key().encode(term.get_env()))?;
385417
let app_data: AppData = app_data_term.decode()?;
386418
let proof_term = term.map_get(at_proof().encode(term.get_env()))?;
387-
let proof: Vec<u8> = RustlerDecoder::rustler_decode(proof_term)?;
419+
let proof = RustlerDecoder::rustler_decode(proof_term)?;
388420

389421
Ok(LogicVerifierInputs {
390422
tag,
@@ -1031,7 +1063,7 @@ impl RustlerEncoder for LogicVerifier {
10311063
impl<'a> RustlerDecoder<'a> for LogicVerifier {
10321064
fn rustler_decode(term: Term<'a>) -> NifResult<Self> {
10331065
let proof_term = term.map_get(at_proof().encode(term.get_env()))?;
1034-
let proof: Vec<u8> = RustlerDecoder::rustler_decode(proof_term)?;
1066+
let proof = RustlerDecoder::rustler_decode(proof_term)?;
10351067

10361068
let instance_term = term.map_get(at_instance().encode(term.get_env()))?;
10371069
let instance: Vec<u8> = RustlerDecoder::rustler_decode(instance_term)?;
@@ -1078,6 +1110,13 @@ impl RustlerEncoder for Transaction {
10781110
Some(balance) => balance.rustler_encode(env)?,
10791111
None => ().encode(env),
10801112
},
1113+
)?
1114+
.map_put(
1115+
at_aggregation_proof().encode(env),
1116+
match &self.aggregation_proof {
1117+
Some(proof) => proof.rustler_encode(env)?,
1118+
None => ().encode(env),
1119+
},
10811120
)?;
10821121

10831122
Ok(map)
@@ -1098,10 +1137,15 @@ impl<'a> RustlerDecoder<'a> for Transaction {
10981137
Err(_) => Some(RustlerDecoder::rustler_decode(expected_balance_term)?),
10991138
};
11001139

1140+
let aggregation_proof_term = term.map_get(at_aggregation_proof().encode(term.get_env()))?;
1141+
let aggregation_proof: Option<Vec<u8>> =
1142+
RustlerDecoder::rustler_decode(aggregation_proof_term)?;
1143+
11011144
Ok(Transaction {
11021145
actions,
11031146
delta_proof,
11041147
expected_balance,
1148+
aggregation_proof,
11051149
})
11061150
}
11071151
}

0 commit comments

Comments
 (0)