add ppc progress points for payback ops

This commit is contained in:
Christian Grothoff 2019-07-24 14:13:25 +02:00
parent bad3e3dc4a
commit 03af37ef23
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
4 changed files with 156 additions and 51 deletions

View File

@ -3906,6 +3906,65 @@ refund_cb (void *cls,
} }
/**
* Function called about paybacks the exchange has to perform.
*
* @param cls closure
* @param rowid row identifier used to uniquely identify the payback operation
* @param timestamp when did we receive the payback request
* @param amount how much should be added back to the reserve
* @param reserve_pub public key of the reserve
* @param coin public information about the coin
* @param coin_sig signature with @e coin_pub of type #TALER_SIGNATURE_WALLET_COIN_PAYBACK
* @param coin_blind blinding factor used to blind the coin
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
*/
static int
payback_cb (void *cls,
uint64_t rowid,
struct GNUNET_TIME_Absolute timestamp,
const struct TALER_Amount *amount,
const struct TALER_ReservePublicKeyP *reserve_pub,
const struct TALER_CoinPublicInfo *coin,
const struct TALER_DenominationPublicKey *denom_pub,
const struct TALER_CoinSpendSignatureP *coin_sig,
const struct TALER_DenominationBlindingKeyP *coin_blind)
{
GNUNET_assert (0); // #5777: NOT implemented! (updated losses from payback/denomination)
return GNUNET_SYSERR;
}
/**
* Function called about paybacks on refreshed coins the exchange has to
* perform.
*
* @param cls closure
* @param rowid row identifier used to uniquely identify the payback operation
* @param timestamp when did we receive the payback request
* @param amount how much should be added back to the reserve
* @param old_coin_pub original coin that was refreshed to create @a coin
* @param coin public information about the coin
* @param coin_sig signature with @e coin_pub of type #TALER_SIGNATURE_WALLET_COIN_PAYBACK
* @param coin_blind blinding factor used to blind the coin
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
*/
static int
payback_refresh_cb (void *cls,
uint64_t rowid,
struct GNUNET_TIME_Absolute timestamp,
const struct TALER_Amount *amount,
const struct TALER_CoinSpendPublicKeyP *old_coin_pub,
const struct TALER_CoinPublicInfo *coin,
const struct TALER_DenominationPublicKey *denom_pub,
const struct TALER_CoinSpendSignatureP *coin_sig,
const struct TALER_DenominationBlindingKeyP *coin_blind)
{
GNUNET_assert (0); // #5777: NOT implemented! (updated denom gains from payback)
return GNUNET_SYSERR;
}
/** /**
* Analyze the exchange's processing of coins. * Analyze the exchange's processing of coins.
* *
@ -3939,17 +3998,18 @@ analyze_coins (void *cls)
else else
{ {
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
_("Resuming coin audit at %llu/%llu/%llu/%llu\n"), _("Resuming coin audit at %llu/%llu/%llu/%llu/%llu\n"),
(unsigned long long) ppc.last_deposit_serial_id, (unsigned long long) ppc.last_deposit_serial_id,
(unsigned long long) ppc.last_melt_serial_id, (unsigned long long) ppc.last_melt_serial_id,
(unsigned long long) ppc.last_refund_serial_id, (unsigned long long) ppc.last_refund_serial_id,
(unsigned long long) ppc.last_withdraw_serial_id); (unsigned long long) ppc.last_withdraw_serial_id,
(unsigned long long) ppc.last_payback_refresh_serial_id);
} }
/* setup 'cc' */ /* setup 'cc' */
cc.qs = GNUNET_DB_STATUS_SUCCESS_ONE_RESULT; cc.qs = GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
cc.denom_summaries = GNUNET_CONTAINER_multihashmap_create (256, cc.denom_summaries = GNUNET_CONTAINER_multihashmap_create (256,
GNUNET_NO); GNUNET_NO);
qsx = adb->get_balance_summary (adb->cls, qsx = adb->get_balance_summary (adb->cls,
asession, asession,
&master_pub, &master_pub,
@ -4003,10 +4063,32 @@ analyze_coins (void *cls)
/* process deposits */ /* process deposits */
if (0 > if (0 >
(qs = edb->select_deposits_above_serial_id (edb->cls, (qs = edb->select_deposits_above_serial_id (edb->cls,
esession, esession,
ppc.last_deposit_serial_id, ppc.last_deposit_serial_id,
&deposit_cb, &deposit_cb,
&cc))) &cc)))
{
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
return qs;
}
/* process paybacks */
if (0 >
(qs = edb->select_payback_above_serial_id (edb->cls,
esession,
ppc.last_payback_serial_id,
&payback_cb,
&cc)))
{
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
return qs;
}
if (0 >
(qs = edb->select_payback_refresh_above_serial_id (edb->cls,
esession,
ppc.last_payback_refresh_serial_id,
&payback_refresh_cb,
&cc)))
{ {
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
return qs; return qs;

View File

@ -262,15 +262,17 @@ postgres_create_tables (void *cls)
",last_deposit_serial_id INT8 NOT NULL DEFAULT 0" ",last_deposit_serial_id INT8 NOT NULL DEFAULT 0"
",last_melt_serial_id INT8 NOT NULL DEFAULT 0" ",last_melt_serial_id INT8 NOT NULL DEFAULT 0"
",last_refund_serial_id INT8 NOT NULL DEFAULT 0" ",last_refund_serial_id INT8 NOT NULL DEFAULT 0"
",last_payback_serial_id INT8 NOT NULL DEFAULT 0"
",last_payback_refresh_serial_id INT8 NOT NULL DEFAULT 0"
")"), ")"),
GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS wire_auditor_progress" GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS wire_auditor_progress"
"(master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE" "(master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE"
",account_name TEXT NOT NULL" ",account_name TEXT NOT NULL"
",last_wire_reserve_in_serial_id INT8 NOT NULL DEFAULT 0" ",last_wire_reserve_in_serial_id INT8 NOT NULL DEFAULT 0"
",last_wire_wire_out_serial_id INT8 NOT NULL DEFAULT 0" ",last_wire_wire_out_serial_id INT8 NOT NULL DEFAULT 0"
",last_timestamp INT8 NOT NULL" ",last_timestamp INT8 NOT NULL"
",wire_in_off BYTEA" ",wire_in_off BYTEA"
",wire_out_off BYTEA" ",wire_out_off BYTEA"
")"), ")"),
/* Table with all of the customer reserves and their respective /* Table with all of the customer reserves and their respective
balances that the auditor is aware of. balances that the auditor is aware of.
@ -323,7 +325,7 @@ postgres_create_tables (void *cls)
",denom_balance_val INT8 NOT NULL" ",denom_balance_val INT8 NOT NULL"
",denom_balance_frac INT4 NOT NULL" ",denom_balance_frac INT4 NOT NULL"
",denom_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL" ",denom_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",num_issued INT8 NOT NULL" ",num_issued INT8 NOT NULL"
",denom_risk_val INT8 NOT NULL" ",denom_risk_val INT8 NOT NULL"
",denom_risk_frac INT4 NOT NULL" ",denom_risk_frac INT4 NOT NULL"
",denom_risk_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL" ",denom_risk_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
@ -400,21 +402,21 @@ postgres_create_tables (void *cls)
we must check that the exchange reported these properly. */ we must check that the exchange reported these properly. */
GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS deposit_confirmations " GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS deposit_confirmations "
"(master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE" "(master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE"
",serial_id BIGSERIAL UNIQUE" ",serial_id BIGSERIAL UNIQUE"
",h_contract_terms BYTEA CHECK (LENGTH(h_contract_terms)=64)" ",h_contract_terms BYTEA CHECK (LENGTH(h_contract_terms)=64)"
",h_wire BYTEA CHECK (LENGTH(h_wire)=64)" ",h_wire BYTEA CHECK (LENGTH(h_wire)=64)"
",timestamp INT8 NOT NULL" ",timestamp INT8 NOT NULL"
",refund_deadline INT8 NOT NULL" ",refund_deadline INT8 NOT NULL"
",amount_without_fee_val INT8 NOT NULL" ",amount_without_fee_val INT8 NOT NULL"
",amount_without_fee_frac INT4 NOT NULL" ",amount_without_fee_frac INT4 NOT NULL"
",amount_without_fee_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL" ",amount_without_fee_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",coin_pub BYTEA CHECK (LENGTH(coin_pub)=32)" ",coin_pub BYTEA CHECK (LENGTH(coin_pub)=32)"
",merchant_pub BYTEA CHECK (LENGTH(merchant_pub)=32)" ",merchant_pub BYTEA CHECK (LENGTH(merchant_pub)=32)"
",exchange_sig BYTEA CHECK (LENGTH(exchange_sig)=64)" ",exchange_sig BYTEA CHECK (LENGTH(exchange_sig)=64)"
",exchange_pub BYTEA CHECK (LENGTH(exchange_pub)=32)" ",exchange_pub BYTEA CHECK (LENGTH(exchange_pub)=32)"
",master_sig BYTEA CHECK (LENGTH(master_sig)=64)" ",master_sig BYTEA CHECK (LENGTH(master_sig)=64)"
",PRIMARY KEY (h_contract_terms, h_wire, coin_pub, " ",PRIMARY KEY (h_contract_terms, h_wire, coin_pub, "
" merchant_pub, exchange_sig, exchange_pub, master_sig)" " merchant_pub, exchange_sig, exchange_pub, master_sig)"
")"), ")"),
/* Table with historic business ledger; basically, when the exchange /* Table with historic business ledger; basically, when the exchange
operator decides to use operating costs for anything but wire operator decides to use operating costs for anything but wire
@ -581,7 +583,7 @@ postgres_prepare (PGconn *db_conn)
/* Used in #postgres_get_deposit_confirmations() */ /* Used in #postgres_get_deposit_confirmations() */
GNUNET_PQ_make_prepare ("auditor_deposit_confirmation_select", GNUNET_PQ_make_prepare ("auditor_deposit_confirmation_select",
"SELECT" "SELECT"
" serial_id" " serial_id"
",h_contract_terms" ",h_contract_terms"
",h_wire" ",h_wire"
",timestamp" ",timestamp"
@ -594,9 +596,9 @@ postgres_prepare (PGconn *db_conn)
",exchange_sig" ",exchange_sig"
",exchange_pub" ",exchange_pub"
",master_sig" /* master_sig could be normalized... */ ",master_sig" /* master_sig could be normalized... */
" FROM deposit_confirmations" " FROM deposit_confirmations"
" WHERE master_pub=$1" " WHERE master_pub=$1"
" AND serial_id>$2", " AND serial_id>$2",
2), 2),
/* Used in #postgres_update_auditor_progress_reserve() */ /* Used in #postgres_update_auditor_progress_reserve() */
GNUNET_PQ_make_prepare ("auditor_progress_update_reserve", GNUNET_PQ_make_prepare ("auditor_progress_update_reserve",
@ -674,8 +676,10 @@ postgres_prepare (PGconn *db_conn)
",last_deposit_serial_id=$2" ",last_deposit_serial_id=$2"
",last_melt_serial_id=$3" ",last_melt_serial_id=$3"
",last_refund_serial_id=$4" ",last_refund_serial_id=$4"
" WHERE master_pub=$5", ",last_payback_serial_id=$5"
4), ",last_payback_refresh_serial_id=$6"
" WHERE master_pub=$7",
7),
/* Used in #postgres_get_auditor_progress_coin() */ /* Used in #postgres_get_auditor_progress_coin() */
GNUNET_PQ_make_prepare ("auditor_progress_select_coin", GNUNET_PQ_make_prepare ("auditor_progress_select_coin",
"SELECT" "SELECT"
@ -683,6 +687,8 @@ postgres_prepare (PGconn *db_conn)
",last_deposit_serial_id" ",last_deposit_serial_id"
",last_melt_serial_id" ",last_melt_serial_id"
",last_refund_serial_id" ",last_refund_serial_id"
",last_payback_serial_id"
",last_payback_refresh_serial_id"
" FROM auditor_progress_coin" " FROM auditor_progress_coin"
" WHERE master_pub=$1;", " WHERE master_pub=$1;",
1), 1),
@ -694,18 +700,20 @@ postgres_prepare (PGconn *db_conn)
",last_deposit_serial_id" ",last_deposit_serial_id"
",last_melt_serial_id" ",last_melt_serial_id"
",last_refund_serial_id" ",last_refund_serial_id"
") VALUES ($1,$2,$3,$4,$5);", ",last_payback_serial_id"
5), ",last_payback_refresh_serial_id"
") VALUES ($1,$2,$3,$4,$5,$6,$7);",
7),
/* Used in #postgres_insert_wire_auditor_progress() */ /* Used in #postgres_insert_wire_auditor_progress() */
GNUNET_PQ_make_prepare ("wire_auditor_progress_insert", GNUNET_PQ_make_prepare ("wire_auditor_progress_insert",
"INSERT INTO wire_auditor_progress " "INSERT INTO wire_auditor_progress "
"(master_pub" "(master_pub"
",account_name" ",account_name"
",last_wire_reserve_in_serial_id" ",last_wire_reserve_in_serial_id"
",last_wire_wire_out_serial_id" ",last_wire_wire_out_serial_id"
",last_timestamp" ",last_timestamp"
",wire_in_off" ",wire_in_off"
",wire_out_off" ",wire_out_off"
") VALUES ($1,$2,$3,$4,$5,$6,$7);", ") VALUES ($1,$2,$3,$4,$5,$6,$7);",
7), 7),
/* Used in #postgres_update_wire_auditor_progress() */ /* Used in #postgres_update_wire_auditor_progress() */
@ -713,9 +721,9 @@ postgres_prepare (PGconn *db_conn)
"UPDATE wire_auditor_progress SET " "UPDATE wire_auditor_progress SET "
" last_wire_reserve_in_serial_id=$1" " last_wire_reserve_in_serial_id=$1"
",last_wire_wire_out_serial_id=$2" ",last_wire_wire_out_serial_id=$2"
",last_timestamp=$3" ",last_timestamp=$3"
",wire_in_off=$4" ",wire_in_off=$4"
",wire_out_off=$5" ",wire_out_off=$5"
" WHERE master_pub=$6 AND account_name=$7", " WHERE master_pub=$6 AND account_name=$7",
7), 7),
/* Used in #postgres_get_wire_auditor_progress() */ /* Used in #postgres_get_wire_auditor_progress() */
@ -723,9 +731,9 @@ postgres_prepare (PGconn *db_conn)
"SELECT" "SELECT"
" last_wire_reserve_in_serial_id" " last_wire_reserve_in_serial_id"
",last_wire_wire_out_serial_id" ",last_wire_wire_out_serial_id"
",last_timestamp" ",last_timestamp"
",wire_in_off" ",wire_in_off"
",wire_out_off" ",wire_out_off"
" FROM wire_auditor_progress" " FROM wire_auditor_progress"
" WHERE master_pub=$1 AND account_name=$2;", " WHERE master_pub=$1 AND account_name=$2;",
2), 2),
@ -843,7 +851,7 @@ postgres_prepare (PGconn *db_conn)
",denom_balance_val" ",denom_balance_val"
",denom_balance_frac" ",denom_balance_frac"
",denom_balance_curr" ",denom_balance_curr"
",num_issued" ",num_issued"
",denom_risk_val" ",denom_risk_val"
",denom_risk_frac" ",denom_risk_frac"
",denom_risk_curr" ",denom_risk_curr"
@ -855,7 +863,7 @@ postgres_prepare (PGconn *db_conn)
" denom_balance_val=$1" " denom_balance_val=$1"
",denom_balance_frac=$2" ",denom_balance_frac=$2"
",denom_balance_curr=$3" ",denom_balance_curr=$3"
",num_issued=$4" ",num_issued=$4"
",denom_risk_val=$5" ",denom_risk_val=$5"
",denom_risk_frac=$6" ",denom_risk_frac=$6"
",denom_risk_curr=$7" ",denom_risk_curr=$7"
@ -867,7 +875,7 @@ postgres_prepare (PGconn *db_conn)
" denom_balance_val" " denom_balance_val"
",denom_balance_frac" ",denom_balance_frac"
",denom_balance_curr" ",denom_balance_curr"
",num_issued" ",num_issued"
",denom_risk_val" ",denom_risk_val"
",denom_risk_frac" ",denom_risk_frac"
",denom_risk_curr" ",denom_risk_curr"
@ -2053,12 +2061,14 @@ postgres_insert_auditor_progress_coin (void *cls,
GNUNET_PQ_query_param_uint64 (&ppc->last_deposit_serial_id), GNUNET_PQ_query_param_uint64 (&ppc->last_deposit_serial_id),
GNUNET_PQ_query_param_uint64 (&ppc->last_melt_serial_id), GNUNET_PQ_query_param_uint64 (&ppc->last_melt_serial_id),
GNUNET_PQ_query_param_uint64 (&ppc->last_refund_serial_id), GNUNET_PQ_query_param_uint64 (&ppc->last_refund_serial_id),
GNUNET_PQ_query_param_uint64 (&ppc->last_payback_serial_id),
GNUNET_PQ_query_param_uint64 (&ppc->last_payback_refresh_serial_id),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
return GNUNET_PQ_eval_prepared_non_select (session->conn, return GNUNET_PQ_eval_prepared_non_select (session->conn,
"auditor_progress_insert_coin", "auditor_progress_insert_coin",
params); params);
} }
@ -2083,13 +2093,15 @@ postgres_update_auditor_progress_coin (void *cls,
GNUNET_PQ_query_param_uint64 (&ppc->last_deposit_serial_id), GNUNET_PQ_query_param_uint64 (&ppc->last_deposit_serial_id),
GNUNET_PQ_query_param_uint64 (&ppc->last_melt_serial_id), GNUNET_PQ_query_param_uint64 (&ppc->last_melt_serial_id),
GNUNET_PQ_query_param_uint64 (&ppc->last_refund_serial_id), GNUNET_PQ_query_param_uint64 (&ppc->last_refund_serial_id),
GNUNET_PQ_query_param_uint64 (&ppc->last_payback_serial_id),
GNUNET_PQ_query_param_uint64 (&ppc->last_payback_refresh_serial_id),
GNUNET_PQ_query_param_auto_from_type (master_pub), GNUNET_PQ_query_param_auto_from_type (master_pub),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
return GNUNET_PQ_eval_prepared_non_select (session->conn, return GNUNET_PQ_eval_prepared_non_select (session->conn,
"auditor_progress_update_coin", "auditor_progress_update_coin",
params); params);
} }
@ -2121,13 +2133,17 @@ postgres_get_auditor_progress_coin (void *cls,
&ppc->last_melt_serial_id), &ppc->last_melt_serial_id),
GNUNET_PQ_result_spec_uint64 ("last_refund_serial_id", GNUNET_PQ_result_spec_uint64 ("last_refund_serial_id",
&ppc->last_refund_serial_id), &ppc->last_refund_serial_id),
GNUNET_PQ_result_spec_uint64 ("last_payback_serial_id",
&ppc->last_payback_serial_id),
GNUNET_PQ_result_spec_uint64 ("last_payback_refresh_serial_id",
&ppc->last_payback_refresh_serial_id),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
}; };
return GNUNET_PQ_eval_prepared_singleton_select (session->conn, return GNUNET_PQ_eval_prepared_singleton_select (session->conn,
"auditor_progress_select_coin", "auditor_progress_select_coin",
params, params,
rs); rs);
} }

View File

@ -230,6 +230,16 @@ struct TALER_AUDITORDB_ProgressPointCoin
*/ */
uint64_t last_refund_serial_id; uint64_t last_refund_serial_id;
/**
* Serial ID of the last payback operation the auditor processed.
*/
uint64_t last_payback_serial_id;
/**
* Serial ID of the last payback-of-refresh operation the auditor processed.
*/
uint64_t last_payback_refresh_serial_id;
}; };

View File

@ -1138,7 +1138,6 @@ typedef int
const struct TALER_DenominationBlindingKeyP *coin_blind); const struct TALER_DenominationBlindingKeyP *coin_blind);
/** /**
* Function called about paybacks on refreshed coins the exchange has to * Function called about paybacks on refreshed coins the exchange has to
* perform. * perform.
@ -1165,8 +1164,6 @@ typedef int
const struct TALER_DenominationBlindingKeyP *coin_blind); const struct TALER_DenominationBlindingKeyP *coin_blind);
/** /**
* Function called about reserve closing operations * Function called about reserve closing operations
* the aggregator triggered. * the aggregator triggered.