8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Dappの習作としてURL短縮サービスを作った

Posted at

image.png

github.com/stsysd/urlshortener
URL登録ページ
短縮URLデモ

EthereumのブロックチェーンをDB代わりに利用したURL短縮サービス。
今のところtestnet(ropsten)にしかデプロイしてない。
短縮URLにアクセスするだけなら誰でも使えるけど、新しく短縮URLを作る場合はMetaMaskでropstenにログインしてgasを払ってもらう必要がある。
GitHub Pagesそのままだとドメインが長すぎて全然URLが短縮された感じがしないので、Freenomからドメインももらってきた。

なぜ作ったか

CryptoZombiesでざっとDapp開発の概要が分かったので一回自分で作ってみたくなったから。
まず練習として環境を整えて一から動くものを作りたかったのでとにかく簡単なものにした。

ブロックチェーン上に記録することで書き換えられたり失効したりしない短縮URLに!という技術的動機もなくはなかったんだけど、よく考えるとブロックチェーンにアクセスする部分(html/js)は普通に変更できてしまうのであんまり意味がなかった。
むしろ、URLはブロックチェーンで公開されてしまうせいで、他人に知られたら困るURLは登録できないという足かせがある。
ブロックチェーンを使ってうれしい部分は、DBのためのサーバをわざわざ用意しなくて済むことぐらいしかないな?

まあ習作ということで一つ。

使ったライブラリとか

  • truffle: Ethereum開発フレームワーク
  • ganache: テスト用のローカルブロックチェーン構築
  • GitHub Pages: ホスティング・独自ドメインの設定・SSL証明書の発行
  • Vue.js: フロントエンドライブラリ
  • web3.js: ブラウザでEthereumとやり取りする

ひっかかったところ

Solidity

  • ブロックチェーン抜きでローカルに動かすことができない
  • 構造体や配列は保存場所でstorage/memoryの区別がある
  • 乱数などの外部リソースを利用するのが難しい
  • 他の誰かに見られたら困るようなデータのやり取りはしてはいけない

などなど、ブロックチェーン上で動作するが故の独特の制限が慣れるまで大変だった。今回は全部自分で書いたけど、今後トークンのやり取りを含むContractを作るなら素直にOpenZeppelinみたいなライブラリを使うべきだろう。

truffle-hdwallet-providerのインストール

というより多分Windows上でのnpmのネイティブな拡張のインストール全般の問題。
truffleでHDウォレットを使うためのパッケージであるtruffle-hdwallet-providerはnpm経由でダウンロードするんだけど、これにはネイティブライブラリが使われているらしく、それをビルドするためにgyp(とそのためのwindows-build-tools)が必要になる。
自分の環境では、はじめWarningを出しつつビルド自体は完了するのだが、ライブラリを読み込もうとすると何のメッセージも残さずプロセスが終了するという現象が起きた。

原因はnodeを公式のインストーラからではなく、msys2のpacmanからインストールしていたせいだった。一回アンインストールして公式のインストーラでインストールしなおしたら、普通に動くようになった(Warning)も消えた。
開発環境はできるだけchocolateyかpacman経由で入れようと思ってたのだが、よく問題の原因になるので公式が用意してくれているなら素直にインストーラを使ったほうがよさそう。

web3.js

web3.jsの現在の安定バージョンは0.20.xだけど、今1.0の開発が進められているらしい。
ググってすぐ出るドキュメントは1.0のものなので注意。
目についた大きな違いは非同期関数の扱いで、1.0だと今風に全部Promiseになっているのでasync/awaitで書けるが、0.20.xはコールバック関数を渡してやらなければならない。
ただしtruffle consoleのwe3のバージョンは0.20.6だが、Contract Methodsが返すのはPromiseになっている。ややこしい。

web3.jsの"new BigNumber() not a base 16 require string"

ブロックチェーンとのやり取りしているコードで何かにつけて上記のエラーが出た。
おそらくsolidityでstringとして定義された文字列がクライアント側に渡される際に、型情報が失われて数値としてパースされてるのが原因なんだと思う。
contractのaddress/abiが何かの手違いで損なわれてたりするとよく起こる印象がある。

もうちょっと頑張りたかったところ

  • keyには62種類の文字しか使ってないのに1文字1byte使ってるのでもっと詰めたい
  • せっかくだからトークンのやり取りもしたかった
  • URLを登録するにはMetaMaskをインストールしてもらわないといけないのは不便
  • 短めのURLの登録に70000unitぐらいのガス、ざっくり数円かかるというのはつらい

最後に

ものすごく簡単なDappだけど、実際に作ってみて分かったことはいろいろあった。
特に印象深いのはgasの値段で、思ってたよりずっと高かった。
本当に最低限の機能しかないので、原因はコードにあるというよりはethの相場にあるのだと思う。
これくらいのTransactionで数円かかるとなると、チャットや掲示板みたいなばんばかDBを更新するサービスで使うのは無理っぽい
やっぱりブロックチェーンの基本は台帳であって、ある程度価値のある取引を記録するものなのかもしれない。
PlasmaとかRaidenとかのプロジェクトがうまくいったらもっと安くなんだろうか。
その辺を踏まえて、次は独自トークンをやり取りするDappを作ってみたい。

あと、GitHub Pagesのドメイン設定も初めてやった。
ちょっと前はhttps対応するためにCloudflareでリバースプロキシを使ってなんやかんやする必要があったみたいだけど、最近GitHub側がsslの証明書を発行してくれるようになって簡単になったらしい。
実際すごい簡単で助かった。

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?