diff options
author | Christian Grothoff <christian@grothoff.org> | 2023-01-11 12:05:29 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2023-01-11 12:05:29 +0100 |
commit | 18515a23749ef723bfc23deb6586348008410820 (patch) | |
tree | 8364db1fd62454a2f120a949289b880e087d1e7a /src/exchangedb/test_exchangedb_populate_table.c | |
parent | f85fe853ce48b2d1af912e3e10865c39d9cc4ca7 (diff) | |
parent | 5de648b0f6f8efba2665dd05cf3b4f45a1ac164b (diff) | |
download | exchange-18515a23749ef723bfc23deb6586348008410820.tar.xz |
Merge branch 'master' of git+ssh://git.taler.net/exchange
Diffstat (limited to 'src/exchangedb/test_exchangedb_populate_table.c')
-rw-r--r-- | src/exchangedb/test_exchangedb_populate_table.c | 542 |
1 files changed, 246 insertions, 296 deletions
diff --git a/src/exchangedb/test_exchangedb_populate_table.c b/src/exchangedb/test_exchangedb_populate_table.c index d67d1307a..face454fd 100644 --- a/src/exchangedb/test_exchangedb_populate_table.c +++ b/src/exchangedb/test_exchangedb_populate_table.c @@ -22,8 +22,11 @@ #include "taler_exchangedb_lib.h" #include "taler_json_lib.h" #include "taler_exchangedb_plugin.h" +#include "math.h" -/**o +#define NUM_ROWS 10000 + +/** * Global result from the testcase. */ static int result; @@ -56,20 +59,13 @@ static int result; * Currency we use. Must match test-exchange-db-*.conf. */ #define CURRENCY "EUR" - - -/** - * Number of newly minted coins to use in the test. - */ -#define MELT_NEW_COINS 5 -#define i 0 -#define NUMBER_DEPOSIT 10 /** * How big do we make the RSA keys? */ #define RSA_KEY_SIZE 1024 - - +#define ROUNDS 1000 +#define MELT_NEW_COINS 5 +#define MELT_NOREVEAL_INDEX 1 /** * Database plugin under test. */ @@ -82,8 +78,8 @@ struct DenomKeyPair struct TALER_DenominationPrivateKey priv; struct TALER_DenominationPublicKey pub; }; - - +static struct DenomKeyPair **new_dkp; +static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins; /** * Destroy a denomination key pair. The key is not necessarily removed from the DB. * @@ -176,92 +172,30 @@ create_denom_key_pair (unsigned int size, } return dkp; } - -/** - * Here we store the hash of the payto URI. - */ -static struct TALER_PaytoHashP wire_target_h_payto; /** - * Counter used in auditor-related db functions. Used to count - * expected rows. - */ -static unsigned int auditor_row_cnt; -/** - * Callback for #select_deposits_above_serial_id () + * Callback invoked with information about refunds applicable + * to a particular coin. * - * @param cls closure - * @param rowid unique serial ID for the deposit in our DB - * @param exchange_timestamp when did the deposit happen - * @param deposit deposit details - * @param denom_pub denomination of the @a coin_pub - * @param done flag set if the deposit was already executed (or not) + * @param cls closure with the `struct TALER_EXCHANGEDB_Refund *` we expect to get + * @param amount_with_fee amount being refunded * @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop */ static enum GNUNET_GenericReturnValue -audit_deposit_cb (void *cls, - uint64_t rowid, - struct GNUNET_TIME_Timestamp exchange_timestamp, - const struct TALER_EXCHANGEDB_Deposit *deposit, - const struct TALER_DenominationPublicKey *denom_pub, - bool done) +check_refund_cb (void *cls, + const struct TALER_Amount *amount_with_fee) { - (void) cls; - (void) rowid; - (void) exchange_timestamp; - (void) deposit; - (void) denom_pub; - (void) done; - auditor_row_cnt++; - return GNUNET_OK; -} -/** - * Function called on deposits that are past their due date - * and have not yet seen a wire transfer. - * - * @param cls closure a `struct TALER_EXCHANGEDB_Deposit *` - * @param rowid deposit table row of the coin's deposit - * @param coin_pub public key of the coin - * @param amount value of the deposit, including fee - * @param payto_uri where should the funds be wired - * @param deadline what was the requested wire transfer deadline - * @param done did the exchange claim that it made a transfer? - */ -static void -wire_missing_cb (void *cls, - uint64_t rowid, - const struct TALER_CoinSpendPublicKeyP *coin_pub, - const struct TALER_Amount *amount, - const char *payto_uri, - struct GNUNET_TIME_Timestamp deadline, - bool done) -{ - const struct TALER_EXCHANGEDB_Deposit *deposit = cls; + const struct TALER_EXCHANGEDB_Refund *refund = cls; - (void) payto_uri; - (void) deadline; - (void) rowid; - if (done) - { - GNUNET_break (0); - result = 66; - } - if (0 != TALER_amount_cmp (amount, - &deposit->amount_with_fee)) - { - GNUNET_break (0); - result = 66; - } - if (0 != GNUNET_memcmp (coin_pub, - &deposit->coin.coin_pub)) + if (0 != TALER_amount_cmp (amount_with_fee, + &refund->details.refund_amount)) { GNUNET_break (0); result = 66; } + return GNUNET_OK; } - - /** * Main function that will be run by the scheduler. * @@ -275,27 +209,28 @@ run (void *cls) const uint32_t num_partitions = 10; struct DenomKeyPair *dkp = NULL; struct GNUNET_TIME_Timestamp ts; - struct TALER_EXCHANGEDB_Deposit depos[NUMBER_DEPOSIT]; + struct TALER_EXCHANGEDB_Deposit *depos=NULL; struct GNUNET_TIME_Timestamp deadline; struct TALER_Amount value; union TALER_DenominationBlindingKeyP bks; struct TALER_CoinPubHashP c_hash; struct TALER_EXCHANGEDB_CollectableBlindcoin cbc; - struct TALER_EXCHANGEDB_CollectableBlindcoin cbc2; struct TALER_ExchangeWithdrawValues alg_values = { .cipher = TALER_DENOMINATION_RSA }; - struct TALER_PlanchetMasterSecretP ps; - struct TALER_ReservePublicKeyP reserve_pub; - struct TALER_EXCHANGEDB_Refund ref; - + struct GNUNET_TIME_Relative times = GNUNET_TIME_UNIT_ZERO; + unsigned long long sqrs = 0; + struct TALER_EXCHANGEDB_Refund *ref=NULL; + unsigned int *perm; + unsigned long long duration_sq; + struct TALER_CoinSpendPublicKeyP coin_pub; + struct TALER_EXCHANGEDB_RefreshRevealedCoin *ccoin; + struct TALER_DenominationPublicKey *new_denom_pubs = NULL; + ref = GNUNET_new_array (ROUNDS +1, + struct TALER_EXCHANGEDB_Refund); + depos = GNUNET_new_array (ROUNDS +1, + struct TALER_EXCHANGEDB_Deposit); ZR_BLK (&cbc); - ZR_BLK (&cbc2); - RND_BLK (&reserve_pub); - - memset (&ref, - 0, - sizeof (ref)); if (NULL == (plugin = TALER_EXCHANGEDB_plugin_load (cfg))) @@ -337,209 +272,207 @@ run (void *cls) GNUNET_assert (GNUNET_OK == TALER_string_to_amount (CURRENCY ":0.000010", &fees.refund)); + GNUNET_assert (NUM_ROWS >= ROUNDS); + ts = GNUNET_TIME_timestamp_get (); deadline = GNUNET_TIME_timestamp_get (); - dkp = create_denom_key_pair (RSA_KEY_SIZE, - ts, - &value, - &fees); - - GNUNET_assert (NULL != dkp); - TALER_denom_pub_hash (&dkp->pub, - &cbc.denom_pub_hash); - RND_BLK (&cbc.reserve_sig); - RND_BLK (&ps); - TALER_planchet_blinding_secret_create (&ps, - &alg_values, - &bks); - - - cbc.reserve_pub = reserve_pub; - cbc.amount_with_fee = value; - GNUNET_assert (GNUNET_OK == - TALER_amount_set_zero (CURRENCY, - &cbc.withdraw_fee)); - /* for (unsigned int i=0; i< NUMBER_DEPOSIT; i++) - {*/ - fprintf(stdout, "%d\n", i); - struct TALER_CoinSpendPublicKeyP coin_pub; - RND_BLK (&coin_pub); - { - struct TALER_PlanchetDetail pd; - - struct TALER_AgeCommitmentHash age_hash; - struct TALER_AgeCommitmentHash *p_ah[2] = { - NULL, - &age_hash - }; - - RND_BLK (&age_hash); - - for (size_t k = 0; k < sizeof(p_ah) / sizeof(p_ah[0]); k++) - { - fprintf(stdout, "OPEN\n"); - - GNUNET_assert (GNUNET_OK == - TALER_denom_blind (&dkp->pub, - &bks, - p_ah[k], - &coin_pub, - &alg_values, - &c_hash, - &pd.blinded_planchet)); - GNUNET_assert (GNUNET_OK == - TALER_coin_ev_hash (&pd.blinded_planchet, - &cbc.denom_pub_hash, - &cbc.h_coin_envelope)); - if (k != 0) - TALER_blinded_denom_sig_free (&cbc.sig); - GNUNET_assert ( - GNUNET_OK == - TALER_denom_sign_blinded ( - &cbc.sig, - &dkp->priv, - false, - &pd.blinded_planchet)); - TALER_blinded_planchet_free (&pd.blinded_planchet); - } - } - - - depos[i].deposit_fee = fees.deposit; - - RND_BLK (&depos[i].coin.coin_pub); - - TALER_denom_pub_hash (&dkp->pub, - &depos[i].coin.denom_pub_hash); - // TALER_denom_pub_hash (&dkp->pub, - // &ref.coin.denom_pub_hash); - GNUNET_assert (GNUNET_OK == - TALER_denom_sig_unblind (&depos[i].coin.denom_sig, - &cbc.sig, - &bks, - &c_hash, - &alg_values, - &dkp->pub)); - - RND_BLK (&depos[i].merchant_pub); - RND_BLK (&depos[i].csig); - RND_BLK (&depos[i].h_contract_terms); - RND_BLK (&depos[i].wire_salt); - depos[i].amount_with_fee = value; - depos[i].refund_deadline = deadline; - depos[i].wire_deadline = deadline; - depos[i].receiver_wire_account = - "payto://iban/DE67830654080004822650?receiver-name=Test"; - TALER_merchant_wire_signature_hash ( - "payto://iban/DE67830654080004822650?receiver-name=Test", - &depos[i].wire_salt, - &h_wire_wt); - depos[i].timestamp = ts; - result = 8; - { - uint64_t known_coin_id; - struct TALER_DenominationHashP dph; - struct TALER_AgeCommitmentHash agh; - FAILIF (TALER_EXCHANGEDB_CKS_ADDED != - plugin->ensure_coin_known (plugin->cls, - &depos[i].coin, - &known_coin_id, - &dph, - &agh)); - } - - /*wire + deposit for get_ready_deposit*/ - - /*STORE INTO DEPOSIT*/ + //DENOMINATION + { + //PAIR KEY LIST + new_dkp = GNUNET_new_array (MELT_NEW_COINS, + struct DenomKeyPair *); + //PUBLIC KEY LIST + new_denom_pubs = GNUNET_new_array (MELT_NEW_COINS, + struct TALER_DenominationPublicKey); + //REFRESH REVEAL COIN LIST + revealed_coins + = GNUNET_new_array (MELT_NEW_COINS, + struct TALER_EXCHANGEDB_RefreshRevealedCoin); + for (unsigned int cnt = 0; cnt < MELT_NEW_COINS; cnt++) { struct GNUNET_TIME_Timestamp now; - struct GNUNET_TIME_Timestamp r; - struct TALER_Amount deposit_fee; - struct TALER_MerchantWireHashP h_wire; + struct TALER_BlindedRsaPlanchet *rp; + struct TALER_BlindedPlanchet *bp; now = GNUNET_TIME_timestamp_get (); - FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->insert_deposit (plugin->cls, - now, - &depos[i])); - TALER_merchant_wire_signature_hash (depos[i].receiver_wire_account, - &depos[i].wire_salt, - &h_wire); - FAILIF (1 != - plugin->have_deposit2 (plugin->cls, - &depos[i].h_contract_terms, - &h_wire, - &depos[i].coin.coin_pub, - &depos[i].merchant_pub, - depos[i].refund_deadline, - &deposit_fee, - &r)); - FAILIF (GNUNET_TIME_timestamp_cmp (now, - !=, - r)); - } - { - struct GNUNET_TIME_Timestamp start_range; - struct GNUNET_TIME_Timestamp end_range; - - start_range = GNUNET_TIME_absolute_to_timestamp ( - GNUNET_TIME_absolute_subtract (deadline.abs_time, - GNUNET_TIME_UNIT_SECONDS)); - end_range = GNUNET_TIME_absolute_to_timestamp ( - GNUNET_TIME_absolute_add (deadline.abs_time, - GNUNET_TIME_UNIT_SECONDS)); - /*Aborted*/ - FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->select_deposits_missing_wire (plugin->cls, - start_range, - end_range, - &wire_missing_cb, - &depos[i])); - - FAILIF (8 != result); + //5 KEY PAIR + new_dkp[cnt] = create_denom_key_pair (RSA_KEY_SIZE, + now, + &value, + &fees); + GNUNET_assert (NULL != new_dkp[cnt]); + new_denom_pubs[cnt] = new_dkp[cnt]->pub; + ccoin = &revealed_coins[cnt]; + bp = &ccoin->blinded_planchet; + bp->cipher = TALER_DENOMINATION_RSA; + rp = &bp->details.rsa_blinded_planchet; + rp->blinded_msg_size = 1 + (size_t) GNUNET_CRYPTO_random_u64 ( + GNUNET_CRYPTO_QUALITY_WEAK, + (RSA_KEY_SIZE / 8) - 1); + rp->blinded_msg = GNUNET_malloc (rp->blinded_msg_size); + GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, + rp->blinded_msg, + rp->blinded_msg_size); + TALER_denom_pub_hash (&new_dkp[cnt]->pub, + &ccoin->h_denom_pub); + ccoin->exchange_vals = alg_values; + TALER_coin_ev_hash (bp, + &ccoin->h_denom_pub, + &ccoin->coin_envelope_hash); + GNUNET_assert (GNUNET_OK == + TALER_denom_sign_blinded (&ccoin->coin_sig, + &new_dkp[cnt]->priv, + true, + bp)); + GNUNET_assert (GNUNET_OK == + TALER_coin_ev_hash (bp, + &cbc.denom_pub_hash, + &cbc.h_coin_envelope)); + GNUNET_assert ( + GNUNET_OK == + TALER_denom_sign_blinded ( + &cbc.sig, + &new_dkp[cnt]->priv, + false, + bp)); } - auditor_row_cnt = 0; - FAILIF (0 >= - plugin->select_deposits_above_serial_id (plugin->cls, - 0, - &audit_deposit_cb, - NULL)); - FAILIF (0 == auditor_row_cnt); - result = 8; - sleep (2); - /*CREATE DEPOSIT*/ - { - struct TALER_MerchantPublicKeyP merchant_pub2; - char *payto_uri2; - - FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->get_ready_deposit (plugin->cls, - 0, - INT32_MAX, - &merchant_pub2, - &payto_uri2)); - FAILIF (0 != GNUNET_memcmp (&merchant_pub2, - &depos[i].merchant_pub)); - FAILIF (0 != strcmp (payto_uri2, - depos[i].receiver_wire_account)); - TALER_payto_hash (payto_uri2, - &wire_target_h_payto); - GNUNET_free (payto_uri2); - // } - /* { - RND_BLK (&ref.details.merchant_pub); - RND_BLK(&ref.details.merchant_sig); - ref.details.h_contract_terms = depos.h_contract_terms; - ref.coin.coin_pub = depos.coin.coin_pub; - ref.details.rtransaction_id = 1; - ref.details.refund_amount = value; - ref.details.refund_fee = fees.refund; - FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->insert_refund (plugin->cls, - &ref)); - }*/ + } + + perm = GNUNET_CRYPTO_random_permute (GNUNET_CRYPTO_QUALITY_NONCE, + NUM_ROWS); + // begin + FAILIF (GNUNET_OK != + plugin->start (plugin->cls, + "Transaction")); + for (unsigned int j=0; j< NUM_ROWS; j++) + { + unsigned int i = perm[j]; + unsigned int k = (unsigned int)rand()%5; + if (i >= ROUNDS) + i = ROUNDS; /* throw-away slot, do not keep around */ + RND_BLK (&coin_pub); + RND_BLK (&c_hash); + depos[i].deposit_fee = fees.deposit; + RND_BLK (&depos[i].coin.coin_pub); + TALER_denom_pub_hash (&new_dkp[k]->pub, + &depos[i].coin.denom_pub_hash); + // TALER_denom_pub_hash (&dkp->pub, + // &ref.coin.denom_pub_hash); + GNUNET_assert (GNUNET_OK == + TALER_denom_sig_unblind (&depos[i].coin.denom_sig, + &cbc.sig, + &bks, + &c_hash, + &alg_values, + &new_dkp[k]->pub)); + RND_BLK (&depos[i].merchant_pub); + RND_BLK (&depos[i].csig); + RND_BLK (&depos[i].h_contract_terms); + RND_BLK (&depos[i].wire_salt); + depos[i].amount_with_fee = value; + depos[i].refund_deadline = deadline; + depos[i].wire_deadline = deadline; + depos[i].receiver_wire_account = + "payto://iban/DE67830654080004822650?receiver-name=Test"; + TALER_merchant_wire_signature_hash ( + "payto://iban/DE67830654080004822650?receiver-name=Test", + &depos[i].wire_salt, + &h_wire_wt); + depos[i].timestamp = ts; + uint64_t known_coin_id; + {//ENSURE_COIN_KNOWN + + struct TALER_DenominationHashP dph; + struct TALER_AgeCommitmentHash agh; + FAILIF (TALER_EXCHANGEDB_CKS_ADDED != + plugin->ensure_coin_known (plugin->cls, + &depos[i].coin, + &known_coin_id, + &dph, + &agh)); + } + /*STORE INTO DEPOSIT*/ + { + struct GNUNET_TIME_Timestamp now; + now = GNUNET_TIME_timestamp_get (); + FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != + plugin->insert_deposit (plugin->cls, + now, + &depos[i])); } + /* 100% Refund */ + { + bool not_found; + bool refund_ok; + bool gone; + bool conflict; + ref[i].coin = depos[i].coin; + ref[i].details.merchant_pub = depos[i].merchant_pub; + RND_BLK(&ref[i].details.merchant_sig); + ref[i].details.h_contract_terms = depos[i].h_contract_terms; + ref[i].coin.coin_pub = depos[i].coin.coin_pub; + ref[i].details.rtransaction_id = i; + ref[i].details.refund_amount = value; + ref[i].details.refund_fee = fees.refund; + FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != + plugin->do_refund (plugin->cls, + &ref[i], + &fees.deposit, + known_coin_id, + ¬_found, + &refund_ok, + &gone, + &conflict)); + + /* FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != + plugin->insert_refund (plugin->cls, + &ref[i]));*/ + } + if (ROUNDS == i) + TALER_denom_sig_free (&depos[i].coin.denom_sig); + } + /* End of benchmark setup */ + GNUNET_free (perm); + // commit + FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != + plugin->commit (plugin->cls)); + for (unsigned int r = 0; r < ROUNDS; r++) + { + struct GNUNET_TIME_Absolute time; + struct GNUNET_TIME_Relative duration; + + time = GNUNET_TIME_absolute_get (); + FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != + plugin->select_refunds_by_coin (plugin->cls, + &ref[r].coin.coin_pub, + &ref[r].details.merchant_pub, + &ref[r].details.h_contract_terms, + &check_refund_cb, + &ref[r])); + duration = GNUNET_TIME_absolute_get_duration (time); + times = GNUNET_TIME_relative_add (times, + duration); + duration_sq = duration.rel_value_us * duration.rel_value_us; + GNUNET_assert (duration_sq / duration.rel_value_us == duration.rel_value_us); + GNUNET_assert (sqrs + duration_sq >= sqrs); + sqrs += duration_sq; + } + /* evaluation of performance */ + { + struct GNUNET_TIME_Relative avg; + double avg_dbl; + double variance; + + avg = GNUNET_TIME_relative_divide (times, + ROUNDS); + avg_dbl = avg.rel_value_us; + variance = sqrs - (avg_dbl * avg_dbl * ROUNDS); + fprintf(stdout, + "%8llu ± %6.0f\n", + (unsigned long long) avg.rel_value_us, + sqrt (variance / (ROUNDS-1))); + } result = 0; drop: GNUNET_break (GNUNET_OK == @@ -547,11 +480,28 @@ drop: cleanup: if (NULL != dkp) destroy_denom_key_pair (dkp); - // for (unsigned int i=0; i<NUMBER_DEPOSIT; i++){ - TALER_denom_sig_free (&depos[i].coin.denom_sig);//} - - TALER_denom_sig_free (&ref.coin.denom_sig); - TALER_blinded_denom_sig_free (&cbc.sig); + if (NULL != revealed_coins) + { + for (unsigned int cnt = 0; cnt < MELT_NEW_COINS; cnt++) + { + TALER_blinded_denom_sig_free (&revealed_coins[cnt].coin_sig); + TALER_blinded_planchet_free (&revealed_coins[cnt].blinded_planchet); + } + GNUNET_free (revealed_coins); + revealed_coins = NULL; + } + GNUNET_free (new_denom_pubs); + for (unsigned int cnt = 0; + (NULL != new_dkp) && (cnt < MELT_NEW_COINS) && (NULL != new_dkp[cnt]); + cnt++) + destroy_denom_key_pair (new_dkp[cnt]); + GNUNET_free (new_dkp); + for (unsigned int i=0; i< ROUNDS +1 ; i++) + { + TALER_denom_sig_free (&depos[i].coin.denom_sig); + } + GNUNET_free(depos); + GNUNET_free(ref); dkp = NULL; TALER_EXCHANGEDB_plugin_unload (plugin); plugin = NULL; |