1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
|
Received: from sog-mx-4.v43.ch3.sourceforge.com ([172.29.43.194]
helo=mx.sourceforge.net)
by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.76)
(envelope-from <stephane@kill-bill.org>) id 1WHzt9-0003lP-4Q
for bitcoin-development@lists.sourceforge.net;
Mon, 24 Feb 2014 18:04:23 +0000
Received-SPF: pass (sog-mx-4.v43.ch3.sourceforge.com: domain of kill-bill.org
designates 209.85.160.45 as permitted sender)
client-ip=209.85.160.45; envelope-from=stephane@kill-bill.org;
helo=mail-pb0-f45.google.com;
Received: from mail-pb0-f45.google.com ([209.85.160.45])
by sog-mx-4.v43.ch3.sourceforge.com with esmtps (TLSv1:RC4-SHA:128)
(Exim 4.76) id 1WHzt7-0007mJ-JE
for bitcoin-development@lists.sourceforge.net;
Mon, 24 Feb 2014 18:04:23 +0000
Received: by mail-pb0-f45.google.com with SMTP id un15so6871414pbc.32
for <bitcoin-development@lists.sourceforge.net>;
Mon, 24 Feb 2014 10:04:15 -0800 (PST)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20130820;
h=x-gm-message-state:content-type:mime-version:subject:from
:in-reply-to:date:cc:message-id:references:to;
bh=6Zq3gn2o689ybwXM/2jN7uBh6ojwzLpsrbbXq2aXBKc=;
b=ZV9jridET6rdBl0V0JK7RZIvzXPMDk2cxraPQ+GqyHEkP0AfGtrB0d1/lXSQYRdoQ2
AbGlsZ0HcaGn1Xsjnip6hGX9eV5v6BAcpfuBCrxSBw0lZMODgMFCJ6/GTb1jucJ6V/46
Qrd+BGlJiMXkJUa9lSXOJqxYg3x0LnZ3RTNf9fADUcekNNcU3KJ6p3ZE7yZn1yg3ln/7
XUFoFEBp8wVgWtN7uh4hclS4mlFuRU2l2M9Vdz1+UlZleZP6tlDllrKp5JrBJzRikf5x
iZmxcENj/3Y7usqDe/DP4LqpaMNQpr+eq4Mfp2RCD4eGRZlreGjV//XAyrCUKa3BXTPW
YeKg==
X-Gm-Message-State: ALoCoQkOkutOQLbP2+D2WEAu8iN/JGBRBezvQOscaoknSDIROgfijnopS6UjFwcuDPbEGKVpLtHv
X-Received: by 10.68.242.68 with SMTP id wo4mr1292044pbc.32.1393265055660;
Mon, 24 Feb 2014 10:04:15 -0800 (PST)
Received: from [192.168.1.107] (adsl-71-146-11-193.dsl.pltn13.sbcglobal.net.
[71.146.11.193])
by mx.google.com with ESMTPSA id ei4sm2097534pbb.42.2014.02.24.10.04.14
for <multiple recipients>
(version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128);
Mon, 24 Feb 2014 10:04:14 -0800 (PST)
Content-Type: multipart/alternative;
boundary="Apple-Mail=_7D5FC4DB-08FD-469A-90F9-DACB05381773"
Mime-Version: 1.0 (Mac OS X Mail 6.6 \(1510\))
From: Stephane Brossier <stephane@kill-bill.org>
In-Reply-To: <5F91BEBF-ECDD-4CBD-A85E-FD7E7DB3F01F@kill-bill.org>
Date: Mon, 24 Feb 2014 10:04:21 -0800
Message-Id: <81FBEA67-45A9-4531-BEA0-071CE9FAEF7E@kill-bill.org>
References: <E1FDB3F2-25ED-4B99-979E-12CE943CBD66@kill-bill.org>
<CANEZrP10z6_UAHD97mj22kVEGyXgHPQ2PdP_8RxHT5Py+xRP_A@mail.gmail.com>
<D6BCC0C4-EF22-4DE8-868E-825D19C387E3@kill-bill.org>
<CANEZrP0FzTGmp1zbaW1VHJLk5117ZnTSehfF4uMX=+UFS+R_Dw@mail.gmail.com>
<0CC0BE1D-1DAA-4994-B034-EB7712F845CF@kill-bill.org>
<DBA255DB-4839-4C3A-BA62-BD3926995C12@kill-bill.org>
<CAEY8wq6F33814d2+97AqDoAicvh=0PigHZ03wHadMq6JqtQMLg@mail.gmail.com>
<EAEC76DA-A490-4A61-BFB7-611D4ADF1680@kill-bill.org>
<CAEY8wq5=pAMTqDPM8yeCF+Z2=1GWmD0UDQdgacN1o3jAUh_BYA@mail.gmail.com>
<CAEY8wq40RxeUYYJS2m=xq26iTd2NE64WR7QOUO0+yR-MJQCoxQ@mail.gmail.com>
<5F91BEBF-ECDD-4CBD-A85E-FD7E7DB3F01F@kill-bill.org>
To: Mike Hearn <mike@plan99.net>
X-Mailer: Apple Mail (2.1510)
X-Spam-Score: -0.5 (/)
X-Spam-Report: Spam Filtering performed by mx.sourceforge.net.
See http://spamassassin.org/tag/ for more details.
-1.5 SPF_CHECK_PASS SPF reports sender host as permitted sender for
sender-domain
-0.0 SPF_PASS SPF: sender matches SPF record
1.0 HTML_MESSAGE BODY: HTML included in message
X-Headers-End: 1WHzt7-0007mJ-JE
Cc: Pierre-Alexandre Meyer <pierre@kill-bill.org>,
Bitcoin Dev <bitcoin-development@lists.sourceforge.net>
Subject: Re: [Bitcoin-development] Extension for BIP-0070 to support
recurring payments
X-BeenThere: bitcoin-development@lists.sourceforge.net
X-Mailman-Version: 2.1.9
Precedence: list
List-Id: <bitcoin-development.lists.sourceforge.net>
List-Unsubscribe: <https://lists.sourceforge.net/lists/listinfo/bitcoin-development>,
<mailto:bitcoin-development-request@lists.sourceforge.net?subject=unsubscribe>
List-Archive: <http://sourceforge.net/mailarchive/forum.php?forum_name=bitcoin-development>
List-Post: <mailto:bitcoin-development@lists.sourceforge.net>
List-Help: <mailto:bitcoin-development-request@lists.sourceforge.net?subject=help>
List-Subscribe: <https://lists.sourceforge.net/lists/listinfo/bitcoin-development>,
<mailto:bitcoin-development-request@lists.sourceforge.net?subject=subscribe>
X-List-Received-Date: Mon, 24 Feb 2014 18:04:23 -0000
--Apple-Mail=_7D5FC4DB-08FD-469A-90F9-DACB05381773
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=iso-8859-1
Mike,
Just want to follow up with you and the community in general regarding =
the BIP0070 extension for recurring billing. At this point we have a =
working prototype that we checked-in in our fork of bitcoinj =
(https://github.com/killbill/bitcoinj). We tested it by extending the =
php 'payment server' from Gavin which we also check-in in a fork =
(https://github.com/killbill/paymentrequest). I think it does not make =
much sense from our side to invest more efforts until we hear some =
feedbacks.
Once we agree/integrate any feedbacks you guys may have-- a proposal for =
next steps would be:
* Turn that into a actual BIP so as to detail how that works,=20
* Write some more serious unit tests
* Merge back code into bitconj trunk
Down the line write the C++ code, but of course that would assume =
BIP0070 is also implemented in C++ as we rely on it.
I understand you guys may have more important matters to solve these =
days with the recent malleability issue, but i want to make it clear =
that we are waiting for feedbacks to make additional progress.
Thanks!
S.
On Feb 14, 2014, at 12:28 PM, Stephane Brossier <stephane@kill-bill.org> =
wrote:
> Kevin,
>=20
> We did a second iteration on the prototype to implement subscription =
cancellation and upgrade/downgrade. We checked in both the bitcoinj and =
php server to be able to test it.
> We also worked on our side of the merchant implementation (Kill Bill) =
to feel confident that the protocol will support advanced business =
cases. At this point it is looking promising, but more work is needed to =
conclude.
>=20
> We wanted to follow up on a few pervious points you raised:
>=20
> > However, continuing to think about this even more, maybe the simple =
memo field along with an empty set of outputs is enough already.
>=20
> =46rom our merchant side (Kill Bill), we do indeed use this field to =
report successes or errors. Maybe it would be useful to extend =
PaymentACK with a boolean success field (so the wallet doesn't commit =
the transaction in case of failures)?
>=20
> > One high-level comment -- the wallet in this design doesn't have any =
way of knowing when the payments are supposed to end. I feel this is =
important to show to the user before they start their wallet polling =
infinitely.
>=20
> We extended our RecurringPaymentDetails message to support this use =
case, as it solves the problem of subscription changes and cancellations =
for free.
>=20
> We introduced the concept of a subscription, referred to by a unique =
id (the tuple merchant_id,subscription_id should be globally unique), =
which has multiple contracts (RecurringPaymentContract). Besides payment =
bounds, each contract has a validity period: generally, a subscription =
will have a unique active contract at a given time and potentially one =
or more pending ones.
>=20
> For example, say you are on the gold plan (1 BTC/mo.) and want to =
downgrade to a bronze plan (0.5 BTC/mo.) at your next billing date. =
Wshen you click "Downgrade" on the merchant site, you will update your =
wallet with two contracts: the current valid one until your next billing =
date (for up to 1 BTC), and a pending one, starting at your next billing =
date (for up to 0.5 BTC/mo. and without an ending date).
> Upon cancellation of the bronze plan, the end date of the contract =
will be updated and polling will stop eventually.
>=20
> All of this contract metadata is returned to the wallet so the user =
can make an informed decision.
>=20
>=20
> Thanks for your feedbacks!
>=20
> S.
>=20
>=20
> On Feb 11, 2014, at 10:37 PM, Kevin Greene <kgreenek@gmail.com> wrote:
>=20
>> Sending this again and truncating since apparently the message body =
was too long.
>>=20
>> Thanks for humoring my questions!
>>=20
>> >I think reporting such errors to the wallet would make complete =
sense. However i am not clear why we would a separate url for that?
>>=20
>> Hmm, thinking about this more, adding a simple status_code in =
PaymentRequest would be a much easier way to achieve this. However, =
continuing to think about this even more, maybe the simple memo field =
along with an empty set of outputs is enough already.
>>=20
>> In bitcoinj, right now the code will throw a =
PaymentRequestException.InvalidOutputs exception if the set of outputs =
is empty with a message of "No Outputs". Because of that, there isn't a =
good way to tell the difference between a payment request that had no =
outputs and a payment request that had some invalid output(s).
>>=20
>> Question to everyone:
>> How does bitcoin-qt handle a PaymentRequest with no outputs?
>=20
--Apple-Mail=_7D5FC4DB-08FD-469A-90F9-DACB05381773
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
charset=iso-8859-1
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Diso-8859-1"></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space; =
">Mike,<div><br></div><div><br></div><div>Just want to follow up with =
you and the community in general regarding the BIP0070 extension for =
recurring billing. At this point we have a working prototype that we =
checked-in in our fork of bitcoinj (<a =
href=3D"https://github.com/killbill/bitcoinj">https://github.com/killbill/=
bitcoinj</a>). We tested it by extending the php 'payment server' from =
Gavin which we also check-in in a fork (<a =
href=3D"https://github.com/killbill/paymentrequest">https://github.com/kil=
lbill/paymentrequest</a>). I think it does not make much sense from our =
side to invest more efforts until we hear some =
feedbacks.</div><div><br></div><div>Once we agree/integrate any =
feedbacks you guys may have-- a proposal for next steps would =
be:</div><div>* Turn that into a actual BIP so as to detail how =
that works, </div><div>* Write some more serious unit =
tests</div><div>* Merge back code into bitconj =
trunk</div><div><br></div><div>Down the line write the C++ code, but of =
course that would assume BIP0070 is also implemented in C++ as we rely =
on it.</div><div><br></div><div>I understand you guys may have more =
important matters to solve these days with the recent malleability =
issue, but i want to make it clear that we are waiting for feedbacks to =
make additional =
progress.</div><div><br></div><div>Thanks!</div><div><br></div><div>S.</di=
v><div><br></div><div><br></div><div><br></div><div><br></div><div><div><d=
iv>On Feb 14, 2014, at 12:28 PM, Stephane Brossier <<a =
href=3D"mailto:stephane@kill-bill.org">stephane@kill-bill.org</a>> =
wrote:</div><br class=3D"Apple-interchange-newline"><blockquote =
type=3D"cite"><meta http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Diso-8859-1"><div style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space; =
"><div>Kevin,</div><div><br></div><div>We did a second iteration on the =
prototype to implement subscription cancellation and upgrade/downgrade. =
We checked in both the bitcoinj and php server to be able to test =
it.</div><div>We also worked on our side of the merchant implementation =
(Kill Bill) to feel confident that the protocol will support advanced =
business cases. At this point it is looking promising, but more work is =
needed to conclude.</div><div><br></div><div>We wanted to follow up on a =
few pervious points you raised:</div><div><br></div><div><div>> =
However, continuing to think about this even more, maybe the simple memo =
field along with an empty set of outputs is enough =
already.</div><div><br></div><div>=46rom our merchant side (Kill Bill), =
we do indeed use this field to report successes or errors. Maybe it =
would be useful to extend PaymentACK with a boolean success field (so =
the wallet doesn't commit the transaction in case of =
failures)?</div><div><br></div><div>> One high-level comment -- the =
wallet in this design doesn't have any way of knowing when the payments =
are supposed to end. I feel this is important to show to the user before =
they start their wallet polling infinitely.</div><div><br></div><div>We =
extended our RecurringPaymentDetails message to support this use case, =
as it solves the problem of subscription changes and cancellations for =
free.</div><div><br></div><div>We introduced the concept of a =
subscription, referred to by a unique id (the tuple =
merchant_id,subscription_id should be globally unique), which has =
multiple contracts (RecurringPaymentContract). Besides payment bounds, =
each contract has a validity period: generally, a subscription will have =
a unique active contract at a given time and potentially one or more =
pending ones.</div><div><br></div><div>For example, say you are on the =
gold plan (1 BTC/mo.) and want to downgrade to a bronze plan (0.5 =
BTC/mo.) at your next billing date. Wshen you click "Downgrade" on the =
merchant site, you will update your wallet with two contracts: the =
current valid one until your next billing date (for up to 1 BTC), and a =
pending one, starting at your next billing date (for up to 0.5 BTC/mo. =
and without an ending date).</div><div>Upon cancellation of the bronze =
plan, the end date of the contract will be updated and polling will stop =
eventually.</div><div><br></div><div>All of this contract metadata is =
returned to the wallet so the user can make an informed =
decision.</div></div><div><br></div><div><br></div><div>Thanks for your =
feedbacks!</div><div><br></div><div>S.</div><div><br></div><div><br></div>=
<div><div>On Feb 11, 2014, at 10:37 PM, Kevin Greene <<a =
href=3D"mailto:kgreenek@gmail.com">kgreenek@gmail.com</a>> =
wrote:</div><br class=3D"Apple-interchange-newline"><blockquote =
type=3D"cite"><div dir=3D"ltr"><div class=3D"gmail_default" =
style=3D"color:rgb(51,102,102)">Sending this again and truncating since =
apparently the message body was too long.</div><div =
class=3D"gmail_default" style=3D"color:rgb(51,102,102)"><br></div>
<div class=3D"gmail_default" style=3D"color:rgb(51,102,102)"><div =
class=3D"gmail_default" =
style=3D"font-family:arial,sans-serif;font-size:13px">Thanks for =
humoring my questions!</div><div class=3D"im" =
style=3D"font-family:arial,sans-serif;font-size:13px">
<div class=3D"gmail_default" style=3D"color:rgb(51,102,102)"><span =
style=3D"color:rgb(34,34,34)"><br></span></div><div =
class=3D"gmail_default" style=3D"color:rgb(51,102,102)"><span =
style=3D"color:rgb(34,34,34)">>I think reporting such errors to the =
wallet would make complete sense. However i am not clear why we would a =
separate url for that?</span><br>
</div><div class=3D"gmail_default" =
style=3D"color:rgb(51,102,102)"><br></div></div><div =
class=3D"gmail_default" =
style=3D"font-family:arial,sans-serif;font-size:13px">Hmm, thinking =
about this more, adding a simple status_code in PaymentRequest would be =
a much easier way to achieve this. However, continuing to think about =
this even more, maybe the simple memo field along with an empty set of =
outputs is enough already.</div>
<div class=3D"gmail_default" =
style=3D"font-family:arial,sans-serif;font-size:13px"><br></div><div =
class=3D"gmail_default" =
style=3D"font-family:arial,sans-serif;font-size:13px">In bitcoinj, right =
now the code will throw a PaymentRequestException.InvalidOutputs =
exception if the set of outputs is empty with a message of "No Outputs". =
Because of that, there isn't a good way to tell the difference between a =
payment request that had no outputs and a payment request that had some =
invalid output(s).</div>
<div class=3D"gmail_default" =
style=3D"font-family:arial,sans-serif;font-size:13px"><br></div><div =
class=3D"gmail_default" =
style=3D"font-family:arial,sans-serif;font-size:13px"><b>Question to =
everyone:</b></div><div class=3D"gmail_default" =
style=3D"font-family:arial,sans-serif;font-size:13px">
How does bitcoin-qt handle a PaymentRequest with no =
outputs?</div></div></div>
</blockquote></div><br></div></blockquote></div><br></div></body></html>=
--Apple-Mail=_7D5FC4DB-08FD-469A-90F9-DACB05381773--
|