ピヨピヨ日記

毎日ピヨピヨしています

State of the ÐApps に Pixereum を載せてもらった

後学のため、ÐApps(Ethereum Blockchain 上のアプリ)のリスティングサイト State of the ÐApps に、この前つくった Pixereum の掲載申請を出したら案外スムースに載せてもらうことができました。

 

Pixereum — State of the ÐApps

 

どうやらマニュアルで審査をしているみたいだけど、まだ絶対数がとても多いわけでもないので、2日程度で掲載に至りました。

 

今後日本でも ÐApps のリスティングサイトがけっこう出てくるだろうなあ。アプリみたいにレビューがあったり、記事広告が出てきたりするんだろうな。

 

Pixereum についてはこちら

diary.piyopiyo.jp 

Ethereum のスマートコントラクトについてはだいぶ遊び方がわかってきたので、次はもう少し面白くて使えるものをつくってみたい。

 

Pixereum を自分のサイトに表示できるやつをつくってみた

この前つくってみた Pixereum を自分のサイトに表示できるやつをつくってみました。

 

Pixereum の詳細については以下の記事で:

diary.piyopiyo.jp

 

今回のスクリプトはすごくてきとうに作ったのでいろいろ改善が必要ですが、とりあえず動くので使ってみています。

 

gist.github.com

 

上のスクリプトをブログのサイドバーとかにはると、Pixereum をサイトに簡単に表示することができます。

 

👇👇👇ここに実際にはってみています。 

 

 

 

このブログはサイドバーがないのでちょっと表示しづらいのですが、別のサイドバーがあるブログにスクリプトをはってみたらこんな感じになりました。まんぞく。

 

f:id:plygnd:20180311175841p:plain

 

Ethereum のスマートコントラクトを使用したスマートロック

Ethereum のスマートコントラクトを使用したスマートロックのプロトタイプをつくってみました。

 

f:id:plygnd:20180310210146j:plain

 

このスマートロックでは、ユーザが鍵を解錠する権利を取得するために、あらかじめスマートコントラクト上に公開鍵を書き込んでおき(このとき Ether で支払いも済ませる)、鍵を解錠する際は公開鍵認証を行ってユーザの確認を行います。

 

今回のプロトタイピングの主目的は、「Ethereum Wallet の公開鍵を使って、ユーザのデバイスと鍵デバイスの間で公開鍵認証を行う」ということがちゃんとできるかどうかの検証です。結果としてはうまくできたのでうれしい。

 

この方法を使うと、受益者(サービスを受けるべきユーザ)の確認・認証を Ethereum の Wallet だけでできるので、鍵以外にも何か使えるかなあと思っています。

 

実際に動いているところ

youtu.be

 

この動画だけだと全く意味不明ですね。

  • Web Bluetooth API を使用したウェブサイト(HTML+JSで実装)と Raspberry Pi (上のプログラムは Node.js で実装) が BLE で繋がっていて、ウェブサイト上の解錠ボタンをクリックしたら、アヒルちゃんが動いています。
  • アヒルちゃんが乗っているのはサーボモータで、実際にはこのサーボモータを使って、アヒルちゃんではなく鍵を動かすことになります。
  • Web Bluetooth API を使用したウェブサイトがユーザ所有のデバイス、Raspberry Pi  + サーボモータが鍵デバイスになります。ユーザ所有のデバイスについては実装が楽なのでウェブサイトにしましたが、BLE が使えるのであれば iPhone でも Android でもなんでも ok です。

 

全体の概要図みたいなもの 

f:id:plygnd:20180310194544p:plain

 

ざっくり解錠の流れ

鍵を解錠する権利の取得

  • Ethereum スマートコントラクトに公開鍵を書き込みます。

ここで Ether 建てによる支払いも完了できます。ただし、エスクロー等の手段を使用しないのであれば、鍵の持ち主を信用できる場合に限ります。

