diff options
author | Christian Grothoff <christian@grothoff.org> | 2017-03-19 01:55:37 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2017-03-19 01:55:37 +0100 |
commit | 9b4d0634e15fd026a887b4e425abc2a75ddeff04 (patch) | |
tree | 6b10c3dc06b3e3bf2d1bf87678a2ccd2adbba49d | |
parent | c75ac3b61295e380f8ea59a75d26426fefe2e4f9 (diff) |
simplify analysis by returning denom_pub with rest of coin transaction data instead of bothering fetching with coin history
-rw-r--r-- | src/auditor/taler-auditor.c | 209 | ||||
-rw-r--r-- | src/exchangedb/plugin_exchangedb_postgres.c | 22 | ||||
-rw-r--r-- | src/exchangedb/test_exchangedb.c | 6 | ||||
-rw-r--r-- | src/include/taler_exchangedb_plugin.h | 6 |
4 files changed, 53 insertions, 190 deletions
diff --git a/src/auditor/taler-auditor.c b/src/auditor/taler-auditor.c index 845858a17..1dd9a8748 100644 --- a/src/auditor/taler-auditor.c +++ b/src/auditor/taler-auditor.c @@ -26,10 +26,6 @@ * * TODO: * - FIXME: do proper transaction history check in #check_transaction_history() - * - OPTIMIZE/SIMPLIFY: modify auditordb to return DK when we inquire about deposit/refresh/refund, - * so we can avoid the costly #get_coin_summary with the transaction history building - * (at least during #analyze_coins); the logic may be partially useful in - * #analyze_merchants (but we won't need the cache!) */ #include "platform.h" #include <gnunet/gnunet_util_lib.h> @@ -972,33 +968,6 @@ analyze_reserves (void *cls) coin, checking deposits, refunds, refresh* and known_coins tables */ -/** - * Summary data we keep per coin. - */ -struct CoinSummary -{ - /** - * Denomination of the coin with fee structure. - */ - const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki; - - /** - * Hash of @e coin_pub. - */ - struct GNUNET_HashCode coin_hash; - - /** - * Public key of the coin. - */ - struct TALER_CoinSpendPublicKeyP coin_pub; - - /** - * List of transactions this coin was involved in. - */ - struct TALER_EXCHANGEDB_TransactionList *tl; - -}; - /** * Summary data we keep per denomination. @@ -1037,18 +1006,6 @@ struct CoinContext { /** - * Map for tracking information about coins. - */ - struct GNUNET_CONTAINER_MultiHashMap *coins; - - /** - * Array of the coins in @e coins. Used to expire coins - * in a circular ring-buffer like fashion (to keep the - * working set in @e coins bounded). - */ - struct CoinSummary summaries[MAX_COIN_SUMMARIES]; - - /** * Map for tracking information about denominations. */ struct GNUNET_CONTAINER_MultiHashMap *denominations; @@ -1142,8 +1099,8 @@ init_denomination (const struct GNUNET_HashCode *denom_hash, */ static struct DenominationSummary * get_balance_summary (struct CoinContext *cc, - const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki, - const struct GNUNET_HashCode *dh) + const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki, + const struct GNUNET_HashCode *dh) { struct DenominationSummary *ds; @@ -1277,126 +1234,6 @@ sync_denomination (void *cls, /** - * Release memory occupied by a coin summary. Note that - * the actual @a value is NOT allocated (comes from the - * ring buffer), only the members of the struct need to be - * freed. - * - * @param cls the `struct CoinContext` - * @param key the hash of the coin's public key - * @param value a `struct DenominationSummary` - * @return #GNUNET_OK (continue to iterate) - */ -static int -free_coin (void *cls, - const struct GNUNET_HashCode *denom_hash, - void *value) -{ - struct CoinContext *cc = cls; - struct CoinSummary *cs = value; - - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multihashmap_remove (cc->coins, - &cs->coin_hash, - cs)); - edb->free_coin_transaction_list (edb->cls, - cs->tl); - cs->tl = NULL; - return GNUNET_OK; -} - - -/** - * Obtain information about the coin from the cache or the database. - * - * If we obtain this information for the first time, also check that - * the coin's transaction history is internally consistent. - * - * @param cc caching information - * @param coin_pub public key of the coin to get information about - * @return NULL on error - */ -// OPTIMIZE/SIMPLIFY: replace by something that just gets the denomination hash! -// (makes this part WAY more efficient!) -static struct CoinSummary * -get_coin_summary (struct CoinContext *cc, - const struct TALER_CoinSpendPublicKeyP *coin_pub) -{ - struct CoinSummary *cs; - struct GNUNET_HashCode chash; - struct TALER_EXCHANGEDB_TransactionList *tl; - const struct TALER_CoinPublicInfo *coin; - const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki; - - /* Check cache */ - GNUNET_CRYPTO_hash (coin_pub, - sizeof (*coin_pub), - &chash); - cs = GNUNET_CONTAINER_multihashmap_get (cc->coins, - &chash); - if (NULL != cs) - return cs; /* cache hit */ - - /* Get transaction history of @a coin_pub from DB */ - tl = edb->get_coin_transactions (edb->cls, - esession, - coin_pub); - if (NULL == tl) - { - GNUNET_break (0); - return NULL; - } - - /* Obtain general denomination information about the coin */ - coin = NULL; - switch (tl->type) - { - case TALER_EXCHANGEDB_TT_DEPOSIT: - coin = &tl->details.deposit->coin; - break; - case TALER_EXCHANGEDB_TT_REFRESH_MELT: - coin = &tl->details.melt->coin; - break; - case TALER_EXCHANGEDB_TT_REFUND: - coin = &tl->details.refund->coin; - break; - } - GNUNET_assert (NULL != coin); /* hard check that switch worked */ - if (GNUNET_OK != - get_denomination_info (&coin->denom_pub, - &dki, - NULL)) - { - GNUNET_break (0); - edb->free_coin_transaction_list (edb->cls, - tl); - return NULL; - } - - /* allocate coin slot in ring buffer */ - if (MAX_COIN_SUMMARIES >= cc->summaries_off) - cc->summaries_off = 0; - cs = &cc->summaries[cc->summaries_off++]; - GNUNET_assert (GNUNET_OK == - free_coin (cc, - &cs->coin_hash, - cs)); - - /* initialize 'cs' and add to cache */ - cs->coin_pub = *coin_pub; - cs->coin_hash = chash; - cs->tl = tl; - cs->dki = dki; - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multihashmap_put (cc->coins, - &cs->coin_hash, - cs, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); - return cs; -} - - -/** * Function called with details about all withdraw operations. * Updates the denomination balance and the overall balance as * we now have additional coins that have been issued. @@ -1470,11 +1307,11 @@ withdraw_cb (void *cls, * goal of auditing the refresh's execution. Verifies the signature * and updates our information about coins outstanding (the old coin's * denomination has less, the fresh coins increased outstanding - * balances). As a side-effect, #get_coin_summary will report - * inconsistencies in the melted coin's balance. + * balances). * * @param cls closure * @param rowid unique serial ID for the refresh session in our DB + * @param denom_pub denomination public key of @a coin_pub * @param coin_pub public key of the coin * @param coin_sig signature from the coin * @param amount_with_fee amount that was deposited including fee @@ -1486,6 +1323,7 @@ withdraw_cb (void *cls, static int refresh_session_cb (void *cls, uint64_t rowid, + const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendSignatureP *coin_sig, const struct TALER_Amount *amount_with_fee, @@ -1495,19 +1333,18 @@ refresh_session_cb (void *cls, { struct CoinContext *cc = cls; struct TALER_RefreshMeltCoinAffirmationPS rmc; - struct CoinSummary *cs; const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki; struct DenominationSummary *dso; struct TALER_Amount amount_without_fee; - cs = get_coin_summary (cc, - coin_pub); - if (NULL == cs) + if (GNUNET_OK != + get_denomination_info (denom_pub, + &dki, + NULL)) { GNUNET_break (0); return GNUNET_SYSERR; } - dki = cs->dki; /* verify melt signature */ rmc.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_MELT); @@ -1688,6 +1525,7 @@ refresh_session_cb (void *cls, * @param rowid unique serial ID for the deposit in our DB * @param timestamp when did the deposit happen * @param merchant_pub public key of the merchant + * @param denom_pub denomination public key of @a coin_pub * @param coin_pub public key of the coin * @param coin_sig signature from the coin * @param amount_with_fee amount that was deposited including fee @@ -1705,6 +1543,7 @@ deposit_cb (void *cls, uint64_t rowid, struct GNUNET_TIME_Absolute timestamp, const struct TALER_MerchantPublicKeyP *merchant_pub, + const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendSignatureP *coin_sig, const struct TALER_Amount *amount_with_fee, @@ -1715,19 +1554,18 @@ deposit_cb (void *cls, int done) { struct CoinContext *cc = cls; - struct CoinSummary *cs; const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki; struct DenominationSummary *ds; struct TALER_DepositRequestPS dr; - cs = get_coin_summary (cc, - coin_pub); - if (NULL == cs) + if (GNUNET_OK != + get_denomination_info (denom_pub, + &dki, + NULL)) { GNUNET_break (0); return GNUNET_SYSERR; } - dki = cs->dki; /* Verify deposit signature */ dr.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_DEPOSIT); @@ -1803,6 +1641,7 @@ deposit_cb (void *cls, * * @param cls closure * @param rowid unique serial ID for the refund in our DB + * @param denom_pub denomination public key of @a coin_pub * @param coin_pub public key of the coin * @param merchant_pub public key of the merchant * @param merchant_sig signature of the merchant @@ -1814,6 +1653,7 @@ deposit_cb (void *cls, static int refund_cb (void *cls, uint64_t rowid, + const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_MerchantSignatureP *merchant_sig, @@ -1822,21 +1662,20 @@ refund_cb (void *cls, const struct TALER_Amount *amount_with_fee) { struct CoinContext *cc = cls; - struct CoinSummary *cs; const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki; struct DenominationSummary *ds; struct TALER_RefundRequestPS rr; struct TALER_Amount amount_without_fee; struct TALER_Amount refund_fee; - cs = get_coin_summary (cc, - coin_pub); - if (NULL == cs) + if (GNUNET_OK != + get_denomination_info (denom_pub, + &dki, + NULL)) { GNUNET_break (0); return GNUNET_SYSERR; } - dki = cs->dki; /* verify refund signature */ rr.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_REFUND); @@ -1946,8 +1785,6 @@ analyze_coins (void *cls) &cc.risk)); } - cc.coins = GNUNET_CONTAINER_multihashmap_create (1024, - GNUNET_NO); cc.denominations = GNUNET_CONTAINER_multihashmap_create (256, GNUNET_NO); @@ -2004,10 +1841,6 @@ analyze_coins (void *cls) &sync_denomination, &cc); GNUNET_CONTAINER_multihashmap_destroy (cc.denominations); - GNUNET_CONTAINER_multihashmap_iterate (cc.coins, - &free_coin, - &cc); - GNUNET_CONTAINER_multihashmap_destroy (cc.coins); if (GNUNET_YES == dret) dret = adb->update_balance_summary (adb->cls, diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index f57ac5a29..536a55881 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -799,7 +799,7 @@ postgres_prepare (PGconn *db_conn) ",denom.fee_refresh_curr " ",num_newcoins" ",noreveal_index" - " FROM refresh_sessions " + " FROM refresh_sessions" " JOIN known_coins ON (refresh_sessions.old_coin_pub = known_coins.coin_pub)" " JOIN denominations denom USING (denom_pub)" " WHERE session_hash=$1 ", @@ -809,7 +809,8 @@ postgres_prepare (PGconn *db_conn) refresh session with id '\geq' the given parameter */ PREPARE ("audit_get_refresh_sessions_incr", "SELECT" - " old_coin_pub" + " known_coins.denom_pub" + ",old_coin_pub" ",old_coin_sig" ",amount_with_fee_val" ",amount_with_fee_frac" @@ -819,6 +820,7 @@ postgres_prepare (PGconn *db_conn) ",melt_serial_id" ",session_hash" " FROM refresh_sessions" + " JOIN known_coins ON (refresh_sessions.old_coin_pub = known_coins.coin_pub)" " WHERE melt_serial_id>=$1" " ORDER BY melt_serial_id ASC", 1, NULL); @@ -905,12 +907,14 @@ postgres_prepare (PGconn *db_conn) ",merchant_sig" ",h_proposal_data" ",rtransaction_id" + ",known_coins.denom_pub" ",coin_pub" ",amount_with_fee_val" ",amount_with_fee_frac" ",amount_with_fee_curr" ",refund_serial_id" " FROM refunds" + " JOIN known_coins ON (coin_pub)" " WHERE refund_serial_id>=$1" " ORDER BY refund_serial_id ASC", 1, NULL); @@ -1040,6 +1044,7 @@ postgres_prepare (PGconn *db_conn) ",amount_with_fee_curr" ",timestamp" ",merchant_pub" + ",known_coins.denom_pub" ",coin_pub" ",coin_sig" ",refund_deadline" @@ -1049,6 +1054,7 @@ postgres_prepare (PGconn *db_conn) ",done" ",deposit_serial_id" " FROM deposits" + " JOIN known_coins ON (coin_pub)" " WHERE (" " (deposit_serial_id>=$1)" " )" @@ -4853,6 +4859,7 @@ postgres_select_deposits_above_serial_id (void *cls, for (i=0;i<nrows;i++) { struct TALER_EXCHANGEDB_Deposit deposit; + struct TALER_DenominationPublicKey denom_pub; uint8_t done = 0; uint64_t rowid; struct GNUNET_PQ_ResultSpec rs[] = { @@ -4862,6 +4869,8 @@ postgres_select_deposits_above_serial_id (void *cls, &deposit.timestamp), GNUNET_PQ_result_spec_auto_from_type ("merchant_pub", &deposit.merchant_pub), + GNUNET_PQ_result_spec_rsa_public_key ("denom_pub", + &denom_pub.rsa_public_key), GNUNET_PQ_result_spec_auto_from_type ("coin_pub", &deposit.coin.coin_pub), GNUNET_PQ_result_spec_auto_from_type ("coin_sig", @@ -4893,6 +4902,7 @@ postgres_select_deposits_above_serial_id (void *cls, rowid, deposit.timestamp, &deposit.merchant_pub, + &denom_pub, &deposit.coin.coin_pub, &deposit.csig, &deposit.amount_with_fee, @@ -4957,6 +4967,7 @@ postgres_select_refreshs_above_serial_id (void *cls, for (i=0;i<nrows;i++) { + struct TALER_DenominationPublicKey denom_pub; struct TALER_CoinSpendPublicKeyP coin_pub; struct TALER_CoinSpendSignatureP coin_sig; struct TALER_Amount amount_with_fee; @@ -4966,6 +4977,8 @@ postgres_select_refreshs_above_serial_id (void *cls, struct GNUNET_HashCode session_hash; struct GNUNET_PQ_ResultSpec rs[] = { + GNUNET_PQ_result_spec_rsa_public_key ("denom_pub", + &denom_pub.rsa_public_key), GNUNET_PQ_result_spec_auto_from_type ("old_coin_pub", &coin_pub), GNUNET_PQ_result_spec_auto_from_type ("old_coin_sig", @@ -4993,6 +5006,7 @@ postgres_select_refreshs_above_serial_id (void *cls, } cb (cb_cls, rowid, + &denom_pub, &coin_pub, &coin_sig, &amount_with_fee, @@ -5054,6 +5068,7 @@ postgres_select_refunds_above_serial_id (void *cls, for (i=0;i<nrows;i++) { struct TALER_EXCHANGEDB_Refund refund; + struct TALER_DenominationPublicKey denom_pub; uint64_t rowid; struct GNUNET_PQ_ResultSpec rs[] = { @@ -5065,6 +5080,8 @@ postgres_select_refunds_above_serial_id (void *cls, &refund.h_proposal_data), GNUNET_PQ_result_spec_uint64 ("rtransaction_id", &refund.rtransaction_id), + GNUNET_PQ_result_spec_rsa_public_key ("denom_pub", + &denom_pub.rsa_public_key), GNUNET_PQ_result_spec_auto_from_type ("coin_pub", &refund.coin.coin_pub), TALER_PQ_result_spec_amount ("amount_with_fee", @@ -5084,6 +5101,7 @@ postgres_select_refunds_above_serial_id (void *cls, } cb (cb_cls, rowid, + &denom_pub, &refund.coin.coin_pub, &refund.merchant_pub, &refund.merchant_sig, diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c index d645abeae..c7f97998d 100644 --- a/src/exchangedb/test_exchangedb.c +++ b/src/exchangedb/test_exchangedb.c @@ -481,6 +481,7 @@ static unsigned int auditor_row_cnt; * * @param cls closure * @param rowid unique serial ID for the refresh session in our DB + * @param denom_pub denomination of the @a coin_pub * @param coin_pub public key of the coin * @param coin_sig signature from the coin * @param amount_with_fee amount that was deposited including fee @@ -492,6 +493,7 @@ static unsigned int auditor_row_cnt; static int audit_refresh_session_cb (void *cls, uint64_t rowid, + const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendSignatureP *coin_sig, const struct TALER_Amount *amount_with_fee, @@ -927,6 +929,7 @@ deposit_cb (void *cls, * @param rowid unique serial ID for the deposit in our DB * @param timestamp when did the deposit happen * @param merchant_pub public key of the merchant + * @param denom_pub denomination of the @a coin_pub * @param coin_pub public key of the coin * @param coin_sig signature from the coin * @param amount_with_fee amount that was deposited including fee @@ -944,6 +947,7 @@ audit_deposit_cb (void *cls, uint64_t rowid, struct GNUNET_TIME_Absolute timestamp, const struct TALER_MerchantPublicKeyP *merchant_pub, + const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendSignatureP *coin_sig, const struct TALER_Amount *amount_with_fee, @@ -964,6 +968,7 @@ audit_deposit_cb (void *cls, * * @param cls closure * @param rowid unique serial ID for the refund in our DB + * @param denom_pub denomination of the @a coin_pub * @param coin_pub public key of the coin * @param merchant_pub public key of the merchant * @param merchant_sig signature of the merchant @@ -976,6 +981,7 @@ audit_deposit_cb (void *cls, static int audit_refund_cb (void *cls, uint64_t rowid, + const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_MerchantSignatureP *merchant_sig, diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h index 970a57f44..9e5a0508b 100644 --- a/src/include/taler_exchangedb_plugin.h +++ b/src/include/taler_exchangedb_plugin.h @@ -592,6 +592,7 @@ typedef void * @param rowid unique serial ID for the deposit in our DB * @param timestamp when did the deposit happen * @param merchant_pub public key of the merchant + * @param denom_pub denomination public key of @a coin_pub * @param coin_pub public key of the coin * @param coin_sig signature from the coin * @param amount_with_fee amount that was deposited including fee @@ -609,6 +610,7 @@ typedef int uint64_t rowid, struct GNUNET_TIME_Absolute timestamp, const struct TALER_MerchantPublicKeyP *merchant_pub, + const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendSignatureP *coin_sig, const struct TALER_Amount *amount_with_fee, @@ -625,6 +627,7 @@ typedef int * * @param cls closure * @param rowid unique serial ID for the refresh session in our DB + * @param denom_pub denomination public key of @a coin_pub * @param coin_pub public key of the coin * @param coin_sig signature from the coin * @param amount_with_fee amount that was deposited including fee @@ -636,6 +639,7 @@ typedef int typedef int (*TALER_EXCHANGEDB_RefreshSessionCallback)(void *cls, uint64_t rowid, + const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendSignatureP *coin_sig, const struct TALER_Amount *amount_with_fee, @@ -650,6 +654,7 @@ typedef int * * @param cls closure * @param rowid unique serial ID for the refund in our DB + * @param denom_pub denomination public key of @a coin_pub * @param coin_pub public key of the coin * @param merchant_pub public key of the merchant * @param merchant_sig signature of the merchant @@ -661,6 +666,7 @@ typedef int typedef int (*TALER_EXCHANGEDB_RefundCallback)(void *cls, uint64_t rowid, + const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_MerchantSignatureP *merchant_sig, |