Expand description
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.
Re-exports
pub use ark_serialize;
pub use scale_codec as scale;
Modules
Macros
- Implement body of
scale::MaxEncodedLen
by delegation toark_std::Zero
andCanonicalSerialize
, usable from polymorphic code. - Implement body of
scale::Decode
by delegation toArkScale
, usable from polymorphic code. - Implement body of
scale::Encode
by delegation toArkScale
, usable from polymorphic code. - Implement
scale::{Encode,Decode}
by delegation toArkScale
, but lacks support for polymorphic code.
Structs
- Arkworks type wrapped for serialization by Scale
- Arkworks type wrapped for serialization by Scale
Constants
- ArkScale usage which neither compresses nor validates inputs, only for usage in host calls and on-chain storage where the runtime already performed validation checks.
- ArkScale usage for typical wire formats, like block data and gossip messages. Always safe.
Traits
- An orphan rules helper which provides
impl scale::MaxEncodedLen for ArkScale<T,WIRE>
- Items implementing
MaxEncodedLen
have a statically known maximum encoded size.
Functions
- Arkworks’
CanonicalSerialize
cannot consumeIterator
s directly, butiter_ark_to_ark_bytes
serializes exactly likeVec<T>
,&'a [T]
, or[T]
do withCanonicalSerialize
. - Arkworks’
CanonicalSerialize
cannot consumeIterator
s directly, butiter_ark_to_scale_bytes
serializes exactly likeArkScale(Vec<T>)
,ArkScale(&'a [T])
, orArkScale([T])
do underparity_scale_codec::Encode
. - Arkworks’ serialization modes hack.
Type Aliases
- Arkworks’ serialization modes, morally (Compress, Validate) but const generics only supports integers,
bool
andchar
right now.
Derive Macros
- Derive
parity_scale_codec::MaxEncodedLen
for struct and enum.