From 4cfcf842fe6bdd0535cdc64683d3eb79e74bbceb Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 12 Jul 2020 19:19:13 +0200 Subject: [PATCH] add reserve state machine --- doc/system/taler/design.tex | 18 ++++++++++++++++-- doc/system/taler/reserve.dot | 14 ++++++++++++++ doc/system/taler/reserve.pdf | Bin 0 -> 14395 bytes 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 doc/system/taler/reserve.dot create mode 100644 doc/system/taler/reserve.pdf diff --git a/doc/system/taler/design.tex b/doc/system/taler/design.tex index 36d167742..ff43376a9 100644 --- a/doc/system/taler/design.tex +++ b/doc/system/taler/design.tex @@ -125,8 +125,8 @@ payment. % FIXME: who needs to be trusted for anonymity? - \subsection{Reserves} + A \emph{reserve} refers to a customer's non-anonymous funds at an exchange, identified by a reserve public key. Suppose a customer wants to convert money into anonymized digital coins. To do that, the customer first creates a @@ -149,7 +149,20 @@ customers that lost their reserve private key to eventually recover their funds. If a wire transfer to the exchange does not include a valid reserve public key, the exchange transfers the money back to the sender. -% FIXME: this really needs a diagram +Figure~\ref{fig:reserve:state} illustrates the state machine for a reserve. +Long-terms states are shown in boxes, while actions are in circles. The +final state is in a double-circle. +A reserve is first {\em filled} by a wire transfer. The amount in it is reduced +by withdraw operations. If the balance reaches zero, the reserve is +{\em drained}. If a reserve is not drained after a certain amount of time, +it is automatically closed. A reserve can also be filled via a recoup +action in case that the denomination of an unspent coin that was +withdrawn from the reserve is revoked. +\begin{figure} + \includegraphics{reserve.pdf} + \caption{State machine of a reserve.} + \label{fig:reserve:states} +\end{figure} Instead of requiring the customer to manually generate reserve key pairs and copy them onto a wire transfer form, banks can offer tight integration with the @@ -187,6 +200,7 @@ for acceptance as an IETF Internet Standard. % FIXME: withdrawal strategy, coin selection \subsection{Coins and Denominations} + Unlike plain Chaumian e-cash, where a coin just contains a serial number, a \emph{coin} in Taler is a public/private key pair where the private key is only known to the owner of the coin. diff --git a/doc/system/taler/reserve.dot b/doc/system/taler/reserve.dot new file mode 100644 index 000000000..af6e3e86d --- /dev/null +++ b/doc/system/taler/reserve.dot @@ -0,0 +1,14 @@ +digraph Reserve { + + filled [color=blue, label="filled reserve", shape="box"]; + drained [color=blue, label="drained reserve", shape="doublecircle"]; + + transfer->filled; + recoup->filled; + filled->withdraw; + withdraw->drained; + withdraw->filled; + filled->close; + close->drained; + drained->recoup; +} diff --git a/doc/system/taler/reserve.pdf b/doc/system/taler/reserve.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5225bdedb7e51d91123c66355ff78b1e3307c850 GIT binary patch literal 14395 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