summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephane Brossier <stephane@kill-bill.org>2014-02-25 19:53:08 -0800
committerbitcoindev <bitcoindev@gnusha.org>2014-02-26 03:53:19 +0000
commit117c5dd19de138acb426e0519516727e01377dc1 (patch)
tree3920b1e5406d42383c6676461c3c3445a87bf211
parentee186fb94b48bc8a209bc7baf4c3a0af5574489d (diff)
downloadpi-bitcoindev-117c5dd19de138acb426e0519516727e01377dc1.tar.gz
pi-bitcoindev-117c5dd19de138acb426e0519516727e01377dc1.zip
Re: [Bitcoin-development] Extension for BIP-0070 to support recurring payments
-rw-r--r--df/07c2c81e1e9a508d7d9716b63b76f8d95325a0499
1 files changed, 499 insertions, 0 deletions
diff --git a/df/07c2c81e1e9a508d7d9716b63b76f8d95325a0 b/df/07c2c81e1e9a508d7d9716b63b76f8d95325a0
new file mode 100644
index 000000000..a9c2b166a
--- /dev/null
+++ b/df/07c2c81e1e9a508d7d9716b63b76f8d95325a0
@@ -0,0 +1,499 @@
+Received: from sog-mx-1.v43.ch3.sourceforge.com ([172.29.43.191]
+ helo=mx.sourceforge.net)
+ by sfs-ml-4.v29.ch3.sourceforge.com with esmtp (Exim 4.76)
+ (envelope-from <stephane@kill-bill.org>) id 1WIVYd-0008Tl-LB
+ for bitcoin-development@lists.sourceforge.net;
+ Wed, 26 Feb 2014 03:53:19 +0000
+Received-SPF: pass (sog-mx-1.v43.ch3.sourceforge.com: domain of kill-bill.org
+ designates 209.85.160.46 as permitted sender)
+ client-ip=209.85.160.46; envelope-from=stephane@kill-bill.org;
+ helo=mail-pb0-f46.google.com;
+Received: from mail-pb0-f46.google.com ([209.85.160.46])
+ by sog-mx-1.v43.ch3.sourceforge.com with esmtps (TLSv1:RC4-SHA:128)
+ (Exim 4.76) id 1WIVYb-0002KV-F9
+ for bitcoin-development@lists.sourceforge.net;
+ Wed, 26 Feb 2014 03:53:19 +0000
+Received: by mail-pb0-f46.google.com with SMTP id um1so391536pbc.5
+ for <bitcoin-development@lists.sourceforge.net>;
+ Tue, 25 Feb 2014 19:53:11 -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=Go9SX7rLPg9GTGqTc6W3tyIdo3a6QxZwGJYtsul8ddM=;
+ b=jqKVC3XVImfkSZFvfG2iHsmtoudK/FEcLcwf07h6igwAAX4ozAoIWEzwlwgwd7ZgI0
+ fuZGaCy0Qh1ye7GUoTtUDjUak9DQZM4COowQXvnlbzx7XWWvXVH6IBr9HE3c3dPOWhhy
+ hFRbdY/eX7XAaCl0+1ofGzGiSl38CBSZ/Uwgrd9EXYeYBuixvr5VWcbCT7n9JIL0huMU
+ lv8W9ZVgQK7bNlzGBqislijtKHyPedO+adOLVlvV6L2Bf+pFUcskMwQVv3peyaZT8bCf
+ THLHD0/w8Jryzehc/ywIK+xEyEE9EDm2ojXvJuqrSLUkI4ZgKlO/Pjf9lI3OYFM+2UX5
+ 2sOQ==
+X-Gm-Message-State: ALoCoQk879B7jk+tpKoDoetD/KuEeTEgZoZtS3Prq4c+x9hP0UEKRSJrAtsE2idnX4/JcDZyr6yn
+X-Received: by 10.66.148.230 with SMTP id tv6mr5774664pab.155.1393386791528;
+ Tue, 25 Feb 2014 19:53:11 -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 bc4sm15896882pbb.2.2014.02.25.19.53.09
+ for <multiple recipients>
+ (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128);
+ Tue, 25 Feb 2014 19:53:10 -0800 (PST)
+Content-Type: multipart/alternative;
+ boundary="Apple-Mail=_95094412-BF43-4F67-807D-5F2DC2CB942C"
+Mime-Version: 1.0 (Mac OS X Mail 6.6 \(1510\))
+From: Stephane Brossier <stephane@kill-bill.org>
+In-Reply-To: <CANEZrP0-LqFC8N500=mnKbKE+=UtFw_Y5cHR8JRC-zmmGsSAjA@mail.gmail.com>
+Date: Tue, 25 Feb 2014 19:53:08 -0800
+Message-Id: <BFA4F8CD-529B-418D-B3B9-599C89914CD1@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>
+ <81FBEA67-45A9-4531-BEA0-071CE9FAEF7E@kill-bill.org>
+ <CANEZrP0-LqFC8N500=mnKbKE+=UtFw_Y5cHR8JRC-zmmGsSAjA@mail.gmail.com>
+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: 1WIVYb-0002KV-F9
+Cc: Bitcoin Dev <bitcoin-development@lists.sourceforge.net>,
+ Pierre-Alexandre Meyer <pierre@kill-bill.org>
+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: Wed, 26 Feb 2014 03:53:19 -0000
+
+
+--Apple-Mail=_95094412-BF43-4F67-807D-5F2DC2CB942C
+Content-Transfer-Encoding: quoted-printable
+Content-Type: text/plain;
+ charset=windows-1252
+
+Hi Mike, Jeremy, Drak,
+
+Before going through your questions, I would like to bring some clarity =
+on a few key elements in that protocol. There are really two aspects to =
+it:
+The contract negotiation; when the user first subscribes, it is prompted =
+by a contract that will define the payment bounds associated with that =
+subscription.=20
+Once accepted, the wallet is in charge and the user does not have to =
+interact anymore -- this is the point of the recurring payment protocol. =
+The wallet will poll the merchant and issue payments as they are =
+requested by the merchant as long as they stay within the bounds of what =
+was specified by the contract (and accepted by the customer).
+
+I think it would help to explain how we ended up with the type of =
+contract we introduced in that protocol. In an ideal world and in a NON =
+recurring scheme, the contract should simply be the exact amount to be =
+paid. In our case the exact amount may not be completely known in =
+advance -- for e.g taxes, shipping, pro-rations, =85 and so we decided =
+to introduce first a max amount per payment, and also a max amount per =
+period. It is up to the merchant to decide whether to specify none, any =
+or both bounds (max amount per payment and max amount per period). By =
+specifying both, the contract is tighter and the client would feel safer =
+to accept it. In the extreme case, by specifying none, the client would =
+be presented with a contract to pay whatever is requested -- probably =
+not a good option in the Bitcoin world unless there is a high sense of =
+trust with the merchant. =20
+
+=46rom reading your comments, it appears we have not been clear on how =
+that frequency (PaymentFrequencyType) is being used. Its sole purpose is =
+to define the max amount per period in the contract. The frequency of =
+the payment is implicitly dictated by the merchant but not specified in =
+the protocol by design: the wallet has to poll with a fine granularity =
+(ideally each day when it is up) to understand if there is something =
+pending. In the same way, a specified amount was not enough in the =
+contract, we feel it would be restrictive to specify in advance when =
+payments are due. There are a lot of complex scenarios in the billing =
+space, and having the wallet poll the merchant to inquire for pending =
+payments is the most flexible option and the contract is there to ensure =
+the client will not be abused. To give a concrete example, imagine a =
+data plan where you pay a base recurring price of $70 per month, but you =
+are charged $10 per GB of data used beyond your included limit. If you =
+exceed your limit on the 15th and the 23rd of a given month, two extra =
+payment attempts will be requested by the merchant, that you couldn=92t =
+predict (this scenario is often referred to as usage billing with Prepay =
+Credits and Top-up, where the customer pays in advance for blocks of N =
+units, and once they are consumed another N are purchased).
+
+
+See answers in your questions inlined below:
+
+>=20
+> I have the following comments:
+> There's no need to serialize RecurringPaymentDetails as bytes here. =
+It's done that way outside of PaymentDetails in order to support digital =
+signatures over protobufs that may have extensions the wallet app isn't =
+aware of, but it's a pain and inside PaymentDetails (and therefore for =
+most extensions) it shouldn't be necessary. So you can just use =
+"optional RecurringPamentDetails recurring_payments =3D 8;"
+>=20
+
+OK, we'll fix it.
+
+
+> There's only 4 possibilities here for recurrences. That seems rather =
+restrictive. Is the cost of being more expressive really so high? Why =
+not allow more flexible specification of periods?
+> If there's no payment_frequency_type field then what happens? A quirk =
+of protobufs to be aware of is that making an enum field "required" can =
+hurt backwards compatibility. Because it will be expressed using a =
+languages underlying enum type, if there's a new enum member added later =
+old software that attempts to deserialize this will throw exceptions =
+because the new "unknown" member would be unrepresentable in the old =
+model. Making the field optional avoids this problem (it will be treated =
+as missing instead) but means software needs to be written to know what =
+to do when it can't read the enum value / sees enum values from the =
+future.
+>=20
+
+I hope the explanation above answers the questions.
+
+> I assume the amounts are specified in terms of satoshi, and timestamps =
+are UNIX time, but better to make that explicit.
+>=20
+
+Yes.
+
+> Seems there's an implicit value constraint that max_payment_amount <=3D =
+max_payment_per_period. What happens if that constraint is violated? =
+Best to document that.
+>=20
+
+As explained above, contract would define none, 1 or both conditions. =
+First the merchant should not return such 'conditions' but if it does =
+the client should not accept the contract. If the client decides to =
+accept it anyway, then the wallet just verifies both conditions are met =
+separately regardless of whether there is such violation and if so, =
+makes the payment.
+
+> What's the "merchant ID" namespace thing about? What's it for? What =
+happens if I set my competitors merchant ID there?
+
+I agree, we can easily get rid of it.
+
+> What's the "subscription ID"? Is this stuff not duplicative/redundant =
+with the existing merchant_data field?
+
+In an ideal world the merchant should return unique subscriptionId (UUID =
+for instance). That subscriptionId is used in the code to identify the =
+contracts associated with the subscription. The merchant_data if i =
+understand correctly the payment protocol is opaque from the client =
+point of view, so it cannot be used by the client for that purpose.=20
+> In what situations would you have >1 contract per payment request? I'm =
+not sure I understand why it's repeated. Presumably if there are zero =
+contracts included the data should be ignored, or an error thrown and =
+the entire payment request rejected? Which should it be?
+>=20
+
+
+There are many example where that could happen; for instance if you =
+subscribe to a service, then later decide to downgrade to a lower =
+product. The merchant may decide to only let you downgrade at the end of =
+your paid period-- to avoid generating extra credit-- and in that =
+situation you end up with two contracts: One for the current product you =
+are in and one for the future product you will end up on when the =
+downgrade becomes effective.
+
+
+> It's unclear to me given such a contract when the payment should =
+actually occur. For instance if it's "monthly" then what day in the =
+month would the payment occur?
+>=20
+
+As outlined above in the introduction, the protocol is designed in such =
+a way that the wallet does not have to know what is the exact date when =
+payment should occur, but instead polls the merchant for pending =
+payments. There are many situations when specifying an exact payment =
+date is not an option so that flexibility is essential. A simple example =
+would be for a customer who started subscribing on the 31th of a month. =
+Since there will be months with 28/29/30 days, the payment date would =
+change depending on the month.
+
+
+
+
+> You'll notice I moved the comments to be above the field definitions. =
+I know the current proto isn't done that way, but let's change it - long =
+comments are good and putting them above the field definitions =
+encourages people to write enough detail without being put off by line =
+length constraints
+>=20
+
+Fine.
+
+
+> I think the next step would be to talk to BitPay/get Jeff+Stephen =
+involved because I know they have customers that really want recurring =
+payments, and those guys will have a clearer idea of customer =
+requirements than we do. I feel uncomfortable with designing or =
+reviewing in a vacuum without some actual people who would use it =
+chiming in, as I don't really know much about the underlying business =
+processes.
+
+
+We are totally open to receive feedbacks from them.. How do we bring =
+them in the discussion?
+
+>=20
+> I have some other comments about the bitcoinj implementation =
+specifically - for instance, we don't have a "wallet directory" concept: =
+everything goes into the wallet file. So we'll need to think about how =
+to structure the code to allow that. Also, just using a background =
+polling thread is likely not flexible enough, as on some platforms you =
+can't stay running all the time (e.g. Android) without upsetting people, =
+but the underlying OS can wake you up at the right times, so wallet apps =
+should have an ability to control wakeup tasks. But we can discuss that =
+over on the bitcoinj list specifically. Let's keep this thread for the =
+general protocol design.
+
+Ok that makes sense.
+
+>=20
+> BIP 70 is indeed implemented in Bitcoin Core on the C++ side, so that =
+isn't a concern. It could be done there too.
+>=20
+
+Great to know.
+
+
+
+
+--Apple-Mail=_95094412-BF43-4F67-807D-5F2DC2CB942C
+Content-Transfer-Encoding: quoted-printable
+Content-Type: text/html;
+ charset=windows-1252
+
+<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html =
+charset=3Dwindows-1252"></head><body style=3D"word-wrap: break-word; =
+-webkit-nbsp-mode: space; -webkit-line-break: after-white-space; =
+"><div><b =
+id=3D"docs-internal-guid-4a9a06ba-6c39-ff6f-7d06-7ec212a688dc"><div =
+style=3D"line-height: 1.15; margin-top: 0pt; margin-bottom: 0pt; "><span =
+style=3D"font-size: 15px; font-family: Arial; font-weight: normal; =
+vertical-align: baseline; white-space: pre-wrap; ">Hi Mike, Jeremy, =
+Drak,</span></div><br><span style=3D"font-size: 15px; font-family: =
+Arial; font-weight: normal; vertical-align: baseline; white-space: =
+pre-wrap; "></span><div style=3D"line-height: 1.15; margin-top: 0pt; =
+margin-bottom: 0pt; "><span style=3D"font-size: 15px; font-family: =
+Arial; font-weight: normal; vertical-align: baseline; white-space: =
+pre-wrap; ">Before going through your questions, I would like to bring =
+some clarity on a few key elements in that protocol. There are really =
+two aspects to it:</span></div><ol =
+style=3D"margin-top:0pt;margin-bottom:0pt;"><li dir=3D"ltr" =
+style=3D"list-style-type: decimal; font-size: 15px; font-family: Arial; =
+font-weight: normal; vertical-align: baseline; "><div =
+style=3D"line-height: 1.15; margin-top: 0pt; margin-bottom: 0pt; "><span =
+style=3D"vertical-align: baseline; white-space: pre-wrap; ">The contract =
+negotiation; when the user first subscribes, it is prompted by a =
+contract that will define the payment bounds associated with that =
+subscription. </span></div></li><li dir=3D"ltr" style=3D"list-style-type: =
+decimal; font-size: 15px; font-family: Arial; font-weight: normal; =
+vertical-align: baseline; "><div style=3D"line-height: 1.15; margin-top: =
+0pt; margin-bottom: 0pt; "><span style=3D"vertical-align: baseline; =
+white-space: pre-wrap; ">Once accepted, the wallet is in charge and the =
+user does not have to interact anymore -- this is the point of the =
+recurring payment protocol. The wallet will poll the merchant and issue =
+payments as they are requested by the merchant as long as they stay =
+within the bounds of what was specified by the contract (and accepted by =
+the customer).</span></div></li></ol><br><span style=3D"font-size: 15px; =
+font-family: Arial; font-weight: normal; vertical-align: baseline; =
+white-space: pre-wrap; "></span><div style=3D"line-height: 1.15; =
+margin-top: 0pt; margin-bottom: 0pt; "><span style=3D"font-size: 15px; =
+font-family: Arial; font-weight: normal; vertical-align: baseline; =
+white-space: pre-wrap; ">I think it would help to explain how we ended =
+up with the type of contract we introduced in that protocol. In an ideal =
+world and in a NON recurring scheme, the contract should simply be the =
+exact amount to be paid. In our case the exact amount may not be =
+completely known in advance -- for e.g taxes, shipping, pro-rations, =85 =
+and so we decided to introduce first a max amount per payment, and also =
+a max amount per period. It is up to the merchant to decide whether to =
+specify none, any or both bounds (max amount per payment and max amount =
+per period). By specifying both, the contract is tighter and the client =
+would feel safer to accept it. In the extreme case, by specifying none, =
+the client would be presented with a contract to pay whatever is =
+requested -- probably not a good option in the Bitcoin world unless =
+there is a high sense of trust with the merchant. =
+&nbsp;&nbsp;</span></div><br><span style=3D"font-size: 15px; =
+font-family: Arial; font-weight: normal; vertical-align: baseline; =
+white-space: pre-wrap; "></span><div style=3D"line-height: 1.15; =
+margin-top: 0pt; margin-bottom: 0pt; "><span style=3D"font-size: 15px; =
+font-family: Arial; font-weight: normal; vertical-align: baseline; =
+white-space: pre-wrap; ">=46rom reading your comments, it appears we =
+have not been clear on how that frequency (PaymentFrequencyType) is =
+being used. Its sole purpose is to define the max amount per period in =
+the contract. The frequency of the payment is implicitly dictated by the =
+merchant but not specified in the protocol by design: the wallet has to =
+poll with a fine granularity (ideally each day when it is up) to =
+understand if there is something pending. In the same way, a specified =
+amount was not enough in the contract, we feel it would be restrictive =
+to specify in advance when payments are due. There are a lot of complex =
+scenarios in the billing space, and having the wallet poll the merchant =
+to inquire for pending payments is the most flexible option and the =
+contract is there to ensure the client will not be abused. To give a =
+concrete example, imagine a data plan where you pay a base recurring =
+price of $70 per month, but you are charged $10 per GB of data used =
+beyond your included limit. If you exceed your limit on the 15th and the =
+23rd of a given month, two extra payment attempts will be requested by =
+the merchant, that you couldn=92t predict (this scenario is often =
+referred to as usage billing with Prepay Credits and Top-up, where the =
+customer pays in advance for blocks of N units, and once they are =
+consumed another N are purchased).</span></div><br><span =
+style=3D"font-size: 15px; font-family: Arial; font-weight: normal; =
+vertical-align: baseline; white-space: pre-wrap; =
+"></span></b></div><div><br></div><div><b =
+id=3D"docs-internal-guid-4a9a06ba-6c39-ff6f-7d06-7ec212a688dc"><div =
+style=3D"line-height: 1.15; margin-top: 0pt; margin-bottom: 0pt; "><span =
+style=3D"font-size: 15px; font-family: Arial; font-weight: normal; =
+vertical-align: baseline; white-space: pre-wrap; ">See answers in your =
+questions inlined below:</span></div><div style=3D"line-height: 1.15; =
+margin-top: 0pt; margin-bottom: 0pt; "><span style=3D"font-size: 15px; =
+font-family: Arial; font-weight: normal; vertical-align: baseline; =
+white-space: pre-wrap; "><br></span></div></b></div><div><blockquote =
+type=3D"cite"><div dir=3D"ltr"><div><pre =
+style=3D"font-family:Consolas,'Liberation =
+Mono',Courier,monospace;font-size:12px;margin-top:0px;margin-bottom:0px;co=
+lor:rgb(51,51,51);line-height:18px"><div><span class=3D"" =
+style=3D"color:rgb(153,153,136);font-style:italic"><br></span></div></pre>=
+</div><div>I have the following comments:</div>
+<div><ol><li>There's no need to serialize RecurringPaymentDetails as =
+bytes here. It's done that way outside of PaymentDetails in order to =
+support digital signatures over protobufs that may have extensions the =
+wallet app isn't aware of, but it's a pain and inside PaymentDetails =
+(and therefore for most extensions) it shouldn't be necessary. So you =
+can just use "optional RecurringPamentDetails recurring_payments =3D =
+8;"<br>
+<br></li></ol></div></div></blockquote><div><br></div><div>OK, we'll fix =
+it.</div><div><br></div><br><blockquote type=3D"cite"><div =
+dir=3D"ltr"><div><ol start=3D"2"><li>There's only 4 possibilities here =
+for recurrences. That seems rather restrictive. Is the cost of being =
+more expressive really so high? Why not allow more flexible =
+specification of periods?</li></ol></div></div></blockquote><blockquote =
+type=3D"cite"><div dir=3D"ltr"><div><ol start=3D"3"><li>
+If there's no payment_frequency_type field then what happens? A quirk of =
+protobufs to be aware of is that making an enum field "required" can =
+hurt backwards compatibility. Because it will be expressed using a =
+languages underlying enum type, if there's a new enum member added later =
+old software that attempts to deserialize this will throw exceptions =
+because the new "unknown" member would be unrepresentable in the old =
+model. Making the field optional avoids this problem (it will be treated =
+as missing instead) but means software needs to be written to know what =
+to do when it can't read the enum value / sees enum values from the =
+future.<br>
+<br></li></ol></div></div></blockquote><div><br></div><div>I hope the =
+explanation above answers the questions.</div><br><blockquote =
+type=3D"cite"><div dir=3D"ltr"><div><ol start=3D"4"><li>I assume the =
+amounts are specified in terms of satoshi, and timestamps are UNIX time, =
+but better to make that =
+explicit.<br><br></li></ol></div></div></blockquote><div><br></div>Yes.</d=
+iv><div><br><blockquote type=3D"cite"><div dir=3D"ltr"><div><ol =
+start=3D"5"><li>Seems there's an implicit value constraint that =
+max_payment_amount &lt;=3D max_payment_per_period. What happens if that =
+constraint is violated? Best to document that.<br>
+<br></li></ol></div></div></blockquote><div><br></div>As explained =
+above, contract would define none, 1 or both conditions. &nbsp;First the =
+merchant should not return such 'conditions' but if it does the client =
+should not accept the contract. If the client decides to accept it =
+anyway, then the wallet just verifies both conditions are met separately =
+regardless of whether there is such violation and if so, makes the =
+payment.</div><div><br></div><div><blockquote type=3D"cite"><div =
+dir=3D"ltr"><div><ol start=3D"6"><li>What's the "merchant ID" namespace =
+thing about? What's it for? What happens if I set my competitors =
+merchant ID there?</li></ol></div></div></blockquote><div><br></div>I =
+agree, we can easily get rid of it.</div><div><br><blockquote =
+type=3D"cite"><div dir=3D"ltr"><div><ol start=3D"6"><li>What's the =
+"subscription ID"? Is this stuff not duplicative/redundant with the =
+existing merchant_data =
+field?<br></li></ol></div></div></blockquote><div><br></div><div>In an =
+ideal world the merchant should return unique subscriptionId (UUID for =
+instance). That subscriptionId is used in the code to identify the =
+contracts associated with the subscription. The merchant_data if i =
+understand correctly the payment protocol is opaque from the client =
+point of view, so it cannot be used by the client for that =
+purpose.&nbsp;</div><blockquote type=3D"cite"><div dir=3D"ltr"><div><ol =
+start=3D"6"><li>In what situations would you have &gt;1 contract per =
+payment request? I'm not sure I understand why it's repeated. Presumably =
+if there are zero contracts included the data should be ignored, or an =
+error thrown and the entire payment request rejected? Which should it =
+be?<br>
+=
+<br></li></ol></div></div></blockquote><div><br></div><div><br></div><div>=
+There are many example where that could &nbsp;happen; for instance if =
+you subscribe to a service, &nbsp;then later decide to downgrade to a =
+lower product. The merchant may decide to only let you downgrade at the =
+end of your paid period-- to avoid generating extra credit-- and in that =
+situation you end up with two contracts: One for the current product you =
+are in and one for the future product you will end up on when the =
+downgrade becomes effective.</div><div><br></div><br><blockquote =
+type=3D"cite"><div dir=3D"ltr"><div><ol start=3D"8"><li>It's unclear to =
+me given such a contract when the payment should actually occur. For =
+instance if it's "monthly" then what day in the month would the payment =
+occur?<br><br></li></ol></div></div></blockquote><div><br></div><div>As =
+outlined above in the introduction, the protocol is designed in such a =
+way that the wallet does not have to know what is the exact date when =
+payment should occur, but instead polls the merchant for pending =
+payments. There are many situations when specifying an exact payment =
+date is not an option so that flexibility is essential. A simple example =
+would be for a customer who started subscribing on the 31th of a month. =
+Since there will be months with 28/29/30 days, the payment date would =
+change depending on the =
+month.</div><div><br></div><div><br></div><div><br></div><br><blockquote =
+type=3D"cite"><div dir=3D"ltr"><div><ol start=3D"9"><li>You'll notice I =
+moved the comments to be above the field definitions. I know the current =
+proto isn't done that way, but let's change it - long comments are good =
+and putting them above the field definitions encourages people to write =
+enough detail without being put off by line length constraints</li>
+=
+</ol></div><div><br></div></div></blockquote><div><br></div><div>Fine.</di=
+v><div><br></div><br><blockquote type=3D"cite"><div dir=3D"ltr"><div>I =
+think the next step would be to talk to BitPay/get Jeff+Stephen involved =
+because I know they have customers that really want recurring payments, =
+and those guys will have a clearer idea of customer requirements than we =
+do. I feel uncomfortable with designing or reviewing in a vacuum without =
+some actual people who would use it chiming in, as I don't really know =
+much about the underlying business =
+processes.</div></div></blockquote><div><br></div><div><br></div><div>We =
+are totally open to receive feedbacks from them.. How do we bring them =
+in the discussion?</div><br><blockquote type=3D"cite"><div dir=3D"ltr">
+<div><br></div><div>I have some other comments about the bitcoinj =
+implementation specifically - for instance, we don't have a "wallet =
+directory" concept: everything goes into the wallet file. So we'll need =
+to think about how to structure the code to allow that. Also, just using =
+a background polling thread is likely not flexible enough, as on some =
+platforms you can't stay running all the time (e.g. Android) without =
+upsetting people, but the underlying OS can wake you up at the right =
+times, so wallet apps should have an ability to control wakeup tasks. =
+But we can discuss that over on the bitcoinj list specifically. Let's =
+keep this thread for the general protocol =
+design.</div></div></blockquote><div><br></div>Ok that makes =
+sense.</div><div><br><blockquote type=3D"cite"><div dir=3D"ltr">
+<div><br></div><div class=3D"gmail_extra">BIP 70 is indeed implemented =
+in Bitcoin Core on the C++ side, so that isn't a concern. It could be =
+done there too.<br><br></div></div>
+</blockquote><br></div><div>Great to =
+know.</div><div><br></div><div><br></div><br></body></html>=
+
+--Apple-Mail=_95094412-BF43-4F67-807D-5F2DC2CB942C--
+
+