taler-docs

Documentation for GNU Taler components, APIs and protocols
Log | Files | Refs | README | LICENSE

commit 68b0c7788a232508d3c00fd88cf7a09fe57281fb
parent 0c6fc42f54afe8c13fdbdb5228b76d8af8773746
Author: Özgür Kesim <oec@codeblau.de>
Date:   Tue, 27 Oct 2026 12:40:32 +0100

[exchange] v45: refresh commitment covers the transfer public keys (#11862)

Also corrects the list of the commitment's inputs.

Diffstat:
Mcore/api-common.rst | 39+++++++++++++++++++++++----------------
Mcore/api-exchange.rst | 7++++++-
Mcore/exchange/post-melt.rst | 6++++++
3 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/core/api-common.rst b/core/api-common.rst @@ -1577,23 +1577,30 @@ within the struct TALER_RefreshCommitmentP { /** - * @since vDOLDPLUS - * Hash over: - * 1. master_refresh_seed - * 2. kappa * n tranfer public keys, depths first: [0..n),...,[0..n) - * 3. hash over all pairs of R-values (for CS) if present, skipped otherwise - * 4. n denomination hashes, in order - * 5. amount with fee - * 6. kappa*n planchets, depths first: [0..n),...,[0..n) + * SHA-512 hash over the concatenation of: + * 1. the refresh_seed of the /melt request (64 bytes), + * 2. @since v45 (ignored for earlier protocol versions, see below): + * the kappa * n transfer public keys of the /melt request + * (32 bytes each), batch by batch: + * [0][0..n), [1][0..n), ..., [kappa-1][0..n), + * 3. the blinding_seed of the /melt request (32 bytes) if one + * of the fresh coins is of a Clause-Schnorr denomination, + * otherwise 32 zero bytes, + * 4. the public key of the old coin (32 bytes), + * 5. the amount with fee, as `TALER_AmountNBO`, + * 6. kappa `TALER_HashPlanchetsP` (64 bytes each), one for each + * batch k = 0..kappa-1, over the n `TALER_BlindedCoinHashP` + * of the fresh coin candidates of the batch. * - * @since v27 - * @deprecated vDOLDPLUS - * Hash over: - * 1. refresh_seed - * 2. hash over all pairs of R-values if present, skipped otherwise - * 3. n denomination hashes, in order - * 4. amount with fee - * 5. kappa * n planchets, depths first: [0..n),...,[0..n) + * Clients MUST include step 2 if the exchange announces protocol + * v45 or later in /config and /keys, and MUST NOT include it for + * exchanges of earlier protocol versions, which do not accept the + * transfer public keys in the commitment (even though clients + * since v32 send them in the /melt request). + * + * For compatibility with older clients, exchanges since v45 also + * accept the commitment without step 2. A later protocol version + * will stop accepting it for new melts. */ struct GNUNET_HashCode session_hash; }; diff --git a/core/api-exchange.rst b/core/api-exchange.rst @@ -30,7 +30,7 @@ defines all specific terms used in this section. Version History --------------- -The currently implemented protocol version is **v42**. +The currently implemented protocol version is **v45**. * Wallet-core is currently targeting **vXX**. * The merchant is currently targeting **v34**. @@ -77,6 +77,11 @@ The currently implemented protocol version is **v42**. codes ``TALER_EC_EXCHANGE_PURSE_CREATE_EXPIRATION_TOO_LATE``, ``TALER_EC_EXCHANGE_RESERVES_PURSE_EXPIRATION_TOO_LATE`` and ``TALER_EC_EXCHANGE_PURSE_DENOMINATION_LEGAL_EXPIRES_TOO_SOON`` +* ``v45``: the refresh commitment :ref:`TALER_RefreshCommitmentP <TALER_RefreshCommitmentP>` now includes + the transfer public keys of the :http:post:`/melt </melt>` + request; clients must include them with exchanges of v45 or + later. The exchange still accepts the commitment without + them from older clients. **Upcoming versions:** diff --git a/core/exchange/post-melt.rst b/core/exchange/post-melt.rst @@ -12,6 +12,12 @@ This endpoint was introduced in this form in protocol **v32**. + Since protocol **v45**, the commitment + :ref:`TALER_RefreshCommitmentP <TALER_RefreshCommitmentP>` over which + ``confirm_sig`` is made includes the ``transfer_pubs``. For + compatibility with older clients, the exchange also accepts a + ``confirm_sig`` over the commitment without them. + :http:statuscode:`200 OK`: The request was successful. The response body is `MeltResponse` in this case. :http:statuscode:`400 Bad Request`: