amarillon のブログ

宇宙科学や語学に関する本の紹介をしています。

Ethereum × Dapps ハッカソンに参加してきた

12月1-2日の土日にかけて、渋谷の Neutrino で開催された Dapps 開発ハッカソンに参加しました。

私のスペックとしては、ブロックチェーンの会社に7月から入って、 JavaScript と web3 を並行してまなびつつ、ERC20トークン操作を中心とした仕事を始めて4か月程度の経験です。

会場の Neutrino はいちどエンジニア勉強会で行ったことがありました。渋谷駅を出て、坂道を登って会場に到着しました。

f:id:amarillon:20181205001203p:plain:w300
入り口で見かけたクリスマスツリー

チーム参加も可能でしたが、個人で参加しました。周りはチームで来ている人もおおく、私をふくめて個人で参加してきた(余った)のは3人でした。この3人でチームを結成しました。

チーム名を決めるように指示をされたので、「Gethot」(ゲソット)としました。


開発のようすがイーサリアム研究所で紹介されていました。

1日めの昼頃から開発を初めて、2日めの3時で開発終了というスケジュールでした。

Neutrino に泊まり込みで開発をおこなうこともできました。(僕は月曜日から仕事があるので、生活リズムを崩さないよう夜は家に帰りました。)

泊まった人々は、椅子に座りながら仮眠をとったということです。そういう状態でプログラミングを続けるのは体力がいると思いますが、見た感じ参加者は若者が多かったので大丈夫だったんだと思います。

作ったもの

Slack ボットとERC20トークン送金を連携する Dapp をつくりました。

Slack というのは開発者がよく使うチャットソフトです。 チャットの中でほかの発言者に対してリアクションをつけることができます。

チャットルームにあらかじめ今回作成したボットを招待しておき、発言に誰かがリアクションをつけると「リアクションをつけられた側」に自動的にトークンが送金されるというものです。簡易的な社内通貨のようなものです。

ユーザーの発言にリアクションがついた場合、

f:id:amarillon:20181205103120p:plain

リアクション👍は+100, 💯は+200 トークンが、登録されてるアドレスに自動的に送金されます。 (その他のリアクションに応じて点数を割り振ることは、時間の都合上実装しませんでした。)

ほかに僕たちのチームがやったのは、

  • 「メッセージが送られたとき」を検出

  • 「リアクションがつけられたとき」を検出

  • それぞれのイベントに対して、トークンを送金する。 

  • ファイルを使ったユーザー登録機能も実装したりしました。新規にチャットルームに現れたユーザーを検出して、1000トークンを自動でプレゼントする機能です。

  • コントラクトはただの ERC20トークンだと面白くないので、簡単なガチャ機能を導入しました。(ただ、反省点としては、もうちょっとコントラクトを拡張するアイデアを出せればよかったと思います。)

Slack ボットの作り方

Slack ではボットを作る方法がいくつも用意されています。

ここのページに載っている情報を参考にしました。 qiita.com

スラッシュコマンドを使ったボットがいちばん作りやすいですが、それだとユーザーがコマンドを打ち込まないといけないため、RTM を利用したボットにしました。

Slack アクセストークンを用意するだけで、Slack の中のイベントを受け取ることができるようになります。 あとは、ERC20トークンの送金スクリプトを Node.js + web3 で書いて、コントラクトにトランザクションを送れば良いです。

https://api.slack.com/apps から Slack アプリを作成して、Your App から左のメニューの Features 内の Oath & Permissions を選ぶ。

f:id:amarillon:20181204234624p:plain
https://api.slack.com/apps

このアクセストークンを使うと、ボットの動きを制御できることになります。Your App の Features 内、Event-subscriptoins から、Subscribe to Bot events を選ぶ。

f:id:amarillon:20181204235241p:plain 検出したい Bot Events を選択して追加。

公式に Node.js での書き方サンプルが載っています。

slackapi.github.io

