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:
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`: