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-
3532static 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
127180static 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
135207static 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