Skip to content
Snippets Groups Projects
Commit d8981b90 authored by STEVAN Antoine's avatar STEVAN Antoine 🦀
Browse files

fix the _trusted setup_ size (dragoon/komodo!60)

in 3c91ef12 and !54, a new implementation of the creation of the _trusted setup_ has been introduced, that gets rid of the `E: Pairing` requirement with a more general `<F: PrimeField, G: CurveGroup<_>>`.

however, the size of the _trusted setup_ was incorrect.
`zk::setup` requires the _maximum degree_ of the _trusted setup_, however, the number of bytes `nb_bytes` was consistently being given to it throughout the code base...

this MR
- introduces a new `zk::nb_elements_in_setup` that converts a number of bytes to the associated number of _trusted setup_ elements
- uses that new `zk` function before calling `zK::setup` in all the code base


## results
> 💡 **Note**  
> !58 is required for the whole table to be used easily

> 💡 **Note**  
> here is how to run the benchmarks in Nushell
> ```bash
> let bad_mr = "3c91ef12"
> let fix = "fix-setup-size"
> 
> git co $"($bad_mr)^"
> cargo criterion --output-format verbose --message-format json out> benches/results/before.ndjson
> cargo run --example bench_setup_size out>> benches/results/before.ndjson
> 
> git co $bad_mr
> cargo criterion --output-format verbose --message-format json out> benches/results/after.ndjson
> cargo run --example bench_setup_size out>> benches/results/after.ndjson
> 
> git co $fix
> cargo criterion --output-format verbose --message-format json out> benches/results/fix.ndjson
> cargo run --example bench_setup_size out>> benches/results/fix.ndjson
> ```
> and here the script used to generate that table is the following:
> ```bash
> def "parse bench-file" []: table<reason: string, id: string, mean: any> -> table<id: string, mean: float> {
>     where reason == "benchmark-complete"
>         | select id mean
>         # NOTE: because `bench_setup_size.rs` outputs `record<reason: string, id: string, mean: float>`
>         | update mean { if ($in | describe) == int { $in } else { $in.estimate } }
>         # NOTE: addressed in `!58`
>         | update id {|it|
>             if ($it.id | str starts-with "recoding") {
>                 $it.id ++ " on some curve"
>             } else {
>                 $it.id
>             }
>         }
>         | update mean { into int }
>         | update id { parse "{id} on {curve}" | into record | get id }
> }
> 
> let before = open benches/results/before.ndjson | parse bench-file
> let after = open benches/results/after.ndjson | parse bench-file
> let fix = open benches/results/fix.ndjson | parse bench-file
> 
> $before
>     | join $after id
>     | rename --column { mean: "before", mean_: "after" }
>     | join $fix id
>     | rename --column { mean: "fix" }
>     | insert b->a {|it| $it.after / $it.before | math round --precision 2 }
>     | insert a->f {|it| $it.fix / $it.after | math round --precision 2 }
>     | insert b->f {|it| $it.fix / $it.before | math round --precision 2 }
>     | select id before b->a after a->f fix b->f
>     | to md --pretty
> ```

>  **Important**  
> before this very MR, i.e. on `3c91ef12`, there was a factor of 15x between _before_ and _after_, meaning that the _trusted setups_ were 15 times larger and longer to serde 👀 
>
> this can be explained by the following facts
> - due to the bad sizes given to the _trusted setup_ building function, the setups were around 30 times larger, 30 being close to the size of a field element on BLS-12-381
> - because the `zk::setup` function only creates half of what its Arkworks counterpart does, the setups were at the same time around 2 times smaller
>
> combining these two and we get a factor of 15x!!
>
> now, with this MR, we get rid of the first factor and are left with _trusted setups_ twice as small and twice as fast to serde 🎉 

