commit 32351ad02d4f24b013690e798c2919cdea019a5c parent fd64eaa526d40d399a5f751eab46b328da5cf8b8 Author: Christian Grothoff <christian@grothoff.org> Date: Wed, 23 Nov 2022 23:15:37 +0100 texting Diffstat:
15 files changed, 505 insertions(+), 38 deletions(-)
diff --git a/depolymerization/en.tex b/depolymerization/en.tex @@ -3,6 +3,11 @@ \usepackage[utf8]{inputenc} \usepackage{wrapfig} +\usepackage{textcomp} +\usepackage{xcolor} +\usepackage{bytefield} +\usepackage{tikz} +\usetikzlibrary{positioning,fit} \usepackage{graphicx} \usepackage{url} \title{Project Depolymerization: \\ @@ -10,131 +15,291 @@ \begin{document} -\author{Emmanuel Benoist \and Christian Grothoff} +\author{Antoine d'Aligny \and Emmanuel Benoist \and Christian Grothoff} \maketitle +\begin{abstract} + GNU Taler is an electronic payment system implemented as Free Software. The + Depolymerization of the Bern University of Applied Sciences (BFH) enables + payments with blockchain-based cryptocurrencies using GNU Taler. This + article explains how to use the resulting payment system to efficiently and + quickly pay with Bitcoin. +\end{abstract} -\begin{figure} +\section{Introduction} + +Today, popular cryptocurrencies like Bitcoin~\cite{nakamoto2008bitcoin} and +Ethereum~\cite{ethereum} are not useful for electronic payments in everyday +life (say to buy bread, pay for a beer or a snack in a vending machine). For +real-world payments, on-chain transactions are too slow, too expensive and the +decentralized nature of blockchains does not allow transaction rates required +in practice. + +GNU Taler is a centralized payment system that allows privacy-preserving +payments to be settled within milliseconds at minimal cost. By combining +the GNU Taler payment system with a blockchain, GNU Taler can address key +performance and privacy limitations of blockchains. +Figure~\ref{fig:offchain} shows the resulting architecture where GNU Taler +serves as a layer-2 solution over a blockchain. + +\begin{figure}[hb] + \begin{center} + \input{figures/settlement_layer.tex} + \end{center} + \caption{Blockchain settlement layer with Depolymerization.}\label{fig:offchain} +\end{figure} + +GNU Taler exchanges are expected to be operated by regulated payment service +providers that can be trusted because they are audited in real-time. Today, +no such a regulated entity exists. To nevertheless enable experimentation with +the technology, Prof. Benoist is operating an experimental exchange at {\tt + https://bitcoin.ice.bfh.ch/} as a research project. While the general +public is at liberty to use the system, there is no warranty that the +generated Bitcoin Taler coins will be redeemed as the university reserves the +right to shut down the system at any time for any reason without enabling +users to recover their assets. + +\section{Withdrawing Bitcoin} + +To begin using GNU Taler for Bitcoin payments, users need to install a GNU +Taler wallet. Wallets are available from {\tt https://wallet.taler.net/} +for various platforms and as extensions for various browsers. We will +largely focus on the user experience for the Android wallet, as in most +cases the user experience is quite similar for the other implementations. + +\subsection{Adding the Bitcoin exchange} + +The experimental Bitcoin exchange operated by BFH is not in the default list +of exchanges supported by a GNU Taler wallet. Thus, users must first add the +exchange. To do so, we need to open the ``Settings'' dialog, as shown in +Figures~\ref{fig:mainmenu:hamburger} and~\ref{fig:mainmenu:settings}. + +\begin{figure}[h!] \begin{center} \includegraphics[width=0.3\textwidth]{Screenshots/Screenshot_20221121-210438.png} \end{center} \caption{To withdraw Bitcoin, you must first select the main menu, using the ``hamburger'' icon in the main ``Balances'' view.} +\label{fig:mainmenu:hamburger} \end{figure} -\begin{figure} +\begin{figure}[h!] \begin{center} \includegraphics[width=0.3\textwidth]{Screenshots/Screenshot_20221121-210443.png} \end{center} \caption{In the main menu, select ``Settings''.} +\label{fig:mainmenu:settings} \end{figure} -\begin{figure} -\begin{center} -\includegraphics[width=0.3\textwidth]{Screenshots/Screenshot_20221121-210448.png} -\end{center} -\caption{In ``Settings'', select ``Exchanges'' to view the list of Taler exchange providers.} -\end{figure} +In the ``Settings'' menu, the ``Exchanges'' entry can then be selected +to inspect and modify the list of GNU Taler exchanges the wallet is +configured to use. To add the BFH exchange, select the ``+'' +button and add the respective URL as shown in Figure~\ref{fig:exchange:add}. + +%\begin{figure} +%\begin{center} +%\includegraphics[width=0.3\textwidth]{Screenshots/Screenshot_20221121-210448.png} +%\end{center} +%\caption{In ``Settings'', select ``Exchanges'' to view the list of Taler exchange providers.} +%\end{figure} -\begin{figure} +\begin{figure}[h!] \begin{center} \includegraphics[width=0.3\textwidth]{Screenshots/Screenshot_20221121-210513.png} \end{center} \caption{Unless already present, use the ``+'' button to add a Bitcoin exchange. We use {\tt bitcoin.ice.bfh.ch} which is the only Depolymerization operator we are aware of at this time.} +\label{fig:exchange:add} \end{figure} -\begin{figure} -\begin{center} -\includegraphics[width=0.3\textwidth]{Screenshots/Screenshot_20221121-210559.png} -\end{center} -\caption{If done correctly, an exchange for ``BITCOINBTC'' should now be in the list. - GNU Taler uses ``BITCOINBTC'' instead of just ``BTC'' to avoid confusion with - the worthless ``TESTNETBTC''.} -\end{figure} +The Taler shorthand for the ``mainnet'' Bitcoin currency is ``BITCOINBTC'' +(instead of just ``BTC''), as the Bitcoin ``testnet'' also uses ``BTC'' and +thus the two currencies might be confused, especially given that within +GNU Taler, the underlying Bitcoin addresses are not visible. -\begin{figure} +%\begin{figure} +%\begin{center} +%\includegraphics[width=0.3\textwidth]{Screenshots/Screenshot_20221121-210559.png} +%\end{center} +%\caption{If done correctly, an exchange for ``BITCOINBTC'' should now be in the list. +% GNU Taler uses ``BITCOINBTC'' instead of just ``BTC'' to avoid confusion with +% the worthless ``TESTNETBTC''.} +%\end{figure} + +\subsection{Adding BITCOINBTC to the Taler wallet} + +To move Bitcoins from a Bitcoin wallet to a Taler wallet, +one starts with the menu reachable from the three horizontal dots next to the Bitcoin exchange and selects the +``Withdraw'' operation (Figure~\ref{fig:menu:withdraw}). + +\begin{figure}[h!] \begin{center} \includegraphics[width=0.3\textwidth]{Screenshots/Screenshot_20221121-210606.png} \end{center} \caption{By clicking the three dots next to the Bitcoin exchange, we get the menu to ``Withdraw'' bitcoins. Here, ``withdraw'' means to transfer BTC from a Bitcoin wallet to a Taler wallet.} +\label{fig:menu:withdraw} \end{figure} -\begin{figure} +Afterwards, the wallet will ask for the amount of BTC +that the user wants to withdraw (Figure~\ref{fig:withdraw:amount}) +and ask for the user to agree to the terms of service +of the Taler exchange operator. + +\begin{figure}[h!] \begin{center} \includegraphics[width=0.3\textwidth]{Screenshots/Screenshot_20221121-210626.png} \end{center} \caption{Specify the amount of (BITCOIN)BTC that you want to withdraw.} +\label{fig:withdraw:amount} \end{figure} -\begin{figure} +GNU Taler exchange operators can also charge transaction fees, +just like Bitcoin miners or banks. GNU Taler wallets show +applicable fees for every operation before allowing the user +to proceed with the transaction. Figure~\ref{fig:withdraw:fees} +shows a Taler wallet showing the fees for the withdraw operation. + +\begin{figure}[h!] \begin{center} \includegraphics[width=0.3\textwidth]{Screenshots/Screenshot_20221121-210653.png} \end{center} \caption{The Taler wallet will show applicable exchange fees before starting the actual process. Note that these fees do not include the on-chain transaction fees of the Bitcoin blockchain.} +\label{fig:withdraw:fees} \end{figure} -\begin{figure} +After the user agreed to the terms of service and the fees, the wallet +internally sets up the withdraw process and shows instructions for how to +transfer Bitcoins to the Taler exchange operator to top-up the Taler wallet +(Figure~\ref{fig:withdraw:instructions}). The Bitcoin transfer is a bit +unusual, as the Deploymerization project encodes the access key of the Taler +wallet in two fake Bitcoin addresses, while the actual transfer to the Bitcoin +Taler exchange operator happens in a third address. Thus, users need to copy +the three lines with amounts and Bitcoin target addresses into their clipboard +and from there import them into their Bitcoin wallet (see +Figure~\ref{fig:bitcoin:import}). + +\begin{figure}[h!] \begin{center} \includegraphics[width=0.3\textwidth]{Screenshots/Screenshot_20221121-210709.png} \end{center} \caption{This is is the information needed for the Bitcoin wallet to make the - on-chain wire transfer to send Bitcoins to your Tale wallet. You should copy + on-chain wire transfer to send Bitcoins to your Taler wallet. You should copy this information into your Bitcoin wallet. If the Bitcoin wallet runs on the same device ``Open in banking app'' may work (if the Bitcoin wallet supports it).} +\label{fig:withdraw:instructions} \end{figure} +We will now show how to complete the operation using the Electrum wallet. +The first step is to open the Electrum wallet and open the screen to +``Send'' funds (Figure~\ref{fig:electrum:send}). -\begin{figure} +\begin{figure}[h!] \begin{center} \includegraphics[width=0.6\textwidth]{Screenshots/ScreenShot-2022-11-22_14.17.37.png} \end{center} \caption{Using your Bitcoin wallet (here: Electrum), you now need to send BTC to the Taler exchange to obtain BITCOINBTC in your Taler wallet.} +\label{fig:electrum:send} \end{figure} -\begin{figure} +Next, one needs to tell Electrum that the payment will go to multiple +recipients. This requires using the ``Pay to many'' option in the +menu (Figure~\ref{fig:electrum:many}). + +\begin{figure}[h!] \begin{center} \includegraphics[width=0.3\textwidth]{Screenshots/ScreenShot-2022-11-22_14.17.44.png} \end{center} \caption{When sending the funds, use the ``Pay to many'' option in the menu to be allowed to enter multiple recipients.} +\label{fig:electrum:many} \end{figure} -\begin{figure} +Once the ``Pay to many'' option has been activated, the three lines from the +GNU Taler wallet can be pasted into the address field +(Figure~\ref{fig:bitcoin:import}). Electrum expects amounts in mBTC, while +the lines generated by GNU Taler used BTC. Hence, all amounts must be +multiplied by 1000 and the ``BTC'' unit should be removed. Also, Electrum +expects the lines in CSV format, thus commas need to be added between the +addresses and the amounts. + +\begin{figure}[h!] \begin{center} \includegraphics[width=0.6\textwidth]{Screenshots/ScreenShot-2022-11-22_14.19.45.png} \end{center} \caption{Now you can import the three destinations that were generated by the GNU Taler wallet. Note that Electrum expects the amounts to be specified in mBTC, while - GNU Taler generated the amounts in BTC. Hence, you need to multiply all amounts by 1000 - and remove the ``BTC'' unit and add commas. + GNU Taler generated the amounts in BTC. Future versions of the Taler wallet may support the Electrum syntax directly.} +\label{fig:bitcoin:import} \end{figure} -\begin{figure} +The last step is then to confirm the transaction to Electrum +and to provide Electrum with the passphrase (Figure~\ref{fig:electrum:pass}). + +\begin{figure}[h!] \begin{center} \includegraphics[width=0.3\textwidth]{Screenshots/ScreenShot-2022-11-22_14.20.32.png} \end{center} \caption{As usual, you need to unlock your Electrum wallet with your passphrase and specify how much you are willing to pay in terms of transaction fees.} +\label{fig:electrum:pass} \end{figure} -\begin{figure} -\begin{center} -\includegraphics[width=0.6\textwidth]{Screenshots/ScreenShot-2022-11-22_14.22.44.png} -\end{center} -\caption{The final transaction should look like this. Here, the two 234 Satoshi transactions - are used to encode which Taler wallet should receive the funds, while the main output goes - to the Taler exchange to hold the funds in escrow. The fourth output is your remaining - balance.} -\end{figure} +Afterwards, Electrum will show a final confirmation screen. Here, the two 234 +Satoshi transactions are used to encode which Taler wallet should receive the +funds, while the main output goes to the Taler exchange to hold the funds in +escrow. The fourth output is your remaining balance. It will then take a few +hours (or possibly days, if the Bitcoin transaction fee offered was low) for +the Bitcoins to arrive at the Taler exchange. During that time, the GNU Taler +wallet will show the transaction as ``pending''. Once the Bitcoins have +arrived at the Taler exchange operator, the wallet will withdraw the coins and +show that the ``withdraw'' operation has completed. + +%\begin{figure} +%\begin{center} +%\includegraphics[width=0.6\textwidth]{Screenshots/ScreenShot-2022-11-22_14.22.44.png} +%\end{center} +%\caption{The final transaction should look like this. Here, the two 234 Satoshi transactions +% are used to encode which Taler wallet should receive the funds, while the main output goes +% to the Taler exchange to hold the funds in escrow. The fourth output is your remaining +% balance.} +%\end{figure} + +\section{Making Peer-to-Peer payments} + +\subsection{Sending money} + +\subsection{Sending invoices} + + +\section{Paying Taler-enabled merchants} + + +\section{Going back onto the chain} + +Last but not least, it is possible to transfer the BITCOINBTC from the Taler +wallet back to a Bitcoin wallet, effectively moving the funds out of the Taler +exchange escrow and back onto the chain. + + + +\section{Future work} + +In the future, GNU Taler could be combined with technologies like the +Lightning~\cite{lightening} network to create a federation of GNU Taler +exchanges. This would likely address open challenges for Lightening in terms +of scalability and availability. The main work required here is to add +support for federation to the GNU Taler payment system. + +\section{Conclusion} + \bibliographystyle{alpha} diff --git a/depolymerization/figures/analysis.tex b/depolymerization/figures/analysis.tex @@ -0,0 +1,52 @@ +\begin{tikzpicture}[ + block/.style={rectangle,draw=black,fill=black!10,minimum size=7mm}, + conf/.style={draw=black!60!green,fill=black!60!green!10}, + nconf/.style={dotted}, + conft/.style={text=black!60!green}, + confl/.style={draw=black!60!green}, + ar/.style={-stealth} + ] + % Common + \node(0){}; + \node[block,conf,right=5mm of 0](1){}; + \node[block,conf,right=5mm of 1](2){}; + \draw[ar] (0) -- (1); + \draw[ar] (1) -- (2); + + % Current + \node[block,conf,right=5mm of 2](3){}; + \node[block,nconf,right=5mm of 3](4){}; + \node[block,nconf,right=5mm of 4](5){}; + \node[block,nconf,right=5mm of 5](6){}; + \draw[ar] (2) -- (3); + \draw[ar] (3) -- (4); + \draw[ar] (4) -- (5); + \draw[ar] (5) -- (6); + + % Fork + \node[block,nconf,above=7mm of 3](3p){}; + \node[block,nconf,right=5mm of 3p](4p){}; + \node[block,nconf,right=5mm of 4p](5p){}; + \node[block,nconf,right=5mm of 5p](6p){}; + \node[block,nconf,right=5mm of 6p](7p){}; + \draw[ar] (2.east) -- (3p.west); + \draw[ar] (3p) -- (4p); + \draw[ar] (4p) -- (5p); + \draw[ar] (5p) -- (6p); + \draw[ar] (6p) -- (7p); + + % Indication + \node[right=5mm of 7p]{\emph{fork}}; + \node[right=17mm of 6]{\emph{active}}; + + % Confirmation + \path (0) -- (1) node[conft,midway, below=6mm] (M) {Max}; + \path (2) -- (3) node[conft,midway, below=6mm] (N) {New}; + \path (3) -- (4) node[conft,midway, below=6mm] (I) {Initial}; + \node[above=25mm of M] (Mp) {}; + \node[above=25mm of N] (Np) {}; + \node[above=25mm of I] (Ip) {}; + \draw[confl,thick,dotted](M) -- (Mp); + \draw[confl](N) -- (Np); + \draw[confl,thick,dotted](I) -- (Ip); +\end{tikzpicture} +\ No newline at end of file diff --git a/depolymerization/figures/conf_delay.tex b/depolymerization/figures/conf_delay.tex @@ -0,0 +1,36 @@ +\begin{tikzpicture}[ + block/.style={rectangle,draw=black,fill=black!10,minimum size=7mm}, + conf/.style={draw=black!60!green,fill=black!60!green!10}, + nconf/.style={dotted}, + err/.style={draw=black!60!red,fill=black!60!red!10}, + ar/.style={-stealth} + ] + % Common + \node[block,conf](1){}; + \node[block,conf,right=5mm of 1](2){$D_0$}; + \node[block,conf,right=5mm of 2](3){}; + \draw[ar] (1) -- (2); + \draw[ar] (2) -- (3); + + % Current + \node [block,nconf,right=5mm of 3](4){}; + \node[block,nconf,right=5mm of 4](5){}; + \node[block,nconf,right=5mm of 5](6){$D_1$}; + \draw[ar] (3) -- (4); + \draw[ar] (4) -- (5); + \draw[ar] (5) -- (6); + + % Fork + \node [block,nconf,above=7mm of 4](4p){}; + \node[block,nconf,right=5mm of 4p](5p){$D_2$}; + \node[block,nconf,right=5mm of 5p](6p){}; + \node[block,nconf,right=5mm of 6p](7p){}; + \draw[ar] (3.east) -- (4p.west); + \draw[ar] (4p) -- (5p); + \draw[ar] (5p) -- (6p); + \draw[ar] (6p) -- (7p); + + % Indication + \node [right=5mm of 7p]{\emph{fork}}; + \node [right=17mm of 6]{\emph{active}}; +\end{tikzpicture} +\ No newline at end of file diff --git a/depolymerization/figures/conflict.tex b/depolymerization/figures/conflict.tex @@ -0,0 +1,36 @@ +\begin{tikzpicture}[ + block/.style={rectangle,draw=black,fill=black!10,minimum size=7mm}, + conf/.style={draw=black!60!green,fill=black!60!green!10}, + nconf/.style={dotted}, + err/.style={draw=black!60!red,fill=black!60!red!10}, + ar/.style={-stealth} + ] + % Common + \node[block,conf](1){}; + \node[block,conf,right=5mm of 1](2){$D_0$}; + \node[block,conf,right=5mm of 2](3){}; + \draw[ar] (1) -- (2); + \draw[ar] (2) -- (3); + + % Current + \node[block,conf,right=5mm of 3](4){$D_3$}; + \node[block,nconf,right=5mm of 4](5){}; + \node[block,nconf,right=5mm of 5](6){$D_1$}; + \draw[ar] (3) -- (4); + \draw[ar] (4) -- (5); + \draw[ar] (5) -- (6); + + % Fork + \node[block,dashed,err,above=7mm of 4](4p){$D_3'$}; + \node[block,nconf,right=5mm of 4p](5p){$D_2$}; + \node[block,nconf,right=5mm of 5p](6p){}; + \node[block,nconf,right=5mm of 6p](7p){}; + \draw[ar] (3.east) -- (4p.west); + \draw[ar] (4p) -- (5p); + \draw[ar] (5p) -- (6p); + \draw[ar] (6p) -- (7p); + + % Indication + \node [right=5mm of 7p]{\emph{fork}}; + \node [right=17mm of 6]{\emph{active}}; +\end{tikzpicture} +\ No newline at end of file diff --git a/depolymerization/figures/depolymerizer_arch.tex b/depolymerization/figures/depolymerizer_arch.tex @@ -0,0 +1,20 @@ +\begin{tikzpicture}[ + rect/.style={rectangle, draw=black, minimum height=6mm, minimum width=22mm}, + sym/.style={stealth-stealth, shorten >= 2pt, shorten <= 2pt} + ] + \node[rect](1) {Taler Exchange}; + \node[rect,below=.8cm of 1](2) {Wire Gateway}; + \node[rect,right=.7cm of 2](3) {PostgreSQL}; + \node[rect,right=.7cm of 3](4) {DLT Adapter}; + \node[rect,above=.8cm of 4](5) {DLT Full Node}; + + \draw[sym] (1) -- node [midway,right] {\tiny HTTP} (2); + \draw[sym] (2) -- node [midway,above] {\tiny SQL} (3); + \draw[sym] (3) -- node [midway,above] {\tiny SQL} (4); + \draw[sym] (4) -- node [midway,left ] {\tiny RPC} (5); + + \node[above= 2mm of 1]{\small{\emph{Wire Gateway API}}}; + \node[above= 2mm of 5]{\small{\emph{DLT specific}}}; + \node[above=22mm of 3](T) {}; + \draw[dotted] (3) -- (T); +\end{tikzpicture} +\ No newline at end of file diff --git a/depolymerization/figures/fork.tex b/depolymerization/figures/fork.tex @@ -0,0 +1,29 @@ +\begin{tikzpicture}[ + block/.style={rectangle,draw=black,fill=black!10,minimum size=7mm}, + ar/.style={-stealth} + ] + % Common + \node[block](1){}; + \node[block,right=5mm of 1](2){$D_0$}; + \node[block,right=5mm of 2](3){}; + \draw[ar] (1) -- (2); + \draw[ar] (2) -- (3); + + % Current + \node[block,right=5mm of 3](4){}; + \node[block,right=5mm of 4](5){$D_1$}; + \draw[ar] (3) -- (4); + \draw[ar] (4) -- (5); + + % Fork + \node[block,above=7mm of 4](4p){}; + \node[block,right=5mm of 4p](5p){$D_2$}; + \node[block,right=5mm of 5p](6p){}; + \draw[ar] (3.east) -- (4p.west); + \draw[ar] (4p) -- (5p); + \draw[ar] (5p) -- (6p); + + % Indication + \node [right=5mm of 6p]{\emph{fork}}; + \node [right=17mm of 5]{\emph{active}}; +\end{tikzpicture} +\ No newline at end of file diff --git a/depolymerization/figures/harmless_reorg.tex b/depolymerization/figures/harmless_reorg.tex @@ -0,0 +1,36 @@ +\begin{tikzpicture}[ + block/.style={rectangle,draw=black,fill=black!10,minimum size=7mm}, + conf/.style={draw=black!60!green,fill=black!60!green!10}, + nconf/.style={dotted}, + err/.style={draw=black!60!red,fill=black!60!red!10}, + ar/.style={-stealth} + ] + % Common + \node[block,conf](1){}; + \node[block,conf,right=5mm of 1](2){$D_0$}; + \node[block,conf,right=5mm of 2](3){}; + \draw[ar] (1) -- (2); + \draw[ar] (2) -- (3); + + % Current + \node[block,conf,right=5mm of 3](4){}; + \node[block,nconf,right=5mm of 4](5){}; + \node[block,nconf,right=5mm of 5](6){$D_1$}; + \draw[ar] (3) -- (4); + \draw[ar] (4) -- (5); + \draw[ar] (5) -- (6); + + % Fork + \node[block,nconf,above=7mm of 4](4p){}; + \node[block,nconf,right=5mm of 4p](5p){$D_2$}; + \node[block,nconf,right=5mm of 5p](6p){}; + \node[block,nconf,right=5mm of 6p](7p){}; + \draw[ar] (3.east) -- (4p.west); + \draw[ar] (4p) -- (5p); + \draw[ar] (5p) -- (6p); + \draw[ar] (6p) -- (7p); + + % Indication + \node [right=5mm of 7p]{\emph{fork}}; + \node [right=17mm of 6]{\emph{active}}; +\end{tikzpicture} +\ No newline at end of file diff --git a/depolymerization/figures/settlement_layer.tex b/depolymerization/figures/settlement_layer.tex @@ -0,0 +1,50 @@ +\begin{tikzpicture}[ + rect/.style={rectangle, draw=black, minimum width=30mm}, + sym/.style={stealth-stealth, shorten >= 2pt, shorten <= 2pt}, + block/.style={rectangle,draw=black,fill=black!10,minimum size=7mm}, + ] + + %% Architecture + \node(Tt){Taler}; + \node[rect,below=0cm of Tt](Tc){Exchange}; + \node[rect,fit={(Tt) (Tc)}](T){}; + + \node[rect,below=7mm of Tc](D) {\textbf{Depolymerization}}; + + \node[rect,below=7mm of D](Bc){Node}; + \node[below=0cm of Bc](Bt){Blockchain}; + \node[rect,fit={(Bt) (Bc)}](B){}; + + \draw[sym] (T) -- (D); + \draw[sym] (D) -- (B); + + %% Blockchain + \node[block,right=7mm of B] (1){}; + \node[block,right=5mm of 1] (2){}; + %\node[block,right=4mm of 2] (3){}; + %\node[block,right=4mm of 3] (4){}; + %\node[block,right=4mm of 4] (5){}; + \node[block,right=5mm of 2] (5){}; + \node[block,right=5mm of 5] (6){}; + \draw[-stealth] (1) -- (2); + % \draw[-stealth] (2) -- (3); + % \draw[-stealth] (3) -- (4); + % \draw[-stealth] (4) -- (5); + \draw[-stealth] (2) -- (5); + \draw[-stealth] (5) -- (6); + + \node[left=4mm of 1] (S){}; + \node[right=4mm of 6] (E){}; + \draw[-stealth] (S) -- (1); + \draw[-stealth] (6) -- (E); + + %% Taler + \node[block, below right=-7.5mm and 11.75mm of T] (off){Off-chain transactions}; + \node[above=-0.5mm of off] {\includegraphics[height=7mm]{media/taler.png}}; + + %% Depolymerization + \node[right=12mm of D] {\small{Credit}}; + \node[right=38.5mm of D] {\small{Debit}}; + \draw[dashed,-stealth] (1.north) |- (off.west); + \draw[dashed,-stealth] (off.east) -| (6.north); +\end{tikzpicture} +\ No newline at end of file diff --git a/depolymerization/figures/taler_arch.tex b/depolymerization/figures/taler_arch.tex @@ -0,0 +1,35 @@ +\begin{tikzpicture}[ + rect/.style={circle, draw=black,font=\fontsize{9}{16}\selectfont}, + sym/.style={-stealth, shorten >= 2pt, shorten <= 2pt} + ] + % Taler payment system + \node[rect](1) {Exchange}; + \node[rect,below left=1.5cm and 0.75cm of 1](2) {Customer}; + \node[rect,below right=1.5cm and 0.75cm of 1](3) {Merchant}; + + \draw[sym] (1) -- node [midway, above, sloped] {\tiny Withdraw coins} (2); + \draw[sym] (2) -- node [midway, above, sloped] {\tiny Spend coins} (3); + \draw[sym] (3) -- node [midway, above, sloped] {\tiny Deposit coins} (1); + + % Settlement layer + \node[left=2.5cm of 1](E1){}; + \node[right=2.5cm of 1](E2){}; + \draw[sym] (E1) -- node [midway, above] {\tiny Deposit money} (1); + \draw[sym] (1) -- node [midway, above] {\tiny Withdraw money} (E2); + + % Auditor + \node[above=0.6cm of 1](A){Auditor}; + \draw[sym] (A) -- node [midway, right] {\tiny Verify} (1); + + % Separator + \node[below=1mm of E1] (S1S) {}; + \node[below=1mm of E2] (S1E) {}; + \node[above=6mm of E1] (S2S) {}; + \node[above=6mm of E2] (S2E) {}; + + \draw[dotted] (S1S) -- (S1E); + \draw[dotted] (S2S) -- (S2E); + + \node[below right=-2mm and -1.5mm of S2S] {\tiny{\emph{Settlement Layer}}}; + \node[below right=-2mm and -1.5mm of S1S] {\tiny{\emph{Taler payment system}}}; +\end{tikzpicture} +\ No newline at end of file diff --git a/depolymerization/media/fee.png b/depolymerization/media/fee.png Binary files differ. diff --git a/depolymerization/media/fee_var.png b/depolymerization/media/fee_var.png Binary files differ. diff --git a/depolymerization/media/news0.png b/depolymerization/media/news0.png Binary files differ. diff --git a/depolymerization/media/news1.png b/depolymerization/media/news1.png Binary files differ. diff --git a/depolymerization/media/news2.png b/depolymerization/media/news2.png Binary files differ. diff --git a/depolymerization/media/taler.png b/depolymerization/media/taler.png Binary files differ.