lsd0009

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

commit 60c24937724c0e1052578627bf80dc74b8b44121
parent 6abdd47e4288407560eb1a3f17a70487315ef09b
Author: Mikolai Gütschow <mikolai.guetschow@tu-dresden.de>
Date:   Fri,  8 May 2026 13:43:10 +0200

protocol/payment: rename timestamps

Diffstat:
Mdraft-guetschow-taler-protocol.md | 307++++---------------------------------------------------------------------------
Mdraft-guetschow-taler-protocol.xml | 1002++++++++++++++++++++++++++++++++++++++++---------------------------------------
Atest-vectors/test-case-1.md | 281+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 799 insertions(+), 791 deletions(-)

diff --git a/draft-guetschow-taler-protocol.md b/draft-guetschow-taler-protocol.md @@ -757,8 +757,8 @@ Knows ⟨coinᵢ⟩ Knows merchant.priv Knows exchange. | | | (E1) deposit check | | | +--------------------+ | | | - | |<- (timestamp, exchange.pub, -| - | | sig) | + | |<------ (time_deposit, -------| + | | exchange.pub, sig) | | | | | +---------------------------+ | | | (M4) deposit verification | | @@ -799,7 +799,8 @@ or proving the payment without resorting to the individual coins. Check order.token? == token? h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64) -determine timestamp, refund_deadline, wire_deadline +timestamp = now() +determine refund_deadline, wire_deadline from timestamp contract = (order.{id,price,info,token?}, exchange, h_wire, timestamp, refund_deadline, wire_deadline) contract.nonce = nonce.pub Persist contract @@ -823,7 +824,7 @@ for i in 0..n: msgᵢ = Gen-Msg(WALLET_COIN_DEPOSIT, ( h_contract | uint256(0x0) | uint512(0x0) | contract.h_wire | coinᵢ.h_denom - | contract.timestamp | contract.refund_deadline + | timestamp | contract.refund_deadline | contributionᵢ + denomᵢ.fee_deposit | denomᵢ.fee_deposit | merchant.pub | uint512(0x0) )) sigᵢ = Ed25519-Sign(coinᵢ.priv, msgᵢ) @@ -844,6 +845,9 @@ msg = Gen-Msg(MERCHANT_CONTRACT, h_contract) sig = Ed25519-Sign(merchant.priv, msg) ~~~ +TODO: what about wire_fees, those should be checked for as well, or do we just assume merchant will pay those? +see src/backend/taler-merchant-httpd_post-orders-ORDER_ID-pay.c:2760 + ~~~ (E1) deposit check (exchange) @@ -864,10 +868,10 @@ for i in 0..n: Check-Subtract(coinᵢ.value, total) Persist deposit-record schedule bank transfer to payto -timestamp = now() +time_deposit = now() msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT, ( h_contract | h_wire | uint512(0x0) - | timestamp | info.time.wire_deadline + | time_deposit | info.time.wire_deadline | info.time.refund_deadline | Sum ⟨depositᵢ.contribution⟩ | SHA-512( ⟨depositᵢ.sig⟩ ) | merchant.pub )) @@ -880,7 +884,7 @@ sig = Ed25519-Sign(exchange.priv, msg) h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64) msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT, ( h_contract | h_wire | uint512(0x0) - | timestamp | contract.wire_deadline + | time_deposit | contract.wire_deadline | contract.refund_deadline | Sum ⟨depositᵢ.contribution⟩ | SHA-512( ⟨depositᵢ.sig⟩ ) | merchant.pub )) @@ -1398,7 +1402,7 @@ They are generated by going through the protocol operations in the following ord 1. Withdraw two coins `coin₀` and `coin₁` from a single `reserve` (cf. {{withdraw}}). 2. Pay for one `order` with the full value of `coin₀` and a partial value of `coin₁` (cf. {{payment}}). -3. Obtain a partial refund for `coin₀` used to pay for the `order` (cf. {{refund}}). +3. Obtain a partial refund on `coin₀` used to pay for the `order` (cf. {{refund}}). 4. Refresh the now-dirty `coin₁` to two new coins `coin₂` and `coin₃` (cf. {{refresh}}). 5. Regenerate `coin₂` and `coin₃` with the knowledge of `coin₁` (cf. {{link}}). 6. Create an `account` for w2w transfers (cf. {{w2w-account}}). @@ -1407,7 +1411,7 @@ They are generated by going through the protocol operations in the following ord 9. Recoup the value of `coin₅` obtained via withdrawal from `account` (cf. {{withdraw-recoup}}). 10. Recoup the value of `coin₃` obtained via refresh from `coin₁` (cf. {{refresh-recoup}}). -// todo: sending full coins only works without fees, should we set fees to zero? +// todo: p2p sending full coins only works without fees, should we set fees to zero? The test vectors in this document have been generated by the GNU Taler reference implementation written in C. All binary data is provided in hexadecimal notation. @@ -1415,290 +1419,7 @@ Big numbers for RSA are represented in big-endian byte order (most significant b ## Test Case 1 -~~~ -exchange.master_pub = 3cb5e9823db2b335fdb3f284ae960e56be8b081c6819b8b0217f38b095 - b4313b -exchange.priv = 1bf4149fa644b3c7f2bf02da4703ff2de3fa160dce0c750eabfa0f7ac70a2442 -exchange.pub = 4c130aae3246831808a162e2d4330de394e5f0d7dff75a80f3fa045b1a43eabb -exchange.url = https://exchange.taler.example.org/ -denom₀.pub.n = ba42b9e75e48847bab175ed4797384d68a430fd849a914aa68438349743b2728 - d9ca97709c15d5c81c7d9d11c84ec9c60cec03aed4b36ad153768eb30cf98454 - 74e97ee9d7475ebc926d87135d56926b7df1cea3ec38897a74bc3e245e59ffa7 - 6e5aff2c2f2eb84e7133a879f4229221f91c7bddf96088e4020e16444d94acc3 - 0708069f4a1bde3dcbead32e3916a9f6722adb3d63bb9075dde49258fbd28a9a - 09251fa08b64faee53a506b9f637136c72af7382b9243fa8996ad4d72cc1b05c - fb45271cb3187b4eeec0b5f9e847cdcc0c3ddef9787164a1aee7e4e1ee6de1b9 - 5282c1ff646aa70aabd1df0003f75d3585e9e740916cee4f7bca0cd82f72104d -denom₀.pub.e = 010001 -denom₀.priv.d = 07bc432fbc6eeb0f9ec2a4f5d2886d65228f57ee5ddac788af355493bd9fc247 - d449b161e41d95080f44d93bd6938d162c4db5f6720f7479768ba73000f330df - 780e856e8d3a01d1778c546e85b3157820de24bc9290238782271a3694f38c66 - 45f3420331ff70f8930377f4fea25beaccc775ce796f9ca7c97d0fc82ce7a688 - 0dd437e6b30695ca51a58f0239aef7481932550ce61b5b085313cb888c893cc1 - bbef6b47c607e1189f8cccb04eeb9f87b9e53f414850f8b923ce83e2859c0434 - a3d14d861e864fd5ce701af11611398a73515b7056b2828e564cdec6052bdbb4 - 3ff435178577198de0676e5d378ade9b31844e81e2218ba3b3aec5bff9a26621 -denom₀.hash = 8653090e3f3f5efac9770a5dd0c97813940c191c9fa1713367f8bb1279b1e3d2 - 7f32d16ea7699501e5fc4d176725d76ab0307f9bdf9d0d263c2256a7f1c63143 -denom₀.value = KUDOS:5.12 -denom₀.fee_withdraw = KUDOS:0.01 -denom₀.fee_deposit = KUDOS:0.01 -denom₀.fee_refresh = KUDOS:0.01 -denom₀.fee_refund = KUDOS:0.01 -denom₁.pub.n = d5455fb79449df7bf548e384d5201d75f4f7697ef9b8051eb8536f66783e70ca - 2d524fefa6840c1f87d9d881486815d5ace866a32269b05bdba7ff6024811c19 - 456026b0a59da4db96f58729d286c90be8cd9cbf575d346202b43282d601b575 - 1ff77a88a0742a692349a0e3fa8ed5518fc5378fcf434929b541c942573abef3 - 10b87776e976e81cf650a04399fabddbde677163918250c4d45f5e90ee7539de - 500a8e915be1d5f17d79cb9585ccdf5dba42ef53c24eae7d7c93c4e0a4327882 - 45b7c76a587f0ac6889d30389531362d51c2ad65cb1e28b4ad4cc97fcd2a4aed - d6612ae8888eb2dbc4de0cf30f46a43b76cc8c3245eefe013195a237f02d13b5 -denom₁.pub.e = 010001 -denom₁.priv.d = 5a520e0e663bbeecf55d5015d258ce8145247ec62aa5d76d422cfbb1cedccad1 - a4ce06527d17d1368d47221ce678463eff02516d6746914ce5c2c9318364366d - 31675e1b539866d8249f89059a4640e0cd503ec0fe13d7fa6620c07f8e789ccb - a4a51f7cbb4f5722bdb211f45b09a0a7f11659c88ac37939b3accfba4bccf24e - a260e21aaec0dfbf857178438986e963e9e356277c3badc34fc91b705d9956b4 - bedc0947d65924d7dd31e564de798eb06837380caed6813d3761d119901c5540 - eb74c3cb674fdfd64b67d78ebd40de0cafd53c038a0a8e87890b953b8b94a977 - 1a6efb3142ca02db873053f8d1de2082db4366fc072aafc723c036a2fb999605 -denom₁.hash = 1de6052bce12feaa2d26e3bba1789b0c2295028279f3eaff8e1345448ba05390 - cff49656ed72a1f7ef6ee2c4a80f80eefa0d0f906e74305b0215c4194ab1c7b8 -denom₁.value = KUDOS:2.56 -denom₁.fee_withdraw = KUDOS:0.01 -denom₁.fee_deposit = KUDOS:0.01 -denom₁.fee_refresh = KUDOS:0.01 -denom₁.fee_refund = KUDOS:0.01 -denom₂.pub.n = d1320993658042f995f09ed66ad2283e457a1f44cad96f1cf5a6299ac93d6172 - 4a7448d70e56a38666ec66352a5810ca3e544d957dedb5789e135589fcb8b139 - c65a2f70d7c421dfd4e27cf38d463074d286730be23d446fc07811519b068346 - b28b86b94acff35524eb62436852714c92f03b0bac21bb6bf727734be7871b70 - 2f928c3ced4bad9ba2d49cec6a86d1019181c65c16abf7b391f103c90c3eaaaa - 9d5298a4a60c71bdaf0f08246327a62399bf4c424c1ed7718cb5df178daa9710 - ec9d098e99ed0456de2fbaf7865ba47931c52d1cac78cacc1bc451782587487a - 6189addfe5dcdf6f190f28816707e3d1e104b5a1f7a570b75c1951588f3289ef -denom₂.pub.e = 010001 -denom₂.priv.d = 311849a8066faa083218b4e6444e8af44650e94ab7427d31b232eb5bb0b3cf8d - 478cefd54cbfa783f0deb503f02a97d226fb98f3a708a508a82c886c285bddf7 - dda5a7b19769a7bb84961cd5f9c749b2f8ff65bb99be6033cbdb41d1418d2f3c - e5c519fa9d649d4a53ae4c32dea64e81b6905b831b44155cbab5cef8b6defde0 - 9295662cdf2189f2763ede05bea0acb707b9b6b087dcebb9ca81f1c2785d6560 - f93bf1a1860676cccceb079c22b48b9fdef68e1d286164f132ffddeab29fa7a7 - 04e1bc3f9f5e28c39675f17136aed8542aa4470a14a7380a4016b21d43ef5b9e - 2b241ced017c54247c12fd6beccb7bd356820b0246553c751b3e071468c2efdd -denom₂.hash = 4f8c487d21ffb5bb7571f5d66bcf6f93f4f5c043df5483669383128700064e86 - 37afecd6029cb36dfc5a60d20ff3112ff1b5ad1b53c78cf39ad13cd2531ba24e -denom₂.value = KUDOS:0.16 -denom₂.fee_withdraw = KUDOS:0.01 -denom₂.fee_deposit = KUDOS:0.01 -denom₂.fee_refresh = KUDOS:0.01 -denom₂.fee_refund = KUDOS:0.01 -denom₃.pub.n = bddb1806b7b7663d94bedbeccbb515987fcae457b5920d85b8485edac6ab0e73 - e6991780e9f1fa6f88e500e0ccd9eeb80d8e3b66289a7cf1b25bd56d05081d58 - 3864ad225a36f8d38391782a85bfe320d439443e8ea19f555edb36fcb58af81c - a5168ca7c42dda68f191bd1587b4da27703384f2aad300a043549c67fc6defd9 - 8bd1074b3bab1bc0d89b87d81f8a1f555a3b4ce2b4ca7b0b1d8f446fa93258db - 511cc3bc2ff62871cb4c746f6806d0b839db8cc560da06eb5619d9d42309a771 - 61373708db18e453ff0a1d6f63281c54ffacada7c8bf5ca7281ffe7e2e5be03f - c006c064d820f719e672429628837399a565dd9d70f6e9ed91e1eb0567978015 -denom₃.pub.e = 010001 -denom₃.priv.d = 1e3370867d0a0d1705b18e0d848d73f7d422f920e4aec23cea7184b9463a26c1 - e9704d4cacaa5952b8683eb403e78a5c628cfa1b9da0e44d9462f1b7f66c1c88 - 3b419f484ed3de257e113c1828e4e5e3592f1a3bddf78d7f88927ee99892c336 - 2ca2c226dbd90971d68a54404d069d5f5704b304e131fb3058959338781a2039 - 93804f64def2980210dc3f4e77c1207400e922032952cb154bb1b776d164cce6 - 9e418844f2f4b20850c0a23d30059362edadfe00fbfa04b6833fc4606deda441 - eb345c49b52d91063da7c55ecea7b32e99a49a823264955803ce3ee220a2cc64 - cd4321e18ae28bb1071c7746e8a3d69adef5113e21a01cab6809668793c2a94f -denom₃.hash = 96524d30b4398d0d5bbe2eff902c4df1cc8286629d149bee0530edcfb361c468 - ea5fdb1b41d538223c8b3fe1a974951bb3290bbfffc6f10cbf0326585041ca4d -denom₃.value = KUDOS:0.08 -denom₃.fee_withdraw = KUDOS:0.01 -denom₃.fee_deposit = KUDOS:0.01 -denom₃.fee_refresh = KUDOS:0.01 -denom₃.fee_refund = KUDOS:0.01 -merchant.priv = 7607240acc4563ebe2e38e76eaf61d74160d71c9a6670ae2e5147ce848767037 -merchant.pub = f54d646619723f7fa2ce79267953fdd8654cfcd0f2cfc0c5e880e3e0d0ab19f0 -merchant.url = https://merchant.taler.example.org/ -merchant.payto = payto://x-taler-bank/bank.taler.example.org/merchant -~~~ - - -### Withdrawal {#tc1-withdraw} - -~~~ -(W1) reserve key generation (wallet) - -reserve.priv = d9641dab5c7f2474573871c25cae2f6c8924ace4157a56d128b1432e55a6c6ba -reserve.pub = ec8ad5e4c6abcf4d0d597f0066a0e3ea0370d221973e06e73f4287148cb93c38 -~~~ -~~~ -(W2) coin generation and blinding (wallet) - -batch_seed = 466431296486ed9cd71fc207254820a2c4a85aeb0b2041494f8bf1f8cd30f113 -coin_seed₀ = 88899daa409b8c4c4a91c8e39030d247d00b292eff952e36067fbe33f2d7ce48 -coin_seed₁ = f5be0b8790719072c7043c257f2c114cd8cb45ea5d98c4aa25d9025f45f1caeb -blind_secret₀ = a3cbe2b0babf5bdfb98f45804acf63225c16e09be1677f705393df3f5de98ebf -blind_secret₁ = 8ea6335ed3ff8a41f9fae95e9fd87382be402d6c26ef972381dee6b3c1e9d775 -coin₀.priv = a5a38bb23a9f36564f9d4e566cdd7e3521b04f8ea4175da726ac4e3ac540b485 -coin₁.priv = ae98c5207fe31e20a7b7a8677b780c6735ce69df32d3085d504010f23c59064a -coin₀.pub = afbdf99f1a794add25bad59c9a3f442714e166adc99c57db991947669a36b185 -coin₁.pub = aa7118596b1adf89543e9afcf2925e516a782eed9d75c8abc4a470e7efdd7fe4 -planchet₀ = 64ede0cf40a952b95af4b09b22c6fd27a1ff6d0ae3920ea03fe14a8b547f1e14 - a2eea98443e7aa092075f6585103fb06c1d68fb4616bf33ae30a207e51840f1a - e655a734184a73d804df42650ce296954c9b61e249486468f7fda8a74f85ec6c - cdb34a66819fbeaf846b10087ffaf8e734428a907b96c6a112f8f943b3a8d554 - 55c01b0daf55456acf0715874ff90fba45b265e2021a70997100fb18bfbef822 - c8475820b4855f141730751bcfad2e7eb46dd6c6a400a8a6a98486c4a2bce4d3 - 407a0d0ba612faebb49428ba3a1986eddadb04b6790fbb7bd27cc0bd98341c60 - ec5b980275202aedd4b0cf3b7ee1732c67c84db4b30b60b551cbf849222c60e1 -planchet₁ = 41f8a6622c99b6a9c30d52d19fc2c20a39a481219de4b0f3e7f604efed5d9625 - 54ea13255785d10a037e14abd75d80a0aa9861df9d80a051c418ff197e68bd0e - ee61e6fd5d3214633734659e8bbd7dd2fe566bd41c537a5759bad9bbca6b2eb7 - e3217e7d3cbefff192d83bd0527dbe0eff56df0b2e2062670d2873ca7766a7c1 - 255e6fcf2c37e95de19fcad244f3986bab45c0a3aca726fc682455ea1166a238 - 9152d7a67d181f035de6bdb97633888f0594c2f63dd3965134372507faf84f75 - 3759abd662d4c7e8df7e01149ff44da3499ed49406d9398e86c4abf12a1f57f3 - 8002115ef7283e4d5422b41c752a0cce8c2c1a9b84e109b4554fc1150ef578b9 -h_planchet₀ = 888da42dbf4897a5d6d9420b827e340c74c0b0e973e140ad1c7b9abfc400a9ec - 5a86b3185e4c656dbe8e01125604616de83fa28910fae513d016f56c3ca94eb4 -h_planchet₁ = f20015bbe0147313e59f9e64ee9e836c192b5d504dbd3328fcfce41fbe9310d6 - aa96d91fdd77599c122cc5390ad7cb86d2c6d4261bd5950e7ec0f86959613841 -sig = 2ae0027dd4a196c4741d60e3e7ff933d7374fa5534d15f1cc2e96e9ab3392894 - c65ab6a0af31ccdb395db5c526770077642502e27d4619d385a91dd13854e706 -~~~ -~~~ -(E1) coin issuance and signing (exchange) - -total = KUDOS:7.7 -blind_sig₀ = 139af4e7e7f6e9e0391e22f78cb0b2c334e6d6667633a192f56fde38ac9feec7 - 841be59b2aa993084c50f70dfd9673dc723eec9d84c28ebd5f8104d1b0b29cf1 - 18cd64cbe33925524a3363a1a6f24f59d47a404cf74680eee97cdeb8cc44a0b8 - 4f3db4496d9bed1224c0fbda64d40f84ef5447d764fb714ca8e72a23a882e749 - e47a519310f6d87b3e8ddc3e4ac4e541cdbfe7550c92f41c511b544d9fbdc2a7 - 296b958e9df0b1394210aef4f1a780a129883d4bcb45425eef96204a7eaa9daa - 7d21827ecbf4571cefe6dbe65314e61c688175c1e81e01d4f0377c9c2312b6cc - 3487f2dd2cf8d85efde346f4d1a12de70bec4038b0bea0c505087c0e67ce4694 -blind_sig₁ = 89649cf83e2ba2cd75c7a1d01809c33d5d02fec81649256215f13a8965ad37d8 - d47c264668ec187e46d75210ce601362fbb15f61a24ec1d337dd2589b5a4ee0e - 77a8d9734aca6a149b9f9b3a78c158b1f8cb243b8cbe9c2212290e8bc731d023 - 82463f3e1cf0fc86c5472b8c96c5eaeac9c9064fdf7411f97935f27fd0bf8820 - 0440c7cc3e6960c5c5156aedb5a820077be08f1ac4b00780258d7b843b21d7ba - f2d969d1b3c77a08b4fe14b216fe78c7e4c0ae964fc06bf3dfe7ff20ec85fa4d - 5e5aec24d89848645ffadb0de3da80c6e41b96571ef28e3d132b7c3fd16a289e - 32389cffb653b4744fabf882342f0db9aef110351d8ffd7a3b86701f0f5034c8 -~~~ -~~~ -(W3) coin unblinding (wallet) - -coin₀.sig = 9303650b8896b6619ca061f4bf44c1b02fb60784a2659de7512b599e7e6524ad - 5a283c81d289d3ec75fc81e7f336bd41dd67a41b72a98d9171f0461c188535b5 - 55019079a18b4491903797f62a034e5f277ce8f7f3f56fbe47e44113561fd414 - c841c2da97da1ae92df0e2cfbe3c26ad37f8bab9bd71365ac536204cda7c21dc - 39891b5cbb4e213f75d4e09c248a7a59f6322fd011619b29ec25ad621dfa2d6f - ae9f8b91935caf54d0d30f4a03bf6beed6637a4054efbad7a41f9da434f07cfd - 2f7619e8a3c82b30e079ff9fe13fc023fba7d627f4fb21e14467ce1db2776783 - 1eb1c3ad5c39f61437a0a70c300fd84cd9280474bb507768a868ea92fa905428 -coin₁.sig = 355aa5b6bf10591375f22a014640cd242f470834759fab4421b4d237a149bc3e - 5fbc8f073e1348da770983cd36df9cf72a30bfe55776744b2d787acb06ba25cc - def36e5269771fe4a38a1109e8b96437a3cc625003f7fdf4d0cc879335584c5b - 13f2b29be1ea4d8a2da7826d608179d98b5edb11261e2048fbbba217a52ae862 - d1e78e30c0787ee40908f1bca708c434d5412a262eca6bcd0ac5890bfbbe7df6 - d69a5544d0054716dfda47791546c177223606c0645858a15b36887619a9d70a - 515f42897758bbe181765d7184cc92b5e2d743df1db9b30394b697117ad24811 - 812febe0a3c57cbb5cf7f6857378f57cd1149f745ed95fd1d342e9860f516469 -~~~ - -### Payment and Deposit {#tc1-payment} - -~~~ -(M1) order generation (merchant) - -wire_salt = 4c5249caea865380e0e519fc38177686 -order.id = ORDER-40 -order.price = KUDOS:7.42 -~~~ -~~~ -(W1) nonce generation (wallet) - -nonce.pub = 6729d69abd7d8218e02c953317b46bba2522efc2c19a7da63194e9ef40fcbd0d -~~~ -~~~ -(M2) contract generation (merchant) - -h_wire = ec4e7258747a4de49628a27907b74f0aad097cfafaa595320f81786375430b67 - ae1ada754299bbc0472f5a1e8bae6fe8e5dc52683dd09490ff06fb2fa4f20ec2 -merchant_time = Sat Feb 14 13:37:42 2026 -pay_deadline = Sat Feb 14 14:07:42 2026 -refund_deadline = Sun Feb 15 13:37:42 2026 -wire_deadline = Mon Feb 16 13:37:42 2026 -contract = { - "version": 0, - "summary": "Free Software Support", - "order_id": "ORDER-40", - "products": [], - "timestamp": { - "t_s": 1771076262 - }, - "refund_deadline": { - "t_s": 1771162662 - }, - "pay_deadline": { - "t_s": 1771078062 - }, - "wire_transfer_deadline": { - "t_s": 1771249062 - }, - "merchant_pub": "YN6P8SGSE8ZQZ8PEF4K7JMZXV1JMSZ6GYB7W1HF8G3HY1M5B37R0", - "merchant_base_url": "https://merchant.taler.example.org/", - "merchant": { - "name": "Taler Merchant" - }, - "h_wire": "XH774P3MF96Y95H8M9WGFDTF1APGJZ7TZAJSACGFG5W66XA31DKTW6PTEN19KEY08WQNM7MBNSQYHSEWA9M3VM4MJ3ZGDYSFMKS0XGG", - "wire_method": "XXXX", - "exchanges": [ - { - "url": "https://exchange.taler.example.org/", - "priority": 1024, - "master_pub": "7JTYK0HXPASKBZDKYA2AX5GEATZ8P20WD0CVHC11FWWB15DM64XG" - } - ], - "nonce": "CWMXD6NXFP11HR1CJMSHFD3BQ8JJ5VY2R6D7V9HHJKMYYG7WQM6G", - "amount": "KUDOS:7.42", - "max_fee": "KUDOS:0.01" -} -h_contract = cc934a29efa612754edba0453d1b0ba175d6830d3ec2b2839a9a539d845a5da4 - 622498e3819cb49206810688a93de1989c6542d2cf1d71f64dc998193e76d535 -sig = c249ee766b4dd256560d48b367d05a41cf7169306247ec56c51c39412b34c110 - 15e365c2b2836761ba020b7175e60870572a6c7f780eeabb6f0777783064d602 -~~~ -~~~ -(W2) payment preparation (wallet) - -contribution₀ = KUDOS:5.12 -contribution₁ = KUDOS:2.3 -sig₀ = 1799394abc575b6b69a071949742fed8cd076c70403dbcfa0ae3baaf0afc0983 - 7b1b301b95cf37c1407566b75c9ae1f79ec7a7d67fbea81315e4f30b83067a0c -sig₁ = c4569c0ab233aa265809dc9481740663a5310c5887f96f28872fcca81851e66a - ca66c65696e226aaf18752a02319278a7bd18f3fb203477a88d28b8e5061bf03 -~~~ -~~~ -(M3) deposit preparation (merchant) - -~~~ -~~~ -(E1) deposit check (exchange) - -exchange_time = Sat Feb 14 13:45:44 2026 -sig = d5012923d92fdd984109eadd60234953d6bb5b1bd3695a402ad32a155e3f3661 - ffe6dde8bbb0d7ee58342b8a0a3296e5eaa8e34655360e6138b7d7fda4eeec09 -~~~ -~~~ -(M2) deposit verification (merchant) - -sig = e66d503c843d72da4b6eb95f872396449de25cbf80b9c243d8c9ed2bde533d24 - 60542c685bfdbf2eabc755510a60b97ed289711fd3f353cd80aa791e2e2f1e0d -~~~ +{::include ./test-vectors/test-case-1.md} ### Refund {#tc1-refund} 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="May" day="07"/> + <date year="2026" month="May" day="08"/> <workgroup>independent</workgroup> <keyword>taler</keyword> <keyword>cryptography</keyword> @@ -719,8 +719,8 @@ Knows ⟨coinᵢ⟩ Knows merchant.priv Knows exchange. | | | (E1) deposit check | | | +--------------------+ | | | - | |<- (timestamp, exchange.pub, -| - | | sig) | + | |<------ (time_deposit, -------| + | | exchange.pub, sig) | | | | | +---------------------------+ | | | (M4) deposit verification | | @@ -756,7 +756,8 @@ or proving the payment without resorting to the individual coins.</t> Check order.token? == token? h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64) -determine timestamp, refund_deadline, wire_deadline +timestamp = now() +determine refund_deadline, wire_deadline from timestamp contract = (order.{id,price,info,token?}, exchange, h_wire, timestamp, refund_deadline, wire_deadline) contract.nonce = nonce.pub Persist contract @@ -779,7 +780,7 @@ for i in 0..n: msgᵢ = Gen-Msg(WALLET_COIN_DEPOSIT, ( h_contract | uint256(0x0) | uint512(0x0) | contract.h_wire | coinᵢ.h_denom - | contract.timestamp | contract.refund_deadline + | timestamp | contract.refund_deadline | contributionᵢ + denomᵢ.fee_deposit | denomᵢ.fee_deposit | merchant.pub | uint512(0x0) )) sigᵢ = Ed25519-Sign(coinᵢ.priv, msgᵢ) @@ -797,6 +798,8 @@ h_contract = SHA-512(canonicalJSON(contract)) msg = Gen-Msg(MERCHANT_CONTRACT, h_contract) sig = Ed25519-Sign(merchant.priv, msg) ]]></artwork> + <t>TODO: what about wire_fees, those should be checked for as well, or do we just assume merchant will pay those? +see src/backend/taler-merchant-httpd_post-orders-ORDER_ID-pay.c:2760</t> <artwork><![CDATA[ (E1) deposit check (exchange) @@ -817,10 +820,10 @@ for i in 0..n: Check-Subtract(coinᵢ.value, total) Persist deposit-record schedule bank transfer to payto -timestamp = now() +time_deposit = now() msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT, ( h_contract | h_wire | uint512(0x0) - | timestamp | info.time.wire_deadline + | time_deposit | info.time.wire_deadline | info.time.refund_deadline | Sum ⟨depositᵢ.contribution⟩ | SHA-512( ⟨depositᵢ.sig⟩ ) | merchant.pub )) @@ -832,7 +835,7 @@ sig = Ed25519-Sign(exchange.priv, msg) h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64) msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT, ( h_contract | h_wire | uint512(0x0) - | timestamp | contract.wire_deadline + | time_deposit | contract.wire_deadline | contract.refund_deadline | Sum ⟨depositᵢ.contribution⟩ | SHA-512( ⟨depositᵢ.sig⟩ ) | merchant.pub )) @@ -1351,7 +1354,7 @@ In Taler, interaction with exchange, therefore called wallet-to-wallet transacti <refcontent>National Institute of Standards and Technology (U.S.)</refcontent> </reference> </references> - <?line 1392?> + <?line 1396?> <section anchor="test-vectors"> <name>Test Vectors</name> @@ -1364,7 +1367,7 @@ They are generated by going through the protocol operations in the following ord <t>Pay for one <tt>order</tt> with the full value of <tt>coin₀</tt> and a partial value of <tt>coin₁</tt> (cf. <xref target="payment"/>).</t> </li> <li> - <t>Obtain a partial refund for <tt>coin₀</tt> used to pay for the <tt>order</tt> (cf. <xref target="refund"/>).</t> + <t>Obtain a partial refund on <tt>coin₀</tt> used to pay for the <tt>order</tt> (cf. <xref target="refund"/>).</t> </li> <li> <t>Refresh the now-dirty <tt>coin₁</tt> to two new coins <tt>coin₂</tt> and <tt>coin₃</tt> (cf. <xref target="refresh"/>).</t> @@ -1388,13 +1391,13 @@ They are generated by going through the protocol operations in the following ord <t>Recoup the value of <tt>coin₃</tt> obtained via refresh from <tt>coin₁</tt> (cf. <xref target="refresh-recoup"/>).</t> </li> </ol> - <t>// todo: sending full coins only works without fees, should we set fees to zero?</t> + <t>// todo: p2p sending full coins only works without fees, should we set fees to zero?</t> <t>The test vectors in this document have been generated by the GNU Taler reference implementation written in C. All binary data is provided in hexadecimal notation. Big numbers for RSA are represented in big-endian byte order (most significant byte first).</t> <section anchor="test-case-1"> <name>Test Case 1</name> - <artwork><![CDATA[ + <sourcecode type="pseudocode"><![CDATA[ exchange.master_pub = 3cb5e9823db2b335fdb3f284ae960e56be8b081c6819b8b0217f38b095 b4313b exchange.priv = 1bf4149fa644b3c7f2bf02da4703ff2de3fa160dce0c750eabfa0f7ac70a2442 @@ -1500,16 +1503,16 @@ merchant.priv = 7607240acc4563ebe2e38e76eaf61d74160d71c9a6670ae2e5147ce84876703 merchant.pub = f54d646619723f7fa2ce79267953fdd8654cfcd0f2cfc0c5e880e3e0d0ab19f0 merchant.url = https://merchant.taler.example.org/ merchant.payto = payto://x-taler-bank/bank.taler.example.org/merchant -]]></artwork> +]]></sourcecode> <section anchor="tc1-withdraw"> <name>Withdrawal</name> - <artwork><![CDATA[ + <sourcecode type="pseudocode"><![CDATA[ (W1) reserve key generation (wallet) reserve.priv = d9641dab5c7f2474573871c25cae2f6c8924ace4157a56d128b1432e55a6c6ba reserve.pub = ec8ad5e4c6abcf4d0d597f0066a0e3ea0370d221973e06e73f4287148cb93c38 -]]></artwork> - <artwork><![CDATA[ +]]></sourcecode> + <sourcecode type="pseudocode"><![CDATA[ (W2) coin generation and blinding (wallet) batch_seed = 466431296486ed9cd71fc207254820a2c4a85aeb0b2041494f8bf1f8cd30f113 @@ -1543,11 +1546,11 @@ h_planchet₁ = f20015bbe0147313e59f9e64ee9e836c192b5d504dbd3328fcfce41fbe931 aa96d91fdd77599c122cc5390ad7cb86d2c6d4261bd5950e7ec0f86959613841 sig = 2ae0027dd4a196c4741d60e3e7ff933d7374fa5534d15f1cc2e96e9ab3392894 c65ab6a0af31ccdb395db5c526770077642502e27d4619d385a91dd13854e706 -]]></artwork> - <artwork><![CDATA[ +]]></sourcecode> + <sourcecode type="pseudocode"><![CDATA[ (E1) coin issuance and signing (exchange) -total = KUDOS:7.7 +total = KUDOS:7.7 blind_sig₀ = 139af4e7e7f6e9e0391e22f78cb0b2c334e6d6667633a192f56fde38ac9feec7 841be59b2aa993084c50f70dfd9673dc723eec9d84c28ebd5f8104d1b0b29cf1 18cd64cbe33925524a3363a1a6f24f59d47a404cf74680eee97cdeb8cc44a0b8 @@ -1564,8 +1567,8 @@ blind_sig₁ = 89649cf83e2ba2cd75c7a1d01809c33d5d02fec81649256215f13a8965ad3 f2d969d1b3c77a08b4fe14b216fe78c7e4c0ae964fc06bf3dfe7ff20ec85fa4d 5e5aec24d89848645ffadb0de3da80c6e41b96571ef28e3d132b7c3fd16a289e 32389cffb653b4744fabf882342f0db9aef110351d8ffd7a3b86701f0f5034c8 -]]></artwork> - <artwork><![CDATA[ +]]></sourcecode> + <sourcecode type="pseudocode"><![CDATA[ (W3) coin unblinding (wallet) coin₀.sig = 9303650b8896b6619ca061f4bf44c1b02fb60784a2659de7512b599e7e6524ad @@ -1584,28 +1587,28 @@ coin₁.sig = 355aa5b6bf10591375f22a014640cd242f470834759fab4421b4d237a149b d69a5544d0054716dfda47791546c177223606c0645858a15b36887619a9d70a 515f42897758bbe181765d7184cc92b5e2d743df1db9b30394b697117ad24811 812febe0a3c57cbb5cf7f6857378f57cd1149f745ed95fd1d342e9860f516469 -]]></artwork> +]]></sourcecode> </section> <section anchor="tc1-payment"> <name>Payment and Deposit</name> - <artwork><![CDATA[ + <sourcecode type="pseudocode"><![CDATA[ (M1) order generation (merchant) wire_salt = 4c5249caea865380e0e519fc38177686 order.id = ORDER-40 order.price = KUDOS:7.42 -]]></artwork> - <artwork><![CDATA[ +]]></sourcecode> + <sourcecode type="pseudocode"><![CDATA[ (W1) nonce generation (wallet) nonce.pub = 6729d69abd7d8218e02c953317b46bba2522efc2c19a7da63194e9ef40fcbd0d -]]></artwork> - <artwork><![CDATA[ +]]></sourcecode> + <sourcecode type="pseudocode"><![CDATA[ (M2) contract generation (merchant) h_wire = ec4e7258747a4de49628a27907b74f0aad097cfafaa595320f81786375430b67 ae1ada754299bbc0472f5a1e8bae6fe8e5dc52683dd09490ff06fb2fa4f20ec2 -merchant_time = Sat Feb 14 13:37:42 2026 +timestamp = Sat Feb 14 13:37:42 2026 pay_deadline = Sat Feb 14 14:07:42 2026 refund_deadline = Sun Feb 15 13:37:42 2026 wire_deadline = Mon Feb 16 13:37:42 2026 @@ -1648,34 +1651,34 @@ h_contract = cc934a29efa612754edba0453d1b0ba175d6830d3ec2b2839a9a539d845a5da 622498e3819cb49206810688a93de1989c6542d2cf1d71f64dc998193e76d535 sig = c249ee766b4dd256560d48b367d05a41cf7169306247ec56c51c39412b34c110 15e365c2b2836761ba020b7175e60870572a6c7f780eeabb6f0777783064d602 -]]></artwork> - <artwork><![CDATA[ +]]></sourcecode> + <sourcecode type="pseudocode"><![CDATA[ (W2) payment preparation (wallet) contribution₀ = KUDOS:5.12 contribution₁ = KUDOS:2.3 -sig₀ = 1799394abc575b6b69a071949742fed8cd076c70403dbcfa0ae3baaf0afc0983 - 7b1b301b95cf37c1407566b75c9ae1f79ec7a7d67fbea81315e4f30b83067a0c -sig₁ = c4569c0ab233aa265809dc9481740663a5310c5887f96f28872fcca81851e66a - ca66c65696e226aaf18752a02319278a7bd18f3fb203477a88d28b8e5061bf03 -]]></artwork> - <artwork><![CDATA[ +sig₀ = 8876dce4ca504df355f17c783e8327ea29b2cbcd7dde608b473644af3580621d + 3eb429022f6d1c4937328db478c6ed9784f6788e2e18dc16927efd4bc9c10908 +sig₁ = 031283a02cb413308cea4b69bd3d1b7beef87be7788fcfc1d7b83f8d97cd4ede + 218d0f753ba8fc92e22415a66065f5c1dff402368de8e85eca0c0ac7358e3602 +]]></sourcecode> + <sourcecode type="pseudocode"><![CDATA[ (M3) deposit preparation (merchant) -]]></artwork> - <artwork><![CDATA[ +]]></sourcecode> + <sourcecode type="pseudocode"><![CDATA[ (E1) deposit check (exchange) -exchange_time = Sat Feb 14 13:45:44 2026 -sig = d5012923d92fdd984109eadd60234953d6bb5b1bd3695a402ad32a155e3f3661 - ffe6dde8bbb0d7ee58342b8a0a3296e5eaa8e34655360e6138b7d7fda4eeec09 -]]></artwork> - <artwork><![CDATA[ +time_exchange = Sat Feb 14 13:37:44 2026 +sig = 09338dd4b1e692431290355b7df62d627a894718db68cf4a8e083bfed7b6c98a + 0dde3c5724f3cb3db0e6737f57c9eb35136997eaf403f27f82c0a9f1cf27d308 +]]></sourcecode> + <sourcecode type="pseudocode"><![CDATA[ (M2) deposit verification (merchant) sig = e66d503c843d72da4b6eb95f872396449de25cbf80b9c243d8c9ed2bde533d24 60542c685bfdbf2eabc755510a60b97ed289711fd3f353cd80aa791e2e2f1e0d -]]></artwork> +]]></sourcecode> </section> <section anchor="tc1-refund"> <name>Refund</name> @@ -1717,460 +1720,463 @@ Education and Research (BMBF) within the project Concrete Contracts.</t> </section> </back> <!-- ##markdown-source: -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 -hIaOSubYE9F0tFAl9XTzB3Al3Q/SKrbpo7ne0Bmt1QlWfeuaNWsTxFBOY+0w -TNnaskc7ZHR2TiWZ1BYOyvNQ3ltlftj4SpN6ZYPJsPdw8prWjdWxZNxmj5t7 -UYqlKoHXJ+2+kpQmwvguyqnZgaKJo2qw9MaS3Z4cM0qfnlM7A85URf6SKsDn -zp3l2KYW71Bm3tZuzcxit2mNclBm5RqdUZu0FZSOUDM7aKaNTOlEnfUyN5vl -TVEi5bNflWKpEljleD604rIhYGpKjE5ONwNH2iBlhOLilJht154qxptE0q5z -xzY0oHv1dgazvFtLXcP5zGSxHItTIZkA3aSRJ/tnrxrvQTOboQVRyaFJbDSL -YfUwd2/ey07VzdBKZhVFVyJpH+nVcKpxSgQH08ZUqP3ZyZePq4huZ3UV6vje -U6oJeHZ69OXjZ08Pj5410Vnnemcr+WcWPBt6tiFKqlXtZxxt5ypVGx6uLlOt -0tkQmlYCnn1598t9Uwcx0FBL17Cq3e3qwierp2af0wmEpTqw6AiSfiJH5ngL -SKWtO8mv6oz+a1ktYNCao10jsQezN/PhtAw8t+1Vy8CtXirCDd9Wwqck892O -mY2u+pfOMZu9vFvSYexkidbXl+yyT73Is7s6HlpzbY6npzbe6OW0lTVOKh8+ -vXvvyZcnj57tGqfVb3BuZTGyZ70WXSTpMGuS1eyM2n+/uuJUvVg9WWlc8+KK -7rXfaixA/MZpLTsaLFY93nUTl5vytjoHdahFtejYUqvmYvquoeSOWru2wRFZ -HPvUWxJmWoQzM3+3xp5d00+j7KoVdFXFc+shmNHnSgXkm+mIVnlasmZN+Ibo -d92EVyu5tqdhc8RKmg+c9nqOOt9B8dBp3HrbMKMtq7lmVd/pBoyP6Bun0MAH -vyTLuR7YNasg2p6umtaw4fPqizfzfpsWlWmXf5NJ5XhTCcW6+l1bR2FabZRR -qNX5ji5rudishD+zsdlqYyrZbBmZ+uomK2Pn/JPtSKe3ayzXWyuy26Stcn3v -b8l/pfzCPmu2Q5nii2rnnOE/LbfPRG8OKRfLEW3mbmwcUOCW5LdXk5Wc8uv+ -qgJW1YxQwPuPnh63mb7C8oqdTTqaSplu/rVh3yrPu7j7/XYb11Gb02aOLc5p -cb+78Ky10rpmTghbd2YPmpb5J+LnD8CPyup3seNaj/5zcqNT9dpZqxpobnAb -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 +4YZ8YThqR9Nk6VfjvFNZzPU+WryButhhqHfqwfxC1WY5tgpTU3rVIl2bx9dL +fDmmbFFJqFInCmfdIk9c+7Wjn98o8yu5E9uzyZ3YtMntrVmH5BWW58odUJbj +552Ha7MtH82KgVI7H9fZqb5uZ49G11jkORgxoJTBMZW3zmZUxXMXzy0up1JX +TdaFkHh4/4Ly33NgWKZ/A4a11yi5sVKupDNAVIFhC+VUhcJgSgGLXkWZ99rz +caquntJLBH9o7WUsz1iryk4lXWztI/hJaaOZHPPL7Z4qXSrIF4PkUxMIgpLl +2JQGUjrofDkWFPVclKMRHoMS9z05SLc2tKlwlf2zoiwYeJ6p8uSImdAjVSmU +VBNdYbi6FQCxF+dyLF/rjJiwlQq2pmnbBIJjWqyvuFgXho6dU81xkqeeKieM +w76+NNTLUQbrBr69bNlAd2xFqOfDaejblrStU53Je15CyxbsYorgYz+fT0ZL +qsioLq7NL/hg6WiURr5drSbp6fJQPpvAdKpriLQ5nvSyxB24Hv7nuO6u6zoH +h8fPT50+Pf/V44dfO3I64edbQ4Wv1bIW4mO9KHfqvr238u+0pm3u3FGMvjPs +/fZXg0Gdo9FJTVqmk9JWgipi+aL3TI60kP2YEUPFK0lrDvVH0Q4sZKgfDH6n +ZqYZSe6PRtYazltgoNY3UA/9UGtKzDmXjEpaTd2zEcsSD5V/ksSAHjNVQ3MN +UaqFRQDWGdQWcoVhz+RZSakpMmCXzv39x/tGgHvfIjAewyFWNDpP9Xvz7/pV +5ouNWbM+X/86qKzl3Fw5qa8MzxcXI7gk1e/scqiHNphJbUUNbXMzVsRKnuu6 +Jtq5L8eDo/mZHUC9WtGRnVdPNFyJvdIeM9qnMXeuYCh+wZr1qZB0aPi9dcXC +hnUiCOimI7moFzT60ItNLbT9Ca3sdnl4beiNFaACchp5wzBUU/p9vRRA6/xy +RCVyjeTDcyXaJP/M4XKmSubr0m5KlY3kgM3OdNl9neDW6S2mfDK4YhRNm1DK +oksSbgcBrA5uYcjx/rmc17XscDy0HFxn4XRJ566qw380xlgVSjy1C93SlKCe +VvUFr8ZUyM8INU5mpWPiaC0oppOqkrQqM6PWD5R5IMU91ZF4qUqETQP5ZDKS +sMNVRTOtAlS1z6f6NVpRIWzQo/0kDssns8V8Q4/OhBjyppxL6vsp7TSZL8zY +pvqveSOZaQdpavQnxCO6RL7KVkVj7r+cTF4tp6SkqmAXUHVWwprMqfThNWUc +Rpe2dQiQabS1kqYqfanF4+WFs1LLjOFpoEPxGuQBTCI61mqBHZLkpcLMBifY +WicLG95vEY9ILJq12HWTc3SuJ2tuq7ghlse0TKXKgmuRUxOkVlNVggTj00mX +89lkeXZOGvHuneV+VZhIBS/AwOPJRV8lVLacPbWTRedAjba4Dc3x6Hf16FAv +DqsWno7YGE5l0Z+aX7adjubqX6oGnEbT7lvVuG3CQeNKEgfHy1xXACnHAbSs +/gaKELp9La/aq/xur3Eb96w86buD1l2t9g65Ju0wdKV0tY8M6K5iWKNyO4ck +FWBvafblSK2v5zOpeK8RM0wAhaFgBMyhKvKG+ZUz+nXxX0zxt/JMGjmJkp3N +2IWjNloRxqx9NZuWC1X5cUWLnynz9SS3ru1wcKBKbQnXvkAvYsbwMsbzxvxh +Kg51i9U+C6q+d37nuARdSogUldHTb1bsSUxntBODVJKK32s/pZ5VQRk5L/uC +wvRmc4EmuccW0MR8qWCunhSjyrrLVtaauuDnMNSNdJ+SdVXfT1dMRxpfLIDQ +LbogUt/UIy8wN327gGHU3NKkyqKb7W/1LpYQGXI6JpcALcew0Y6hVWsvbOlk +VkNY7Q0oAyppbVdpH9mHmoxhY16rvVrP9788fHZytP/1ycGTh4+PdWE3kVRb +yL7QbDo4HqgNO7o+qWoKKEWa4eoEnAOVHwvweaoIOPj8WGu70/hnpv7af5ZL +Pe1z2ozf/Nra00NKXuCVlRosKPwN/33f+83gqn+/ueLN753+CxgXOzWvWrU7 +V5DwU/r88eNcvdDo0OnnbPwKvpWN5wWBo8a933X02Ye5I5+xa8c+VLUaWn53 +Tf3eh6W2+7mr+Tj4zQ2b+b4y6P3WgGzk93Gp6aDvGoHZLDZaSP0tZQeb0ql2 +ndnMWxchP6XPHz/O1Qvt3pwda/Wc9o0uIcW/9mxaCDA3BUUfntru567l483F +tH/omaks5/MlFZuoibTB5UenqIPGtTd/25i//ro732pP5U+Zjg3D2mxOqzdJ +SQLD2eX4Sr34YH2uXrjujfpNhTB1eqRPnvjZ8f628tMExxHqIo6ncmOdndI+ ++ipH1ddOG0/aB+oCRlu92Vs1kNY41mu0xvULlfqeW+DVNDM6uT83xSBMV7or +MMcszJlLSj/IJrypEct2bzE50+ViOv1SL89Q2v4t4TXEUGqbOg0faBphLHul +ehvXZSFm55MErh2ZdJlCWtR3SfupKY1IWSLAd7W+zMaXOp5UuVGTs7woz84V +nDNY0uy4tZ1QDbatURtdNjGaUQDFjB1ikwIxzacbW5Qp7aSg3OHXBw/2H98/ +PJlO5osTy54TFXjvIPykYP9EMR1R0mRJUbNOyClW6ckZcAru+gg/coTVlxs4 +QoJVic11rqMWnpwt+PmJYmK7JNaKTv1Aj6S2pLHRLlnK21Af6haMgi0sNwFc +SQXk1avbzh192kYtIAN6eSCqvU13ttVWDafFaN1us5tvA3/3O9O1RZKrj+wG +fuuRruLe5vvU6/mJBac0kJVIGFfpGeuK9EPthWgbzjY6JQ60x2IiYXtfddtu +tDuCbr261atcIi1gwDbXtMMybxPQbrxIxrpH+bk9x+YAX+x/+eXh85Nnh8eH +z/5wePLi4fMHd5/tv9hWxg2RuclxWFKVySCA//3aLYRSlVBbPP99Hdor2tq0 +VEE+lQu6b91WzL/219aWWQRtlVtX+KAqu24FQDpGoTJPXWdbF53W0qZXhBv6 +pR7vs3zyWm7t9kysayWK6G6L9/hq8TZbY+YQ6sD/Ncz5muqsS7lq/k7+il5q +do7GVTNb61KvX6GLG99Rhl4ZhatBSN/yDby8kUyh+0oO14fXUKY6+1a3WSVq +qudMghIU0Xahio/yrdrD/mM15d+x3Gv+rBTXt5BxVWRvnrU44NHLA8rsLpZz +Z/KK0hXEUZ107um0yN7msf7m2rGu5OEsSTmj8QJhqC42S7xCkA3zqTdQdE2f +sc3WETWwRaXsbyjPKd8yQg2fOXNAqZHQzh00UspFbdgmUuBqR+zys4Y+dEHH +2i92+joiStuj1cKK5uBuYPb1hK2s/ne7kEa/6+3Ym0azQFhLx+ztJj14ZtX2 +NPkJ8MVey9YjalG/gRPYaCaZaKTMP6vmqJUjrJfTn0k+gQmoU47AunSlzqSq +nOVTfQaWxj7NtKW9QebhrlTr5pSP1Vfb6cuJynvO1dqD2Yzc2PSnRIHWjdWZ +No2cpE2e9lhBO9n4iJUXJBBltWZ4Op5AvE+HPUuM3fyvTscp1WLClJnFwMqq +qt1nUAfMnCZbH75V/qmVvFS3mmejbMi5oku78HR1DnTbBBoKIOtVAzqjRPFE +JVzVOSGnzb9JEH6757QtwumWo9KfFzT7+ggUy1fSTvADTmBJpQwLdXbOqBon +rIZZ6TXTpEo+7OoebSOfECidt7gPWjmdikSFjbTiL6S80E9sYJ9Zhqp8fq9n +xYMrU8BG80lVcipKWtSmPZWXdKiUlhfFbVUG8Yb2Cl6quEFQOao5vKkabzNt +enXCtBpO97/1LGo9x+tP64dsk0NbJN64V42e7lUB6obItP3Kthly815blK5r +76a3r2hnU17j6izVejvfO/0jYBytkNekdD8GPSvEXX27bue3KuXy+2cDOoDD +2XEe3zvAf7969lDlXG7L575ix/BdKbYXk1dy/Nn7rVvSc82D17VzQ25e245J +2ysrfMXsfjR6bvrgjduhRKmarPnOOz1ppXi/ozyRM/jdbejpKyZpkKhb0lO/ +dSt6rnnwx7dzRR5zTcWu03eV6NAG+kqV/xj0rBB39e2Wvjt9O4jthqWn6bu1 +vut/jUz5rem55sHr2rkhN2+k75hdix40ulqf3Y9Gz00fvHE7g26Fx4Cdwe30 +3fzrr2LJWgT+g2l9UOPpTXLx0ehZIe7q2zdux5Li7KjAa2CHqy7+7hb09PUh +N+cntYVZFZPbj65to6yx+fhcWr/UOau/+QkNmtU7y3+dnP9FUdi6feN2zPqe +06fS3hMzvG27qnfbAdYhSFMg/s0Ny5omX2dYwnqmdbEj77YsH4OeFeKuvt0O +Hyrr0ddncNT/fgkwoMmFG8GAoIYBm2blo9Fz0weva6e5GtxYBHYai8AIziej +kl/q+jWzTksVrbTX0y71dUa8fWug8dSbciZPzP5Ms77n+elWrzp1ykFo6Khk +jj0RTUcLVVJPN78HV9L9IK1imz6a6w2d0VqdYNW3rlizNkEM5TTWDsOUrS17 +tENGZ+dUkklt4aA8D+W9VeaHjS81q1c2mAx7DyZvaN1YHUvGbfa4uRelWKoS +eH3S7mtJaSLQd15OzQ4UzRxVg6U3lmz35JhR+vSM2hlwpiryl1QBPnfuLMc2 +tXiHMvO2dmtmFrtNa5SDMivX6IzapK2gdISa2UEzbWRKJ+qsl7nZLG+KEimf +/boUS5XAKsfzoRWXDQFTU2J0croZONIGKSMU5yc02XbtqZp4k0jadu7YhgZ0 +r97OYJZ3q40kaGE8edNvyuFMFsuxgC9iAuyTRqzsnyZXa9/vVaPYa+Y4tHgq +6TTpjmaJrCZ+u25l+5pOt6puhlZeq9i6ElT7SK8GWY2zIzimckzl218cP3lc +xXlbq2tTR4fPqFLg+cnBk8fPn+0fPG9its5V0FZK0CyDNrRvQ+xUK+DPSG3n +2lUbNK4uXq3y2TCa1geeP7n7ZNdURww0ANOVrWrPu7rw2epZ2md0LmGpjjE6 +gPwfy5E59AKyaqtR8ss6z/9GVssatBJpV07sce3NLDktDs9te9XicKuXinHD +d5XwKcl8v2VGo/cCSOeIzV7dLemIdrJP66tOdjGoXvrZXqWHVmKb9PTUdhy9 +yLay8klFxSd3D58+OX74fNu4sn5j5laWKHvWl9FFkg6zUlmNzhiD71fXoaoX +a3VvvLWictXDq6sRv3Faa5AGmFWPd93E5aaYrZKuTrioViBb2tRcWd82DNxS +C9k2UiJDY596RzJMK3JmwO/XZmXb9NOowWpFYFUl3Xo8ZtS4knz5djqiJZ+W +iFl7viEUXrfn1bKu7WnYpFgJ8Z7TXtxRhz0MaQ6dxq13DevZMpZrxvS9bsA4 +jL7xEA2w8AsxmJrNai2Z5eROFYm0gkU7UNVeuPWV5Ynaw/tGjkaUZIV5Ihvy +d7RYxubz5UVjUesNfXyF0jqqrc/UyTl0mlXO0NJY7OjSkcpv0gZBoerFBjo7 +NHjy7O7hs5OHdwdoZMh3/SR2GzUd7dC0WcfR9tXVXAwbXru+eDP/vWlZnM4p +aEpWOd5UBLJuKq6sBDGtNgpBVH1BR5e1MG+2HD+zYbzWHlYKNWxaxvrqJtNo +x/yTjV+nZ24UHFjTt93krXLTH65oYaWAxD5rNnSZ8pFq75+ZfyoYmIneHFIu +liPajt7Y+qDgOclvr5nNqCBm23BUJZkwHPcePjtqz/vKrFcz2mRlr3ZuDd7X +s9iyir3Vme+a4++vN88dNUbtKbJFRi0Z6C6ga60Yr0FHihE6syBNp/IT44CP +MyWVz+qakSvxyM85IZ062M6g1eh4g9N7uv/y6BA/nzz6sW6vWQbVmV2pI4Vb +0nAr9N+oEaJZoIPg1C90hoZNetC5YWarIX0RSj9oKnl0xLxWx+PoOp5SfeAA +fluOq+IT0aoy6Zk9uLaYCAhdVUrrTdmtJquWpowiC+CE1c2Dff0NJPPyabf4 +nZrTG6p2qTRPHVvApjrHsDi3wbDzumSqOiWn6nv6ZttoclZyXcquTliVKjch +JKfTXBfVxkezKdHUKOnGegavKNyi9qSr1MCnlbJXJfv6lId+VdVD+6PZbDG6 +3KJzcGizM1W5D3v7isktFhCTGNg7Xaj9xtVAzPzpw0h0dZMu1TJHL9SVUnrP +JoGjYbOwy0AwcIhLXd+PlmcSEaCZQfMnzWDdh5mKuT27Fncu9JlzPbRgKFiO +MS+vWF6OygXV/D+EsNBpJ4u6d8yBHBVqdLqWyLAMjbSKh7Z7pZZX9fGMleqm +lewTiBtN3jT3GJSFzjJRMRllkwCCt6uPPc0XsyXX2ah2pkqdE8YudyzM6avv +h9ljTnK5eENCazcM1xpCn3yzpUg/U22TXdZce+76qiYzmhPj+PXFyg1s+rc5 +70pcaoCUnznRvb6EeF071bbUprp0LGl+LHpu+uCN2+lc7TbD/VHr3U6/4XVu +T881D/74djYuNXQUkN2gns2wSBk+fZxy1zLlR6Bnhbirb998pdtRu6kgFQ3t +bArGbSjSp0Ko+KW54k0LF7cf29oqt0q23W5019z+wOvIH2Ch2/D951nn/rdZ +5nb6a8vTaiaJon9vlS9+PUOTcVHasvZ/T5UveoHant+CqEkPyGRDNR2353ZT +WW9e99Te+dAK1NSHi9QhgirLcFEu1E6HG7d8zQA+ZFms34ANhLz/I5TF3nK3 +dPNkclqg+Zf/9bd//cv/bUrY63PYuyDWj10RWzsR/ap+ux35epa+QUKdB7Uv +TvBWPpI9k5HXya329oH2drtqZbKk3b2f3XCb3nry0npVKiHQtJj4slKf+XSk +tsogSrrsyrNWSYNnh/e+enzX5lhXczvNLbvfw23jP1XfK0lPQ8gVSzrriQ+1 +HnOreVtziWzV9DYT7u2YZcNk1EyrAv9cNs4fMyGr/iimjZ+oWxXsKaz0q2rR +tGaXPf9zJW66coYpDrrZVH2IebpZXqi1dtY4zYua/t1eV9vV9seWlqjPVk1U +aljlC6tccb22P5MXCLZ3llNKZzg2tSzaz/cu2ExzWrOYMgBjyicsrmWdyoxZ +O2KncmurFgBawFZHLOiP4FnzpgsimKrn+KPb65bu9Rzu7aV7E5xo2qU1m/GR +Rr1hrWItT9qSF8cxk9nOl+F6BTJoJbKOEuyOTYoQWssgZGO3ejoXtaf20IGP +9r1qc+ON3U6Xi75is+mNKawsMi0OmbFbU0JfQKvrklrfPrSps879mo2z42xm +bGS/Tl7latXrKlmrkm7dezDHp7BxbzZvZrx6E2MPDKnyivarVZMRnTuMZtYa +cE7VXx0HzQ0bR3fqo/lmks310ZyNrYCVORYT9dHO3V7PG17FDJNk1gejqFMW +WesYZiLz07lJaIqlLvKqku1rieftHqWP7Qm6rQVNuzHT7Mrs+TehizUS3Vb6 +6lwp5djfb/WCIWYTk6RpU2bOOKBydfFVH4HaOIWyysDSiXpUhGcmwBxsqua+ +NcWfmuOtO07km288ku/6E/hAgy5105y2G3MrSRlqwldKBiXj55V4Us5WqLR2 +Jadake1RdeYYU6iTOrMbc62PzBG1uFGHZsqbXZ1Wh8Wc9iidzxz6WhZ9Ests +yKYO9ReGKttxunL2oVE4c0K9OeLQvF6qU3l1KZ8SAv2VZzxACBL+TH9FvUGG +WlVQJ6ZCbup0tJENuqi+vPxc7butTsyQ47k63FGVYLbKILV+91vdrdRobunt +vzOzA7eqe2ydg6smntnzOSuHDayppHwxWyqApFYK6KwiWv4hrTtnU/hjNapp +Y6d4VdROdQR004ir/f5Li6fmG0+ts0rtqQT2eJzV823sK+bwj5scaLNyzker +h9WDPjpP+bjmjU1H3VTn3FQnql51gE3H6TVXHV2z8TSO5lEcjvn0sS6iWm28 +fqNu1lbn1F9MhIFaLgaY2wE/n1BdTiW7lczrc7upDuqCCkud03/+x71AHREs +yf9xaaWwIdo9Uo8uJdxwypXakqM+sFAdxKNOPK2OSEATyoH1YVj6//yPA29r +55//sfIKVBG8TZ+eVQcMjNVnJjkVO7KRPjmaUCt768jXTH2WuTrXezmuloXo +w+hGgM355PpsZOrjzUSpiPFfR3JkPyPQNFImkLm4KG3ZMChUI9DHTttvalRz +XBnIOXmfZ/K1Ohten8RPQ6zOCTtVKR19DFeTG3UNtVkEm+oj2NW6lm2JbvXt +21s3JGj4CzrR1K5TgcO3+vehT9C79ig7p7HopMi9MIJyk45/Sp+rF27w0oY3 +V/t3dmgMzurlDcdMakPUVcppUpNXUGs8iTHCXUdU/gIOqLSzcsP2zALAGbu4 +YHVBsbETkI8PflzlLenroHjtzWpX2z/9w3bXprSq05/hwMpr5b9K1hooMKtt +6I/fvnRtn6sXrh3gxjeb3To72kgP1jXuCnUjb0MuzqT913zEL0J1bqMvajeN +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 --> diff --git a/test-vectors/test-case-1.md b/test-vectors/test-case-1.md @@ -0,0 +1,281 @@ +~~~ pseudocode +exchange.master_pub = 3cb5e9823db2b335fdb3f284ae960e56be8b081c6819b8b0217f38b095 + b4313b +exchange.priv = 1bf4149fa644b3c7f2bf02da4703ff2de3fa160dce0c750eabfa0f7ac70a2442 +exchange.pub = 4c130aae3246831808a162e2d4330de394e5f0d7dff75a80f3fa045b1a43eabb +exchange.url = https://exchange.taler.example.org/ +denom₀.pub.n = ba42b9e75e48847bab175ed4797384d68a430fd849a914aa68438349743b2728 + d9ca97709c15d5c81c7d9d11c84ec9c60cec03aed4b36ad153768eb30cf98454 + 74e97ee9d7475ebc926d87135d56926b7df1cea3ec38897a74bc3e245e59ffa7 + 6e5aff2c2f2eb84e7133a879f4229221f91c7bddf96088e4020e16444d94acc3 + 0708069f4a1bde3dcbead32e3916a9f6722adb3d63bb9075dde49258fbd28a9a + 09251fa08b64faee53a506b9f637136c72af7382b9243fa8996ad4d72cc1b05c + fb45271cb3187b4eeec0b5f9e847cdcc0c3ddef9787164a1aee7e4e1ee6de1b9 + 5282c1ff646aa70aabd1df0003f75d3585e9e740916cee4f7bca0cd82f72104d +denom₀.pub.e = 010001 +denom₀.priv.d = 07bc432fbc6eeb0f9ec2a4f5d2886d65228f57ee5ddac788af355493bd9fc247 + d449b161e41d95080f44d93bd6938d162c4db5f6720f7479768ba73000f330df + 780e856e8d3a01d1778c546e85b3157820de24bc9290238782271a3694f38c66 + 45f3420331ff70f8930377f4fea25beaccc775ce796f9ca7c97d0fc82ce7a688 + 0dd437e6b30695ca51a58f0239aef7481932550ce61b5b085313cb888c893cc1 + bbef6b47c607e1189f8cccb04eeb9f87b9e53f414850f8b923ce83e2859c0434 + a3d14d861e864fd5ce701af11611398a73515b7056b2828e564cdec6052bdbb4 + 3ff435178577198de0676e5d378ade9b31844e81e2218ba3b3aec5bff9a26621 +denom₀.hash = 8653090e3f3f5efac9770a5dd0c97813940c191c9fa1713367f8bb1279b1e3d2 + 7f32d16ea7699501e5fc4d176725d76ab0307f9bdf9d0d263c2256a7f1c63143 +denom₀.value = KUDOS:5.12 +denom₀.fee_withdraw = KUDOS:0.01 +denom₀.fee_deposit = KUDOS:0.01 +denom₀.fee_refresh = KUDOS:0.01 +denom₀.fee_refund = KUDOS:0.01 +denom₁.pub.n = d5455fb79449df7bf548e384d5201d75f4f7697ef9b8051eb8536f66783e70ca + 2d524fefa6840c1f87d9d881486815d5ace866a32269b05bdba7ff6024811c19 + 456026b0a59da4db96f58729d286c90be8cd9cbf575d346202b43282d601b575 + 1ff77a88a0742a692349a0e3fa8ed5518fc5378fcf434929b541c942573abef3 + 10b87776e976e81cf650a04399fabddbde677163918250c4d45f5e90ee7539de + 500a8e915be1d5f17d79cb9585ccdf5dba42ef53c24eae7d7c93c4e0a4327882 + 45b7c76a587f0ac6889d30389531362d51c2ad65cb1e28b4ad4cc97fcd2a4aed + d6612ae8888eb2dbc4de0cf30f46a43b76cc8c3245eefe013195a237f02d13b5 +denom₁.pub.e = 010001 +denom₁.priv.d = 5a520e0e663bbeecf55d5015d258ce8145247ec62aa5d76d422cfbb1cedccad1 + a4ce06527d17d1368d47221ce678463eff02516d6746914ce5c2c9318364366d + 31675e1b539866d8249f89059a4640e0cd503ec0fe13d7fa6620c07f8e789ccb + a4a51f7cbb4f5722bdb211f45b09a0a7f11659c88ac37939b3accfba4bccf24e + a260e21aaec0dfbf857178438986e963e9e356277c3badc34fc91b705d9956b4 + bedc0947d65924d7dd31e564de798eb06837380caed6813d3761d119901c5540 + eb74c3cb674fdfd64b67d78ebd40de0cafd53c038a0a8e87890b953b8b94a977 + 1a6efb3142ca02db873053f8d1de2082db4366fc072aafc723c036a2fb999605 +denom₁.hash = 1de6052bce12feaa2d26e3bba1789b0c2295028279f3eaff8e1345448ba05390 + cff49656ed72a1f7ef6ee2c4a80f80eefa0d0f906e74305b0215c4194ab1c7b8 +denom₁.value = KUDOS:2.56 +denom₁.fee_withdraw = KUDOS:0.01 +denom₁.fee_deposit = KUDOS:0.01 +denom₁.fee_refresh = KUDOS:0.01 +denom₁.fee_refund = KUDOS:0.01 +denom₂.pub.n = d1320993658042f995f09ed66ad2283e457a1f44cad96f1cf5a6299ac93d6172 + 4a7448d70e56a38666ec66352a5810ca3e544d957dedb5789e135589fcb8b139 + c65a2f70d7c421dfd4e27cf38d463074d286730be23d446fc07811519b068346 + b28b86b94acff35524eb62436852714c92f03b0bac21bb6bf727734be7871b70 + 2f928c3ced4bad9ba2d49cec6a86d1019181c65c16abf7b391f103c90c3eaaaa + 9d5298a4a60c71bdaf0f08246327a62399bf4c424c1ed7718cb5df178daa9710 + ec9d098e99ed0456de2fbaf7865ba47931c52d1cac78cacc1bc451782587487a + 6189addfe5dcdf6f190f28816707e3d1e104b5a1f7a570b75c1951588f3289ef +denom₂.pub.e = 010001 +denom₂.priv.d = 311849a8066faa083218b4e6444e8af44650e94ab7427d31b232eb5bb0b3cf8d + 478cefd54cbfa783f0deb503f02a97d226fb98f3a708a508a82c886c285bddf7 + dda5a7b19769a7bb84961cd5f9c749b2f8ff65bb99be6033cbdb41d1418d2f3c + e5c519fa9d649d4a53ae4c32dea64e81b6905b831b44155cbab5cef8b6defde0 + 9295662cdf2189f2763ede05bea0acb707b9b6b087dcebb9ca81f1c2785d6560 + f93bf1a1860676cccceb079c22b48b9fdef68e1d286164f132ffddeab29fa7a7 + 04e1bc3f9f5e28c39675f17136aed8542aa4470a14a7380a4016b21d43ef5b9e + 2b241ced017c54247c12fd6beccb7bd356820b0246553c751b3e071468c2efdd +denom₂.hash = 4f8c487d21ffb5bb7571f5d66bcf6f93f4f5c043df5483669383128700064e86 + 37afecd6029cb36dfc5a60d20ff3112ff1b5ad1b53c78cf39ad13cd2531ba24e +denom₂.value = KUDOS:0.16 +denom₂.fee_withdraw = KUDOS:0.01 +denom₂.fee_deposit = KUDOS:0.01 +denom₂.fee_refresh = KUDOS:0.01 +denom₂.fee_refund = KUDOS:0.01 +denom₃.pub.n = bddb1806b7b7663d94bedbeccbb515987fcae457b5920d85b8485edac6ab0e73 + e6991780e9f1fa6f88e500e0ccd9eeb80d8e3b66289a7cf1b25bd56d05081d58 + 3864ad225a36f8d38391782a85bfe320d439443e8ea19f555edb36fcb58af81c + a5168ca7c42dda68f191bd1587b4da27703384f2aad300a043549c67fc6defd9 + 8bd1074b3bab1bc0d89b87d81f8a1f555a3b4ce2b4ca7b0b1d8f446fa93258db + 511cc3bc2ff62871cb4c746f6806d0b839db8cc560da06eb5619d9d42309a771 + 61373708db18e453ff0a1d6f63281c54ffacada7c8bf5ca7281ffe7e2e5be03f + c006c064d820f719e672429628837399a565dd9d70f6e9ed91e1eb0567978015 +denom₃.pub.e = 010001 +denom₃.priv.d = 1e3370867d0a0d1705b18e0d848d73f7d422f920e4aec23cea7184b9463a26c1 + e9704d4cacaa5952b8683eb403e78a5c628cfa1b9da0e44d9462f1b7f66c1c88 + 3b419f484ed3de257e113c1828e4e5e3592f1a3bddf78d7f88927ee99892c336 + 2ca2c226dbd90971d68a54404d069d5f5704b304e131fb3058959338781a2039 + 93804f64def2980210dc3f4e77c1207400e922032952cb154bb1b776d164cce6 + 9e418844f2f4b20850c0a23d30059362edadfe00fbfa04b6833fc4606deda441 + eb345c49b52d91063da7c55ecea7b32e99a49a823264955803ce3ee220a2cc64 + cd4321e18ae28bb1071c7746e8a3d69adef5113e21a01cab6809668793c2a94f +denom₃.hash = 96524d30b4398d0d5bbe2eff902c4df1cc8286629d149bee0530edcfb361c468 + ea5fdb1b41d538223c8b3fe1a974951bb3290bbfffc6f10cbf0326585041ca4d +denom₃.value = KUDOS:0.08 +denom₃.fee_withdraw = KUDOS:0.01 +denom₃.fee_deposit = KUDOS:0.01 +denom₃.fee_refresh = KUDOS:0.01 +denom₃.fee_refund = KUDOS:0.01 +merchant.priv = 7607240acc4563ebe2e38e76eaf61d74160d71c9a6670ae2e5147ce848767037 +merchant.pub = f54d646619723f7fa2ce79267953fdd8654cfcd0f2cfc0c5e880e3e0d0ab19f0 +merchant.url = https://merchant.taler.example.org/ +merchant.payto = payto://x-taler-bank/bank.taler.example.org/merchant +~~~ + +### Withdrawal {#tc1-withdraw} +~~~ pseudocode +(W1) reserve key generation (wallet) + +reserve.priv = d9641dab5c7f2474573871c25cae2f6c8924ace4157a56d128b1432e55a6c6ba +reserve.pub = ec8ad5e4c6abcf4d0d597f0066a0e3ea0370d221973e06e73f4287148cb93c38 +~~~ +~~~ pseudocode +(W2) coin generation and blinding (wallet) + +batch_seed = 466431296486ed9cd71fc207254820a2c4a85aeb0b2041494f8bf1f8cd30f113 +coin_seed₀ = 88899daa409b8c4c4a91c8e39030d247d00b292eff952e36067fbe33f2d7ce48 +coin_seed₁ = f5be0b8790719072c7043c257f2c114cd8cb45ea5d98c4aa25d9025f45f1caeb +blind_secret₀ = a3cbe2b0babf5bdfb98f45804acf63225c16e09be1677f705393df3f5de98ebf +blind_secret₁ = 8ea6335ed3ff8a41f9fae95e9fd87382be402d6c26ef972381dee6b3c1e9d775 +coin₀.priv = a5a38bb23a9f36564f9d4e566cdd7e3521b04f8ea4175da726ac4e3ac540b485 +coin₁.priv = ae98c5207fe31e20a7b7a8677b780c6735ce69df32d3085d504010f23c59064a +coin₀.pub = afbdf99f1a794add25bad59c9a3f442714e166adc99c57db991947669a36b185 +coin₁.pub = aa7118596b1adf89543e9afcf2925e516a782eed9d75c8abc4a470e7efdd7fe4 +planchet₀ = 64ede0cf40a952b95af4b09b22c6fd27a1ff6d0ae3920ea03fe14a8b547f1e14 + a2eea98443e7aa092075f6585103fb06c1d68fb4616bf33ae30a207e51840f1a + e655a734184a73d804df42650ce296954c9b61e249486468f7fda8a74f85ec6c + cdb34a66819fbeaf846b10087ffaf8e734428a907b96c6a112f8f943b3a8d554 + 55c01b0daf55456acf0715874ff90fba45b265e2021a70997100fb18bfbef822 + c8475820b4855f141730751bcfad2e7eb46dd6c6a400a8a6a98486c4a2bce4d3 + 407a0d0ba612faebb49428ba3a1986eddadb04b6790fbb7bd27cc0bd98341c60 + ec5b980275202aedd4b0cf3b7ee1732c67c84db4b30b60b551cbf849222c60e1 +planchet₁ = 41f8a6622c99b6a9c30d52d19fc2c20a39a481219de4b0f3e7f604efed5d9625 + 54ea13255785d10a037e14abd75d80a0aa9861df9d80a051c418ff197e68bd0e + ee61e6fd5d3214633734659e8bbd7dd2fe566bd41c537a5759bad9bbca6b2eb7 + e3217e7d3cbefff192d83bd0527dbe0eff56df0b2e2062670d2873ca7766a7c1 + 255e6fcf2c37e95de19fcad244f3986bab45c0a3aca726fc682455ea1166a238 + 9152d7a67d181f035de6bdb97633888f0594c2f63dd3965134372507faf84f75 + 3759abd662d4c7e8df7e01149ff44da3499ed49406d9398e86c4abf12a1f57f3 + 8002115ef7283e4d5422b41c752a0cce8c2c1a9b84e109b4554fc1150ef578b9 +h_planchet₀ = 888da42dbf4897a5d6d9420b827e340c74c0b0e973e140ad1c7b9abfc400a9ec + 5a86b3185e4c656dbe8e01125604616de83fa28910fae513d016f56c3ca94eb4 +h_planchet₁ = f20015bbe0147313e59f9e64ee9e836c192b5d504dbd3328fcfce41fbe9310d6 + aa96d91fdd77599c122cc5390ad7cb86d2c6d4261bd5950e7ec0f86959613841 +sig = 2ae0027dd4a196c4741d60e3e7ff933d7374fa5534d15f1cc2e96e9ab3392894 + c65ab6a0af31ccdb395db5c526770077642502e27d4619d385a91dd13854e706 +~~~ +~~~ pseudocode +(E1) coin issuance and signing (exchange) + +total = KUDOS:7.7 +blind_sig₀ = 139af4e7e7f6e9e0391e22f78cb0b2c334e6d6667633a192f56fde38ac9feec7 + 841be59b2aa993084c50f70dfd9673dc723eec9d84c28ebd5f8104d1b0b29cf1 + 18cd64cbe33925524a3363a1a6f24f59d47a404cf74680eee97cdeb8cc44a0b8 + 4f3db4496d9bed1224c0fbda64d40f84ef5447d764fb714ca8e72a23a882e749 + e47a519310f6d87b3e8ddc3e4ac4e541cdbfe7550c92f41c511b544d9fbdc2a7 + 296b958e9df0b1394210aef4f1a780a129883d4bcb45425eef96204a7eaa9daa + 7d21827ecbf4571cefe6dbe65314e61c688175c1e81e01d4f0377c9c2312b6cc + 3487f2dd2cf8d85efde346f4d1a12de70bec4038b0bea0c505087c0e67ce4694 +blind_sig₁ = 89649cf83e2ba2cd75c7a1d01809c33d5d02fec81649256215f13a8965ad37d8 + d47c264668ec187e46d75210ce601362fbb15f61a24ec1d337dd2589b5a4ee0e + 77a8d9734aca6a149b9f9b3a78c158b1f8cb243b8cbe9c2212290e8bc731d023 + 82463f3e1cf0fc86c5472b8c96c5eaeac9c9064fdf7411f97935f27fd0bf8820 + 0440c7cc3e6960c5c5156aedb5a820077be08f1ac4b00780258d7b843b21d7ba + f2d969d1b3c77a08b4fe14b216fe78c7e4c0ae964fc06bf3dfe7ff20ec85fa4d + 5e5aec24d89848645ffadb0de3da80c6e41b96571ef28e3d132b7c3fd16a289e + 32389cffb653b4744fabf882342f0db9aef110351d8ffd7a3b86701f0f5034c8 +~~~ +~~~ pseudocode +(W3) coin unblinding (wallet) + +coin₀.sig = 9303650b8896b6619ca061f4bf44c1b02fb60784a2659de7512b599e7e6524ad + 5a283c81d289d3ec75fc81e7f336bd41dd67a41b72a98d9171f0461c188535b5 + 55019079a18b4491903797f62a034e5f277ce8f7f3f56fbe47e44113561fd414 + c841c2da97da1ae92df0e2cfbe3c26ad37f8bab9bd71365ac536204cda7c21dc + 39891b5cbb4e213f75d4e09c248a7a59f6322fd011619b29ec25ad621dfa2d6f + ae9f8b91935caf54d0d30f4a03bf6beed6637a4054efbad7a41f9da434f07cfd + 2f7619e8a3c82b30e079ff9fe13fc023fba7d627f4fb21e14467ce1db2776783 + 1eb1c3ad5c39f61437a0a70c300fd84cd9280474bb507768a868ea92fa905428 +coin₁.sig = 355aa5b6bf10591375f22a014640cd242f470834759fab4421b4d237a149bc3e + 5fbc8f073e1348da770983cd36df9cf72a30bfe55776744b2d787acb06ba25cc + def36e5269771fe4a38a1109e8b96437a3cc625003f7fdf4d0cc879335584c5b + 13f2b29be1ea4d8a2da7826d608179d98b5edb11261e2048fbbba217a52ae862 + d1e78e30c0787ee40908f1bca708c434d5412a262eca6bcd0ac5890bfbbe7df6 + d69a5544d0054716dfda47791546c177223606c0645858a15b36887619a9d70a + 515f42897758bbe181765d7184cc92b5e2d743df1db9b30394b697117ad24811 + 812febe0a3c57cbb5cf7f6857378f57cd1149f745ed95fd1d342e9860f516469 +~~~ + +### Payment and Deposit {#tc1-payment} +~~~ pseudocode +(M1) order generation (merchant) + +wire_salt = 4c5249caea865380e0e519fc38177686 +order.id = ORDER-40 +order.price = KUDOS:7.42 +~~~ +~~~ pseudocode +(W1) nonce generation (wallet) + +nonce.pub = 6729d69abd7d8218e02c953317b46bba2522efc2c19a7da63194e9ef40fcbd0d +~~~ +~~~ pseudocode +(M2) contract generation (merchant) + +h_wire = ec4e7258747a4de49628a27907b74f0aad097cfafaa595320f81786375430b67 + ae1ada754299bbc0472f5a1e8bae6fe8e5dc52683dd09490ff06fb2fa4f20ec2 +timestamp = Sat Feb 14 13:37:42 2026 +pay_deadline = Sat Feb 14 14:07:42 2026 +refund_deadline = Sun Feb 15 13:37:42 2026 +wire_deadline = Mon Feb 16 13:37:42 2026 +contract = { + "version": 0, + "summary": "Free Software Support", + "order_id": "ORDER-40", + "products": [], + "timestamp": { + "t_s": 1771076262 + }, + "refund_deadline": { + "t_s": 1771162662 + }, + "pay_deadline": { + "t_s": 1771078062 + }, + "wire_transfer_deadline": { + "t_s": 1771249062 + }, + "merchant_pub": "YN6P8SGSE8ZQZ8PEF4K7JMZXV1JMSZ6GYB7W1HF8G3HY1M5B37R0", + "merchant_base_url": "https://merchant.taler.example.org/", + "merchant": { + "name": "Taler Merchant" + }, + "h_wire": "XH774P3MF96Y95H8M9WGFDTF1APGJZ7TZAJSACGFG5W66XA31DKTW6PTEN19KEY08WQNM7MBNSQYHSEWA9M3VM4MJ3ZGDYSFMKS0XGG", + "wire_method": "XXXX", + "exchanges": [ + { + "url": "https://exchange.taler.example.org/", + "priority": 1024, + "master_pub": "7JTYK0HXPASKBZDKYA2AX5GEATZ8P20WD0CVHC11FWWB15DM64XG" + } + ], + "nonce": "CWMXD6NXFP11HR1CJMSHFD3BQ8JJ5VY2R6D7V9HHJKMYYG7WQM6G", + "amount": "KUDOS:7.42", + "max_fee": "KUDOS:0.01" +} +h_contract = cc934a29efa612754edba0453d1b0ba175d6830d3ec2b2839a9a539d845a5da4 + 622498e3819cb49206810688a93de1989c6542d2cf1d71f64dc998193e76d535 +sig = c249ee766b4dd256560d48b367d05a41cf7169306247ec56c51c39412b34c110 + 15e365c2b2836761ba020b7175e60870572a6c7f780eeabb6f0777783064d602 +~~~ +~~~ pseudocode +(W2) payment preparation (wallet) + +contribution₀ = KUDOS:5.12 +contribution₁ = KUDOS:2.3 +sig₀ = 8876dce4ca504df355f17c783e8327ea29b2cbcd7dde608b473644af3580621d + 3eb429022f6d1c4937328db478c6ed9784f6788e2e18dc16927efd4bc9c10908 +sig₁ = 031283a02cb413308cea4b69bd3d1b7beef87be7788fcfc1d7b83f8d97cd4ede + 218d0f753ba8fc92e22415a66065f5c1dff402368de8e85eca0c0ac7358e3602 +~~~ +~~~ pseudocode +(M3) deposit preparation (merchant) + +~~~ +~~~ pseudocode +(E1) deposit check (exchange) + +time_exchange = Sat Feb 14 13:37:44 2026 +sig = 09338dd4b1e692431290355b7df62d627a894718db68cf4a8e083bfed7b6c98a + 0dde3c5724f3cb3db0e6737f57c9eb35136997eaf403f27f82c0a9f1cf27d308 +~~~ +~~~ pseudocode +(M2) deposit verification (merchant) + +sig = e66d503c843d72da4b6eb95f872396449de25cbf80b9c243d8c9ed2bde533d24 + 60542c685bfdbf2eabc755510a60b97ed289711fd3f353cd80aa791e2e2f1e0d +~~~