Skip to content

fix the _trusted setup_ size

STEVAN Antoine requested to merge fix-setup-size into main

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 calling zK::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 Nushell

let 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. on 3c91ef1, 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->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
Edited by STEVAN Antoine

Merge request reports