# GNU Taler ![](logo-2021.svg)
# GNU Taler *T*axable \ *A*nonymous \ *L*ibre \ *E*conomic\ *R*eserves
## Was ist es? - Ein Bezahlsystem. - *Keine* Währung. - *Keine* Blockchain. - Kryptographisch sicher.
## Was kann es? - *Anonym* bezahlen. - Aber *transparentes* Einkommen. - Niedrige Transaktionskosten. - Erfordert (nur) Vertrauen in eine *zentrale Autorität*.
## Aber warum? Bezahlmethoden: - *Bargeld:* Keine Onlinezahlung. - *SEPA-Überweisung:* Langsam, Datenschutz. :-/ - *Kreditkarte, SEPA-Instant, ...:* Datenschutz. :-/ - *Proof-of-\*-Währungen:* Nein. >:-(
## Aber warum? - Günstig. (Micropayments!) - Geldempfänger können *know-your-customer*-Prozedur unterworfen werden. - Exchange sieht nicht, *wer* ein Produkt bezahlt hat. - freie Software. :)
## Ohne Taler ![](ohne_taler.svg)
## Mit Taler ![](mit_taler.svg)
## Eigenschaften Als Kunde: Wie Bargeld. - Kein Login beim Bezahlen. - Coins sind *im* Wallet. - Wallet verloren → (nur) Coins aus dem Wallet weg.
## Taler-Exchange Exchange bewahrt Geld *treuhänderisch* auf: - z.B. Bankkonto (IBAN etc.) - oder Bitcoin (Bitcoinwallet) *Talermünze* ist *Anspruch* auf Verfügung über dieses Geld.
## Taler-Exchange *Überweisung an die Exchange*, um neue Taler zu erhalten. Oder *Taler einlösen*, um eine Überweisung von der Exchange zu erhalten. Oder *Taler einlösen*, um frische Taler zu erhalten.
# Ein bisschen Kryptographie
## Taler-Münzen (zu einfach) Die Exchange hat mehrere *RSA-Signaturschlüssel*: Einen für jeden Münzwert. | Kunde | Exchange | |-------|------| | *Wählt* ein C. | | | | Nimmt 10 Euro von Kunde. | | | *Signiert* C mit ihrem 10-EUR-Key. | Problem: Exchange kann sich *Kunde/C-Zuordnung* merken.
## Münzen ausgeben (zu einfach) Kunde gibt (C, Signatur) an *Händler*. Händler *fragt Exchange*, ob *C* bekannt. *Nein?* Gut. *Ja?* Double spending!
## Taler-Münzen (nah dran) | Kunde | Exchange | |-------|------| | *Wählt* ein C. | | | Verblindet C. | | | | Nimmt 10 Euro von Kunde. | | | Signiert C *blind* mit ihrem 10-EUR-Key. | | Entblindet die Signatur. | |
## Taler-Münzen (nah dran) 10-EUR-Key: $(e, N)$, $(d, N)$ mit $x^{e \cdot d} \equiv x (mod\ N)$ | Kunde | Exchange | |-------|------| | *Wählt* $C$ und $b \in \mathrm{Z}_N$ | | | *Sendet* $C \cdot b^e$ | | | | *Sendet* $(C \cdot b^e) ^ d$ | | $ = C^d \cdot (b^e)^d = C^d \cdot b$ | |

Taler-Münzen (endlich!)

Jetzt wählen wir C aber nicht frei.

Sondern: (c, C) ist ein EdDSA-Schlüsselpaar.

(Und anstelle von C müssen wir einen Hash von C benutzen.)

