Answering to myself here:
Private Keys: 32 Bytes.
- The private key is just a scalar that your raise curve points to the power of. The subgroup order for G1 and G2 is
r~2^255
, so for private keys higher than this the point just wraps around. Therefore, useful private keys are<2^255
and fit into 32 bytes. - Recall that
r
is defined here: https://electriccoin.co/blog/new-snark-curve/
Public Keys: 48 Bytes.
- 381 bit affine x coordinate, encoded into 48 big-endian bytes.
- See also https://github.com/ethereum/eth2.0-specs/blob/7a5cdc2a9df9a19c3abe47d88a8b7587a9f109d3/specs/core/0_beacon-chain.md#custom-types
Signatures: 96 Bytes.
- Two 381 bit integers (affine x coordinate), encoded into two 48 big-endian byte arrays.
- The signature is a point on the G2 subgroup, which is defined over a finite field with elements twice as big as the G1 curve (G2 is over Fq2 rather than Fq. Fq2 is analogous to the complex numbers).
- See also https://github.com/ethereum/eth2.0-specs/blob/7a5cdc2a9df9a19c3abe47d88a8b7587a9f109d3/specs/core/0_beacon-chain.md#custom-types