| id                                                              | before     | b-&gt;a | after      | a-&gt;f | fix        | b-&gt;f |
| --------------------------------------------------------------- | ---------- | ------- | ---------- | ------- | ---------- | ------- |
| inverse 10x10                                                   | 336359     | 0.93    | 313852     | 1.05    | 329191     | 0.98    |
| inverse 15x15                                                   | 811018     | 0.99    | 800064     | 1.01    | 807417     | 1       |
| inverse 20x20                                                   | 1511592    | 1       | 1508034    | 1.02    | 1542538    | 1.02    |
| inverse 30x30                                                   | 3703750    | 1.01    | 3731380    | 1.02    | 3793071    | 1.02    |
| inverse 40x40                                                   | 7163839    | 1       | 7145015    | 1.03    | 7336996    | 1.02    |
| inverse 60x60                                                   | 18620089   | 1       | 18625577   | 1.02    | 18922329   | 1.02    |
| inverse 80x80                                                   | 37571610   | 1       | 37643906   | 1.02    | 38306236   | 1.02    |
| inverse 120x120                                                 | 105404054  | 1       | 105281874  | 1.01    | 106797441  | 1.01    |
| inverse 160x160                                                 | 224332257  | 1       | 224092724  | 1.01    | 227066824  | 1.01    |
| inverse 240x240                                                 | 671096671  | 1       | 671005055  | 1.01    | 679280010  | 1.01    |
| inverse 320x320                                                 | 1487909175 | 1       | 1488534950 | 1.01    | 1506027089 | 1.01    |
| transpose 10x10                                                 | 87         | 0.93    | 81         | 1       | 81         | 0.93    |
| transpose 15x15                                                 | 175        | 0.96    | 168        | 1       | 168        | 0.96    |
| transpose 20x20                                                 | 284        | 1.03    | 293        | 0.95    | 279        | 0.98    |
| transpose 30x30                                                 | 759        | 1.22    | 924        | 0.89    | 823        | 1.08    |
| transpose 40x40                                                 | 1798       | 1.63    | 2935       | 0.98    | 2887       | 1.61    |
| transpose 60x60                                                 | 3830       | 1.67    | 6378       | 1.01    | 6468       | 1.69    |
| transpose 80x80                                                 | 7720       | 1.5     | 11548      | 0.99    | 11470      | 1.49    |
| transpose 120x120                                               | 16365      | 1.5     | 24572      | 0.98    | 24059      | 1.47    |
| transpose 160x160                                               | 42764      | 1.18    | 50453      | 1.07    | 54189      | 1.27    |
| transpose 240x240                                               | 119435     | 1.18    | 141357     | 1       | 140752     | 1.18    |
| transpose 320x320                                               | 218674     | 1.13    | 246262     | 1       | 247167     | 1.13    |
| mul 10x10                                                       | 15499      | 1       | 15474      | 1       | 15527      | 1       |
| mul 15x15                                                       | 51800      | 1       | 51913      | 1       | 51772      | 1       |
| mul 20x20                                                       | 122399     | 1       | 122390     | 1.01    | 123248     | 1.01    |
| mul 30x30                                                       | 499047     | 0.95    | 474740     | 1.01    | 481756     | 0.97    |
| mul 40x40                                                       | 1224755    | 0.98    | 1203588    | 1.01    | 1211995    | 0.99    |
| mul 60x60                                                       | 4166589    | 0.99    | 4122003    | 1       | 4139839    | 0.99    |
| mul 80x80                                                       | 9942560    | 0.99    | 9870864    | 1       | 9912815    | 1       |
| mul 120x120                                                     | 33706366   | 0.99    | 33458234   | 1.01    | 33680802   | 1       |
| mul 160x160                                                     | 79645646   | 1       | 79974020   | 1.01    | 80469214   | 1.01    |
| mul 240x240                                                     | 277091998  | 0.99    | 274638961  | 1.01    | 276412347  | 1       |
| mul 320x320                                                     | 664942845  | 1       | 662229758  | 1.02    | 676065811  | 1.02    |
| recoding 1 bytes and 2 shards with k = 2                        | 124        | 1       | 124        | 1.02    | 127        | 1.02    |
| recoding 1 bytes and 2 shards with k = 4                        | 179        | 0.99    | 178        | 1.01    | 180        | 1.01    |
| recoding 1 bytes and 2 shards with k = 8                        | 284        | 1       | 284        | 1       | 285        | 1       |
| recoding 1 bytes and 2 shards with k = 16                       | 496        | 1.01    | 499        | 1.01    | 505        | 1.02    |
| recoding 1 bytes and 4 shards with k = 2                        | 347        | 1.01    | 349        | 0.99    | 347        | 1       |
| recoding 1 bytes and 4 shards with k = 4                        | 505        | 1       | 505        | 1       | 507        | 1       |
| recoding 1 bytes and 4 shards with k = 8                        | 821        | 1       | 825        | 1       | 825        | 1       |
| recoding 1 bytes and 4 shards with k = 16                       | 1451       | 1       | 1454       | 1.01    | 1464       | 1.01    |
| recoding 1 bytes and 8 shards with k = 2                        | 792        | 1       | 791        | 1       | 792        | 1       |
| recoding 1 bytes and 8 shards with k = 4                        | 1162       | 1       | 1163       | 1.01    | 1169       | 1.01    |
| recoding 1 bytes and 8 shards with k = 8                        | 1884       | 1.01    | 1897       | 1       | 1902       | 1.01    |
| recoding 1 bytes and 8 shards with k = 16                       | 3361       | 1       | 3368       | 1.02    | 3446       | 1.03    |
| recoding 1 bytes and 16 shards with k = 2                       | 1680       | 1       | 1679       | 1.01    | 1699       | 1.01    |
| recoding 1 bytes and 16 shards with k = 4                       | 2472       | 1       | 2475       | 1       | 2468       | 1       |
| recoding 1 bytes and 16 shards with k = 8                       | 4034       | 1       | 4033       | 1.01    | 4060       | 1.01    |
| recoding 1 bytes and 16 shards with k = 16                      | 7187       | 1       | 7173       | 1.02    | 7331       | 1.02    |
| recoding 1024 bytes and 2 shards with k = 2                     | 1020       | 1       | 1020       | 1       | 1017       | 1       |
| recoding 1024 bytes and 2 shards with k = 4                     | 1079       | 1       | 1081       | 0.98    | 1064       | 0.99    |
| recoding 1024 bytes and 2 shards with k = 8                     | 1186       | 0.98    | 1167       | 1       | 1166       | 0.98    |
| recoding 1024 bytes and 2 shards with k = 16                    | 1386       | 1       | 1392       | 0.99    | 1383       | 1       |
| recoding 1024 bytes and 4 shards with k = 2                     | 2978       | 1       | 2968       | 1       | 2970       | 1       |
| recoding 1024 bytes and 4 shards with k = 4                     | 3120       | 1       | 3113       | 1       | 3113       | 1       |
| recoding 1024 bytes and 4 shards with k = 8                     | 3438       | 1       | 3445       | 1       | 3447       | 1       |
| recoding 1024 bytes and 4 shards with k = 16                    | 4056       | 1       | 4071       | 1       | 4051       | 1       |
| recoding 1024 bytes and 8 shards with k = 2                     | 6905       | 1       | 6879       | 1       | 6861       | 0.99    |
| recoding 1024 bytes and 8 shards with k = 4                     | 7236       | 1       | 7216       | 1       | 7227       | 1       |
| recoding 1024 bytes and 8 shards with k = 8                     | 7969       | 1       | 7986       | 1       | 7962       | 1       |
| recoding 1024 bytes and 8 shards with k = 16                    | 9455       | 1       | 9427       | 1       | 9442       | 1       |
| recoding 1024 bytes and 16 shards with k = 2                    | 14746      | 1       | 14760      | 0.99    | 14686      | 1       |
| recoding 1024 bytes and 16 shards with k = 4                    | 15516      | 1       | 15493      | 1       | 15538      | 1       |
| recoding 1024 bytes and 16 shards with k = 8                    | 17112      | 1       | 17097      | 1       | 17078      | 1       |
| recoding 1024 bytes and 16 shards with k = 16                   | 20237      | 1       | 20284      | 1       | 20295      | 1       |
| recoding 1048576 bytes and 2 shards with k = 2                  | 1427516    | 1.01    | 1441658    | 0.99    | 1424866    | 1       |
| recoding 1048576 bytes and 2 shards with k = 4                  | 1083761    | 1.01    | 1094451    | 1       | 1089954    | 1.01    |
| recoding 1048576 bytes and 2 shards with k = 8                  | 1087564    | 0.99    | 1076515    | 1.02    | 1094795    | 1.01    |
| recoding 1048576 bytes and 2 shards with k = 16                 | 1089556    | 0.99    | 1078406    | 1.03    | 1105840    | 1.01    |
| recoding 1048576 bytes and 4 shards with k = 2                  | 3256507    | 1       | 3250060    | 1.04    | 3370007    | 1.03    |
| recoding 1048576 bytes and 4 shards with k = 4                  | 3259079    | 1.01    | 3285892    | 1       | 3297768    | 1.01    |
| recoding 1048576 bytes and 4 shards with k = 8                  | 3235697    | 1       | 3244151    | 1.01    | 3278027    | 1.01    |
| recoding 1048576 bytes and 4 shards with k = 16                 | 3240586    | 1.01    | 3264910    | 1.01    | 3284101    | 1.01    |
| recoding 1048576 bytes and 8 shards with k = 2                  | 7580388    | 1       | 7576306    | 1.02    | 7732461    | 1.02    |
| recoding 1048576 bytes and 8 shards with k = 4                  | 7567385    | 1.01    | 7614250    | 1.01    | 7699032    | 1.02    |
| recoding 1048576 bytes and 8 shards with k = 8                  | 7589588    | 1       | 7584071    | 1.01    | 7643021    | 1.01    |
| recoding 1048576 bytes and 8 shards with k = 16                 | 7572517    | 1       | 7596138    | 1.01    | 7637596    | 1.01    |
| recoding 1048576 bytes and 16 shards with k = 2                 | 16248634   | 1       | 16245477   | 1.01    | 16450530   | 1.01    |
| recoding 1048576 bytes and 16 shards with k = 4                 | 16253850   | 1       | 16299266   | 1.01    | 16458170   | 1.01    |
| recoding 1048576 bytes and 16 shards with k = 8                 | 16240827   | 1       | 16265027   | 1       | 16256734   | 1       |
| recoding 1048576 bytes and 16 shards with k = 16                | 16229981   | 1       | 16307729   | 1       | 16265882   | 1       |
| setup/setup 1024                                                | 8934763    | 2.12    | 18942383   | 0.11    | 2175852    | 0.24    |
| setup/serializing with compression 1024                         | 4194       | 15.82   | 66364      | 0.03    | 2100       | 0.5     |
| setup/serializing with no compression 1024                      | 4953       | 16.04   | 79451      | 0.03    | 2501       | 0.5     |
| setup/deserializing with compression and validation 1024        | 3644409    | 15.18   | 55337980   | 0.03    | 1809773    | 0.5     |
| setup/deserializing with compression and no validation 1024     | 1065186    | 15.74   | 16762363   | 0.03    | 544255     | 0.51    |
| setup/deserializing with no compression and validation 1024     | 2566945    | 15.17   | 38931135   | 0.03    | 1258935    | 0.49    |
| setup/deserializing with no compression and no validation 1024  | 6722       | 14.84   | 99769      | 0.03    | 3235       | 0.48    |
| setup/setup 2048                                                | 9092980    | 3.63    | 33024605   | 0.09    | 2909175    | 0.32    |
| setup/serializing with compression 2048                         | 8240       | 16.32   | 134437     | 0.03    | 4141       | 0.5     |
| setup/serializing with no compression 2048                      | 9767       | 16.41   | 160306     | 0.03    | 4976       | 0.51    |
| setup/deserializing with compression and validation 2048        | 7239787    | 15.32   | 110931280  | 0.03    | 3639477    | 0.5     |
| setup/deserializing with compression and no validation 2048     | 2113330    | 15.93   | 33674890   | 0.03    | 1084243    | 0.51    |
| setup/deserializing with no compression and validation 2048     | 5081373    | 15.25   | 77482178   | 0.03    | 2537317    | 0.5     |
| setup/deserializing with no compression and no validation 2048  | 13079      | 15.14   | 198034     | 0.03    | 6479       | 0.5     |
| setup/setup 4096                                                | 9731992    | 6.14    | 59757543   | 0.07    | 4328023    | 0.44    |
| setup/serializing with compression 4096                         | 16462      | 16.44   | 270647     | 0.03    | 8407       | 0.51    |
| setup/serializing with no compression 4096                      | 19654      | 16.4    | 322264     | 0.03    | 9854       | 0.5     |
| setup/deserializing with compression and validation 4096        | 14330104   | 15.47   | 221659652  | 0.03    | 7227388    | 0.5     |
| setup/deserializing with compression and no validation 4096     | 4214098    | 15.79   | 66537465   | 0.03    | 2137818    | 0.51    |
| setup/deserializing with no compression and validation 4096     | 10095359   | 15.33   | 154755178  | 0.03    | 5037809    | 0.5     |
| setup/deserializing with no compression and no validation 4096  | 26192      | 14.94   | 391397     | 0.03    | 12862      | 0.49    |
| setup/setup 8192                                                | 9594720    | 11.35   | 108884342  | 0.06    | 6893620    | 0.72    |
| setup/serializing with compression 8192                         | 33114      | 16.42   | 543855     | 0.03    | 16713      | 0.5     |
| setup/serializing with no compression 8192                      | 39992      | 16.17   | 646576     | 0.03    | 19983      | 0.5     |
| setup/deserializing with compression and validation 8192        | 28578044   | 15.55   | 444525236  | 0.03    | 14337421   | 0.5     |
| setup/deserializing with compression and no validation 8192     | 8417684    | 15.93   | 134082205  | 0.03    | 4309633    | 0.51    |
| setup/deserializing with no compression and validation 8192     | 20134851   | 15.39   | 309785238  | 0.03    | 10066797   | 0.5     |
| setup/deserializing with no compression and no validation 8192  | 51832      | 15.06   | 780369     | 0.03    | 25710      | 0.5     |
| setup/setup 16384                                               | 10096523   | 19.72   | 199105054  | 0.06    | 11317161   | 1.12    |
| setup/serializing with compression 16384                        | 67050      | 16.28   | 1091282    | 0.03    | 33502      | 0.5     |
| setup/serializing with no compression 16384                     | 80269      | 16.2    | 1300111    | 0.03    | 40785      | 0.51    |
| setup/deserializing with compression and validation 16384       | 56905556   | 15.56   | 885542593  | 0.03    | 28622218   | 0.5     |
| setup/deserializing with compression and no validation 16384    | 16829951   | 15.96   | 268660355  | 0.03    | 8607645    | 0.51    |
| setup/deserializing with no compression and validation 16384    | 40158772   | 15.44   | 619890738  | 0.03    | 20006634   | 0.5     |
| setup/deserializing with no compression and no validation 16384 | 103242     | 15.07   | 1555913    | 0.03    | 51533      | 0.5     |
| serialized size with compression and validation 1024            | 3280       | 15      | 49208      | 0.03    | 1640       | 0.5     |
| serialized size with compression and no validation 1024         | 3280       | 15      | 49208      | 0.03    | 1640       | 0.5     |
| serialized size with no compression and validation 1024         | 6544       | 15.04   | 98408      | 0.03    | 3272       | 0.5     |
| serialized size with no compression and no validation 1024      | 6544       | 15.04   | 98408      | 0.03    | 3272       | 0.5     |
| serialized size with compression and validation 2048            | 6448       | 15.25   | 98360      | 0.03    | 3224       | 0.5     |
| serialized size with compression and no validation 2048         | 6448       | 15.25   | 98360      | 0.03    | 3224       | 0.5     |
| serialized size with no compression and validation 2048         | 12880      | 15.27   | 196712     | 0.03    | 6440       | 0.5     |
| serialized size with no compression and no validation 2048      | 12880      | 15.27   | 196712     | 0.03    | 6440       | 0.5     |
| serialized size with compression and validation 4096            | 12784      | 15.38   | 196664     | 0.03    | 6392       | 0.5     |
| serialized size with compression and no validation 4096         | 12784      | 15.38   | 196664     | 0.03    | 6392       | 0.5     |
| serialized size with no compression and validation 4096         | 25552      | 15.39   | 393320     | 0.03    | 12776      | 0.5     |
| serialized size with no compression and no validation 4096      | 25552      | 15.39   | 393320     | 0.03    | 12776      | 0.5     |
| serialized size with compression and validation 8192            | 25456      | 15.45   | 393272     | 0.03    | 12728      | 0.5     |
| serialized size with compression and no validation 8192         | 25456      | 15.45   | 393272     | 0.03    | 12728      | 0.5     |
| serialized size with no compression and validation 8192         | 50896      | 15.45   | 786536     | 0.03    | 25448      | 0.5     |
| serialized size with no compression and no validation 8192      | 50896      | 15.45   | 786536     | 0.03    | 25448      | 0.5     |
| serialized size with compression and validation 16384           | 50800      | 15.48   | 786488     | 0.03    | 25400      | 0.5     |
| serialized size with compression and no validation 16384        | 50800      | 15.48   | 786488     | 0.03    | 25400      | 0.5     |
| serialized size with no compression and validation 16384        | 101584     | 15.48   | 1572968    | 0.03    | 50792      | 0.5     |
| serialized size with no compression and no validation 16384     | 101584     | 15.48   | 1572968    | 0.03    | 50792      | 0.5     |
parent 6170d5c2
No related branches found
No related tags found
No related merge requests found
......@@ -22,10 +22,10 @@ where
group.bench_function(
&format!("setup {} on {}", nb_bytes, std::any::type_name::<F>()),
|b| b.iter(|| zk::setup::<_, F, G>(nb_bytes, rng).unwrap()),
|b| b.iter(|| zk::setup::<_, F, G>(zk::nb_elements_in_setup::<F>(nb_bytes), rng).unwrap()),
);
let setup = zk::setup::<_, F, G>(nb_bytes, rng).unwrap();
let setup = zk::setup::<_, F, G>(zk::nb_elements_in_setup::<F>(nb_bytes), rng).unwrap();
group.bench_function(
&format!(
......
......@@ -16,7 +16,7 @@ where
{
let rng = &mut test_rng();
let setup = zk::setup::<_, F, G>(nb_bytes, rng).unwrap();
let setup = zk::setup::<_, F, G>(zk::nb_elements_in_setup::<F>(nb_bytes), rng).unwrap();
for (compress, validate) in [
(Compress::Yes, Validate::Yes),
......
......@@ -131,7 +131,7 @@ where
let rng = &mut test_rng();
info!("generating new powers");
let powers = zk::setup::<_, F, G>(n, rng)?;
let powers = zk::setup::<_, F, G>(zk::nb_elements_in_setup::<F>(n), rng)?;
fs::dump(&powers, powers_dir, powers_filename, COMPRESS)?;
......@@ -283,10 +283,11 @@ fn main() {
info!("regenerating temporary powers");
let rng = &mut test_rng();
zk::setup::<_, Fr, G1Projective>(nb_bytes, rng).unwrap_or_else(|e| {
throw_error(1, &format!("could not generate powers: {}", e));
unreachable!()
})
zk::setup::<_, Fr, G1Projective>(zk::nb_elements_in_setup::<Fr>(nb_bytes), rng)
.unwrap_or_else(|e| {
throw_error(1, &format!("could not generate powers: {}", e));
unreachable!()
})
};
if do_verify_blocks {
......
......@@ -131,6 +131,13 @@ where
Ok(Commitment(commitment.into()))
}
// compute the number of elements that a _trusted setup_ should have for data of
// a certain expected size
pub fn nb_elements_in_setup<F: PrimeField>(nb_bytes: usize) -> usize {
let bytes_per_element = (F::MODULUS_BIT_SIZE as usize) / 8;
nb_bytes / bytes_per_element
}
#[cfg(test)]
mod tests {
use ark_bls12_381::{Fr, G1Projective};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment