fix the _trusted setup_ size
in 3c91ef12 and !54 (merged), 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 callingzK::setup
in all the code base
results
💡 Note
!58 (merged) is required for the whole table to be used easily
💡 Note
here is how to run the benchmarks in Nushelllet bad_mr = "3c91ef1" 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:
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. on3c91ef1
, 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 smallercombining 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->a | after | a->f | fix | b->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 |