Skip to content

Commit f9f41ad

Browse files
committed
sp bench: use hash-map for label cache, bench with empty (0), tiny (1) and huge (100000)
1 parent 90136e1 commit f9f41ad

2 files changed

Lines changed: 94 additions & 20 deletions

File tree

src/bench.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ int main(int argc, char** argv) {
199199
"ecdsa_recover", "schnorrsig", "schnorrsig_verify", "schnorrsig_sign", "ec",
200200
"keygen", "ec_keygen", "ellswift", "encode", "ellswift_encode", "decode",
201201
"ellswift_decode", "ellswift_keygen", "ellswift_ecdh", "silentpayments",
202-
"silentpayments_full_scan", "silentpayments_full_scan_with_labels"};
202+
"silentpayments_full_scan", "sp_scan_with_labels"};
203203
size_t valid_args_size = sizeof(valid_args)/sizeof(valid_args[0]);
204204
int invalid_args = have_invalid_args(argc, argv, valid_args, valid_args_size);
205205

@@ -253,7 +253,7 @@ int main(int argc, char** argv) {
253253

254254
#ifndef ENABLE_MODULE_SILENTPAYMENTS
255255
if (have_flag(argc, argv, "silentpayments") || have_flag(argc, argv, "silentpayments_full_scan") ||
256-
have_flag(argc, argv, "silentpayments_full_scan_with_labels")) {
256+
have_flag(argc, argv, "sp_scan_with_labels")) {
257257
fprintf(stderr, "./bench: silentpayments module not enabled.\n");
258258
fprintf(stderr, "See README.md for configuration instructions.\n\n");
259259
return EXIT_FAILURE;

src/modules/silentpayments/bench_impl.h

Lines changed: 92 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
#define SECP256K1_MODULE_SILENTPAYMENTS_BENCH_H
99

1010
#include "../../../include/secp256k1_silentpayments.h"
11+
#include "label_cache.h"
12+
13+
#define TINY_LABEL_CACHE_ENTRIES 1
14+
#define HUGE_LABEL_CACHE_ENTRIES 1000000
1115

1216
#define NUM_TX_OUTPUTS 10
1317

@@ -21,17 +25,10 @@ typedef struct {
2125
secp256k1_silentpayments_found_output found_outputs[NUM_TX_OUTPUTS];
2226
unsigned char scalar[32];
2327
unsigned char smallest_outpoint[36];
28+
label_cache_t *label_cache_tiny;
29+
label_cache_t *label_cache_huge;
2430
} bench_silentpayments_data;
2531

26-
/* we need a non-null pointer for the cache */
27-
static int noop;
28-
void* label_cache = &noop;
29-
const unsigned char* label_lookup(const unsigned char* key, const void* cache_ptr) {
30-
(void)key;
31-
(void)cache_ptr;
32-
return NULL;
33-
}
34-
3532
static void bench_silentpayments_scan_setup(void* arg) {
3633
int i;
3734
bench_silentpayments_data *data = (bench_silentpayments_data*)arg;
@@ -85,18 +82,74 @@ static void bench_silentpayments_scan_setup(void* arg) {
8582
CHECK(secp256k1_ec_pubkey_parse(data->ctx, &data->spend_pubkeys[0], spend_pubkey, pubkeylen));
8683
memcpy(data->scan_key, scan_key, 32);
8784
memcpy(data->smallest_outpoint, smallest_outpoint, 36);
85+
86+
data->label_cache_tiny = label_cache_init();
87+
data->label_cache_huge = label_cache_init();
88+
/* create a giant label cache with fake entries (note that in order to avoid point
89+
* multiplications, these are created pseudo-randomly and thus are not necessarily
90+
* cryptograhpically valid, but they still match the serialized labels format, i.e. first byte
91+
* is either 0x02 or 0x03, while the remaining 32 bytes are random) */
92+
for (i = 0; i < HUGE_LABEL_CACHE_ENTRIES; i++) {
93+
unsigned char msg[8];
94+
unsigned char fake_label_tweak[32];
95+
unsigned char fake_label[33];
96+
int ret;
97+
98+
secp256k1_write_be64(msg, i);
99+
CHECK(secp256k1_tagged_sha256(data->ctx, fake_label_tweak, (unsigned char*)"fake_label_tweak", 16, msg, 8));
100+
fake_label[0] = (i % 2) == 1 ? 0x02 : 0x03;
101+
CHECK(secp256k1_tagged_sha256(data->ctx, &fake_label[1], (unsigned char*)"fake_label", 10, msg, 8));
102+
ret = label_cache_put(data->label_cache_huge, fake_label, fake_label_tweak);
103+
CHECK(ret == 1); /* 1 -> new slot */
104+
if (i == 0) { /* for the tiny label cache, only insert one entry */
105+
ret = label_cache_put(data->label_cache_tiny, fake_label, fake_label_tweak);
106+
CHECK(ret == 1);
107+
}
108+
}
109+
CHECK(label_cache_size(data->label_cache_tiny) == TINY_LABEL_CACHE_ENTRIES);
110+
CHECK(label_cache_size(data->label_cache_huge) == HUGE_LABEL_CACHE_ENTRIES);
111+
/* paranoid sanity check: verify that the newly inserted elements can all be looked up,
112+
* and that the same amount of randomly generated labels (in a different way) _can't_ be looked up */
113+
for (i = 0; i < HUGE_LABEL_CACHE_ENTRIES; i++) {
114+
unsigned char msg[8];
115+
unsigned char expected_fake_label_tweak[32];
116+
unsigned char fake_label_in_cache[33];
117+
unsigned char fake_label_not_in_cache[33];
118+
unsigned char *lookup_result;
119+
120+
secp256k1_write_be64(msg, i);
121+
CHECK(secp256k1_tagged_sha256(data->ctx, expected_fake_label_tweak, (unsigned char*)"fake_label_tweak", 16, msg, 8));
122+
fake_label_in_cache[0] = (i % 2) == 1 ? 0x02 : 0x03;
123+
CHECK(secp256k1_tagged_sha256(data->ctx, &fake_label_in_cache[1], (unsigned char*)"fake_label", 10, msg, 8));
124+
fake_label_not_in_cache[0] = (i % 2) == 1 ? 0x02 : 0x03;
125+
CHECK(secp256k1_tagged_sha256(data->ctx, &fake_label_not_in_cache[1], (unsigned char*)"fake_label_outside", 18, msg, 8));
126+
127+
/* label expected to be in cache */
128+
lookup_result = label_cache_get(data->label_cache_huge, fake_label_in_cache);
129+
CHECK(lookup_result != NULL);
130+
CHECK(secp256k1_memcmp_var(lookup_result, expected_fake_label_tweak, 32) == 0);
131+
132+
/* label expected not to be in cache */
133+
lookup_result = label_cache_get(data->label_cache_huge, fake_label_not_in_cache);
134+
CHECK(lookup_result == NULL);
135+
}
136+
}
137+
138+
static void bench_silentpayments_scan_teardown(void* arg, int iters) {
139+
bench_silentpayments_data *data = (bench_silentpayments_data*)arg;
140+
(void)iters;
141+
label_cache_destroy(data->label_cache_tiny);
142+
label_cache_destroy(data->label_cache_huge);
88143
}
89144

90-
static void bench_silentpayments_full_tx_scan(void* arg, int iters, int use_labels) {
145+
static void bench_silentpayments_full_tx_scan(void* arg, int iters, label_cache_t *label_cache, secp256k1_silentpayments_label_lookup label_lookup_fn) {
91146
int i;
92147
uint32_t n_found = 0;
93148
secp256k1_silentpayments_found_output *found_output_ptrs[NUM_TX_OUTPUTS];
94149
const secp256k1_xonly_pubkey *tx_output_ptrs[NUM_TX_OUTPUTS];
95150
const secp256k1_xonly_pubkey *tx_input_ptrs[2];
96151
bench_silentpayments_data *data = (bench_silentpayments_data*)arg;
97152
secp256k1_silentpayments_prevouts_summary prevouts_summary;
98-
const secp256k1_silentpayments_label_lookup label_lookup_fn = use_labels ? label_lookup : NULL;
99-
const void *label_context = use_labels ? label_cache : NULL;
100153

101154
for (i = 0; i < 2; i++) {
102155
tx_input_ptrs[i] = &data->tx_inputs[i];
@@ -118,18 +171,37 @@ static void bench_silentpayments_full_tx_scan(void* arg, int iters, int use_labe
118171
data->scan_key,
119172
&prevouts_summary,
120173
&data->spend_pubkeys[0],
121-
label_lookup_fn, label_context)
174+
label_lookup_fn, label_cache)
122175
);
123176
CHECK(n_found == 0);
124177
}
125178
}
126179

127180
static void bench_silentpayments_full_scan(void *arg, int iters) {
128-
bench_silentpayments_full_tx_scan(arg, iters, 0);
181+
bench_silentpayments_full_tx_scan(arg, iters, NULL, NULL);
129182
}
130183

131-
static void bench_silentpayments_full_scan_with_labels(void *arg, int iters) {
132-
bench_silentpayments_full_tx_scan(arg, iters, 1);
184+
static const unsigned char* label_cache_empty_lookup_fun(const unsigned char *key, const void *cache_ptr) {
185+
(void)key;
186+
(void)cache_ptr;
187+
return NULL;
188+
}
189+
190+
static void bench_silentpayments_full_scan_with_labels_empty(void *arg, int iters) {
191+
bench_silentpayments_data *data = (bench_silentpayments_data*)arg;
192+
bench_silentpayments_full_tx_scan(arg, iters, NULL, label_cache_empty_lookup_fun);
193+
}
194+
195+
static void bench_silentpayments_full_scan_with_labels_tiny(void *arg, int iters) {
196+
bench_silentpayments_data *data = (bench_silentpayments_data*)arg;
197+
CHECK(label_cache_size(data->label_cache_tiny) == TINY_LABEL_CACHE_ENTRIES); /* sanity check */
198+
bench_silentpayments_full_tx_scan(arg, iters, data->label_cache_tiny, label_cache_lookup_fun);
199+
}
200+
201+
static void bench_silentpayments_full_scan_with_labels_huge(void *arg, int iters) {
202+
bench_silentpayments_data *data = (bench_silentpayments_data*)arg;
203+
CHECK(label_cache_size(data->label_cache_huge) == HUGE_LABEL_CACHE_ENTRIES); /* sanity check */
204+
bench_silentpayments_full_tx_scan(arg, iters, data->label_cache_huge, label_cache_lookup_fun);
133205
}
134206

135207
static void run_silentpayments_bench(int iters, int argc, char** argv) {
@@ -138,8 +210,10 @@ static void run_silentpayments_bench(int iters, int argc, char** argv) {
138210

139211
data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_NONE);
140212

141-
if (d || have_flag(argc, argv, "silentpayments") || have_flag(argc, argv, "silentpayments_full_scan")) run_benchmark("silentpayments_full_scan", bench_silentpayments_full_scan, bench_silentpayments_scan_setup, NULL, &data, 10, iters);
142-
if (d || have_flag(argc, argv, "silentpayments") || have_flag(argc, argv, "silentpayments_full_scan_with_labels")) run_benchmark("silentpayments_full_scan_with_labels", bench_silentpayments_full_scan_with_labels, bench_silentpayments_scan_setup, NULL, &data, 10, iters);
213+
if (d || have_flag(argc, argv, "sp") || have_flag(argc, argv, "sp_scan")) run_benchmark("sp_full_scan", bench_silentpayments_full_scan, bench_silentpayments_scan_setup, bench_silentpayments_scan_teardown, &data, 10, iters);
214+
if (d || have_flag(argc, argv, "sp") || have_flag(argc, argv, "sp_scan_with_labels")) run_benchmark("sp_scan_with_label_cache_empty_L=0", bench_silentpayments_full_scan_with_labels_empty, bench_silentpayments_scan_setup, bench_silentpayments_scan_teardown, &data, 10, iters);
215+
if (d || have_flag(argc, argv, "sp") || have_flag(argc, argv, "sp_scan_with_labels")) run_benchmark("sp_scan_with_label_cache_tiny_L=1", bench_silentpayments_full_scan_with_labels_tiny, bench_silentpayments_scan_setup, bench_silentpayments_scan_teardown, &data, 10, iters);
216+
if (d || have_flag(argc, argv, "sp") || have_flag(argc, argv, "sp_scan_with_labels")) run_benchmark("sp_scan_with_label_cache_huge_L=1000000", bench_silentpayments_full_scan_with_labels_huge, bench_silentpayments_scan_setup, bench_silentpayments_scan_teardown, &data, 10, iters);
143217

144218
secp256k1_context_destroy(data.ctx);
145219
}

0 commit comments

Comments
 (0)