ここのページの Connecting and sending a message や、Receiving messages のコードをコピー & ペーストしたものはそのまま動きます(npm install @slack/client --save 等インストールが必要)

作業ファイル

作業ファイルは、私の GitHub プライベートリポジトリにプッシュする形でファイル共有しました。私が昔お世話になったエンジニアさんが、「僕は GitHub に課金しているのでプライベートリポジトリが使えます。」と言ってたのがかっこよかったので、私も GitHub に課金してプライベートリポジトリを使える状態にしていました。今回ついにその機会がめぐってきて嬉しかった。

web3 の privateKeyToAccount

普段は秘密鍵をプログラム内で直接あつかうということはやらないのですが、ハッカソンで使ったのはテストネットだったし時間ももったいなかったので、プログラム内に秘密鍵を string として持っておきました。トランザクションに署名するときは

web3.eth.accounts.signTransaction(tx, privateKey [, callback]);

web3.eth.accounts — web3.js 1.0.0 documentation

を使う方法をとりました。

秘密鍵からアドレスを得るには、同じく web3 の関数

web3.eth.accounts.privateKeyToAccount(privateKey);

web3.eth.accounts — web3.js 1.0.0 documentation

を使いましたが、なぜか正しいアドレスに変換できないという問題が発生し、この問題に数時間はまって抜け出せないでおりました。web3 のイシューに挙げられているように、じつは秘密鍵からアドレスをつくるときには文字列として 0x をつけないといけないという事だったようです。

Getho について

開発を始める前に、Popshoot の CTO 佐藤さんによる Getho ハンズオンがありました。

gethoハッカソン -ハンズオン- - Speaker Deck

Getho を使うと開発用のプライベートノードを無料で作れます。 Ethreum のノードを自分で作ろうと思うと、同期作業をするのが結構時間がかかって面倒です。また、自分でノードをたてるとたまに同期に失敗してやり直すこともあるので時間の無駄が発生することが多いです。簡単なスマートコントラクトを作ってデバッグしていきたいなら、Getho のようなツールを使うのが便利だと思います。

ほかにも Infura とか Ganache, Remix のような無料で使える Dapps 開発ツールがあるので、好みに応じて使い分けると良いと思います。

私は Getho 以前は個人的に Ganache を好んで使ってました。マイニングがサクサク進んで(アプリの)UI も凝っているところが気に入っています。(デプロイ等はコマンドラインから行います)

Dapps の開発がある程度進んでいて、マイニングに数十秒ていどの時間がかかっても良いときには、Infura でデプロイをして Etherscan とかで挙動を確認するのが簡単な方法です。Getho は現在も開発が進んでいるので、今後 Getho のマイニングが速くなってくるとどんどん使いやすくなると思います。無料で使えるというのはポイントが高いかと思います。

Getho では、getho upload (contract) というコマンドでスマートコントラクトをアップロードできます。アップロードしたスマートコントラクトは、GUI を使ったボタンが用意され、実行することができます。コントラクトアップロードという作業が何を指すのか私は理解してないのですが、デプロイ済みのコントラクトにTxを送るよりもGUIボタンで操作できたほうが簡便ではあります。

Dapps 発想力

結果発表。

うちのチームは残念ながら入賞には至りませんでした;;。優勝チームおめでとうございます。

さて、自分で Dapp をアイデアから考えてみて思ったのは、自分の生活に基づいた製品以外はなかなか思いつかないということです。比較的若年層や、技術がわかる人にとって理解しやすいものを思いつくが、たとえば「コンピュータ技術にとくに興味のない人々」でも使えるものを思いつくのは難しいものです。

「気づかないうちにブロックチェーンを使っている」…そういう仕組みを思いつくことが大事だと感じました。

ハッカソンに参加するのは今回が初めてでしたが、集中して作業をすると1日半程度でもそこそこ動くものができて充実感がありました。ちょっと眼を酷使しすぎたせいで、2日めの後半はものがかすんで見えてきたので、イベント終了後はすぐに帰宅してぐっすり寝ました。