steps towards new split-auditor logic
This commit is contained in:
parent
2ace9969b7
commit
a8b8258e12
@ -64,51 +64,58 @@ This report is based on a template licensed under the Affero General Public
|
||||
License, either version 3, or (at your option) any later version.
|
||||
The source code for the template is available at \url{https://git.taler.net/}.
|
||||
|
||||
The report was generated by the auditor started at
|
||||
{\bf {{ data.auditor_start_time }} } and concluded at
|
||||
{\bf {{ data.auditor_end_time }} }.
|
||||
The report was generated by the auditors at the following times:
|
||||
|
||||
In that time, the auditor processed the following table ranges:
|
||||
\begin{table}[h!]
|
||||
\begin{center}
|
||||
\begin{tabular}{l|r|r}
|
||||
Auditor & Start & End \\ \hline \hline
|
||||
Aggregation & {{ aggregation.auditor_start_time }} & {{ aggregation.auditor_end_time }} \\ \hline
|
||||
Coins & {{ coins.auditor_start_time }} & {{ coins.auditor_end_time }} \\ \hline
|
||||
Deposits & {{ deposits.auditor_start_time }} & {{ deposits.auditor_end_time }} \\ \hline
|
||||
Reserves & {{ reserves.auditor_start_time }} & {{ reserves.auditor_end_time }} \\ \hline
|
||||
Wire & {{ wire.wire_auditor_start_time }} & {{ wire.wire_auditor_end_time }} \\
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
\end{table}
|
||||
|
||||
In that time, the auditors processed the following table ranges:
|
||||
\begin{table}[h!]
|
||||
\begin{center}
|
||||
\begin{tabular}{l|r|r}
|
||||
Table & Start & End \\ \hline \hline
|
||||
Reserves Incoming & {{ data.start_ppr_reserve_in_serial_id }}
|
||||
& {{ data.end_ppr_reserve_in_serial_id }} \\ \hline
|
||||
Reserves Out (withdraw) & {{ data.start_ppr_reserve_out_serial_id }}
|
||||
& {{ data.end_ppr_reserve_out_serial_id }} \\ \hline
|
||||
Reserves Recoup & {{ data.start_ppr_reserve_recoup_serial_id }}
|
||||
& {{ data.end_ppr_reserve_recoup_serial_id }} \\ \hline
|
||||
Reserves Close & {{ data.start_ppr_reserve_close_serial_id }}
|
||||
& {{ data.end_ppr_reserve_close_serial_id }} \\ \hline
|
||||
Aggregation & {{ data.start_ppa_wire_out_serial_id }}
|
||||
& {{ data.end_ppa_wire_out_serial_id }} \\ \hline
|
||||
Coin withdraw & {{ data.start_ppc_withdraw_serial_id }}
|
||||
& {{ data.end_ppc_withdraw_serial_id }} \\ \hline
|
||||
Coin deposit & {{ data.start_ppc_deposit_serial_id }}
|
||||
& {{ data.end_ppc_deposit_serial_id }} \\ \hline
|
||||
Coin melt & {{ data.start_ppc_melt_serial_id }}
|
||||
& {{ data.end_ppc_melt_serial_id }} \\ \hline
|
||||
Coin refund & {{ data.start_ppc_refund_serial_id }}
|
||||
& {{ data.end_ppc_refund_serial_id }} \\ \hline
|
||||
Coin recoup & {{ data.start_ppc_recoup_serial_id }}
|
||||
& {{ data.end_ppc_recoup_serial_id }} \\ \hline
|
||||
Coin recoup refresh & {{ data.start_ppc_recoup_refresh_serial_id }}
|
||||
& {{ data.end_ppc_recoup_refresh_serial_id }} \\
|
||||
Reserves Incoming & {{ reserves.start_ppr_reserve_in_serial_id }}
|
||||
& {{ reserves.end_ppr_reserve_in_serial_id }} \\ \hline
|
||||
Reserves Out (withdraw) & {{ reserves.start_ppr_reserve_out_serial_id }}
|
||||
& {{ reserves.end_ppr_reserve_out_serial_id }} \\ \hline
|
||||
Reserves Recoup & {{ reserves.start_ppr_reserve_recoup_serial_id }}
|
||||
& {{ reserves.end_ppr_reserve_recoup_serial_id }} \\ \hline
|
||||
Reserves Close & {{ reserves.start_ppr_reserve_close_serial_id }}
|
||||
& {{ reserves.end_ppr_reserve_close_serial_id }} \\ \hline
|
||||
Aggregation & {{ aggregation.start_ppa_wire_out_serial_id }}
|
||||
& {{ aggregation.end_ppa_wire_out_serial_id }} \\ \hline
|
||||
Coin withdraw & {{ coins.start_ppc_withdraw_serial_id }}
|
||||
& {{ coins.end_ppc_withdraw_serial_id }} \\ \hline
|
||||
Coin deposit & {{ coins.start_ppc_deposit_serial_id }}
|
||||
& {{ coins.end_ppc_deposit_serial_id }} \\ \hline
|
||||
Coin melt & {{ coins.start_ppc_melt_serial_id }}
|
||||
& {{ coins.end_ppc_melt_serial_id }} \\ \hline
|
||||
Coin refund & {{ coins.start_ppc_refund_serial_id }}
|
||||
& {{ coins.end_ppc_refund_serial_id }} \\ \hline
|
||||
Coin recoup & {{ coins.start_ppc_recoup_serial_id }}
|
||||
& {{ coins.end_ppc_recoup_serial_id }} \\ \hline
|
||||
Coin recoup refresh & {{ coins.start_ppc_recoup_refresh_serial_id }}
|
||||
& {{ coins.end_ppc_recoup_refresh_serial_id }} \\
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
\caption{Serial number ranges of the tables processed by the audit.}
|
||||
\label{table:auditor_range}
|
||||
\end{table}
|
||||
|
||||
The report was generated by the wire auditor started at
|
||||
{\bf {{ wire.wire_auditor_start_time }} } and concluded at
|
||||
{\bf {{ wire.wire_auditor_end_time }} }.
|
||||
|
||||
{% if wire.account_progress|length() == 0 %}
|
||||
In that time, the auditor processed NO accounts at all.
|
||||
In that time, the wire auditor processed NO accounts at all.
|
||||
{% else %}
|
||||
In that time, the auditor processed the following table ranges:
|
||||
In that time, the wire auditor processed the following table ranges:
|
||||
\begin{center}
|
||||
\begin{longtable}{l|c|r|r}
|
||||
Account & Table & Start & End \\ \hline
|
||||
@ -136,19 +143,21 @@ In that time, the auditor processed the following table ranges:
|
||||
\section{Operations}
|
||||
|
||||
The balance of the escrow account should
|
||||
be {\bf {{ data.total_escrow_balance }}}.
|
||||
be {\bf {{ coins.total_escrow_balance }}} (coins)
|
||||
plus {\bf {{ reserves.total_escrow_balance }}} (reserves).
|
||||
|
||||
\noindent
|
||||
The active operational risk stands at
|
||||
{\bf {{ data.total_active_risk }}}.
|
||||
{\bf {{ coins.total_active_risk }}}.
|
||||
|
||||
\noindent
|
||||
Loss (actualized risk from recoups) is
|
||||
{\bf {{ data.total_recoup_loss }}}.
|
||||
{\bf {{ coins.total_recoup_loss }}}.
|
||||
|
||||
\noindent
|
||||
Recoups of non-revoked coins are at
|
||||
{\bf {{ data.total_irregular_recoups }}}.
|
||||
{\bf {{ coins.total_irregular_recoups }}} (coins)
|
||||
plus {\bf {{ reserves.total_irregular_recoups }}} (reserves).
|
||||
|
||||
\section{Income}
|
||||
|
||||
@ -160,12 +169,11 @@ This section analyzes the income of the exchange operator from fees.
|
||||
\label{table:revenue}
|
||||
\begin{tabular}{l|r}
|
||||
Category & Amount \\ \hline \hline
|
||||
Withdraw fees & {{ data.total_withdraw_fee_income }} \\
|
||||
Deposit fees & {{ data.total_deposit_fee_income }} \\
|
||||
Melt fees & {{ data.total_melt_fee_income }} \\
|
||||
Refund fees & {{ data.total_refund_fee_income }} \\
|
||||
Aggregation fees & {{ data.total_aggregation_fee_income }} \\ \hline \hline
|
||||
{\bf Total} & {{ data.income_fee_total }} \\
|
||||
Withdraw fees & {{ reserves.total_withdraw_fee_income }} \\
|
||||
Deposit fees & {{ coins.total_deposit_fee_income }} \\
|
||||
Melt fees & {{ coins.total_melt_fee_income }} \\
|
||||
Refund fees & {{ coins.total_refund_fee_income }} \\
|
||||
Aggregation fees & {{ aggregation.total_aggregation_fee_income }} \\
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
\end{table}
|
||||
@ -297,15 +305,15 @@ and should be answered by revoking the exchange's online siging keys.
|
||||
% TODO: maybe reference PhD thesis on this?
|
||||
|
||||
The total amount the exchange currently lags behind is
|
||||
{\bf {{ data.missing_deposit_confirmation_total }} } from a total number of
|
||||
{\bf {{ data.missing_deposit_confirmation_count }} } deposit confirmations.
|
||||
{\bf {{ deposits.missing_deposit_confirmation_total }} } from a total number of
|
||||
{\bf {{ deposits.missing_deposit_confirmation_count }} } deposit confirmations.
|
||||
|
||||
Note that some lag is perfectly normal.
|
||||
Below, we report {\em all} deposit confirmations that are lagging behind.
|
||||
|
||||
% Table generation tested by testcase #24 in test-auditor.sh
|
||||
|
||||
{% if data.deposit_confirmation_inconsistencies|length() == 0 %}
|
||||
{% if deposits.deposit_confirmation_inconsistencies|length() == 0 %}
|
||||
{\bf No deposit confirmations that are lagging behind detected.}
|
||||
{% else %}
|
||||
\begin{longtable}{r|r|r}
|
||||
@ -325,7 +333,7 @@ Below, we report {\em all} deposit confirmations that are lagging behind.
|
||||
\caption{Missing deposit confirmations.}
|
||||
\label{table:missing_dc}
|
||||
\endlastfoot
|
||||
{% for item in data.deposit_confirmation_inconsistencies %}
|
||||
{% for item in deposits.deposit_confirmation_inconsistencies %}
|
||||
{{ item.timestamp }} &
|
||||
{{ item.amount }} &
|
||||
{{ item.rowid }} \\
|
||||
@ -355,18 +363,18 @@ exposure} is the amount of coins in circulation for a particular
|
||||
denomination and the maximum loss for the exchange from this type of
|
||||
compromise.
|
||||
|
||||
{% if (data.emergencies|length() != 0) %}
|
||||
{% if (coins.emergencies|length() != 0) %}
|
||||
The total risk from emergencies detected by amount is
|
||||
{\bf {{ data.emergencies_risk_by_amount }} }.
|
||||
{\bf {{ coins.emergencies_risk_by_amount }} }.
|
||||
The total loss from emergencies detected by amount is
|
||||
{\bf {{ data.emergencies_loss }} }.
|
||||
{\bf {{ coins.emergencies_loss }} }.
|
||||
{% endif %}
|
||||
|
||||
{% if (data.emergencies_by_count|length() != 0) %}
|
||||
{% if (coins.emergencies_by_count|length() != 0) %}
|
||||
The total risk from emergencies detected by counting coins is
|
||||
{\bf {{ data.emergencies_risk_by_count }} }
|
||||
{\bf {{ coins.emergencies_risk_by_count }} }
|
||||
The total loss from emergencies detected by counting coins could be up to
|
||||
{\bf {{ data.emergencies_loss_by_count }} }.
|
||||
{\bf {{ coins.emergencies_loss_by_count }} }.
|
||||
{% endif %}
|
||||
|
||||
|
||||
@ -374,7 +382,7 @@ The total loss from emergencies detected by counting coins could be up to
|
||||
|
||||
% Table generation tested by testcase #18 in test-auditor.sh
|
||||
|
||||
{% if data.emergencies_by_count|length() == 0 %}
|
||||
{% if coins.emergencies_by_count|length() == 0 %}
|
||||
{\bf No emergencies detected by counting coins.}
|
||||
{% else %}
|
||||
\begin{longtable}{r|c|r|r}
|
||||
@ -391,7 +399,7 @@ The total loss from emergencies detected by counting coins could be up to
|
||||
\caption{Emergencies by counting coins.}
|
||||
\label{table:emergencies_coin_counting}
|
||||
\endlastfoot
|
||||
{% for item in data.emergencies_by_count %}
|
||||
{% for item in coins.emergencies_by_count %}
|
||||
\multicolumn{4}{l}{ {\tt \truncate{0.95\textwidth}{ {{ item.denompub_hash }} } } } \\
|
||||
\nopagebreak
|
||||
{{ item.value }} &
|
||||
@ -416,7 +424,7 @@ indicator that the exchange's private signing key was compromised.
|
||||
|
||||
% Table generation tested by testcases #18, #25 in test-auditor.sh
|
||||
|
||||
{% if data.emergencies|length() == 0 %}
|
||||
{% if coins.emergencies|length() == 0 %}
|
||||
{\bf No emergencies by value detected.}
|
||||
{% else %}
|
||||
\begin{longtable}{r|c|r|r}
|
||||
@ -433,7 +441,7 @@ indicator that the exchange's private signing key was compromised.
|
||||
\caption{Emergencies by value deposited.}
|
||||
\label{table:emergencies}
|
||||
\endlastfoot
|
||||
{% for item in data.emergencies %}
|
||||
{% for item in coins.emergencies %}
|
||||
\multicolumn{4}{l}{ {\tt \truncate{0.95\textwidth}{ {{ item.denompub_hash }} } } } \\
|
||||
\nopagebreak
|
||||
{{ item.value }} &
|
||||
@ -504,7 +512,7 @@ compromise resulting in proportional financial losses to the exchange.
|
||||
|
||||
% Table generation tested by testcase #2 in test-auditor.sh
|
||||
|
||||
{% if data.reserve_balance_insufficient_inconsistencies|length() == 0 %}
|
||||
{% if reserves.reserve_balance_insufficient_inconsistencies|length() == 0 %}
|
||||
{\bf All withdrawals were covered by sufficient reserve funding.}
|
||||
{% else %}
|
||||
\begin{longtable}{p{8.5cm}|r}
|
||||
@ -517,11 +525,11 @@ compromise resulting in proportional financial losses to the exchange.
|
||||
\endfoot
|
||||
\hline
|
||||
{\bf Total loss} &
|
||||
{{ data.total_loss_balance_insufficient }} \\
|
||||
{{ reserves.total_loss_balance_insufficient }} \\
|
||||
\caption{Reserves with withdrawals higher than reserve funding.}
|
||||
\label{table:reserve:balance_insufficient}
|
||||
\endlastfoot
|
||||
{% for item in data.reserve_balance_insufficient_inconsistencies %}
|
||||
{% for item in reserves.reserve_balance_insufficient_inconsistencies %}
|
||||
{\tt \small {{ item.reserve_pub }} }
|
||||
&
|
||||
{{ item.loss }} \\ \hline
|
||||
@ -543,7 +551,7 @@ would be reported separately in Section~\ref{sec:wire_check_out}.
|
||||
|
||||
% Table generation tested by testcase #23 in test-auditor.sh
|
||||
|
||||
{% if data.wire_out_inconsistencies|length() == 0 %}
|
||||
{% if aggregation.wire_out_inconsistencies|length() == 0 %}
|
||||
{\bf All aggregations matched up.}
|
||||
{% else %}
|
||||
\begin{longtable}{r|r|r}
|
||||
@ -559,12 +567,12 @@ would be reported separately in Section~\ref{sec:wire_check_out}.
|
||||
\endfoot
|
||||
\hline
|
||||
{\bf Total deltas} &
|
||||
{{ data.total_wire_out_delta_plus}} &
|
||||
- {{ data.total_wire_out_delta_minus}} \\
|
||||
{{ aggregation.total_wire_out_delta_plus}} &
|
||||
- {{ aggregation.total_wire_out_delta_minus}} \\
|
||||
\caption{Claimed wire out aggregate totals not matching up.}
|
||||
\label{table:reserve:wire_out_balance_inconsistencies}
|
||||
\endlastfoot
|
||||
{% for item in data.wire_out_inconsistencies %}
|
||||
{% for item in aggregation.wire_out_inconsistencies %}
|
||||
\multicolumn{3}{l}{ {\tt \truncate{0.95\textwidth}{
|
||||
{% if 'payto_uri' in item.destination_account %}
|
||||
{{ item.destination_account.payto_uri }}
|
||||
@ -589,7 +597,7 @@ any effects on its own balance, those entries are excluded from the total.
|
||||
|
||||
% Table generation tested by testcase #25 in test-auditor.sh
|
||||
|
||||
{% if data.coin_inconsistencies|length() == 0 %}
|
||||
{% if aggregation.coin_inconsistencies|length() == 0 %}
|
||||
{\bf All coin histories were unproblematic.}
|
||||
{% else %}
|
||||
\begin{longtable}{p{1.8cm}|r|r}
|
||||
@ -607,12 +615,12 @@ any effects on its own balance, those entries are excluded from the total.
|
||||
\endfoot
|
||||
\hline
|
||||
$\sum$ {\bf Delta (Auditor-Exchange)} &
|
||||
{{ data.total_coin_delta_plus }} &
|
||||
- {{ data.total_coin_delta_minus }} \\
|
||||
{{ aggregation.total_coin_delta_plus }} &
|
||||
- {{ aggregation.total_coin_delta_minus }} \\
|
||||
\caption{Arithmetic inconsistencies of amount calculations involving a coin.}
|
||||
\label{table:amount:arithmetic:coin:inconsistencies}
|
||||
\endlastfoot
|
||||
{% for item in data.coin_inconsistencies %}
|
||||
{% for item in aggregation.coin_inconsistencies %}
|
||||
{{ item.operation }} &
|
||||
\multicolumn{2}{l}{ {\tt \small {{ item.coin_pub }} } } \\
|
||||
\nopagebreak &
|
||||
@ -637,9 +645,11 @@ the (hash of the) denomination public key for
|
||||
``recoup-verify'' and ``deposit-verify'' operations, and the master
|
||||
public key for ``recoup-master'' operations.
|
||||
|
||||
% Table generation tested by testcase #4/#5/#6/#7/#13 in test-auditor.sh
|
||||
\subsubsection{For aggregations}
|
||||
|
||||
{% if data.bad_sig_losses|length() == 0 %}
|
||||
% Table generation tested by testcase #XX in test-auditor.sh
|
||||
|
||||
{% if aggregation.bad_sig_losses|length() == 0 %}
|
||||
{\bf All signatures were valid.}
|
||||
{% else %}
|
||||
\begin{longtable}{l|r|r}
|
||||
@ -656,11 +666,81 @@ public key for ``recoup-master'' operations.
|
||||
\endfoot
|
||||
\hline
|
||||
\multicolumn{2}{l}{ {\bf Total losses} } &
|
||||
{\bf {{ data.total_bad_sig_loss}} } \\
|
||||
{\bf {{ aggregation.total_bad_sig_loss}} } \\
|
||||
\caption{Losses from operations performed on coins without proper signatures.}
|
||||
\label{table:bad_signature_losses}
|
||||
\endlastfoot
|
||||
{% for item in data.bad_sig_losses %}
|
||||
{% for item in aggregation.bad_sig_losses %}
|
||||
\multicolumn{3}{l}{ {\tt \small \truncate{0.9\textwidth}{ {{ item.key_pub }} } } } \\
|
||||
\nopagebreak
|
||||
{{ item.operation }} &
|
||||
{{ item.row }} &
|
||||
{{ item.loss }} \\ \hline
|
||||
{% endfor %}
|
||||
\end{longtable}
|
||||
{% endif %}
|
||||
|
||||
\subsubsection{For coins}
|
||||
|
||||
% Table generation tested by testcase #4/#5/#6/#13 in test-auditor.sh
|
||||
|
||||
{% if coins.bad_sig_losses|length() == 0 %}
|
||||
{\bf All signatures were valid.}
|
||||
{% else %}
|
||||
\begin{longtable}{l|r|r}
|
||||
\multicolumn{3}{l}{ {\bf Public key} }\\
|
||||
{\bf Operation type} & Database row & {\bf Loss amount} \\
|
||||
\hline \hline
|
||||
\endfirsthead
|
||||
\multicolumn{3}{l}{ {\bf Public key} }\\
|
||||
{\bf Operation type} & Database row & {\bf Loss amount} \\ \hline \hline
|
||||
\endhead
|
||||
\hline \hline
|
||||
\multicolumn{3}{l}{ {\bf Public key} }\\
|
||||
{\bf Operation type} & Database row & {\bf Loss amount} \\
|
||||
\endfoot
|
||||
\hline
|
||||
\multicolumn{2}{l}{ {\bf Total losses} } &
|
||||
{\bf {{ coins.total_bad_sig_loss}} } \\
|
||||
\caption{Losses from operations performed on coins without proper signatures.}
|
||||
\label{table:bad_signature_losses}
|
||||
\endlastfoot
|
||||
{% for item in coins.bad_sig_losses %}
|
||||
\multicolumn{3}{l}{ {\tt \small \truncate{0.9\textwidth}{ {{ item.key_pub }} } } } \\
|
||||
\nopagebreak
|
||||
{{ item.operation }} &
|
||||
{{ item.row }} &
|
||||
{{ item.loss }} \\ \hline
|
||||
{% endfor %}
|
||||
\end{longtable}
|
||||
{% endif %}
|
||||
|
||||
\subsubsection{For reserves}
|
||||
|
||||
% Table generation tested by testcase #7 in test-auditor.sh
|
||||
|
||||
{% if reserves.bad_sig_losses|length() == 0 %}
|
||||
{\bf All signatures were valid.}
|
||||
{% else %}
|
||||
\begin{longtable}{l|r|r}
|
||||
\multicolumn{3}{l}{ {\bf Public key} }\\
|
||||
{\bf Operation type} & Database row & {\bf Loss amount} \\
|
||||
\hline \hline
|
||||
\endfirsthead
|
||||
\multicolumn{3}{l}{ {\bf Public key} }\\
|
||||
{\bf Operation type} & Database row & {\bf Loss amount} \\ \hline \hline
|
||||
\endhead
|
||||
\hline \hline
|
||||
\multicolumn{3}{l}{ {\bf Public key} }\\
|
||||
{\bf Operation type} & Database row & {\bf Loss amount} \\
|
||||
\endfoot
|
||||
\hline
|
||||
\multicolumn{2}{l}{ {\bf Total losses} } &
|
||||
{\bf {{ reserves.total_bad_sig_loss}} } \\
|
||||
\caption{Losses from operations performed on coins without proper signatures.}
|
||||
\label{table:bad_signature_losses}
|
||||
\endlastfoot
|
||||
{% for item in reserves.bad_sig_losses %}
|
||||
\multicolumn{3}{l}{ {\tt \small \truncate{0.9\textwidth}{ {{ item.key_pub }} } } } \\
|
||||
\nopagebreak
|
||||
{{ item.operation }} &
|
||||
@ -826,7 +906,7 @@ translate into a financial loss (yet).
|
||||
|
||||
% Table generation tested by testcase #3 in test-auditor.sh
|
||||
|
||||
{% if data.reserve_balance_summary_wrong_inconsistencies|length() == 0 %}
|
||||
{% if reserves.reserve_balance_summary_wrong_inconsistencies|length() == 0 %}
|
||||
{\bf All balances matched up.}
|
||||
{% else %}
|
||||
\begin{longtable}{p{6cm}|r|r}
|
||||
@ -840,12 +920,12 @@ translate into a financial loss (yet).
|
||||
\hline
|
||||
\hline
|
||||
{\bf Total deltas} &
|
||||
{{ data.total_balance_summary_delta_plus}} &
|
||||
- {{ data.total_balance_summary_delta_minus}} \\
|
||||
{{ reserves.total_balance_summary_delta_plus}} &
|
||||
- {{ reserves.total_balance_summary_delta_minus}} \\
|
||||
\caption{Reserves balances not matching up.}
|
||||
\label{table:reserve:balance_inconsistencies}
|
||||
\endlastfoot
|
||||
{% for item in data.reserve_balance_summary_wrong_inconsistencies %}
|
||||
{% for item in reserves.reserve_balance_summary_wrong_inconsistencies %}
|
||||
{\tt \tiny {{ item.reserve_pub }} } &
|
||||
{{ item.auditor }} &
|
||||
{{ item.exchange }} \\ \hline
|
||||
@ -853,16 +933,16 @@ translate into a financial loss (yet).
|
||||
\end{longtable}
|
||||
{% endif %}
|
||||
|
||||
{% if data.reserve_balance_summary_wrong_inconsistencies|length() != 0 %}
|
||||
{% if reserves.reserve_balance_summary_wrong_inconsistencies|length() != 0 %}
|
||||
This means that there are inconsistencies in the exchange's
|
||||
summary data about reserve balances.
|
||||
\begin{itemize}
|
||||
\item The exchange believes some reserves contain (in total)
|
||||
{\bf {{ data.total_balance_summary_delta_plus}} } {\em less} than they
|
||||
{\bf {{ reserves.total_balance_summary_delta_plus}} } {\em less} than they
|
||||
actually contain. A non-zero value here means the exchange may deny legitimate withdrawal
|
||||
requests, denying customers access to their funds.
|
||||
\item The exchange believes some reserves contain (in total)
|
||||
{\bf {{ data.total_balance_summary_delta_minus}} } {\em more} than they
|
||||
{\bf {{ reserves.total_balance_summary_delta_minus}} } {\em more} than they
|
||||
actually contain. A non-zero value here means the exchange may allow coins to be withdrawn
|
||||
for which it never received any income, at a loss (for the exchange).
|
||||
\end{itemize}
|
||||
@ -958,7 +1038,7 @@ with respect to what wire fee it charges at what time.
|
||||
|
||||
% Table generation tested by testcase #14 in test-auditor.sh
|
||||
|
||||
{% if data.wire_fee_time_inconsistencies|length() == 0 %}
|
||||
{% if aggregation.wire_fee_time_inconsistencies|length() == 0 %}
|
||||
{\bf No wire fee timing issues detected.}
|
||||
{% else %}
|
||||
\begin{longtable}{p{1.5cm}|r|p{6}}
|
||||
@ -976,7 +1056,7 @@ with respect to what wire fee it charges at what time.
|
||||
\caption{Wire fees with ambiguous timestamps.}
|
||||
\label{table:wire_fee:ambiguity}
|
||||
\endlastfoot
|
||||
{% for item in data.wire_fee_time_inconsistencies %}
|
||||
{% for item in aggregation.wire_fee_time_inconsistencies %}
|
||||
{\tt {{ item.type }} } & {{ item.time }} & {{ item.diagnostic }} \\ \hline
|
||||
{% endfor %}
|
||||
\end{longtable}
|
||||
@ -989,9 +1069,11 @@ with respect to what wire fee it charges at what time.
|
||||
This section describes issues found that do not have a clear financial
|
||||
impact.
|
||||
|
||||
% Table generation tested by testcase #13/#15/#25 in test-auditor.sh
|
||||
\subsubsection{For aggregations}
|
||||
|
||||
{% if data.row_inconsistencies|length() == 0 %}
|
||||
% Table generation tested by testcase #15/#25 in test-auditor.sh
|
||||
|
||||
{% if aggregation.row_inconsistencies|length() == 0 %}
|
||||
{\bf No row inconsistencies found.}
|
||||
{% else %}
|
||||
\begin{longtable}{p{2.5cm}|l|p{5cm}}
|
||||
@ -1007,9 +1089,69 @@ impact.
|
||||
\hline \hline
|
||||
{\bf Table} & {\bf Row} & {\bf Diagnostic} \\
|
||||
\caption{Other issues found (by table and row).}
|
||||
\label{table:misc}
|
||||
\label{table:misc:aggregation}
|
||||
\endlastfoot
|
||||
{% for item in data.row_inconsistencies %}
|
||||
{% for item in aggregation.row_inconsistencies %}
|
||||
\verb! {{ item.table }} ! &
|
||||
{{ item.row }} &
|
||||
{{ item.diagnostic }} \\ \hline
|
||||
{% endfor %}
|
||||
\end{longtable}
|
||||
{% endif %}
|
||||
|
||||
\subsubsection{For coins}
|
||||
|
||||
% Table generation tested by testcase #13 in test-auditor.sh
|
||||
|
||||
{% if coins.row_inconsistencies|length() == 0 %}
|
||||
{\bf No row inconsistencies found.}
|
||||
{% else %}
|
||||
\begin{longtable}{p{2.5cm}|l|p{5cm}}
|
||||
{\bf Table} & {\bf Row} & {\bf Diagnostic} \\
|
||||
\hline \hline
|
||||
\endfirsthead
|
||||
{\bf Table} & {\bf Row} & {\bf Diagnostic} \\
|
||||
\hline \hline
|
||||
\endhead
|
||||
\hline \hline
|
||||
{\bf Table} & {\bf Row} & {\bf Diagnostic} \\
|
||||
\endfoot
|
||||
\hline \hline
|
||||
{\bf Table} & {\bf Row} & {\bf Diagnostic} \\
|
||||
\caption{Other issues found (by table and row).}
|
||||
\label{table:misc:coins}
|
||||
\endlastfoot
|
||||
{% for item in coins.row_inconsistencies %}
|
||||
\verb! {{ item.table }} ! &
|
||||
{{ item.row }} &
|
||||
{{ item.diagnostic }} \\ \hline
|
||||
{% endfor %}
|
||||
\end{longtable}
|
||||
{% endif %}
|
||||
|
||||
\subsubsection{For reserves}
|
||||
|
||||
% Table generation tested by testcase #XX in test-auditor.sh
|
||||
|
||||
{% if reserves.row_inconsistencies|length() == 0 %}
|
||||
{\bf No row inconsistencies found.}
|
||||
{% else %}
|
||||
\begin{longtable}{p{2.5cm}|l|p{5cm}}
|
||||
{\bf Table} & {\bf Row} & {\bf Diagnostic} \\
|
||||
\hline \hline
|
||||
\endfirsthead
|
||||
{\bf Table} & {\bf Row} & {\bf Diagnostic} \\
|
||||
\hline \hline
|
||||
\endhead
|
||||
\hline \hline
|
||||
{\bf Table} & {\bf Row} & {\bf Diagnostic} \\
|
||||
\endfoot
|
||||
\hline \hline
|
||||
{\bf Table} & {\bf Row} & {\bf Diagnostic} \\
|
||||
\caption{Other issues found (by table and row).}
|
||||
\label{table:misc:reserves}
|
||||
\endlastfoot
|
||||
{% for item in reserves.row_inconsistencies %}
|
||||
\verb! {{ item.table }} ! &
|
||||
{{ item.row }} &
|
||||
{{ item.diagnostic }} \\ \hline
|
||||
@ -1032,7 +1174,7 @@ reserve expired.
|
||||
|
||||
% Table generation tested by testcase #20 in test-auditor.sh
|
||||
|
||||
{% if data.reserve_not_closed_inconsistencies|length() == 0 %}
|
||||
{% if reserves.reserve_not_closed_inconsistencies|length() == 0 %}
|
||||
{\bf All expired reserves were closed.}
|
||||
{% else %}
|
||||
\begin{longtable}{p{4.5cm}|c|r}
|
||||
@ -1045,11 +1187,11 @@ reserve expired.
|
||||
\endfoot
|
||||
\hline
|
||||
{\bf Sum} & &
|
||||
{{ data.total_balance_reserve_not_closed}} \\
|
||||
{{ reserves.total_balance_reserve_not_closed}} \\
|
||||
\caption{Reserves not closed on time.}
|
||||
\label{table:reserve:not_closed}
|
||||
\endlastfoot
|
||||
{% for item in data.reserve_not_closed_inconsistencies %}
|
||||
{% for item in reserves.reserve_not_closed_inconsistencies %}
|
||||
{\tt \tiny \truncate{4.3cm}{ {{ item.reserve_pub }} } } &
|
||||
{\tiny {{ item.expiration_time }} } &
|
||||
{{ item.balance }} \\ \hline
|
||||
@ -1067,7 +1209,7 @@ may happen even if the exchange is correct.
|
||||
|
||||
% Table generation tested by testcase #12 in test-auditor.sh
|
||||
|
||||
{% if data.refresh_hanging|length() == 0 %}
|
||||
{% if coins.refresh_hanging|length() == 0 %}
|
||||
{\bf All melted coins were refreshed.}
|
||||
{% else %}
|
||||
\begin{longtable}{p{6.5cm}|c|r}
|
||||
@ -1082,11 +1224,11 @@ may happen even if the exchange is correct.
|
||||
\endfoot
|
||||
\hline
|
||||
{\bf Sum} & &
|
||||
{{ data.total_refresh_hanging}} \\
|
||||
{{ coins.total_refresh_hanging}} \\
|
||||
\caption{Refresh operations hanging.}
|
||||
\label{table:refresh:hanging}
|
||||
\endlastfoot
|
||||
{% for item in data.refresh_hanging %}
|
||||
{% for item in coins.refresh_hanging %}
|
||||
\truncate{6.2cm}{ {\tt \small {{ item.coin_pub }} } } &
|
||||
{{ item.row }} &
|
||||
{{ item.amount }} \\ \hline
|
||||
@ -1104,7 +1246,7 @@ implications.
|
||||
|
||||
% Table generation tested by testcase #22 in test-auditor.sh
|
||||
|
||||
{% if data.denomination_key_validity_withdraw_inconsistencies|length() == 0 %}
|
||||
{% if reserves.denomination_key_validity_withdraw_inconsistencies|length() == 0 %}
|
||||
{\bf All denomination keys were valid at the time of withdrawals.}
|
||||
{% else %}
|
||||
\begin{longtable}{p{7.5cm}|r}
|
||||
@ -1124,7 +1266,7 @@ implications.
|
||||
\caption{Execution times not matching denomination key validity period.}
|
||||
\label{table:withdraw:bad_time}
|
||||
\endlastfoot
|
||||
{% for item in data.denomination_key_validity_withdraw_inconsistencies %}
|
||||
{% for item in reserves.denomination_key_validity_withdraw_inconsistencies %}
|
||||
{\tt \small \truncate{0.6\textwidth}{ {{ item.reserve_pub }} } } & {{ item.row }} \\
|
||||
\nopagebreak
|
||||
{\tt \small \truncate{0.6\textwidth}{ {{ item.denompub_h }} } } & {{ item.execution_date }} \\ \hline
|
||||
|
@ -36,6 +36,18 @@ jsonData1 = json.load(jsonFile1)
|
||||
jsonFile2 = open (sys.argv[2], 'r')
|
||||
jsonData2 = json.load(jsonFile2)
|
||||
|
||||
jsonFile3 = open (sys.argv[3], 'r')
|
||||
jsonData3 = json.load(jsonFile3)
|
||||
|
||||
jsonFile4 = open (sys.argv[4], 'r')
|
||||
jsonData4 = json.load(jsonFile4)
|
||||
|
||||
jsonFile5 = open (sys.argv[5], 'r')
|
||||
jsonData5 = json.load(jsonFile5)
|
||||
|
||||
jsonFile6 = open (sys.argv[6], 'r')
|
||||
jsonData6 = json.load(jsonFile6)
|
||||
|
||||
jinjaEnv = jinja2.Environment(loader=StdinLoader(),
|
||||
lstrip_blocks=True,
|
||||
trim_blocks=True,
|
||||
@ -43,4 +55,4 @@ jinjaEnv = jinja2.Environment(loader=StdinLoader(),
|
||||
autoescape=False)
|
||||
tmpl = jinjaEnv.get_template('stdin');
|
||||
|
||||
print(tmpl.render(data = jsonData1, wire = jsonData2))
|
||||
print(tmpl.render(data = jsonData1, wire = jsonData2, aggregation = jsonData3, coins = jsonData4, deposits = jsonData5, reserves = jsonData6))
|
||||
|
5
src/auditor/.gitignore
vendored
5
src/auditor/.gitignore
vendored
@ -2,14 +2,11 @@ taler-auditor-httpd
|
||||
taler-auditor
|
||||
taler-wire-auditor
|
||||
taler-auditor-exchange
|
||||
test-audit.json
|
||||
test-report.aux
|
||||
test-report.pdf
|
||||
test-report.tex
|
||||
test-wire-audit.json
|
||||
*.json
|
||||
texput.aux
|
||||
test-audit-inc.json
|
||||
test-wire-audit-inc.json
|
||||
wirefees/
|
||||
bank.err
|
||||
libauditor.a
|
||||
|
@ -85,7 +85,7 @@ static struct GNUNET_CONTAINER_MultiHashMap *denominations;
|
||||
* @return human-readable string representing the time
|
||||
*/
|
||||
json_t *
|
||||
TALER_ARL_TALER_ARL_json_from_time_abs_nbo (struct GNUNET_TIME_AbsoluteNBO at)
|
||||
TALER_ARL_json_from_time_abs_nbo (struct GNUNET_TIME_AbsoluteNBO at)
|
||||
{
|
||||
return json_string
|
||||
(GNUNET_STRINGS_absolute_time_to_string
|
||||
|
@ -87,7 +87,7 @@ extern struct GNUNET_TIME_Absolute start_time;
|
||||
* @return human-readable string representing the time
|
||||
*/
|
||||
json_t *
|
||||
TALER_ARL_TALER_ARL_json_from_time_abs_nbo (struct GNUNET_TIME_AbsoluteNBO at);
|
||||
TALER_ARL_json_from_time_abs_nbo (struct GNUNET_TIME_AbsoluteNBO at);
|
||||
|
||||
|
||||
/**
|
||||
|
@ -1441,24 +1441,26 @@ run (void *cls,
|
||||
report = json_pack ("{s:o, s:o, s:o, s:o, s:o,"
|
||||
" s:o, s:o, s:o, s:o, s:o,"
|
||||
" s:o, s:o, s:o, s:I, s:I,"
|
||||
" s:o, s:o }",
|
||||
" s:o, s:o, s:o }",
|
||||
/* blocks #1 */
|
||||
"wire_out_inconsistencies",
|
||||
report_wire_out_inconsistencies,
|
||||
/* Tested in test-auditor.sh #23 */
|
||||
"total_wire_out_delta_plus",
|
||||
TALER_JSON_from_amount (
|
||||
&total_wire_out_delta_plus),
|
||||
/* Tested in test-auditor.sh #23 */
|
||||
"total_wire_out_delta_minus",
|
||||
TALER_JSON_from_amount (
|
||||
&total_wire_out_delta_minus),
|
||||
/* Tested in test-auditor.sh #4/#5/#6/#7/#13 */
|
||||
/* FIXME: Tested in test-auditor.sh #?? */
|
||||
"bad_sig_losses",
|
||||
report_bad_sig_losses,
|
||||
/* Tested in test-auditor.sh #4/#5/#6/#7/#13 */
|
||||
/* FIXME: Tested in test-auditor.sh #?? */
|
||||
"total_bad_sig_loss",
|
||||
TALER_JSON_from_amount (&total_bad_sig_loss),
|
||||
/* block #2 */
|
||||
/* Tested in test-auditor.sh #14/#15 */
|
||||
/* Tested in test-auditor.sh #15 */
|
||||
"row_inconsistencies",
|
||||
report_row_inconsistencies,
|
||||
"coin_inconsistencies",
|
||||
@ -1490,7 +1492,9 @@ run (void *cls,
|
||||
start_time),
|
||||
"auditor_end_time",
|
||||
TALER_ARL_json_from_time_abs (
|
||||
GNUNET_TIME_absolute_get ())
|
||||
GNUNET_TIME_absolute_get ()),
|
||||
"wire_fee_time_inconsistencies",
|
||||
report_fee_time_inconsistencies
|
||||
);
|
||||
GNUNET_break (NULL != report);
|
||||
TALER_ARL_done (report);
|
||||
|
@ -199,10 +199,10 @@ report_emergency_by_amount (const struct
|
||||
"denom_loss",
|
||||
TALER_JSON_from_amount (loss),
|
||||
"start",
|
||||
TALER_ARL_TALER_ARL_json_from_time_abs_nbo (
|
||||
TALER_ARL_json_from_time_abs_nbo (
|
||||
issue->start),
|
||||
"deposit_end",
|
||||
TALER_ARL_TALER_ARL_json_from_time_abs_nbo (
|
||||
TALER_ARL_json_from_time_abs_nbo (
|
||||
issue->expire_deposit),
|
||||
"value",
|
||||
TALER_JSON_from_amount_nbo (&issue->value)));
|
||||
@ -251,10 +251,10 @@ report_emergency_by_count (const struct
|
||||
"denom_risk",
|
||||
TALER_JSON_from_amount (risk),
|
||||
"start",
|
||||
TALER_ARL_TALER_ARL_json_from_time_abs_nbo (
|
||||
TALER_ARL_json_from_time_abs_nbo (
|
||||
issue->start),
|
||||
"deposit_end",
|
||||
TALER_ARL_TALER_ARL_json_from_time_abs_nbo (
|
||||
TALER_ARL_json_from_time_abs_nbo (
|
||||
issue->expire_deposit),
|
||||
"value",
|
||||
TALER_JSON_from_amount_nbo (&issue->value)));
|
||||
@ -2238,16 +2238,17 @@ run (void *cls,
|
||||
"emergencies_risk_by_amount",
|
||||
TALER_JSON_from_amount (
|
||||
&reported_emergency_risk_by_amount),
|
||||
/* Tested in test-auditor.sh #4/#5/#6/#7/#13 */
|
||||
/* Tested in test-auditor.sh #4/#5/#6/#13/#26 */
|
||||
"bad_sig_losses",
|
||||
report_bad_sig_losses,
|
||||
/* Tested in test-auditor.sh #4/#5/#6/#7/#13 */
|
||||
/* Tested in test-auditor.sh #4/#5/#6/#13/#26 */
|
||||
"total_bad_sig_loss",
|
||||
TALER_JSON_from_amount (&total_bad_sig_loss),
|
||||
/* Tested in test-auditor.sh #14/#15 */
|
||||
/* FIXME: Tested in test-auditor.sh #?? */
|
||||
"row_inconsistencies",
|
||||
report_row_inconsistencies,
|
||||
/* Block #3 */
|
||||
/* Tested in test-auditor.sh #18 */
|
||||
"amount_arithmetic_inconsistencies",
|
||||
report_amount_arithmetic_inconsistencies,
|
||||
"total_arithmetic_delta_plus",
|
||||
@ -2308,12 +2309,12 @@ run (void *cls,
|
||||
(json_int_t) ppc.last_recoup_serial_id,
|
||||
"end_ppc_recoup_refresh_serial_id",
|
||||
(json_int_t) ppc.last_recoup_refresh_serial_id,
|
||||
"auditor_start_time", json_string (
|
||||
GNUNET_STRINGS_absolute_time_to_string (
|
||||
start_time)),
|
||||
"auditor_end_time", json_string (
|
||||
GNUNET_STRINGS_absolute_time_to_string (
|
||||
GNUNET_TIME_absolute_get ())),
|
||||
"auditor_start_time",
|
||||
TALER_ARL_json_from_time_abs (
|
||||
start_time),
|
||||
"auditor_end_time",
|
||||
TALER_ARL_json_from_time_abs (
|
||||
GNUNET_TIME_absolute_get ()),
|
||||
"total_irregular_recoups",
|
||||
TALER_JSON_from_amount (
|
||||
&total_irregular_recoups)
|
||||
|
@ -303,14 +303,20 @@ run (void *cls,
|
||||
{
|
||||
json_t *report;
|
||||
|
||||
report = json_pack ("{s:o, s:o, s:I}",
|
||||
report = json_pack ("{s:o, s:I, s:o, s:o, s:o}",
|
||||
"deposit_confirmation_inconsistencies",
|
||||
report_deposit_confirmation_inconsistencies,
|
||||
"missing_deposit_confirmation_count",
|
||||
(json_int_t) number_missed_deposit_confirmations,
|
||||
"missing_deposit_confirmation_total",
|
||||
TALER_JSON_from_amount (
|
||||
&total_missed_deposit_confirmations)
|
||||
&total_missed_deposit_confirmations),
|
||||
"auditor_start_time",
|
||||
TALER_ARL_json_from_time_abs (
|
||||
start_time),
|
||||
"auditor_end_time",
|
||||
TALER_ARL_json_from_time_abs (
|
||||
GNUNET_TIME_absolute_get ())
|
||||
);
|
||||
GNUNET_break (NULL != report);
|
||||
TALER_ARL_done (report);
|
||||
|
@ -1449,19 +1449,19 @@ run (void *cls,
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
||||
"Launching auditor\n");
|
||||
if (GNUNET_OK !=
|
||||
TALER_ARL_init (TALER_ARL_cfg))
|
||||
TALER_ARL_init (c))
|
||||
{
|
||||
global_ret = 1;
|
||||
return;
|
||||
}
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CONFIGURATION_get_value_time (TALER_ARL_cfg,
|
||||
"exchangTALER_ARL_edb",
|
||||
"exchangedb",
|
||||
"IDLE_RESERVE_EXPIRATION_TIME",
|
||||
&idle_reserve_expiration_time))
|
||||
{
|
||||
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
|
||||
"exchangTALER_ARL_edb",
|
||||
"exchangedb",
|
||||
"IDLE_RESERVE_EXPIRATION_TIME");
|
||||
global_ret = 1;
|
||||
return;
|
||||
@ -1564,14 +1564,14 @@ run (void *cls,
|
||||
"total_balance_reserve_not_closed",
|
||||
TALER_JSON_from_amount (
|
||||
&total_balance_reserve_not_closed),
|
||||
/* Tested in test-auditor.sh #4/#5/#6/#7/#13 */
|
||||
/* Tested in test-auditor.sh #7 */
|
||||
"bad_sig_losses",
|
||||
report_bad_sig_losses,
|
||||
/* blocks #3 */
|
||||
/* Tested in test-auditor.sh #4/#5/#6/#7/#13 */
|
||||
/* Tested in test-auditor.sh #7 */
|
||||
"total_bad_sig_loss",
|
||||
TALER_JSON_from_amount (&total_bad_sig_loss),
|
||||
/* Tested in test-auditor.sh #14/#15 */
|
||||
/* FIXME: Tested in test-auditor.sh #?? */
|
||||
"row_inconsistencies",
|
||||
report_row_inconsistencies,
|
||||
/* Tested in test-auditor.sh #23 */
|
||||
|
@ -79,15 +79,35 @@ function pre_audit () {
|
||||
function audit_only () {
|
||||
# Run the auditor!
|
||||
echo -n "Running audit(s) ..."
|
||||
|
||||
# NOTE: this should be removed soon...
|
||||
$VALGRIND taler-auditor -L DEBUG -r -c $CONF -m $MASTER_PUB > test-audit.json 2> test-audit.log || exit_fail "auditor failed"
|
||||
echo -n "."
|
||||
# Also do incremental run
|
||||
$VALGRIND taler-auditor -L DEBUG -c $CONF -m $MASTER_PUB > test-audit-inc.json 2> test-audit-inc.log || exit_fail "auditor failed"
|
||||
echo -n "."
|
||||
$VALGRIND taler-helper-auditor-wire -L DEBUG -r -c $CONF -m $MASTER_PUB > test-wire-audit.json 2> test-wire-audit.log || exit_fail "wire auditor failed"
|
||||
# Also do incremental run
|
||||
|
||||
$VALGRIND taler-helper-auditor-aggregation -L DEBUG -r -c $CONF -m $MASTER_PUB > test-audit-aggregation.json 2> test-audit-aggregation.log || exit_fail "aggregation audit failed"
|
||||
echo -n "."
|
||||
$VALGRIND taler-helper-auditor-wire -L DEBUG -c $CONF -m $MASTER_PUB > test-wire-audit-inc.json 2> test-wire-audit-inc.log || exit_fail "wire auditor failed"
|
||||
$VALGRIND taler-helper-auditor-aggregation -L DEBUG -c $CONF -m $MASTER_PUB > test-audit-aggregation-inc.json 2> test-audit-aggregation-inc.log || exit_fail "incremental aggregation audit failed"
|
||||
echo -n "."
|
||||
$VALGRIND taler-helper-auditor-coins -L DEBUG -r -c $CONF -m $MASTER_PUB > test-audit-coins.json 2> test-audit-coins.log || exit_fail "coin audit failed"
|
||||
echo -n "."
|
||||
$VALGRIND taler-helper-auditor-coins -L DEBUG -c $CONF -m $MASTER_PUB > test-audit-coins-inc.json 2> test-audit-coins-inc.log || exit_fail "incremental coin audit failed"
|
||||
echo -n "."
|
||||
$VALGRIND taler-helper-auditor-deposits -L DEBUG -r -c $CONF -m $MASTER_PUB > test-audit-deposits.json 2> test-audit-deposits.log || exit_fail "deposits audit failed"
|
||||
echo -n "."
|
||||
$VALGRIND taler-helper-auditor-deposits -L DEBUG -c $CONF -m $MASTER_PUB > test-audit-deposits-inc.json 2> test-audit-deposits-inc.log || exit_fail "incremental deposits audit failed"
|
||||
echo -n "."
|
||||
$VALGRIND taler-helper-auditor-reserves -L DEBUG -r -c $CONF -m $MASTER_PUB > test-audit-reserves.json 2> test-audit-reserves.log || exit_fail "reserves audit failed"
|
||||
echo -n "."
|
||||
$VALGRIND taler-helper-auditor-reserves -L DEBUG -c $CONF -m $MASTER_PUB > test-audit-reserves-inc.json 2> test-audit-reserves-inc.log || exit_fail "incremental reserves audit failed"
|
||||
echo -n "."
|
||||
$VALGRIND taler-helper-auditor-wire -L DEBUG -r -c $CONF -m $MASTER_PUB > test-audit-wire.json 2> test-wire-audit.log || exit_fail "wire audit failed"
|
||||
echo -n "."
|
||||
$VALGRIND taler-helper-auditor-wire -L DEBUG -c $CONF -m $MASTER_PUB > test-audit-wire-inc.json 2> test-wire-audit-inc.log || exit_fail "wire audit failed"
|
||||
echo -n "."
|
||||
|
||||
echo " DONE"
|
||||
}
|
||||
|
||||
@ -99,7 +119,7 @@ function post_audit () {
|
||||
wait
|
||||
echo "DONE"
|
||||
echo -n "TeXing ."
|
||||
../../contrib/render.py test-audit.json test-wire-audit.json < ../../contrib/auditor-report.tex.j2 > test-report.tex || exit_fail "Renderer failed"
|
||||
../../contrib/render.py test-audit.json test-audit-wire.json test-audit-aggregation.json test-audit-coins.json test-audit-deposits.json test-audit-reserves.json < ../../contrib/auditor-report.tex.j2 > test-report.tex || exit_fail "Renderer failed"
|
||||
|
||||
echo -n "."
|
||||
timeout 10 pdflatex test-report.tex >/dev/null || exit_fail "pdflatex failed"
|
||||
@ -141,21 +161,21 @@ run_audit aggregator
|
||||
echo "Checking output"
|
||||
# if an emergency was detected, that is a bug and we should fail
|
||||
echo -n "Test for emergencies... "
|
||||
jq -e .emergencies[0] < test-audit.json > /dev/null && exit_fail "Unexpected emergency detected in ordinary run" || echo PASS
|
||||
jq -e .emergencies[0] < test-audit-coins.json > /dev/null && exit_fail "Unexpected emergency detected in ordinary run" || echo PASS
|
||||
echo -n "Test for deposit confirmation emergencies... "
|
||||
jq -e .deposit_confirmation_inconsistencies[0] < test-audit.json > /dev/null && exit_fail "Unexpected deposit confirmation inconsistency detected" || echo PASS
|
||||
jq -e .deposit_confirmation_inconsistencies[0] < test-audit-deposits.json > /dev/null && exit_fail "Unexpected deposit confirmation inconsistency detected" || echo PASS
|
||||
echo -n "Test for emergencies by count... "
|
||||
jq -e .emergencies_by_count[0] < test-audit.json > /dev/null && exit_fail "Unexpected emergency by count detected in ordinary run" || echo PASS
|
||||
jq -e .emergencies_by_count[0] < test-audit-coins.json > /dev/null && exit_fail "Unexpected emergency by count detected in ordinary run" || echo PASS
|
||||
|
||||
echo -n "Test for wire inconsistencies... "
|
||||
jq -e .wire_out_amount_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected wire out inconsistency detected in ordinary run"
|
||||
jq -e .reserve_in_amount_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected reserve in inconsistency detected in ordinary run"
|
||||
jq -e .missattribution_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected missattribution inconsistency detected in ordinary run"
|
||||
jq -e .row_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected row inconsistency detected in ordinary run"
|
||||
jq -e .denomination_key_validity_withdraw_inconsistencies[0] < test-audit.json > /dev/null && exit_fail "Unexpected denomination key withdraw inconsistency detected in ordinary run"
|
||||
jq -e .row_minor_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected minor row inconsistency detected in ordinary run"
|
||||
jq -e .lag_details[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected lag detected in ordinary run"
|
||||
jq -e .wire_format_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected wire format inconsistencies detected in ordinary run"
|
||||
jq -e .wire_out_amount_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected wire out inconsistency detected in ordinary run"
|
||||
jq -e .reserve_in_amount_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected reserve in inconsistency detected in ordinary run"
|
||||
jq -e .missattribution_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected missattribution inconsistency detected in ordinary run"
|
||||
jq -e .row_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected row inconsistency detected in ordinary run"
|
||||
jq -e .denomination_key_validity_withdraw_inconsistencies[0] < test-audit-reserves.json > /dev/null && exit_fail "Unexpected denomination key withdraw inconsistency detected in ordinary run"
|
||||
jq -e .row_minor_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected minor row inconsistency detected in ordinary run"
|
||||
jq -e .lag_details[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected lag detected in ordinary run"
|
||||
jq -e .wire_format_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected wire format inconsistencies detected in ordinary run"
|
||||
|
||||
|
||||
# TODO: check operation balances are correct (once we have all transaction types and wallet is deterministic)
|
||||
@ -163,34 +183,44 @@ jq -e .wire_format_inconsistencies[0] < test-wire-audit.json > /dev/null && exit
|
||||
|
||||
echo PASS
|
||||
|
||||
LOSS=`jq -r .total_bad_sig_loss < test-audit.json`
|
||||
LOSS=`jq -r .total_bad_sig_loss < test-audit-aggregation.json`
|
||||
if test $LOSS != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong total bad sig loss, got unexpected loss of $LOSS"
|
||||
exit_fail "Wrong total bad sig loss from aggregation, got unexpected loss of $LOSS"
|
||||
fi
|
||||
LOSS=`jq -r .total_bad_sig_loss < test-audit-coins.json`
|
||||
if test $LOSS != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong total bad sig loss from coins, got unexpected loss of $LOSS"
|
||||
fi
|
||||
LOSS=`jq -r .total_bad_sig_loss < test-audit-reserves.json`
|
||||
if test $LOSS != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong total bad sig loss from reserves, got unexpected loss of $LOSS"
|
||||
fi
|
||||
|
||||
echo -n "Test for wire amounts... "
|
||||
WIRED=`jq -r .total_wire_in_delta_plus < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_wire_in_delta_plus < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Expected total wire delta plus wrong, got $WIRED"
|
||||
fi
|
||||
WIRED=`jq -r .total_wire_in_delta_minus < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_wire_in_delta_minus < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Expected total wire delta minus wrong, got $WIRED"
|
||||
fi
|
||||
WIRED=`jq -r .total_wire_out_delta_plus < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_wire_out_delta_plus < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Expected total wire delta plus wrong, got $WIRED"
|
||||
fi
|
||||
WIRED=`jq -r .total_wire_out_delta_minus < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_wire_out_delta_minus < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Expected total wire delta minus wrong, got $WIRED"
|
||||
fi
|
||||
WIRED=`jq -r .total_missattribution_in < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_missattribution_in < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Expected total missattribution in wrong, got $WIRED"
|
||||
@ -198,22 +228,44 @@ fi
|
||||
echo PASS
|
||||
|
||||
echo -n "Checking for unexpected arithmetic differences "
|
||||
LOSS=`jq -r .total_arithmetic_delta_plus < test-audit.json`
|
||||
LOSS=`jq -r .total_arithmetic_delta_plus < test-audit-aggregation.json`
|
||||
if test $LOSS != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong arithmetic delta, got unexpected plus of $LOSS"
|
||||
exit_fail "Wrong arithmetic delta from aggregations, got unexpected plus of $LOSS"
|
||||
fi
|
||||
LOSS=`jq -r .total_arithmetic_delta_minus < test-audit.json`
|
||||
LOSS=`jq -r .total_arithmetic_delta_minus < test-audit-aggregation.json`
|
||||
if test $LOSS != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong arithmetic delta, got unexpected minus of $LOSS"
|
||||
exit_fail "Wrong arithmetic delta from aggregation, got unexpected minus of $LOSS"
|
||||
fi
|
||||
LOSS=`jq -r .total_arithmetic_delta_plus < test-audit-coins.json`
|
||||
if test $LOSS != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong arithmetic delta from coins, got unexpected plus of $LOSS"
|
||||
fi
|
||||
LOSS=`jq -r .total_arithmetic_delta_minus < test-audit-coins.json`
|
||||
if test $LOSS != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong arithmetic delta from coins, got unexpected minus of $LOSS"
|
||||
fi
|
||||
LOSS=`jq -r .total_arithmetic_delta_plus < test-audit-reserves.json`
|
||||
if test $LOSS != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong arithmetic delta from reserves, got unexpected plus of $LOSS"
|
||||
fi
|
||||
LOSS=`jq -r .total_arithmetic_delta_minus < test-audit-reserves.json`
|
||||
if test $LOSS != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong arithmetic delta from reserves, got unexpected minus of $LOSS"
|
||||
fi
|
||||
|
||||
jq -e .amount_arithmetic_inconsistencies[0] < test-audit.json > /dev/null && exit_fail "Unexpected arithmetic inconsistencies detected in ordinary run"
|
||||
jq -e .amount_arithmetic_inconsistencies[0] < test-audit-aggregation.json > /dev/null && exit_fail "Unexpected arithmetic inconsistencies from aggregations detected in ordinary run"
|
||||
jq -e .amount_arithmetic_inconsistencies[0] < test-audit-coins.json > /dev/null && exit_fail "Unexpected arithmetic inconsistencies from coins detected in ordinary run"
|
||||
jq -e .amount_arithmetic_inconsistencies[0] < test-audit-reserves.json > /dev/null && exit_fail "Unexpected arithmetic inconsistencies from reserves detected in ordinary run"
|
||||
echo PASS
|
||||
|
||||
echo -n "Checking for unexpected wire out differences "
|
||||
jq -e .wire_out_inconsistencies[0] < test-audit.json > /dev/null && exit_fail "Unexpected wire out inconsistencies detected in ordinary run"
|
||||
jq -e .wire_out_inconsistencies[0] < test-audit-aggregation.json > /dev/null && exit_fail "Unexpected wire out inconsistencies detected in ordinary run"
|
||||
echo PASS
|
||||
|
||||
# cannot easily undo aggregator, hence full reload
|
||||
@ -232,17 +284,17 @@ run_audit
|
||||
echo "Checking output"
|
||||
# if an emergency was detected, that is a bug and we should fail
|
||||
echo -n "Test for emergencies... "
|
||||
jq -e .emergencies[0] < test-audit.json > /dev/null && exit_fail "Unexpected emergency detected in ordinary run" || echo PASS
|
||||
jq -e .emergencies[0] < test-audit-coins.json > /dev/null && exit_fail "Unexpected emergency detected in ordinary run" || echo PASS
|
||||
echo -n "Test for emergencies by count... "
|
||||
jq -e .emergencies_by_count[0] < test-audit.json > /dev/null && exit_fail "Unexpected emergency by count detected in ordinary run" || echo PASS
|
||||
jq -e .emergencies_by_count[0] < test-audit-coins.json > /dev/null && exit_fail "Unexpected emergency by count detected in ordinary run" || echo PASS
|
||||
|
||||
echo -n "Test for wire inconsistencies... "
|
||||
jq -e .wire_out_amount_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected wire out inconsistency detected in ordinary run"
|
||||
jq -e .reserve_in_amount_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected reserve in inconsistency detected in ordinary run"
|
||||
jq -e .missattribution_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected missattribution inconsistency detected in ordinary run"
|
||||
jq -e .row_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected row inconsistency detected in ordinary run"
|
||||
jq -e .row_minor_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected minor row inconsistency detected in ordinary run"
|
||||
jq -e .wire_format_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected wire format inconsistencies detected in ordinary run"
|
||||
jq -e .wire_out_amount_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected wire out inconsistency detected in ordinary run"
|
||||
jq -e .reserve_in_amount_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected reserve in inconsistency detected in ordinary run"
|
||||
jq -e .missattribution_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected missattribution inconsistency detected in ordinary run"
|
||||
jq -e .row_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected row inconsistency detected in ordinary run"
|
||||
jq -e .row_minor_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected minor row inconsistency detected in ordinary run"
|
||||
jq -e .wire_format_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected wire format inconsistencies detected in ordinary run"
|
||||
|
||||
# TODO: check operation balances are correct (once we have all transaction types and wallet is deterministic)
|
||||
# TODO: check revenue summaries are correct (once we have all transaction types and wallet is deterministic)
|
||||
@ -258,9 +310,9 @@ echo -n "Check for lag detection... "
|
||||
# taler-helper-auditor-wire.c)
|
||||
if [ $DATABASE_AGE -gt 3600 ]
|
||||
then
|
||||
jq -e .lag_details[0] < test-wire-audit.json > /dev/null || exit_fail "Lag not detected in run without aggregator at age $DELTA"
|
||||
jq -e .lag_details[0] < test-audit-wire.json > /dev/null || exit_fail "Lag not detected in run without aggregator at age $DELTA"
|
||||
|
||||
LAG=`jq -r .total_amount_lag < test-wire-audit.json`
|
||||
LAG=`jq -r .total_amount_lag < test-audit-wire.json`
|
||||
if test $LAG = "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Expected total lag to be non-zero"
|
||||
@ -272,27 +324,27 @@ fi
|
||||
|
||||
|
||||
echo -n "Test for wire amounts... "
|
||||
WIRED=`jq -r .total_wire_in_delta_plus < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_wire_in_delta_plus < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Expected total wire delta plus wrong, got $WIRED"
|
||||
fi
|
||||
WIRED=`jq -r .total_wire_in_delta_minus < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_wire_in_delta_minus < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Expected total wire delta minus wrong, got $WIRED"
|
||||
fi
|
||||
WIRED=`jq -r .total_wire_out_delta_plus < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_wire_out_delta_plus < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Expected total wire delta plus wrong, got $WIRED"
|
||||
fi
|
||||
WIRED=`jq -r .total_wire_out_delta_minus < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_wire_out_delta_minus < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Expected total wire delta minus wrong, got $WIRED"
|
||||
fi
|
||||
WIRED=`jq -r .total_missattribution_in < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_missattribution_in < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Expected total missattribution in wrong, got $WIRED"
|
||||
@ -311,28 +363,28 @@ echo "UPDATE reserves_in SET credit_val=5 WHERE reserve_in_serial_id=1" | psql -
|
||||
run_audit
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
ROW=`jq .reserve_in_amount_inconsistencies[0].row < test-wire-audit.json`
|
||||
ROW=`jq .reserve_in_amount_inconsistencies[0].row < test-audit-wire.json`
|
||||
if test $ROW != 1
|
||||
then
|
||||
exit_fail "Row wrong"
|
||||
fi
|
||||
WIRED=`jq -r .reserve_in_amount_inconsistencies[0].amount_wired < test-wire-audit.json`
|
||||
WIRED=`jq -r .reserve_in_amount_inconsistencies[0].amount_wired < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:10"
|
||||
then
|
||||
exit_fail "Amount wrong"
|
||||
fi
|
||||
EXPECTED=`jq -r .reserve_in_amount_inconsistencies[0].amount_exchange_expected < test-wire-audit.json`
|
||||
EXPECTED=`jq -r .reserve_in_amount_inconsistencies[0].amount_exchange_expected < test-audit-wire.json`
|
||||
if test $EXPECTED != "TESTKUDOS:5"
|
||||
then
|
||||
exit_fail "Expected amount wrong"
|
||||
fi
|
||||
|
||||
WIRED=`jq -r .total_wire_in_delta_minus < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_wire_in_delta_minus < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong total wire_in_delta_minus, got $WIRED"
|
||||
fi
|
||||
DELTA=`jq -r .total_wire_in_delta_plus < test-wire-audit.json`
|
||||
DELTA=`jq -r .total_wire_in_delta_plus < test-audit-wire.json`
|
||||
if test $DELTA != "TESTKUDOS:5"
|
||||
then
|
||||
exit_fail "Expected total wire delta plus wrong, got $DELTA"
|
||||
@ -354,49 +406,49 @@ echo "UPDATE reserves_in SET credit_val=15 WHERE reserve_in_serial_id=1" | psql
|
||||
|
||||
run_audit
|
||||
|
||||
EXPECTED=`jq -r .reserve_balance_summary_wrong_inconsistencies[0].auditor < test-audit.json`
|
||||
EXPECTED=`jq -r .reserve_balance_summary_wrong_inconsistencies[0].auditor < test-audit-reserves.json`
|
||||
if test $EXPECTED != "TESTKUDOS:5.01"
|
||||
then
|
||||
exit_fail "Expected reserve balance summary amount wrong, got $EXPECTED (auditor)"
|
||||
fi
|
||||
|
||||
EXPECTED=`jq -r .reserve_balance_summary_wrong_inconsistencies[0].exchange < test-audit.json`
|
||||
EXPECTED=`jq -r .reserve_balance_summary_wrong_inconsistencies[0].exchange < test-audit-reserves.json`
|
||||
if test $EXPECTED != "TESTKUDOS:0.01"
|
||||
then
|
||||
exit_fail "Expected reserve balance summary amount wrong, got $EXPECTED (exchange)"
|
||||
fi
|
||||
|
||||
WIRED=`jq -r .total_loss_balance_insufficient < test-audit.json`
|
||||
WIRED=`jq -r .total_loss_balance_insufficient < test-audit-reserves.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong total loss from insufficient balance, got $WIRED"
|
||||
fi
|
||||
|
||||
ROW=`jq -e .reserve_in_amount_inconsistencies[0].row < test-wire-audit.json`
|
||||
ROW=`jq -e .reserve_in_amount_inconsistencies[0].row < test-audit-wire.json`
|
||||
if test $ROW != 1
|
||||
then
|
||||
exit_fail "Row wrong, got $ROW"
|
||||
fi
|
||||
|
||||
WIRED=`jq -r .reserve_in_amount_inconsistencies[0].amount_exchange_expected < test-wire-audit.json`
|
||||
WIRED=`jq -r .reserve_in_amount_inconsistencies[0].amount_exchange_expected < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:15"
|
||||
then
|
||||
exit_fail "Wrong amount_exchange_expected, got $WIRED"
|
||||
fi
|
||||
|
||||
WIRED=`jq -r .reserve_in_amount_inconsistencies[0].amount_wired < test-wire-audit.json`
|
||||
WIRED=`jq -r .reserve_in_amount_inconsistencies[0].amount_wired < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:10"
|
||||
then
|
||||
exit_fail "Wrong amount_wired, got $WIRED"
|
||||
fi
|
||||
|
||||
WIRED=`jq -r .total_wire_in_delta_minus < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_wire_in_delta_minus < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:5"
|
||||
then
|
||||
exit_fail "Wrong total wire_in_delta_minus, got $WIRED"
|
||||
fi
|
||||
|
||||
WIRED=`jq -r .total_wire_in_delta_plus < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_wire_in_delta_plus < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong total wire_in_delta_plus, got $WIRED"
|
||||
@ -422,27 +474,27 @@ run_audit
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
|
||||
jq -e .bad_sig_losses[0] < test-audit.json > /dev/null || exit_fail "Bad signature not detected"
|
||||
jq -e .bad_sig_losses[0] < test-audit-coins.json > /dev/null || exit_fail "Bad signature not detected"
|
||||
|
||||
ROW=`jq -e .bad_sig_losses[0].row < test-audit.json`
|
||||
ROW=`jq -e .bad_sig_losses[0].row < test-audit-coins.json`
|
||||
if test $ROW != ${SERIAL}
|
||||
then
|
||||
exit_fail "Row wrong, got $ROW"
|
||||
fi
|
||||
|
||||
LOSS=`jq -r .bad_sig_losses[0].loss < test-audit.json`
|
||||
LOSS=`jq -r .bad_sig_losses[0].loss < test-audit-coins.json`
|
||||
if test $LOSS != "TESTKUDOS:3"
|
||||
then
|
||||
exit_fail "Wrong deposit bad signature loss, got $LOSS"
|
||||
fi
|
||||
|
||||
OP=`jq -r .bad_sig_losses[0].operation < test-audit.json`
|
||||
OP=`jq -r .bad_sig_losses[0].operation < test-audit-coins.json`
|
||||
if test $OP != "deposit"
|
||||
then
|
||||
exit_fail "Wrong operation, got $OP"
|
||||
fi
|
||||
|
||||
LOSS=`jq -r .total_bad_sig_loss < test-audit.json`
|
||||
LOSS=`jq -r .total_bad_sig_loss < test-audit-coins.json`
|
||||
if test $LOSS != "TESTKUDOS:3"
|
||||
then
|
||||
exit_fail "Wrong total bad sig loss, got $LOSS"
|
||||
@ -468,25 +520,25 @@ echo "UPDATE deposits SET h_contract_terms='\x12bb676444955c98789f219148aa31899d
|
||||
run_audit
|
||||
|
||||
echo -n "Checking bad signature detection... "
|
||||
ROW=`jq -e .bad_sig_losses[0].row < test-audit.json`
|
||||
ROW=`jq -e .bad_sig_losses[0].row < test-audit-coins.json`
|
||||
if test $ROW != $SERIAL
|
||||
then
|
||||
exit_fail "Row wrong, got $ROW"
|
||||
fi
|
||||
|
||||
LOSS=`jq -r .bad_sig_losses[0].loss < test-audit.json`
|
||||
LOSS=`jq -r .bad_sig_losses[0].loss < test-audit-coins.json`
|
||||
if test $LOSS != "TESTKUDOS:3"
|
||||
then
|
||||
exit_fail "Wrong deposit bad signature loss, got $LOSS"
|
||||
fi
|
||||
|
||||
OP=`jq -r .bad_sig_losses[0].operation < test-audit.json`
|
||||
OP=`jq -r .bad_sig_losses[0].operation < test-audit-coins.json`
|
||||
if test $OP != "deposit"
|
||||
then
|
||||
exit_fail "Wrong operation, got $OP"
|
||||
fi
|
||||
|
||||
LOSS=`jq -r .total_bad_sig_loss < test-audit.json`
|
||||
LOSS=`jq -r .total_bad_sig_loss < test-audit-coins.json`
|
||||
if test $LOSS != "TESTKUDOS:3"
|
||||
then
|
||||
exit_fail "Wrong total bad sig loss, got $LOSS"
|
||||
@ -510,25 +562,25 @@ echo "UPDATE known_coins SET denom_sig='\x287369672d76616c200a2028727361200a2020
|
||||
|
||||
run_audit
|
||||
|
||||
ROW=`jq -e .bad_sig_losses[0].row < test-audit.json`
|
||||
ROW=`jq -e .bad_sig_losses[0].row < test-audit-coins.json`
|
||||
if test $ROW != "-1"
|
||||
then
|
||||
exit_fail "Row wrong, got $ROW"
|
||||
fi
|
||||
|
||||
LOSS=`jq -r .bad_sig_losses[0].loss < test-audit.json`
|
||||
LOSS=`jq -r .bad_sig_losses[0].loss < test-audit-coins.json`
|
||||
if test $LOSS == "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong deposit bad signature loss, got $LOSS"
|
||||
fi
|
||||
|
||||
OP=`jq -r .bad_sig_losses[0].operation < test-audit.json`
|
||||
OP=`jq -r .bad_sig_losses[0].operation < test-audit-coins.json`
|
||||
if test $OP != "known-coin"
|
||||
then
|
||||
exit_fail "Wrong operation, got $OP"
|
||||
fi
|
||||
|
||||
LOSS=`jq -r .total_bad_sig_loss < test-audit.json`
|
||||
LOSS=`jq -r .total_bad_sig_loss < test-audit-coins.json`
|
||||
if test $LOSS == "TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Wrong total bad sig loss, got $LOSS"
|
||||
@ -555,14 +607,14 @@ echo "UPDATE reserves_out SET reserve_sig='\x9ef381a84aff252646a157d88eded50f708
|
||||
|
||||
run_audit
|
||||
|
||||
OP=`jq -r .bad_sig_losses[0].operation < test-audit.json`
|
||||
OP=`jq -r .bad_sig_losses[0].operation < test-audit-reserves.json`
|
||||
if test $OP != "withdraw"
|
||||
then
|
||||
exit_fail "Wrong operation, got $OP"
|
||||
fi
|
||||
|
||||
LOSS=`jq -r .bad_sig_losses[0].loss < test-audit.json`
|
||||
LOSS_TOTAL=`jq -r .total_bad_sig_loss < test-audit.json`
|
||||
LOSS=`jq -r .bad_sig_losses[0].loss < test-audit-reserves.json`
|
||||
LOSS_TOTAL=`jq -r .total_bad_sig_loss < test-audit-reserves.json`
|
||||
if test $LOSS != $LOSS_TOTAL
|
||||
then
|
||||
exit_fail "Expected loss $LOSS and total loss $LOSS_TOTAL do not match"
|
||||
@ -604,17 +656,17 @@ echo "UPDATE app_banktransaction SET subject='$NEW_WTID' WHERE id='$OLD_ID';" |
|
||||
run_audit
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
DIAG=`jq -r .reserve_in_amount_inconsistencies[0].diagnostic < test-wire-audit.json`
|
||||
DIAG=`jq -r .reserve_in_amount_inconsistencies[0].diagnostic < test-audit-wire.json`
|
||||
if test "x$DIAG" != "xwire subject does not match"
|
||||
then
|
||||
exit_fail "Diagnostic wrong: $DIAG (0)"
|
||||
fi
|
||||
WTID=`jq -r .reserve_in_amount_inconsistencies[0].reserve_pub < test-wire-audit.json`
|
||||
WTID=`jq -r .reserve_in_amount_inconsistencies[0].reserve_pub < test-audit-wire.json`
|
||||
if test x$WTID != x"$OLD_WTID" -a x$WTID != x"$NEW_WTID"
|
||||
then
|
||||
exit_fail "WTID reported wrong: $WTID"
|
||||
fi
|
||||
EX_A=`jq -r .reserve_in_amount_inconsistencies[0].amount_exchange_expected < test-wire-audit.json`
|
||||
EX_A=`jq -r .reserve_in_amount_inconsistencies[0].amount_exchange_expected < test-audit-wire.json`
|
||||
if test x$WTID = x$OLD_WTID -a x$EX_A != x"TESTKUDOS:10"
|
||||
then
|
||||
exit_fail "Amount reported wrong: $EX_A"
|
||||
@ -623,17 +675,17 @@ if test x$WTID = x$NEW_WTID -a x$EX_A != x"TESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Amount reported wrong: $EX_A"
|
||||
fi
|
||||
DIAG=`jq -r .reserve_in_amount_inconsistencies[1].diagnostic < test-wire-audit.json`
|
||||
DIAG=`jq -r .reserve_in_amount_inconsistencies[1].diagnostic < test-audit-wire.json`
|
||||
if test "x$DIAG" != "xwire subject does not match"
|
||||
then
|
||||
exit_fail "Diagnostic wrong: $DIAG (1)"
|
||||
fi
|
||||
WTID=`jq -r .reserve_in_amount_inconsistencies[1].reserve_pub < test-wire-audit.json`
|
||||
WTID=`jq -r .reserve_in_amount_inconsistencies[1].reserve_pub < test-audit-wire.json`
|
||||
if test $WTID != "$OLD_WTID" -a $WTID != "$NEW_WTID"
|
||||
then
|
||||
exit_fail "WTID reported wrong: $WTID (wanted: $NEW_WTID or $OLD_WTID)"
|
||||
fi
|
||||
EX_A=`jq -r .reserve_in_amount_inconsistencies[1].amount_exchange_expected < test-wire-audit.json`
|
||||
EX_A=`jq -r .reserve_in_amount_inconsistencies[1].amount_exchange_expected < test-audit-wire.json`
|
||||
if test $WTID = "$OLD_WTID" -a $EX_A != "TESTKUDOS:10"
|
||||
then
|
||||
exit_fail "Amount reported wrong: $EX_A"
|
||||
@ -643,12 +695,12 @@ then
|
||||
exit_fail "Amount reported wrong: $EX_A"
|
||||
fi
|
||||
|
||||
WIRED=`jq -r .total_wire_in_delta_minus < test-wire-audit.json`
|
||||
WIRED=`jq -r .total_wire_in_delta_minus < test-audit-wire.json`
|
||||
if test $WIRED != "TESTKUDOS:10"
|
||||
then
|
||||
exit_fail "Wrong total wire_in_delta_minus, got $WIRED"
|
||||
fi
|
||||
DELTA=`jq -r .total_wire_in_delta_plus < test-wire-audit.json`
|
||||
DELTA=`jq -r .total_wire_in_delta_plus < test-audit-wire.json`
|
||||
if test $DELTA != "TESTKUDOS:10"
|
||||
then
|
||||
exit_fail "Expected total wire delta plus wrong, got $DELTA"
|
||||
@ -673,12 +725,12 @@ echo "UPDATE app_banktransaction SET debit_account_id=1 WHERE id='$OLD_ID';" | p
|
||||
run_audit
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
AMOUNT=`jq -r .missattribution_in_inconsistencies[0].amount < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .missattribution_in_inconsistencies[0].amount < test-audit-wire.json`
|
||||
if test "x$AMOUNT" != "xTESTKUDOS:10"
|
||||
then
|
||||
exit_fail "Reported amount wrong: $AMOUNT"
|
||||
fi
|
||||
AMOUNT=`jq -r .total_missattribution_in < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .total_missattribution_in < test-audit-wire.json`
|
||||
if test "x$AMOUNT" != "xTESTKUDOS:10"
|
||||
then
|
||||
exit_fail "Reported total amount wrong: $AMOUNT"
|
||||
@ -702,12 +754,12 @@ echo "UPDATE app_banktransaction SET date=NOW() WHERE id=$OLD_ID;" | psql -Aqt $
|
||||
run_audit
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
DIAG=`jq -r .row_minor_inconsistencies[0].diagnostic < test-wire-audit.json`
|
||||
DIAG=`jq -r .row_minor_inconsistencies[0].diagnostic < test-audit-wire.json`
|
||||
if test "x$DIAG" != "xexecution date mismatch"
|
||||
then
|
||||
exit_fail "Reported diagnostic wrong: $DIAG"
|
||||
fi
|
||||
TABLE=`jq -r .row_minor_inconsistencies[0].table < test-wire-audit.json`
|
||||
TABLE=`jq -r .row_minor_inconsistencies[0].table < test-audit-wire.json`
|
||||
if test "x$TABLE" != "xreserves_in"
|
||||
then
|
||||
exit_fail "Reported table wrong: $TABLE"
|
||||
@ -737,27 +789,27 @@ echo -e "UPDATE app_banktransaction SET debit_account_id=2,credit_account_id=1,s
|
||||
run_audit
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
AMOUNT=`jq -r .wire_out_amount_inconsistencies[0].amount_wired < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .wire_out_amount_inconsistencies[0].amount_wired < test-audit-wire.json`
|
||||
if test "x$AMOUNT" != "xTESTKUDOS:10"
|
||||
then
|
||||
exit_fail "Reported wired amount wrong: $AMOUNT"
|
||||
fi
|
||||
AMOUNT=`jq -r .total_wire_out_delta_plus < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .total_wire_out_delta_plus < test-audit-wire.json`
|
||||
if test "x$AMOUNT" != "xTESTKUDOS:10"
|
||||
then
|
||||
exit_fail "Reported total plus amount wrong: $AMOUNT"
|
||||
fi
|
||||
AMOUNT=`jq -r .total_wire_out_delta_minus < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .total_wire_out_delta_minus < test-audit-wire.json`
|
||||
if test "x$AMOUNT" != "xTESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Reported total minus amount wrong: $AMOUNT"
|
||||
fi
|
||||
AMOUNT=`jq -r .wire_out_amount_inconsistencies[0].amount_justified < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .wire_out_amount_inconsistencies[0].amount_justified < test-audit-wire.json`
|
||||
if test "x$AMOUNT" != "xTESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Reported justified amount wrong: $AMOUNT"
|
||||
fi
|
||||
DIAG=`jq -r .wire_out_amount_inconsistencies[0].diagnostic < test-wire-audit.json`
|
||||
DIAG=`jq -r .wire_out_amount_inconsistencies[0].diagnostic < test-audit-wire.json`
|
||||
if test "x$DIAG" != "xjustification for wire transfer not found"
|
||||
then
|
||||
exit_fail "Reported diagnostic wrong: $DIAG"
|
||||
@ -781,8 +833,8 @@ run_audit
|
||||
|
||||
echo -n "Testing hung refresh detection... "
|
||||
|
||||
HANG=`jq -er .refresh_hanging[0].amount < test-audit.json`
|
||||
TOTAL_HANG=`jq -er .total_refresh_hanging < test-audit.json`
|
||||
HANG=`jq -er .refresh_hanging[0].amount < test-audit-coins.json`
|
||||
TOTAL_HANG=`jq -er .total_refresh_hanging < test-audit-coins.json`
|
||||
if test x$HANG = TESTKUDOS:0
|
||||
then
|
||||
exit_fail "Hanging amount zero"
|
||||
@ -815,14 +867,14 @@ run_audit
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
|
||||
OP=`jq -er .bad_sig_losses[0].operation < test-audit.json`
|
||||
OP=`jq -er .bad_sig_losses[0].operation < test-audit-coins.json`
|
||||
if test x$OP != xmelt
|
||||
then
|
||||
exit_fail "Operation wrong, got $OP"
|
||||
fi
|
||||
|
||||
LOSS=`jq -er .bad_sig_losses[0].loss < test-audit.json`
|
||||
TOTAL_LOSS=`jq -er .total_bad_sig_loss < test-audit.json`
|
||||
LOSS=`jq -er .bad_sig_losses[0].loss < test-audit-coins.json`
|
||||
TOTAL_LOSS=`jq -er .total_bad_sig_loss < test-audit-coins.json`
|
||||
if test x$LOSS != x$TOTAL_LOSS
|
||||
then
|
||||
exit_fail "Loss inconsistent, got $LOSS and $TOTAL_LOSS"
|
||||
@ -861,12 +913,12 @@ then
|
||||
post_audit
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
TABLE=`jq -r .row_inconsistencies[0].table < test-audit.json`
|
||||
TABLE=`jq -r .row_inconsistencies[0].table < test-audit-aggregation.json`
|
||||
if test "x$TABLE" != "xwire-fee"
|
||||
then
|
||||
exit_fail "Reported table wrong: $TABLE"
|
||||
fi
|
||||
DIAG=`jq -r .row_inconsistencies[0].diagnostic < test-audit.json`
|
||||
DIAG=`jq -r .row_inconsistencies[0].diagnostic < test-audit-aggregation.json`
|
||||
if test "x$DIAG" != "xwire fee signature invalid at given time"
|
||||
then
|
||||
exit_fail "Reported diagnostic wrong: $DIAG"
|
||||
@ -906,7 +958,7 @@ then
|
||||
run_audit aggregator
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
TABLE=`jq -r .row_inconsistencies[0].table < test-audit.json`
|
||||
TABLE=`jq -r .row_inconsistencies[0].table < test-audit-aggregation.json`
|
||||
if test "x$TABLE" != "xaggregation" -a "x$TABLE" != "xdeposits"
|
||||
then
|
||||
exit_fail "Reported table wrong: $TABLE"
|
||||
@ -950,22 +1002,22 @@ then
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
|
||||
AMOUNT=`jq -r .wire_out_amount_inconsistencies[0].amount_justified < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .wire_out_amount_inconsistencies[0].amount_justified < test-audit-wire.json`
|
||||
if test "x$AMOUNT" != "x$OLD_AMOUNT"
|
||||
then
|
||||
exit_fail "Reported justified amount wrong: $AMOUNT"
|
||||
fi
|
||||
AMOUNT=`jq -r .wire_out_amount_inconsistencies[0].amount_wired < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .wire_out_amount_inconsistencies[0].amount_wired < test-audit-wire.json`
|
||||
if test "x$AMOUNT" != "x$NEW_AMOUNT"
|
||||
then
|
||||
exit_fail "Reported wired amount wrong: $AMOUNT"
|
||||
fi
|
||||
TOTAL_AMOUNT=`jq -r .total_wire_out_delta_minus < test-wire-audit.json`
|
||||
TOTAL_AMOUNT=`jq -r .total_wire_out_delta_minus < test-audit-wire.json`
|
||||
if test "x$TOTAL_AMOUNT" != "xTESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Reported total wired amount minus wrong: $TOTAL_AMOUNT"
|
||||
fi
|
||||
TOTAL_AMOUNT=`jq -r .total_wire_out_delta_plus < test-wire-audit.json`
|
||||
TOTAL_AMOUNT=`jq -r .total_wire_out_delta_plus < test-audit-wire.json`
|
||||
if test "x$TOTAL_AMOUNT" = "xTESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Reported total wired amount plus wrong: $TOTAL_AMOUNT"
|
||||
@ -980,22 +1032,22 @@ then
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
|
||||
AMOUNT=`jq -r .wire_out_amount_inconsistencies[0].amount_justified < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .wire_out_amount_inconsistencies[0].amount_justified < test-audit-wire.json`
|
||||
if test "x$AMOUNT" != "x$OLD_AMOUNT"
|
||||
then
|
||||
exit_fail "Reported justified amount wrong: $AMOUNT"
|
||||
fi
|
||||
AMOUNT=`jq -r .wire_out_amount_inconsistencies[0].amount_wired < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .wire_out_amount_inconsistencies[0].amount_wired < test-audit-wire.json`
|
||||
if test "x$AMOUNT" != "x$NEW_AMOUNT"
|
||||
then
|
||||
exit_fail "Reported wired amount wrong: $AMOUNT"
|
||||
fi
|
||||
TOTAL_AMOUNT=`jq -r .total_wire_out_delta_minus < test-wire-audit.json`
|
||||
TOTAL_AMOUNT=`jq -r .total_wire_out_delta_minus < test-audit-wire.json`
|
||||
if test "x$TOTAL_AMOUNT" != "x$OLD_AMOUNT"
|
||||
then
|
||||
exit_fail "Reported total wired amount minus wrong: $TOTAL_AMOUNT (wanted $OLD_AMOUNT)"
|
||||
fi
|
||||
TOTAL_AMOUNT=`jq -r .total_wire_out_delta_plus < test-wire-audit.json`
|
||||
TOTAL_AMOUNT=`jq -r .total_wire_out_delta_plus < test-audit-wire.json`
|
||||
if test "x$TOTAL_AMOUNT" != "xTESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Reported total wired amount plus wrong: $TOTAL_AMOUNT"
|
||||
@ -1044,12 +1096,12 @@ then
|
||||
post_audit
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
TABLE=`jq -r .row_minor_inconsistencies[0].table < test-wire-audit.json`
|
||||
TABLE=`jq -r .row_minor_inconsistencies[0].table < test-audit-wire.json`
|
||||
if test "x$TABLE" != "xwire_out"
|
||||
then
|
||||
exit_fail "Reported table wrong: $TABLE"
|
||||
fi
|
||||
DIAG=`jq -r .row_minor_inconsistencies[0].diagnostic < test-wire-audit.json`
|
||||
DIAG=`jq -r .row_minor_inconsistencies[0].diagnostic < test-audit-wire.json`
|
||||
DIAG=`echo "$DIAG" | awk '{print $1 " " $2 " " $3}'`
|
||||
if test "x$DIAG" != "xexecution date mismatch"
|
||||
then
|
||||
@ -1079,22 +1131,22 @@ run_audit
|
||||
|
||||
echo -n "Testing emergency detection... "
|
||||
|
||||
jq -e .reserve_balance_summary_wrong_inconsistencies[0] < test-audit.json > /dev/null || exit_fail "Reserve balance inconsistency not detected"
|
||||
jq -e .reserve_balance_summary_wrong_inconsistencies[0] < test-audit-reserves.json > /dev/null || exit_fail "Reserve balance inconsistency not detected"
|
||||
|
||||
jq -e .emergencies[0] < test-audit.json > /dev/null || exit_fail "Emergency not detected"
|
||||
jq -e .emergencies_by_count[0] < test-audit.json > /dev/null || exit_fail "Emergency by count not detected"
|
||||
jq -e .amount_arithmetic_inconsistencies[0] < test-audit.json > /dev/null || exit_fail "Escrow balance calculation impossibility not detected"
|
||||
jq -e .emergencies[0] < test-audit-coins.json > /dev/null || exit_fail "Emergency not detected"
|
||||
jq -e .emergencies_by_count[0] < test-audit-coins.json > /dev/null || exit_fail "Emergency by count not detected"
|
||||
jq -e .amount_arithmetic_inconsistencies[0] < test-audit-coins.json > /dev/null || exit_fail "Escrow balance calculation impossibility not detected"
|
||||
|
||||
echo PASS
|
||||
|
||||
echo -n "Testing loss calculation... "
|
||||
|
||||
AMOUNT=`jq -r .emergencies_loss < test-audit.json`
|
||||
AMOUNT=`jq -r .emergencies_loss < test-audit-coins.json`
|
||||
if test "x$AMOUNT" == "xTESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Reported amount wrong: $AMOUNT"
|
||||
fi
|
||||
AMOUNT=`jq -r .emergencies_loss_by_count < test-audit.json`
|
||||
AMOUNT=`jq -r .emergencies_loss_by_count < test-audit-coins.json`
|
||||
if test "x$AMOUNT" == "xTESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Reported amount wrong: $AMOUNT"
|
||||
@ -1135,12 +1187,12 @@ then
|
||||
|
||||
echo -n "Testing reserve closure was done correctly... "
|
||||
|
||||
jq -e .reserve_not_closed_inconsistencies[0] < test-audit.json > /dev/null && exit_fail "Unexpected reserve not closed inconsistency detected"
|
||||
jq -e .reserve_not_closed_inconsistencies[0] < test-audit-reserves.json > /dev/null && exit_fail "Unexpected reserve not closed inconsistency detected"
|
||||
|
||||
echo "PASS"
|
||||
|
||||
echo -n "Testing no bogus transfers detected... "
|
||||
jq -e .wire_out_amount_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail "Unexpected wire out inconsistency detected in run with reserve closure"
|
||||
jq -e .wire_out_amount_inconsistencies[0] < test-audit-wire.json > /dev/null && exit_fail "Unexpected wire out inconsistency detected in run with reserve closure"
|
||||
|
||||
echo "PASS"
|
||||
|
||||
@ -1169,10 +1221,10 @@ echo "UPDATE reserves SET current_balance_val=100+current_balance_val WHERE rese
|
||||
run_audit
|
||||
|
||||
echo -n "Testing reserve closure missing detected... "
|
||||
jq -e .reserve_not_closed_inconsistencies[0] < test-audit.json > /dev/null || exit_fail "Reserve not closed inconsistency not detected"
|
||||
jq -e .reserve_not_closed_inconsistencies[0] < test-audit-reserves.json > /dev/null || exit_fail "Reserve not closed inconsistency not detected"
|
||||
echo "PASS"
|
||||
|
||||
AMOUNT=`jq -r .total_balance_reserve_not_closed < test-audit.json`
|
||||
AMOUNT=`jq -r .total_balance_reserve_not_closed < test-audit-reserves.json`
|
||||
if test "x$AMOUNT" == "xTESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Reported total amount wrong: $AMOUNT"
|
||||
@ -1220,14 +1272,14 @@ then
|
||||
|
||||
echo -n "Testing lack of reserve closure transaction detected... "
|
||||
|
||||
jq -e .reserve_lag_details[0] < test-wire-audit.json > /dev/null || exit_fail "Reserve closure lag not detected"
|
||||
jq -e .reserve_lag_details[0] < test-audit-wire.json > /dev/null || exit_fail "Reserve closure lag not detected"
|
||||
|
||||
AMOUNT=`jq -r .reserve_lag_details[0].amount < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .reserve_lag_details[0].amount < test-audit-wire.json`
|
||||
if test "x$AMOUNT" != "xTESTKUDOS:${VAL_DELTA}"
|
||||
then
|
||||
exit_fail "Reported total amount wrong: $AMOUNT"
|
||||
fi
|
||||
AMOUNT=`jq -r .total_closure_amount_lag < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .total_closure_amount_lag < test-audit-wire.json`
|
||||
if test "x$AMOUNT" != "xTESTKUDOS:${VAL_DELTA}"
|
||||
then
|
||||
exit_fail "Reported total amount wrong: $AMOUNT"
|
||||
@ -1260,7 +1312,7 @@ echo "UPDATE auditor_denominations SET expire_withdraw=${NEW_WEXP} WHERE denom_p
|
||||
run_audit
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
jq -e .denomination_key_validity_withdraw_inconsistencies[0] < test-audit.json > /dev/null || exit_fail "Denomination key withdraw inconsistency not detected"
|
||||
jq -e .denomination_key_validity_withdraw_inconsistencies[0] < test-audit-reserves.json > /dev/null || exit_fail "Denomination key withdraw inconsistency not detected"
|
||||
|
||||
echo PASS
|
||||
|
||||
@ -1295,19 +1347,19 @@ then
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
|
||||
jq -e .wire_out_inconsistencies[0] < test-audit.json > /dev/null || exit_fail "Wire out inconsistency not detected"
|
||||
jq -e .wire_out_inconsistencies[0] < test-audit-aggregation.json > /dev/null || exit_fail "Wire out inconsistency not detected"
|
||||
|
||||
ROW=`jq .wire_out_inconsistencies[0].rowid < test-audit.json`
|
||||
ROW=`jq .wire_out_inconsistencies[0].rowid < test-audit-aggregation.json`
|
||||
if test $ROW != 1
|
||||
then
|
||||
exit_fail "Row wrong"
|
||||
fi
|
||||
AMOUNT=`jq -r .total_wire_out_delta_plus < test-audit.json`
|
||||
AMOUNT=`jq -r .total_wire_out_delta_plus < test-audit-aggregation.json`
|
||||
if test "x$AMOUNT" != "xTESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Reported amount wrong: $AMOUNT"
|
||||
fi
|
||||
AMOUNT=`jq -r .total_wire_out_delta_minus < test-audit.json`
|
||||
AMOUNT=`jq -r .total_wire_out_delta_minus < test-audit-aggregation.json`
|
||||
if test "x$AMOUNT" != "xTESTKUDOS:0.01"
|
||||
then
|
||||
exit_fail "Reported total amount wrong: $AMOUNT"
|
||||
@ -1324,19 +1376,19 @@ then
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
|
||||
jq -e .wire_out_inconsistencies[0] < test-audit.json > /dev/null || exit_fail "Wire out inconsistency not detected"
|
||||
jq -e .wire_out_inconsistencies[0] < test-audit-aggregation.json > /dev/null || exit_fail "Wire out inconsistency not detected"
|
||||
|
||||
ROW=`jq .wire_out_inconsistencies[0].rowid < test-audit.json`
|
||||
ROW=`jq .wire_out_inconsistencies[0].rowid < test-audit-aggregation.json`
|
||||
if test $ROW != 1
|
||||
then
|
||||
exit_fail "Row wrong"
|
||||
fi
|
||||
AMOUNT=`jq -r .total_wire_out_delta_minus < test-audit.json`
|
||||
AMOUNT=`jq -r .total_wire_out_delta_minus < test-audit-aggregation.json`
|
||||
if test "x$AMOUNT" != "xTESTKUDOS:0"
|
||||
then
|
||||
exit_fail "Reported amount wrong: $AMOUNT"
|
||||
fi
|
||||
AMOUNT=`jq -r .total_wire_out_delta_plus < test-audit.json`
|
||||
AMOUNT=`jq -r .total_wire_out_delta_plus < test-audit-aggregation.json`
|
||||
if test "x$AMOUNT" != "xTESTKUDOS:0.01"
|
||||
then
|
||||
exit_fail "Reported total amount wrong: $AMOUNT"
|
||||
@ -1370,14 +1422,14 @@ else
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
|
||||
jq -e .deposit_confirmation_inconsistencies[0] < test-audit.json > /dev/null || exit_fail "Deposit confirmation inconsistency NOT detected"
|
||||
jq -e .deposit_confirmation_inconsistencies[0] < test-audit-deposits.json > /dev/null || exit_fail "Deposit confirmation inconsistency NOT detected"
|
||||
|
||||
AMOUNT=`jq -er .missing_deposit_confirmation_total < test-audit.json`
|
||||
AMOUNT=`jq -er .missing_deposit_confirmation_total < test-audit-deposits.json`
|
||||
if test x$AMOUNT = xTESTKUDOS:0
|
||||
then
|
||||
exit_fail "Expected non-zero total missing deposit confirmation amount"
|
||||
fi
|
||||
COUNT=`jq -er .missing_deposit_confirmation_count < test-audit.json`
|
||||
COUNT=`jq -er .missing_deposit_confirmation_count < test-audit-deposits.json`
|
||||
if test x$AMOUNT = x0
|
||||
then
|
||||
exit_fail "Expected non-zero total missing deposit confirmation count"
|
||||
@ -1411,22 +1463,22 @@ then
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
|
||||
jq -e .coin_inconsistencies[0] < test-audit.json > /dev/null || exit_fail "Coin inconsistency NOT detected"
|
||||
jq -e .coin_inconsistencies[0] < test-audit-aggregation.json > /dev/null || exit_fail "Coin inconsistency NOT detected"
|
||||
|
||||
jq -e .row_inconsistencies[0] < test-audit.json > /dev/null || exit_fail "Coin history verification failure NOT reported"
|
||||
jq -e .row_inconsistencies[0] < test-audit-aggregation.json > /dev/null || exit_fail "Coin history verification failure NOT reported"
|
||||
|
||||
# Note: if the wallet withdrew much more than it spent, this might indeed
|
||||
# go legitimately unnoticed.
|
||||
jq -e .emergencies[0] < test-audit.json > /dev/null || exit_fail "Denomination value emergency NOT reported"
|
||||
jq -e .emergencies[0] < test-audit-coins.json > /dev/null || exit_fail "Denomination value emergency NOT reported"
|
||||
|
||||
AMOUNT=`jq -er .total_coin_delta_minus < test-audit.json`
|
||||
AMOUNT=`jq -er .total_coin_delta_minus < test-audit-aggregation.json`
|
||||
if test x$AMOUNT = xTESTKUDOS:0
|
||||
then
|
||||
exit_fail "Expected non-zero total inconsistency amount from coins"
|
||||
fi
|
||||
# Note: if the wallet withdrew much more than it spent, this might indeed
|
||||
# go legitimately unnoticed.
|
||||
COUNT=`jq -er .emergencies_risk_by_amount < test-audit.json`
|
||||
COUNT=`jq -er .emergencies_risk_by_amount < test-audit-coins.json`
|
||||
if test x$AMOUNT = xTESTKUDOS:0
|
||||
then
|
||||
exit_fail "Expected non-zero emergency-by-amount"
|
||||
@ -1453,27 +1505,27 @@ run_audit
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
|
||||
jq -e .bad_sig_losses[0] < test-audit.json > /dev/null || exit_fail "Bad signature not detected"
|
||||
jq -e .bad_sig_losses[0] < test-audit-coins.json > /dev/null || exit_fail "Bad signature not detected"
|
||||
|
||||
ROW=`jq -e .bad_sig_losses[0].row < test-audit.json`
|
||||
ROW=`jq -e .bad_sig_losses[0].row < test-audit-coins.json`
|
||||
if test $ROW != ${SERIAL}
|
||||
then
|
||||
exit_fail "Row wrong, got $ROW"
|
||||
fi
|
||||
|
||||
LOSS=`jq -r .bad_sig_losses[0].loss < test-audit.json`
|
||||
LOSS=`jq -r .bad_sig_losses[0].loss < test-audit-coins.json`
|
||||
if test $LOSS != "TESTKUDOS:3"
|
||||
then
|
||||
exit_fail "Wrong deposit bad signature loss, got $LOSS"
|
||||
fi
|
||||
|
||||
OP=`jq -r .bad_sig_losses[0].operation < test-audit.json`
|
||||
OP=`jq -r .bad_sig_losses[0].operation < test-audit-coins.json`
|
||||
if test $OP != "deposit"
|
||||
then
|
||||
exit_fail "Wrong operation, got $OP"
|
||||
fi
|
||||
|
||||
LOSS=`jq -r .total_bad_sig_loss < test-audit.json`
|
||||
LOSS=`jq -r .total_bad_sig_loss < test-audit-coins.json`
|
||||
if test $LOSS != "TESTKUDOS:3"
|
||||
then
|
||||
exit_fail "Wrong total bad sig loss, got $LOSS"
|
||||
@ -1509,13 +1561,13 @@ then
|
||||
|
||||
echo -n "Testing inconsistency detection... "
|
||||
|
||||
AMOUNT=`jq -r .wire_format_inconsistencies[0].amount < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .wire_format_inconsistencies[0].amount < test-audit-wire.json`
|
||||
if test "${AMOUNT}" != "TESTKUDOS:1"
|
||||
then
|
||||
exit_fail "Amount wrong, got ${AMOUNT}"
|
||||
fi
|
||||
|
||||
AMOUNT=`jq -r .total_wire_format_amount < test-wire-audit.json`
|
||||
AMOUNT=`jq -r .total_wire_format_amount < test-audit-wire.json`
|
||||
if test "${AMOUNT}" != "TESTKUDOS:1"
|
||||
then
|
||||
exit_fail "Wrong total wire format amount, got $AMOUNT"
|
||||
|
Loading…
Reference in New Issue
Block a user