2017/09/10

WebPayments と仮想通貨の関連性について

この記事について

 少し前から仮想通貨に興味があり、界隈の動きが気になっている。

 動機としては、「日本での支払いはクソめんどくさすぎる、何とかしてくれ」という事がある。中国では QR コードでサクッとどこでも支払いができるとか、硬貨で支払いをしようとしたら「硬貨とか紙幣使うなんて恥ずかしいからやめてくれ」と言われた、といった話は聞くが、完全に日本は置いていかれている感がある。日本終わりです、終わり!…一応日本でも Suica で支払いができたりするが、日常で接する全ての店舗でそういった便利な支払いができるかと言うと全くそんな事はない。実際、硬貨や紙幣なしに生活できるかと言ったらできないでしょう。

 リアルワールドでの支払いはそんな感じで絶望的な状況な訳だが、Web での支払いは比較的デジタルで便利だ。とは言え、仮想通貨での支払いはまだまだ整備されていない。WebPayments はここに関係してくるのか?WebPayments とは一体何なのか?という事について、少しだけ調べたので備忘的に書いておこうと思う。

 そして、おそらく色々間違っているところがあると思うので、専門家の人に是非ツッコミを入れて頂きたいと思っている。

結論

 一応、調べた限りの結論を先に書いておこうと思う。結論は、こうだ。

 WebPayments は仮想通貨での支払いに使われる可能性も秘めているが、現状形はなく、将来に期待

 仮想通貨で支払う時には「支払いに同意する」という行為をどうやって実現するかが問題になるが、詳細は後に書く。この結論に至るまでには色々と知識が必要なので、面倒に感じるかもしれないが順を追って書いていく。

WebPayments とは何なのか?

 これがいきなり難しい問いだ。結構浮ついたワードとして出回っていて、実態がよく分からない。個人的な理解としては、こうだ。

 WebPayments とは、Web 上で支払いを行うための、"HTTP 上の仕組み" と "JavaScript 上の仕組み" を総称したものである。

 間違ってるかな?(笑)よく分からないので専門家の方に教えて頂きたいところである。具体的に W3C 上での参照を下に記す。
 具体的な利用例としては、下記の様になるのではないかと思う。
  1. HTTP 上の仕組み
    • サーバーサイドから支払いのリクエスト(ステータスコード 402 のレスポンス)をクライアントに送り、支払いをしてもらう。アプリとの連携などが考えられる(ブラウザが対応するのかはよく分からない)。
  2. JavaScript 上の仕組み
    • ウェブサイト上のスクリプト発端で、支払いを行う。ショッピングサイトでの支払いなどが考えられる。
 どちらにしても、実際の支払いの方法は下記の様なものになるのではないかと思う。
  1. カード情報や発送先などの情報をサーバーに送り、サーバーが別途それを利用し、支払いを行う。支払いをされる側がカード情報を一旦でも保持するのが特徴。
  2. カード情報は送らずに事前にカード会社から取得したトークンと発送先などの情報をサーバーに送り、サーバーは別途トークンをカード会社に送って支払いを行う。支払いをされる側としては、カード情報にタッチしないのが特徴。
 両者の違いが分からない人は、@agektmr さんの Web Payments はなぜ避けて通れないものになるのか - ウェブでの新しいお金の払い方 の記事を読んで理解してもらいたい。

仮想通貨で WebPayments を利用するには?

 さて、もともとの疑問であった「仮想通貨で WebPayments を利用する事はできるのか、できるのならどうやってするのか」という事だが、先ずは「現状は形がない」という認識だ。何故なら、現状の Payment Request API はクレジットカード情報の利用が前提となっているからだ(合ってる?)。

 仮想通貨で支払いをする時に問題になるのが、「どうやって支払いに同意した事にするのか(秘密鍵で署名しなければならない)」という部分だが、現状の仕組みを見ると、Payment App を利用すれば可能性がある様に思う。例えば下記の様な形ではないだろうか。
  • クライアントは、Payment App で仮想通貨のトランザクションに署名した状態でトランザクション情報を返す。それをサーバーに送信し、サーバーは仮想通貨に応じたバリデーションプロセスに乗せる。
  • クライアントは、Payment App で仮想通貨(の秘密鍵)を管理するサーバーにトークンを発行してもらい、そのトークンを被支払い者のサーバーに返す。被支払い者はそのトークンを仮想通貨を管理するサーバーに送って支払いを行う。
    ※情報を秘匿したいというよりも、秘密鍵をクライアントで管理しない可能性があるのではないか、という話
 この様なプロセスが実際可能な仕様になっているのかはいまいち分からなかった。Payment App まわりがどうなっているか、情報が収集できなかったためだ。ごめんなさい。そのうち調べます。

仮想通貨で支払う時の問題

 仮想通貨で支払いを行おうと思った場合、支払いを行う者と支払いを行われる者でメインとしている通貨が違う事が起こり得る。例えば、A さんは BTC で支払いをしたいと思っていて、B ショップはいやいや円が欲しいです、といった場合や、C ショップでは LTC がよいと思っているかもしれない。

 どこかで聞いた事のある様な話だ。まさに ILP と IoV が解決してくれる話だと思う。具体的なフローは疲れてしまったので割愛するが(ぉぃ)、Payment App が ILP に対応したレジャーに対して支払いをさせる様にすれば、可能だと思う。

 次回がもしあれば、そのフローについてもう少し詳細に書いてみたいと思う。

参照