## Refresh-Protokoll - Münzen können ablaufen. ⇒ *Erneuern* - *Wechselgeld*
## Refresh-Protokoll - Gefährdet Besteuerbarkeit. - Lösung: Altbesitzer erhält *immer* Zugriff auf die neuen Münzen. ⇒ Steuerhinterziehung schafft *Risiko* für den Händler.
## Diffie-Hellman - Alice wählt privat/öffentliches Schlüsselpaar $(a, A)$ - Bob wählt privat/öffentliches Schlüsselpaar $(b, B)$ - Alice rechnet *gemeinsames Geheimnis* $G := a * B$ - Bob rechnet *gemeinsames Geheimnis* $G := A * b$ ("$*$" sei eine magische Operation)
## Refresh-Protokoll Idee: Neuer Münz-Schlüssel und Blendungsfaktor wird nicht gewürfelt, sondern *aus $G$ errechnet*. - Für Alices $(a, A)$ nehmen wir $(c, C)$ der alten Münze. - Bobs $(b, B)$ würfeln wir. - Die Exchange *verrät* uns das öffentliche $B$. Ergebnis: Da der alte Besitzer $a = c$ kennt, kann er $G$ und damit die *neue Münze errechnen*.
## Refresh-Protokoll ... jedenfalls wenn wir uns an das Protokoll gehalten haben. *Wieso sollten wir?*
## Wieso sollten wir? Weil wir das ganze 3× machen. - Die Exchange bittet uns, bei 2 der Anfragen zu *beweisen*, dass wir ehrlich waren. - Wir legen die jeweiligen $b$ offen. Die verbleibende (3te) Anfrage wird ausgeführt.
# Setup
## Exchange ```bash curl https://taler.net/taler-systems.gpg.key | apt-key add - echo 'deb https://deb.taler.net/apt/debian bullseye main'\ >> /etc/apt/sources.list.d/taler.list apt install taler-exchange taler-exchange-offline taler-exchange-offline setup # Masterschlüssel erzeugen. ``` Außerdem: - Zahlungsmethode (z.B. Bankkonto) - `nginx` (HTTPS Reverse Proxy) - Datenbank
## Exchange *Starten:* Am besten nicht alle als root... ```bash taler-exchange-aggregator & taler-exchange-closer & taler-exchange-secmod-cs & taler-exchange-secmod-rsa & taler-exchange-secmod-eddsa & taler-exchange-transfer & taler-exchange-wirewatch & taler-exchange-httpd & ```
## Exchange *Signieren:* Am besten auf einem Offline-Computer mit einem USB-Stick dazwischen... ```bash alias teo=taler-exchange-offline teo enable-account payto://FOOBAR | teo upload teo wire-fee 2022 iban KUDOS:0 KUDOS:0 | teo upload teo global-fee 2022 [...] | teo upload teo download | teo sign | teo upload ```
## Nexus Abstrahiert Außenwelt weg. Teil der *libeufin*. "*Mailbox*" für das Bankkonto. Spricht *EBICS* mit der Bank.
## libeufin-Sandbox Kein Live-Konto mit EBICS? Kein Problem! Wir machen einfach unsere *eigene Bank*! (Mit sehr limitiertem Funktionsumfang ;)) https://bank.w.icmp.camp
## Merchant-Backend ```bash curl https://taler.net/taler-systems.gpg.key | apt-key add - echo 'deb https://deb.taler.net/apt/debian bullseye main'\ >> /etc/apt/sources.list.d/taler.list apt install taler-exchange taler-merchant ``` Oder fertig verdockert: [https://tschunk.shop/howto](https://web.archive.org/web/20221231152156/https://tschunk.shop/howto.html)
## Merchant-Backend ```ini [MERCHANT-EXCHANGE-demo] CURRENCY = WICMP EXCHANGE_BASE_URL = https://exchange.w.icmp.camp/ MASTER_KEY = GP460KQZ21VTGNQWYWAYXK1F6G67WNFDHYJFA... [taler] CURRENCY = WICMP [merchantdb-postgres] CONFIG = postgres:///merchant [merchant] DATABASE = postgres PORT = 8888 ```
## Merchant-Backend ![](merchant.png)
## Merchant-Backend ```bash curl 'https://tschunk.shop/instances/default/private/orders'\ -H 'Authorization: Bearer secret-token:y9jgHGtLzA6PSy' \ --data-raw $' { "order": { "amount": "MANA:13.37", "summary": "Turbotschunk!", "products": [], "extra": "", "wire_fee_amortization": 1, "max_fee": "MANA:1", "max_wire_fee": "MANA:1" }, "inventory_products": [], "create_token": true }' ```
## Merchant-Backend *Payment deadline*: Wann läuft die Bestellung ab? *Refund deadline*: Geld wird so lange zurückgehalten. *Wire transfer deadline*: Aggregiere Überweisungen.

Auf der WICMP

WICMP-ZentralbankKredit an cashier.
cashier

Devisentausch: EUR/WICMPs.

Überweist WICMPs an exchange.

exchangeStellt Münzen für Nutzer aus

Auf der WICMP

Auf der WICMP

Nutzer

Bezahlt merchant

merchantReicht Münzen bei der exchange ein.
exchangeÜberweist gesammelt WICMPs an merchant.

Auf der WICMP

## Are we Taler yet? Kommt drauf an: - *Einsatzfähig?* Ja. - *"Oma-tauglich"?* Nein.
## Are we Taler yet? Wo kann ich es benutzen? - *In der echten Welt?* Noch nicht. - *Irgendwo?* An der Berner Fachhochschule. - *Auf der WICMP?* Aber ja!
## Are we Taler yet? Wallets für *Android*, *Firefox* und *CLI*. - auch im *F-Droid* Store ;-) - (Chrome kaputt(?), iOS gibt's *bald*™) - Bug: Letzte Münze kann nicht ausgegeben werden.

Happy Hacking

    Was geht:

  • Bezahlt eure Mate und euren Tschunk mit GNU Taler.

  • Was fehlt:

  • Pixelflut mit Micropayments.
  • LED-Streifen as a (paid) Service.
  • ...
https://tschunk.shop/howto
## Hintergrund und Quellen Dieser Talk wurde am 2022-12-27 auf der [Wintergalaktischen Club Mate Party](https://w.icmp.camp) in Erlangen gehalten. Er nutzt die gemeinfreien "Person"-Embleme der [Tango icons](https://commons.wikimedia.org/wiki/Tango_icons#Emblems). Dieses Werk ist lizensiert unter der [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). Copyright ⓒ 2022 Florian Jung