lsd0009

LSD0009: The GNU Taler Protocol
Log | Files | Refs | README

commit 813b7afbbcd10b0fb530f93cb04299ec656419e1
parent 3109e3cc293c6a35a39bb409f217a49d1d039f57
Author: Mikolai Gütschow <mikolai.guetschow@tu-dresden.de>
Date:   Thu,  2 Apr 2026 16:55:22 +0200

protocol: add intro to payment

Diffstat:
Mdraft-guetschow-taler-protocol.md | 18++++++++++++------
Mdraft-guetschow-taler-protocol.xml | 284+++++++++++++++++++++++++++++++++++++++++--------------------------------------
2 files changed, 159 insertions(+), 143 deletions(-)

diff --git a/draft-guetschow-taler-protocol.md b/draft-guetschow-taler-protocol.md @@ -391,7 +391,7 @@ out = uint32(len(msg)) | uint32(purpose) | msg // todo: explain persist, check, knows, sum, indexing (if left of equal sign, single entry; if not refers to whole list) -## Withdrawal +## Withdrawal {#withdrawal} The wallet generates `n > 0` coins (`coinᵢ`) and requests `n` signatures (`blind_sigᵢ`) from the exchange, attributing value to the coins according to `n` chosen denominations (`denomᵢ`). @@ -488,7 +488,13 @@ check RSA-FDH-Verify(SHA-512(coinᵢ.pub), coinᵢ.sig, denomᵢ.pub) persist (coinᵢ, blind_secretᵢ) ~~~ -## Payment +## Payment {#payment} + +The wallet obtains `contract` information for an `order` from the merchant +after claiming it with a `nonce`. +Payment of the order is prepared by signing (partial) deposit authorizations (`depositᵢ`) of coins (`coinᵢ`), +where the sum of all contributions (`contributionᵢ <= denomᵢ.value`) must match the `contract.price` plus potential deposit fees. +The payment is complete as soon as the merchant successfully redeems the deposit authorizations at the exchange (cf. {{deposit}}). ~~~ wallet merchant @@ -507,7 +513,7 @@ knows valid coinᵢ knows exchange, payto +-----------------------+ | | | |------- /orders/{order.id}/claim ------>| - | (nonce.pub, token?) | + | (nonce.pub, order.token?) | | | | +--------------------------+ | | (M2) contract generation | @@ -593,7 +599,7 @@ persist (contract, ~sig, ~deposit) ~~~ (M3) deposit check (merchant) -check sum(depositᵢ.fraction) == contract.price +check sum(depositᵢ.contribution) == contract.price check Deposit(deposit)ᵢ msg = Sign-Msg(MERCHANT_PAYMENT_OK, h_contract) sig = EdDSA-Sign(merchant.priv, msg) @@ -605,7 +611,7 @@ sig = EdDSA-Sign(merchant.priv, msg) check EdDSA-Verify(merchant.pub, msg, sig) ~~~ -## Deposit +## Deposit {#deposit} ~~~ merchant/wallet exchange @@ -644,7 +650,7 @@ msg3 = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT, ( h_contract | contract.h_wire | uint512(0x0) | exchange_timestamp | contract.wire_deadline | contract.refund_deadline - | sum(*deposit.fraction - *denom.fee_deposit) + | sum(*deposit.contribution - *denom.fee_deposit) | SHA-512(*deposit.sig1) | merchant.pub )) ~~~ diff --git a/draft-guetschow-taler-protocol.xml b/draft-guetschow-taler-protocol.xml @@ -24,7 +24,7 @@ <email>mikolai.guetschow@tu-dresden.de</email> </address> </author> - <date year="2026" month="April" day="01"/> + <date year="2026" month="April" day="02"/> <workgroup>independent</workgroup> <keyword>taler</keyword> <keyword>cryptography</keyword> @@ -472,6 +472,11 @@ persist (coinᵢ, blind_secretᵢ) </section> <section anchor="payment"> <name>Payment</name> + <t>The wallet obtains <tt>contract</tt> information for an <tt>order</tt> from the merchant +after claiming it with a <tt>nonce</tt>. +Payment of the order is prepared by signing (partial) deposit authorizations (<tt>depositᵢ</tt>) of coins (<tt>coinᵢ</tt>), +where the sum of all contributions (<tt>contributionᵢ &lt;= denomᵢ.value</tt>) must match the <tt>contract.price</tt> plus potential deposit fees. +The payment is complete as soon as the merchant successfully redeems the deposit authorizations at the exchange (cf. <xref target="deposit"/>).</t> <artwork><![CDATA[ wallet merchant knows merchant.pub knows merchant.priv @@ -489,7 +494,7 @@ knows valid coinᵢ knows exchange, payto +-----------------------+ | | | |------- /orders/{order.id}/claim ------>| - | (nonce.pub, token?) | + | (nonce.pub, order.token?) | | | | +--------------------------+ | | (M2) contract generation | @@ -567,7 +572,7 @@ persist (contract, ~sig, ~deposit) <artwork><![CDATA[ (M3) deposit check (merchant) -check sum(depositᵢ.fraction) == contract.price +check sum(depositᵢ.contribution) == contract.price check Deposit(deposit)ᵢ msg = Sign-Msg(MERCHANT_PAYMENT_OK, h_contract) sig = EdDSA-Sign(merchant.priv, msg) @@ -615,7 +620,7 @@ msg3 = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT, ( h_contract | contract.h_wire | uint512(0x0) | exchange_timestamp | contract.wire_deadline | contract.refund_deadline - | sum(*deposit.fraction - *denom.fee_deposit) + | sum(*deposit.contribution - *denom.fee_deposit) | SHA-512(*deposit.sig1) | merchant.pub )) ]]></artwork> </section> @@ -707,7 +712,7 @@ msg3 = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT, <refcontent>National Institute of Standards and Technology (U.S.)</refcontent> </reference> </references> - <?line 659?> + <?line 665?> <section anchor="change-log"> <name>Change log</name> @@ -720,138 +725,143 @@ Education and Research (BMBF) within the project Concrete Contracts.</t> </section> </back> <!-- ##markdown-source: -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 +5/8PNW0ZaAJSAAA= -->