Dev branch for age restriction, deposit policies, Brandt-Vickrey auctions etc.
Go to file
Christian Grothoff e7aeec04f4
The current recoup API is broken. I guess this is another example where "trivial" API changes turn out to have (multiple!) unexpected consequences.
The current "/recoup" API does not have clear idempotency semantics, as we've discussed on the phone.  This is already bad by itself, as it makes it hard to write down what the API does other than "whatever the implementation does".

However, it actually breaks correctness in this (admittedly kinda contrived, but not impossible) case:

Say that we have a coin A obtained via withdrawal and a coin B obtained via refreshing coin A. Now the denominations of A gets revoked..

The wallet does a recoup of A for EUR:1.

Now the denomination of B also gets revoked.  The wallet recoups B (incidentally also for EUR:1) and now A can be recouped again for EUR:1.  But now the exchange is in a state where it will refuse a legitimate recoup request for A because the detection for an idempotent request kicks in.

This is IMHO bad API design, and the exchange should simply always recoup the maximum amount.

Furthermore, we usually follow the principle of "API calls that take up DB space are paid".  With the current recoup API, I can do many tiny recoup requests which the exchange then has to store, right?

I guess it would not be a big change to remove the "amount" value from the recoup/recoup-refresh request bodies, right?

- Florian
2022-01-11 12:47:35 +01:00
contrib The current recoup API is broken. I guess this is another example where "trivial" API changes turn out to have (multiple!) unexpected consequences. 2022-01-11 12:47:35 +01:00
debian improve suicide logic 2021-12-02 08:02:20 +01:00
doc last fixes from Dora 2021-10-12 22:20:21 +02:00
m4 add gettext support 2021-04-05 20:11:45 +02:00
po add gettext support 2021-04-05 20:11:45 +02:00
src The current recoup API is broken. I guess this is another example where "trivial" API changes turn out to have (multiple!) unexpected consequences. 2022-01-11 12:47:35 +01:00
.dir-locals.el Add a .dir-locals,el for configuring emacs for this project 2019-03-15 21:45:02 +01:00
.gitignore -document section name 2021-08-04 14:05:13 +02:00
.gitmodules fix gana path 2021-09-02 15:24:13 +02:00
ABOUT-NLS add gettext support 2021-04-05 20:11:45 +02:00
AUTHORS fix format string issue in taler-wire, complete work on #5536 revocation file issue (shift location of revocation file and change content to include denom hash) 2019-03-03 00:35:21 +01:00
bootstrap force full gana update on bootstrap 2021-11-21 17:24:58 +01:00
ChangeLog preliminary work on supporting sharding/parallel aggregation (undertested, but tests pass again) 2021-09-03 19:08:02 +02:00
configure.ac -version bump 2021-09-27 10:56:53 +02:00
COPYING -initial import for mint 2015-01-08 18:37:20 +01:00
Makefile.am readme 2021-11-16 17:06:27 +01:00
NEWS -initial import for mint 2015-01-08 18:37:20 +01:00
README -bump required version 2021-11-28 22:08:57 +01:00
README.1st readme 2021-11-16 17:06:27 +01:00

                       Welcome to GNU Taler


What is Taler?
==============

Taler is an electronic payment system providing the ability to pay
anonymously using digital cash.  Taler consists of a network protocol
definition (using a RESTful API over HTTP), a Exchange (which creates
digital coins), a Wallet (which allows customers to manage, store and
spend digital coins), and a Merchant website which allows customers to
spend their digital coins.  Naturally, each Merchant is different, but
Taler includes code examples to help Merchants integrate Taler as a
payment system.

Taler is currently developed by a worldwide group of independent free
software developers and the DECENTRALISE team at Inria Rennes.  Taler
is free software and a GNU package (https://www.gnu.org/).

This is an alpha release with a few known bugs, lacking a few
important features, documentation, testing, performance tuning and an
external security audit.  However, you can run the code and it largely
works fine.  that does not work yet.  This package also only includes
the Taler exchange, not the other components of the system.

Documentation about Taler can be found at https://taler.net/.
Our bug tracker is at https://gnunet.org/bugs/.


Joining GNU
===========

This is a GNU program, developed by the GNU Project and part of the
GNU Operating System. If you are the author of an awesome program and
want to join us in writing Free Software, please consider making it an
official GNU program and become a GNU maintainer.  You can find
instructions on how to do so at http://www.gnu.org/help/evaluation.
We are looking forward to hacking with you!


Dependencies:
=============

These are the direct dependencies for running a Taler exchange:

- GNUnet            >= 0.15.4
- GNU libmicrohttpd >= 0.9.71
- Postgres          >= 9.5



Project structure is currently as follows:

src/include/
  -- installed headers for public APIs

src/util/
  -- common utility functions (currency representation,
     Taler-specific cryptography, Taler-specific json
     support)

src/pq/
  -- Postgres-specific utility functions

src/exchangedb/
  -- Exchange database backend (with DB-specific plugins)

src/exchange/
  -- taler exchange server

src/exchange-tools/
  -- taler exchange helper programs

src/exchange-lib/
  -- libtalerexchange: C API to issue HTTP requests to exchange

src/auditor/
  -- tools to generate reports about financial performance and
     to validate that the exchange has been operating correctly

src/benchmark/
  -- tool to run performance measurements



Getting Started
===============

The following steps illustrate how to set up a exchange HTTP server.
They take as a stub for configuring the exchange the content of 'contrib/exchange-template/config/'.

1) Create a 'test/' directory and copy the stubs in it:

mkdir -p test/config/
cp exchange/contrib/exchange-template/config/* test/config/
cd test/

2) Create the exchange's master with the tool 'gnunet-ecc':

gnunet-ecc -g1 master.priv

3) Edit config/exchange-common.conf by replacing the right value on the line with the
MASTER_PUBLIC_KEY entry with the fresh generated (ASCII version of) master.priv.
This ASCII version is obtained by issuing:

gnunet-ecc -p master.priv

4) Generate other exchange related keys ('denomination' and 'signing' keys), by issuing:

taler-exchange-keyup -m master.priv -o auditor.in

5) A exchange needs a database to operate, so the following instructions relate to
how to set up PostgreSQL. On debian, the two packages needed are:

* postgresql
* postgresql-client

For other operating systems, please refer to the relevant documentation.

In this settlement, the exchange will use a database called 'talercheck' and will
run under the username through which 'taler-exchange-httpd' is launched. Thus assuming
that this user is 'demo', we need to create a 'demo' role for postgresql and make
him the owner of 'talercheck' database.

To perform these administrative tasks we have to impersonate the 'postgres' (by default,
postgres installation assigns privileges to such a user) user, then connect to the running DBMS.
Issue the following:

su # give your root password
su - postgres
psql # this is the command-line client to the DMBS
# the following lines are SQL
CREATE USER demo;
CREATE DATABASE talercheck OWNER demo;
# quit with CTRL-D

7) If any previous step has been successful, it is now possbile to start up the
exchange web server (by default it will listen on port 4241); issue:


taler-exchange-httpd -d `pwd` # assuming we did not move outside of the 'test' directory