Facebookの仮想通貨Libraが来年発行されるという事で、世界中の中央銀行はじめトランプさんなどからも袋叩きの今日この頃ですが、
まぁ、そういう政治的?というか大人の方々のお話はともかくとして、Libra使って何ができるのかいじってみたいというのはQiita界隈に生息するものの本能だったりもします。
で、先月そのLibraのデベロッパーグループの主催で行われたハッカソンHackLibraにLibra Authというプロジェクトで参加して、入賞は逃したけど「Honorable mention (名誉ある言及)」という賞的なものを頂いたので、その辺を少し書いてみようかなと思います。
最近Qiitaに全然書いてなかったし。
HackLibra
https://medium.com/@hacklibra/hacklibra-winners-8da1a9124628
自分のブログ「かも日記」 LibraのハッカソンHackLibraで3位入賞はできなかったけどなんか褒められた感?
https://jsgt.org/wp/?p=975
Libra Auth
https://github.com/toshirot/libra-auth
残念ながら締め切り日の4日後にLibra testnet の更新があって、私のデモが依存していたライブラリが動かなくなってしまいました。
まぁ、発展途上のLibraなのでしょうがないのですが、その修正(修正しても良いかはちゃんと聞いたのだけど)が締め切り後ということで減点になってしまったので3位入賞を逃してしまいました。あれが無ければ入賞していたと自負はしてます。えへん。
さて、Libra Authという名前でわかる通り、これはLibraを利用したauthenticationについての話です。
Libraの公開鍵と秘密鍵を利用した認証方法で、EdDSAによる署名を使用します。
Libraクライアントの鍵に基付く認証ですが、BobとAlice間の認証時の通信はLibraブロックチェーンを呼び出さなくても可能(呼び出せばより強固ですが)なので、Libraブロックチェーンに負荷を与えません。というわけで処理速度が速いです。
以下の図はこのDemoのものですが、ユーザー「ALICE」はLibraでチケットセンター「BOB」にチケット料金を支払い、署名チケットで認証されます。
詳細は Github の説明を観ていただくとして、ざっくりいうと、Libraを送受信した「Alice」と「Bob」本人であることをお互いに証明できるPrivate Key とトランザクション上で参照できるPublic Key を利用して相互に本人確認し、Signatureで作ったQRコードで認証をする方法についてのテスト実装です。
このデモは、例えば入場券の販売などを想定しています。
####手順
(1,2,3) AliceはBobのチケットセンターへ10Libra送金し、Bobへアドレスとメッセージを送ります。
(4,5) Bobは受け取ったメッセージと自分のPrivate Key でSignatureBを作りAliceへ送ります。
(6,7) Aliceは送ったメッセージと受け取ったSignatureBをBobのPublic Key でVerifyしてTrueならボブが、2のトランザクションでLibraを支払った相手であることが証明されます。
そこで、SignatureBとAliceのPrivate Key でSignatureAを作り、それとAliceのAddressでQRコードを作ります。
(8) Bobは入場ゲートでAliceのQRコードをスキャンし、送ったSignatureBと受け取ったSignatureAをAliceのPublic Key でVerifyしてTrueならAliceが、2のトランザクションでLibraをBobへ支払った人であることが証明されるので
(9) 証明された入場をOKにします。
上記の(1~4)以降はLibraネットワークを参照しなくても認証は可能なので、例えば入場門で数万人を連続処理してもLibraのネットワークに負荷をかけないということです。
もちろん、QRコードの盗難や転売対策として、(5~8)を繰り返すことも可能です。あるいは、転売を許可する代わりに、転売手数料がBobにも入る仕組みにすることもできると思います。
####デモ
https://libra-auth.com/
ALICE: Buy ticket:
http://libra-auth.com/buy-ticket.html
BOB: Authenticate ticket:
https://libra-auth.com/auth-ticket.html
コードはNode.jsで書いてますが、基本的にはどんな言語でもかけるかなと思います。その辺はこれから少しいじるつもりなので、後日続きを書きたいなと思ってます。現状のDemoコードはGithubでご覧ください。