鍵を解錠

  • [ユーザのデバイス] 鍵デバイスに鍵の解錠要求を出します。
  • [鍵デバイス] 解錠要求を受け取ったら、Ethererum スマートコントラクト上の公開鍵を取得します。(値を読むだけなので、手数料のGasはかかりません。)
  • [鍵デバイス] 乱数を生成します。
  • [鍵デバイス] 乱数を公開鍵で暗号化し、暗号化した乱数をユーザのデバイスに返します。
  • [ユーザのデバイス] 秘密鍵で暗号化された乱数を復号します。
  • [ユーザのデバイス] 得られた乱数のハッシュ値を鍵デバイスに返します。
  • [鍵デバイス] 自身が生成した乱数のハッシュ値と、ユーザのデバイスから受け取ったハッシュ値を比較して、一致していれば鍵を解錠します。

 

ここでは、ユーザのデバイスはインターネットに接続できる必要がないため、BLE 以外にもスマートカードとかでも同じようなことができる気がします。

 

鍵自身が  Ethereum のノードになっているときはいいけど、外部のノードを使用するときは、ノードが嘘をついている可能性もあるので、複数のノード上のスマートコントラクトの値を読んだほうがいいのかな?

 

プロトタイピングで使用したもの

  • Raspberry Pi + サーボ - 鍵デバイス
  • Chrome - ユーザデバイス
  • Node.js - 鍵側のコード
  • HTML/JS + Web Bluetooth API - ユーザデバイス側のコード
  • 使用した node modules - web3, eth-crypto, bleno, crypto, cylon
  • Solidity - スマートコントラクトのコード

 

最初は、BLE を使うユーザのデバイスを iOS にしようと思ったけど、ちょっと楽をするために、ブラウザから Bluetooth を使用することのできる Web Bluetooth API を使ったのでかなり楽にプロトタイプをつくることができました。

 

おわりに

書いてる途中で、「鍵」がゲシュタルト崩壊してきました。「鍵デバイス」という名前だと秘密鍵やら公開鍵やらと混同してしまうので、「スマートロック」という名前を使用して説明すればよかったです。でもめんどくさいからこのままでいいや。

 

あと、スマートロックといいながら、まったく鍵の機構を作っていないのでタイトル詐欺かもしれない。ごめんなさい。

 

あとあと、公開鍵認証のやり方がこれでいいのか不安。ちゃんとコンピュータサイエンスを勉強したいなあ。やっぱり大学に行きなおすべきか。学費稼がないと。

 

今日も現実逃避できて楽しかったけど、そろそろ本格的に確定申告やばい。

 

参考

blog.playground.io

 

blog.playground.io

Ethereum Blockchain 上の「ピクセル」のオーナーになれるサービス Pixereum.io

Ethereum Blockchain 上の「ピクセル」のオーナーになれるサービス Pixereum.io を作ってみたよ。

 

f:id:plygnd:20180303170323p:plain

Ethereum Blockchain 上の 100x100=10000 ピクセルの所有権を取得できるサービス

 

Pixereum とは?

  • 暗号通貨(Ether)を使って、Ethereum Blockchain 上の「ピクセル」の所有権を取得することができるサービス
  • Pixereum には合計 10000 個のピクセルがある
  • 取得した「ピクセル」には、任意の色やメッセージを設定できる
  • 取得した「ピクセル」に、任意の価格を設定して販売することができる
  • 使い方: Pixereum.io にアクセスしてピクセルをクリックしてみよう!*1

 

意味あるの?

  • ないよ!
  • でも、「世界に10000個しかないピクセル」に価値を見出すへんなひとが一定数いて、ピクセルを購入してくれたら何か価値が生まれるかも?
  • アートって言い張ることもできるかも?(cryptoart なるジャンル?)
  • 広告的な価値があるかも?
  • もともとは、1ピクセルを1ドルで販売したという http://www.milliondollarhomepage.com/ にインスパイアされている。*2 
  • 現時点(2017年 - 2018年)における Ethereum の Smart Contract 上の技術的ないろいろやJavaScript APIの検証目的。

 

