Gunosy Blockchain Blog

Gunosyの開発メンバーが知見を共有するブログです。

EthereumとContracts開発を取り巻くエコシステムの概要

はじめに

こんにちは、新規事業開発室の @yamarkz です。

今回はEthereumプラットフォーム上で動くアプリケーション(Smart contracts)の開発を取り巻くエコシステムを広く浅く紹介します。

Ethereum

f:id:yamarkz:20180122134502p:plain:w400

Ethereum is a decentralized platform that runs smart contracts : applications that run exactly as programmed without any possibility of downtime, censorship, fraud or third-party interference.

Ethereum公式サイトより引用。

Ethereumは特定の通貨ではなく、Smart contracts(以下、コントラクト)と呼ばれるアプリケーション(Dapps)を実行するための基盤(プラットフォーム)として開発されました。

Ethereumを発案し、開発を行なっているVitalik Buterinは現在23歳と驚くべき若さです。

Bitcoinが価値保存のプラットフォームとするならば、Ethereumは価値利用のプラットフォームというイメージが良いかなと思います。

Ethereum 紹介動画

www.youtube.com

Smart contracts

Ethereum最大の特徴はブロックチェーン上にアプリケーションを構築することができる点です。

アプリケーションをEthereumの世界ではSmart contracts (賢い契約) と表現しています。 スマートコントラクトという表現だとパッとイメージしにくいですが、これはブロックチェーン上で自立的に振る舞うアプリケーションのことです。

自立的に振る舞うアプリケーションであるコントラクトはEVMバイトコードと呼ばれるチューリング完全な言語で表現されます。 EVMバイトコード自体は人間が読むことが難しいので、コントラクトを開発するための高級言語 (下記で紹介) が開発されており、この高級言語を用いて開発を行うのが一般的です。

f:id:yamarkz:20180123180206p:plain

高級言語で記述されたコードは最終的にEVMコンパイラでコンパイルされ、EVMバイトコードが作られます。作られたEVMバイトコードはEVM上にデプロイされ、トランザクションに応じて自立的に処理の実行します。(EVMとは、Ethereum Virtual Machine のことです。)

コントラクトはブロックチェーンにデプロイされると、以後の改変が不可能となります。なのでWebアプリ開発の感覚でカジュアルに複数回デプロイを行ない改善を行うことができません。コントラクトを変更したい場合は既存のコードを破棄し、新たなコードをデプロイする方法があります。参考

また、コントラクトはEthereumネットワークに接続する全ノードで共有されるため、デプロイ後はネットワークのノードがなくならない限り永久的にコントラクトを操作することが可能になります。

Contracts 開発

実際にコントラクト開発に関わる周辺システムを紹介していきます。

開発言語

先ほども紹介した通り、開発言語はバイトコードにコンパイルし、EVM(Ethereum Virtual Machine) 上にデプロイされ、実行されます。

バイトコードに変換される開発用の高級言語は以下の様な種類があります。

言語名 実装言語
Solidity C++
Serpent C++
Viper Python
LLL 不明

Solidity

f:id:yamarkz:20180122114740p:plain:w200

Solidity (ソリディティ) は最もメジャーなコントラクト開発言語で、言語構文がJavaScriptライクな静的型付言語です。 Solidityはネット上に多くのドキュメントが揃っているのと、これまで多くのアプリケーションで採用された実績があり、2018年1月の時点ではSolidityを用いるのがデファクトスタンダートになっています。

f:id:yamarkz:20180123180914p:plain:w400

参考

Serpent

SerpentはC++で実装されたコントラクト開発言語で、Pythonライクな言語構文です。 Serpentは市場予測サービスであるAugerで採用されていました。しかしSerpent自体に脆弱性が発覚後、AugerはSolidityに書き換えられています。(現在はこの脆弱性は解決されています)

btcnews.jp

サンプルコードはこちらを参考にしてみてください。

現在はSerpent自体の開発がストップしており、公式でもコントラクト開発にはSolidityを使用するよう注意書きがされています。 素直に従ってSolidityを使いましょう。

参考

Viper

New experimental programming language

Githubリポジトリに記されている通り、Viperは現在実験的に研究開発されているコントラクト開発言語です。 コミットログを見ると最近は活発に開発が行われていますが、まだ研究開発段階であるため、コントラクトの実用開発に利用するのはもう少し先になりそうです。

ViperはSolidityと比較するといくつか言語機能が削除されています。

具体的には、ModifiersClass inheritanceなどです。 これらの自由な言語機能が複雑な処理やコードを作る原因となり、結果的にアプリケーションの脆弱性を作り出すことに繋がるため、機能を削除し安全なアプリケーション開発が行われる土台を作ることがViperの狙いです。

