#serialization #scale #arkworks #parity #wrapped #codec #traits

no-std ark-scale

Arkworks serialization wrapped in Parity SCALE codec

7 releases

0.0.12 Dec 5, 2023
0.0.11 Sep 23, 2023
0.0.10 Aug 29, 2023
0.0.3 May 16, 2023
0.0.2 Apr 14, 2023

#9 in #arkworks

Download history 72146/week @ 2024-07-22 58793/week @ 2024-07-29 69609/week @ 2024-08-05 94426/week @ 2024-08-12 58532/week @ 2024-08-19 82329/week @ 2024-08-26 95735/week @ 2024-09-02 82115/week @ 2024-09-09 79168/week @ 2024-09-16 80338/week @ 2024-09-23 84868/week @ 2024-09-30 80209/week @ 2024-10-07 78135/week @ 2024-10-14 86313/week @ 2024-10-21 66073/week @ 2024-10-28 95004/week @ 2024-11-04

327,839 downloads per month
Used in 19 crates (10 directly)

MIT/Apache

34KB
611 lines

Arkworks serialization wrapped in Parity SCALE codec

ArkScale(T) can be serialized or deserialized using parity-scale-codec, provided T can be serialized or deserialized using ark-serialize.

Arkworks serializes via the std::io::{Read,Write} traits, or its no_std fork of those traits, as do other zcash sapling derivatives. At its core, Parity SCALE codec also consists of traits {Input,Output} analogous to std::io::{Read,Write} respectively, as well as traits {Decode,Encode} also quite similar to ark-serialize::{CanonicalDeserialize,CanonicalSerialize}. We simply translate between these extremely similar traits, including wrapping and unwrapping errors appropriately.

ArkScale cannot easily implement MaxEncodedLen or ConstEncodedLen from SCALE, due to the orphan rules. You'll need these if using weights in Frame, so you should usually create wrapper types around ArkScale. As a rule, anytime you choose curves then you'll have a conditionanl ark-substrate dependence anyways, so wrapper types should not become too onerous, and they likely improve documentation, errors, etc anyways.

ArkScale panics if serialization fails because SCALE does not propogate serialization failures. As scale outputs cannot fail, and ark-scale-derive does not introduce failures, we therefore cannot trigger this panic except by some explicit impl CanonicalSerialize for T intrpducing a failure. ArkScale users should therefore be responcible for reviewing non-derived CanonicalSerialize in their dependencies. In particular, there are no fresh failures in arkworks/algebra:

git clone https://github.com/arkworks-rs/algebra
cd algebra
grep -r --include '*.rs' 'CanonicalSerialize for' -A 10 ff* ec* poly/ | less

This becomes slightly harder if Implementable trait aliases lands.

Dependencies

~3.5–5MB
~99K SLoC