このあとやってみたいこと

  • 万が一ピクセルを取得してくれるひとがそこそこ出てきて、ピクセルが埋まってきたら、Pixereum をどこかパブリックなスペースで大きく表示してみたい。
  • 「世界初(※僕調べ)暗号通貨アート」とかわけのわからないことをいえるかも。
  • 今はカタコトでしか英語での説明を書けていないので、ちゃんと英語を勉強して海外の人向けにちゃんとサービスを提供する練習をしたい。
  • DApps といろいろできるアプリ(iOS or Android)を書きたいので、Pixereum を練習台につかいたい。

 

最近は Blockchain の勉強をしながら「価値とはそもそも何か?」とか考えて現実逃避できるので楽しいけど、そろそろ確定申告やらないとやばい。現実つらい。

 

Ruby で Ethereum のアドレスを生成する

Ruby 25 周年のイベントに参加してからなんか Ruby でプログラムを書きたくなってしまったので、無駄に Ruby で Ethereum のアドレスを生成するプログラムを書いてみた。

 

もっといいやり方があるのかもしれないけど、けっこうすっきり書けてうれしい。やっぱり Ruby いいなあ。

  

gist.github.com

 

Ethereum アドレス生成の手順は理解できたけど、ライブラリのおかげでブラックボックスになっている部分がまだまだ多い。もう少し低レベルで理解したいので、楕円曲線DSAとかをちゃんと勉強したい。

Ethereum の SmartContract でアンロックできて遊べる BLE ラジコン

Ethereum の SmartContract を使って車をアンロックできるようにしてみようと思ったんだけど、お金が無くて車を買うことができなかったので、まずラジコンを作ってそのラジコンのアンロックを SmartContract でできるようにしてみた。ラジコンはせっかくなので、Raspberry Pi ベースにして iPhone から BLE で操作できるようにした。

 

f:id:plygnd:20180218001006j:plain

 


Ethereum の SmartContract でアンロックできて遊べる BLE ラジコン

 

このラジコンには Raspberry Pi 3 が乗っかっていて、iPhone と Bluetooth で接続・コントロールができる。Raspberry Pi 側のコードは Node.js を使って書いた。bleno というライブラリを使用すると BLE の Peripheral としてふるまうコードを驚くほど簡単に書ける。iOS 側は普通に CoreBluetooth を使っただけ。

 

車体はすべてタミヤ製。ギヤ・モータは シングルギヤボックス、車体は ユニバーサルプレート、タイヤは スポーツタイヤ と ボールキャスター を使用。モータの制御は L298N モータドライバモジュールを使用。

 

あとは、ラジコンのロック・アンロックを管理する Ethereum の SmartContract を書いて、Raspberry Pi 側の Node.js のコードで SmartContract の状態変数の値をみてロック状態かアンロック状態を判断するようにした。ここでは Web3.js, infura.io を使用して外部のノードをみにいくようにしているけど、外部のノードは嘘をつく可能性があるので、ほんとは ローカルにノードがあったほうがいいような気がする。

 

--- 

 

今日はせっかくの遊びなので、Swift でいろいろクソコードを書くのに挑戦できて面白かった。日本語や絵文字をメソッド名や変数名に使えてとてもたのしい。以下、ラジコンを動かすために iOS から Raspberry Pi に Bluetooth でコマンドを送るためのコード。ひどい。

 

f:id:plygnd:20180218003957p:plain

 

---

 

それにしても、Node.js も iOS も Raspberry Pi もなんだかいろいろ便利ですごいなあ。偉い人たちがライブラリやら環境やらを揃えてくれてるおかげでこのおもちゃを全部作るのにかかった時間は正味 3 時間くらい。ぼくは役に立たないものを作るのは大好きだけど、たまには他の人の役に立つものをつくりたいなあ。