サンプルコードはこちらを参考にしてみてください。

参考

LLL

LLLはLisp Like Languageの頭文字を取ったコントラクト開発言語で、その名の通り言語構文が関数型言語であるLispに似ています。 現在はLLL自体のドキュメントが少ないので今後の発展に期待しています。

f:id:yamarkz:20180122192834p:plain

参考

開発環境 (クライアント)

Ethereumプラットフォームはクライアントと呼ばれるアプリケーションを介して利用します。EthereumでのクライアントはWWWの世界でのWebサーバーに該当します。クライアントはRPCリクエストを受け取ることができるため、通信手段としてRPCを用いて外部のアプリケーションとやりとりを行うことが可能です。

BitcoinではBitcoin coreが唯一の公式クライアントですが、Ethereumでは様々な言語でクライアントが実装されています。 様々な言語で実装し活用する理由は、セキュリティの観点からリスクを分散するためです。

クライアント 実装言語 開発元
cpp-ethereum C++ Ethereum Foundation
go-ethereum Go Ethereum Foundation
parity Rust Ethcore
pyethapp Python Ethereum Foundation
ethereumjs-lib JavaScript Ethereum Foundation
EthereumJ Java <ether.camp>
ruby-ethereum Ruby Jan Xie
ethereumH Haskell BlockApp

これらの中で特に人気が高いのが「geth」と「Parity」です。

geth

f:id:yamarkz:20180122211917p:plain:w400

geth (go-ethereum) はGo言語で実装されたEthereumクライアントで、呼び名は「ゲス」です。 gethはネット上に環境構築記事がたくさんあるため、他のクライアントと比較しても使いやすい思います。 筆者も普段はgethを用いて開発を行なっています。

参考

Parity

f:id:yamarkz:20180123095856p:plain:w400

Parity(パリティ)は元々Ethereum Foundationに在籍していた数名のDeveloperを中心に開発が行われているクライアントで、実装言語にはRustが使われています。 Parityの開発に携わっているDeveloperは界隈では技術力が高いと言われていますが、Parityに付随するWallet機能で脆弱性が見つかったり、開発不手際でWalletに紐づいていた一部のetherを凍結させたりする事件が過去に発生しています。

参考

開発サポート

開発を推進していく周辺ツールなどを紹介します。

Remix (browser-solidity)

ブラウザ環境でSolidityを用いた開発を行うことができるツールです。 カジュアルにコントラクト開発を始めることができますが、実務で利用するとなると勝手が悪くなってきます。 個々人の開発環境にLinterなどを導入して開発するのが最適だと思います。

参考

Truffle & OpenZeppelin

現在のコントラクト開発はTruffleとOpenZeppelinを用いるのがベストプラクティスになっています。 イメージとしては、Truffleで開発を大枠を作成し、OpenZeppelinを開発の土台としコントラクト開発を進める感じです。

Truffle

f:id:yamarkz:20180122112437p:plain:w200

Truffle (トリュフ) はコントラクト開発を行うフレームワークで、コマンド1つで開発の雛形を作れたり、デプロイができたりとスーパー便利です。 Truffle導入の解説はネット上に多く存在するため今回は割愛します。

f:id:yamarkz:20180123102018p:plain:w400

参考

OpenZeppelin

f:id:yamarkz:20180122115054p:plain:w400

OpenZeppelinはコントラクト開発で用いるライブラリです。ERC20トークンの開発がサポートされており、トークン作成の土台を担ってくれます。

具体的には、StandardToken を継承し、パラメータ値を設定するだけでERC20トークンがつくれます。楽チンですね。StandardTokenの実装はこちら

トークン作成の解説はネット記事で多く取り上げられているため今回は割愛します。

参考

Etherscan

f:id:yamarkz:20180123174440p:plain:w400

Etherscanはライブネット上のブロック情報をGUI上で確認できるWebサービスで、実際に動作しているコントラクトのソースコードも確認できます。 便利で見やすいので、基本ライブネット上のデータを検索する際にはEtherscanを利用しています。BitcoinでいうBlockchain Infoですね。

参考

Web3

コントラクトをGUI上から操作する際に用いるAPI連携のIFとしてWeb3があります。Web3の導入は今回割愛しますが、容易にWeb3経由でAPI操作が行えるので便利です。 この記事の執筆時点で自分はWeb3上からの簡単なAPI操作しか行なったことがないので、今後公式ドキュメントを読みながら活用していきたい気概です。

Web3は様々な言語で提供されています。

Mist

f:id:yamarkz:20180123190445p:plain:w400

Mist(ミスト)はEthereumの公式Walletです。Ethereumの公式HPからDLし導入することができます。 MistにはWallet機能の他にコントラクトをデプロイする機能も備わっており、GUI上からデプロイを行うことが可能です。

