diff --git a/.gitignore b/.gitignore index c762c8e6..62334853 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ bench_generator bench_rangeproof bench_internal bench_whitelist +bench_iceberg noverify_tests tests exhaustive_tests diff --git a/Makefile.am b/Makefile.am index 056ff369..4deb521b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -118,6 +118,12 @@ bench_internal_CPPFLAGS = $(SECP_CONFIG_DEFINES) bench_ecmult_SOURCES = src/bench_ecmult.c bench_ecmult_LDADD = $(COMMON_LIB) $(PRECOMPUTED_LIB) bench_ecmult_CPPFLAGS = $(SECP_CONFIG_DEFINES) +if ENABLE_MODULE_ICEBERG +noinst_PROGRAMS += bench_iceberg +bench_iceberg_SOURCES = src/bench_iceberg.c +bench_iceberg_LDADD = $(COMMON_LIB) $(PRECOMPUTED_LIB) +bench_iceberg_CPPFLAGS = $(SECP_CONFIG_DEFINES) +endif endif TESTS = diff --git a/src/bench_iceberg.c b/src/bench_iceberg.c new file mode 100644 index 00000000..24828109 --- /dev/null +++ b/src/bench_iceberg.c @@ -0,0 +1,97 @@ +/*********************************************************************** + * Distributed under the MIT software license, see the accompanying * + * file COPYING or https://www.opensource.org/licenses/mit-license.php.* + ***********************************************************************/ + +#include +#include +#include + +#include "secp256k1.c" +#include "../include/secp256k1.h" +#include "util.h" +#include "bench.h" +#include "modules/iceberg/bench_impl.h" + +/* Small sizes, spread out enough to show the growth curve. These are not + * deployment recommendations: all five are below the n >= 3t-2 that the + * agreement around the scheme needs, and 4-of-7 versus 5-of-9 is here because + * the seed count roughly triples between them, not because anyone runs it. */ +static const unsigned int CONFIGS[][2] = { {3,2}, {5,3}, {7,4}, {9,5}, {10,5} }; + +int main(int argc, char **argv) { + bench_iceberg_data data; + int iters = get_iters(1000); + size_t c; + + (void)argc; (void)argv; + data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_NONE); + + printf("%-22s", ""); + for (c = 0; c < sizeof(CONFIGS)/sizeof(CONFIGS[0]); c++) { + char label[16]; + sprintf(label, "%u-of-%u", CONFIGS[c][1], CONFIGS[c][0]); + printf("%12s", label); + } + printf("\n"); + printf("%-22s", "seeds per participant"); + for (c = 0; c < sizeof(CONFIGS)/sizeof(CONFIGS[0]); c++) { + printf("%12u", secp256k1_rss_binom(CONFIGS[c][0] - 1, CONFIGS[c][1] - 1)); + } + printf("\n\n"); + + { + /* per_sig marks the rows a signing session actually pays for, so the + * total at the bottom comes from the same run as the rows above it + * rather than from someone adding them up by hand. */ + struct { const char *name; void (*fn)(void*, int); int per_sig; const char *note; } benches[] = { + { "shares_gen", bench_iceberg_shares_gen, 0, " (setup only)" }, + { "share_cache_create",bench_iceberg_cache_create, 0, " (setup only)" }, + { "pubshare_gen", bench_iceberg_pubshare_gen, 0, " (setup only)" }, + { "pubkey_agg", bench_iceberg_pubkey_agg, 0, " (setup only)" }, + { "nonce_gen", bench_iceberg_nonce_gen, 1, "" }, + { "nonce_agg", bench_iceberg_nonce_agg, 1, "" }, + { "partial_sign", bench_iceberg_partial_sign, 1, "" }, + { "partial_sig_agg", bench_iceberg_partial_sig_agg, 1, "" }, + { "partial_sig_verify",bench_iceberg_partial_sig_verify, 0, " (optional, per share)" }, + { " degree_check", bench_iceberg_degree_check, 0, " (inside nonce_agg, partial_sign and partial_sig_verify)" }, + { " interpolate", bench_iceberg_interpolate, 0, " (inside nonce_agg, partial_sign and partial_sig_verify)" }, + { " lagrange_basis", bench_iceberg_lagrange_basis, 0, " (inside degree_check)" } + }; + double per_signature[sizeof(CONFIGS)/sizeof(CONFIGS[0])] = { 0 }; + size_t b; + for (b = 0; b < sizeof(benches)/sizeof(benches[0]); b++) { + printf("%-22s", benches[b].name); + for (c = 0; c < sizeof(CONFIGS)/sizeof(CONFIGS[0]); c++) { + int64_t begin, total; + double each; + int i; + data.n = CONFIGS[c][0]; + data.t = CONFIGS[c][1]; + data.mu = 2 * data.t - 1; + bench_iceberg_setup(&data); + benches[b].fn(&data, 2); /* warm up */ + begin = gettime_i64(); + for (i = 0; i < iters; i++) { + benches[b].fn(&data, 1); + } + total = gettime_i64() - begin; + each = (double)total / iters; + if (benches[b].per_sig) { + per_signature[c] += each; + } + printf("%9.1f us", each); + } + printf("%s\n", benches[b].note); + } + + printf("\n%-22s", "per signature"); + for (c = 0; c < sizeof(CONFIGS)/sizeof(CONFIGS[0]); c++) { + printf("%9.1f us", per_signature[c]); + } + printf("\n"); + } + + secp256k1_context_destroy(data.ctx); + return EXIT_SUCCESS; +}