MAYA is a shuffle argument with O(log n) proof size and transparent setup, built for verifiable elections. It allows a mix-server to prove — succinctly and without any trusted setup — that a shuffled list of ciphertexts is a correct re-encryption and permutation of the original list, without revealing the permutation itself.

Performance

nModeProver (s)Verifier (s)Proof size
1,000ST0.240.053.78 KB
MT0.100.03
10,000ST1.950.454.91 KB
MT0.720.17
100,000ST19.524.606.03 KB
MT6.901.57
1,000,000ST193.7245.436.59 KB
MT71.9113.81

Table 1. MAYA (Ristretto curve) for a shuffle of n ciphertexts. Timings are measured end-to-end, including disk I/O, in seconds, for single-threaded (ST) and multi-threaded (MT) execution. Proof size is independent of the threading model.

All benchmarks were conducted on a laptop equipped with an Intel Core i5-1245U processor (2 Performance-cores and 8 Efficient-cores for a total of 12 threads, with a max turbo frequency of 4.4 GHz), 16 GB of RAM, and running Ubuntu 22.04 LTS, with rustc 1.88.0. MAYA uses the Ristretto255 curve (curve25519-dalek) with folding factor k=4.

These figures improve on the ones reported in the paper. They were measured with the implementation in maya_extensions, run as a single block, which is the plain shuffle. The protocol is unchanged. See the Changelog for how the two versions differ, and the Paper for the full evaluation.

Learn more