参考

MetaMask

f:id:yamarkz:20180123175257p:plain:w400

MetaMaskはキツネマークのブラウザウォレットで、ChromeExtensionとして提供されています。 ブラウザ上からテストネットやメインネットに接続し、トランザクションの送信操作を行うことができるため非常に便利です。

参考

Test & CI

テストに関しては以前、弊社CTOの松本がblockchain.tokyo #2 で紹介していました。

発表資料 speakerdeck.com

また、発表内容はGunosy Tech Blogで紹介されています。

tech.gunosy.io

テストとCIについては内容が深くなりそうなので、別途テスト実装の記事で紹介したいと思います。

参考にしているコントラクト開発

コントラクトコードは基本オープンソースになっているので、Githubなどでコードを読むことができます。 また、Github上になくともEtherscan経由でもデプロイされたコードを読むことができるので、成功した既存のプロダクトコードを参考にしています。

CryptoKitties

f:id:yamarkz:20180123174545p:plain:w400

最近大きな話題になった、子猫ゲームのCryptoKitties。 公式のRepositoryをGithubなどから探し出すことができなかったのですが、Etherscanでチェーン上にデプロイされたコントラクトコードを確認することができました。 ソースコード

Zilliqa

f:id:yamarkz:20180123174612p:plain:w400

ブロックチェーンのスケーリング問題を解決する新たなプラットフォームとして開発されています。 2017年にICOによるトークンセールが行われ、現在本格的に開発が進められています。 Zilliqaチームはプラットフォームの他にコントラクトの安全性を高めるためにチューリング不完全な開発言語「SCILLA(シラ)」 の開発も進めていく様なので今後に期待しています。

Bread

f:id:yamarkz:20180124121314p:plain:w400

Breadは仮想通貨のWalletアプリで、昨年ICOが行われました。 WalletアプリのソースコードがGithub上に公開されていたり、ICOで利用したコントラクトコードも公開されています。 コントラクトではTruffleとOpenZeppelinが使われており参考にしています。

ALIS

f:id:yamarkz:20180123174735p:plain:w400

Steemitのようなメディアプラットフォームを目指しているALIS。 ICO後、技術仕様に関してCTOの方がFAQを投稿しています。投稿はこちら

FAQの中身も紳士的で、今後の動向に注目していきたいですね。日本初のブロックチェーンを活用したプロダクトとして成功してほしいなぁと個人的に思ってます。

まとめ

EthereumはSmart contractsを実行するためのプラットフォーム。コントラクトを開発するための言語は様々だが、現在はSolidityを用いるのがデファクトスタンダード。 コントラクト開発にはTruffleとOpenZeppleinを用いるのがベストプラクティスで、Ethereumを利用するためのクライアントにはgethがおすすめ。 GUIでのコントラクトの動作確認はMist or Metamaskを用いて行い、Web3経由でAPI操作を行いクライアントサイド(Web or アプリ)へ繋げる。 コードベースのテストはTruffleを活用しつつ、MochaとChainを用いて検証する。

参考構成

  • 開発言語: Solidity
  • フレームワーク: Truffle
  • ライブラリ: OpenZeppelin
  • クライアント: Geth or Parity or etc...
  • テスト: CI & Mocha & Chai etc...
  • Wallet: Mist or MetaMask
  • API: Web3系
  • 確認ツール: Etherscan
  • nodeパッケージ管理: yarn

最後に

今回は広く浅くEthereumとその周辺システムの概要に触れてみました。ブロックチェーン技術は新しい概念やツールがたくさんあり、キャッチアップするだけで一苦労ですね。。。 この記事の執筆中も紹介したいものが次々出てきて取捨選択に困りました。

ここで紹介したツールを活用してコントラクト開発は行われています。本記事が今後新たにコントラクト開発を始めようとする方の指針になれれば嬉しいです。

今後はここからより踏み込んだコントラクト開発のプラクティスなどを紹介していけたらいいなと思っています。

宣伝

Gunosyではブロックチェーンを始めとしてスマートスピーカー、VR/ARと言った新規領域での研究・開発を進めており、メンバーを募集しています。

少し話を聞いてみたい!という方も歓迎していますので、下記のリンクからの応募お待ちしております。

www.wantedly.com

また弊社Gunosyでは、blockchain.tokyo を主催するなど、ブロックチェーンや仮想通貨に関する調査を行っています。

次回は弊社Gunosyを会場としてイベントを開催する予定です。少しでも興味のある方は下記リンクからのご参加お待ちしております。 また、イベントグループへメンバー登録をしていただくとイベント参加者募集の通知が来るので、こちらもぜひ登録してみてください。

blockchain-tokyo.connpass.com