スマートコントラクト超入門

なんかとあるお方がAdventCalendarで、なんかスマートコントラクトは任せると言ってた気がしたので書きました。

投稿日: 2018/12/10

発端

先日の未来大Advent Calendarで[塩基氏]が(https://enkiseijin.hateblo.jp/entry/2018/12/09/190046)が

スマートコントラクト周りは,どこぞのメカのヲタクの方が詳しいと思います.

と書いており、これは書けと言われた気がした。

ので、やんわりとスマートコントラクト入門的なものを書いていきます。

そもそも仮想通貨とは

まず↑の否定から入りますが、俗に言われる仮想通貨というのは、英名ではCrypt Curency、直訳すれば暗号通貨です。仮想通貨なんて言葉、どこにも合致してません。マスコミや暗号通貨取引業者がバズワードとして広めた結果仮想通貨というワードの方が広まってしまいました(まぁそもそも先日のオープンラボに来た学生の話を聞く限りビットコインは知られていても仮想通貨というワードは知らない人が多かったので無になりますが)

と、ここまで書いて塩基氏が既に書いてたことに気付いたので次進みます。

スマートコントラクト

スマートコントラクトとは、直訳すると「賢い契約」です。なんやそれ、となると思いますが、要するに特定条件を満たしたときに自動的に契約が成立する様な仕組みの事を指します。

従来は契約の自動化には第三者の介入により契約の正当性や本人確認等を行って居ました。しかし、ブロックチェーン技術を用いたスマートコントラクトでは、この契約の正当性確認や本人確認等の処理をマイニングするマシンにやらせる事により、契約の自動化を第三者無しで行ってしまうというのがスマートコントラクトです。

スマートコントラクトのチューリング完全と非完全

実は最初期の暗号通貨であるかの有名なビットコインは、あくまで通貨取引としての利用を前提として生み出された仕組みであるため、後発の暗号通貨では可能なチューリング完全なプログラミングは不可能です。ループ処理が入るような複雑な処理に対応できないのです。

一方、暗号通貨取引高2番手のEthereumは、スマートコントラクトの取引を主として生み出された為、チューリング完全なスマートコントラクト言語であるSolidityや、等のEthereumネットワーク(Ethereum Virtual Machine、略してEVM)上で処理が可能なByte文字列へコンパイルできる言語が存在します。

Ethereumは、特にSolidityという言語がEthereum公式のスマートコントラクト言語として開発が進められており、JSライクな書き方で今までのプログラミング言語と同じのうに記述できる為、スマートコントラクト開発≒Solidityプログラミングの図式が暗黙のうちに出来上がってる気がします。知らんけど。

ちなみに、研究前の下調べではNEMという選択肢もありました。こちらはAPIリクエストでスマートコントラクトとして動作させるものですが、トランザクションの追加データに情報を書き込むことしか出来ず、自分の研究では使っていません。

第三者の手を介さない、分散処理されるアプリケーション、DApps

Ethereumは、httpプロトコルの次を担うプロトコルを目指しています。その為、一昔前に提唱されたWeb2.0の次のバージョンを意味するWeb3.hogeというEVMフレームワークが多数存在しています。

このWeb3、Web3.0で目指しているのは、第三者を一切介さずに何もかもを実現できるエコシステムを目指しています。この第三者を介さないアプリケーションが、分散処理を行うことで固有のホストが存在しないアプリケーション、分散型アプリケーション、略してDAppsが可能となっているのです。

これにより、理論上は今までのサーバーとクライアントの構図となっているシステムが、EVMとクライアントの関係、つまり直接EVMネットワークと結ばれるだけでアプリケーションが実行できる新しい世界が生まれるのです。

みんなで払おう手数料のgas

Ethereumには、Ethereumネットワークを介してシステムを稼働させたりトランザクションを成立させるために頑張っているマイナー達(ノード)に手数料を支払います。これがgasと言います。まあ手数料とはいえ、数百ether取られるというわけではなく、weiという1etherの10-18で数百weiとか数十weiという単位で取られるだけなので、微々たるものです。これを減らすために、コントラクトのコードを書く際は最適化する必要があります。

せっかくだし、なんか作ってみよう

DAppsのチュートリアルとして、日本語で書かれたEthereum入門(https://book.ethereum-jp.net/)というスマートコントラクト入門にはもってこいな教材があります。これを参考にしてもらえると、とても理解がしやすいと思います。しかしながら、あまりContributerが居ないのか、情報があまり更新されておらず、今となっては別の手法の方が早く作成出来ます。今回は中身自体はこのチュートリアルを、作成方法自体はRemixIDEを用いたものでやっていきましょう。

このチュートリアルでは、数字を登録、参照するコントラクトを作ります。

まず、remix.ethereum.orgを開きます。Solidityの公式IDEです。前はbrowser-solidityと言われていました。

あとは簡単です。Ethereum入門のSingleNumRegisterをコピペ(とは言うものの、コードが古く、非推奨、あるいは廃止済みな書き方になってるので直した下記コードをコピペ)して、

pragma solidity ^0.5.0;
contract SingleNumRegister {
    uint storedData;
    function set(uint x) public{
        storedData = x;
    }
    function get() public view returns (uint retVal){
        return storedData;
    }
}

右側ペインのstart to compileボタンを押して、エラーが出ないのを確認します。確認後、"Run"タブに切り替えて、EnvironmentがJavascriptVMになっているのを確認してから、"Deploy"ボタンを押します。

remix操作画面

すると、下にデプロイ済(とは言っても本番環境では無くブラウザ上で再現した仮想EVM、EVMのVM・・・)のコントラクトが一覧で表示されます。表示を展開すると、GUIで各functionを操作できるボタンが表示されます。操作してみましょう。

例えば、114514(多分意味はない数字だよ)を入れて、左のsetを押して、コンソール画面の履歴が流れた後にgetボタンを押してやると・・・

set関数実行画面

get関数実行画面

やりますねえ!(←お前それやりたかっただけだろ)

本番環境でもやってみたい人たちに

metamaskを入れてあげると、ローカルで構築した自分だけのブロックチェーン、プライベートチェーンと接続したり、各テストネットや各取引所で取引されているメインネット上に接続して先程のコントラクトをデプロイしてやり取り出来るようになります。

では、metamaskをインストールします。FirefoxとChrome、Opera用のアドオンがありますのでそれを入れます。ここ(https://crypto-times.jp/metamask/)を参考にmetamaskをインストール、登録します。胡散臭いアフィリエイトサイトかもしれませんが、まあ事実ですしわかりやすいのでここ見ながら登録してください。EdgeとIEはブラウザじゃないので使わないでください(真顔)

導入後、metamaskにログインした状態で先程のremixIDEを開き、Environmentの中から、Injected web3を選んでください。すると、metamaskと接続を許可するかどうかの画面が出てきて、許可するとあとはメインネットにデプロイ出来るようになります。

が、法定通貨と取引されてるくらいの価値がある暗号通貨で遊ぶにはもったいないので、Ropsten, Rinkebyなどのテストネット(メインネットと違って通貨の価値は無いが、無料で通貨を貰う仕組み、fausetがあり、遊べるようになっている)を使いましょう。

このへんでめんどくさくなってきたので、もし反響があれば書いたり書かなかったりするかもしれません。

奥深い、これからの分散型アプリケーションの世界

Ethereum、価値の取引に向いているのですが、実はゲームの世界でかなり流行しています。例えば、CryptKittiesという猫を集めるゲームでは、リアルマネー(Ethereum)でレア猫の取引をしたり育成したりするゲームや、噂の話ですがEthereumをつぎ込んで都市育成シュミレーションするゲームとかがあり、日本でもスマホゲーメーカーのモバイルファクトリーのように、実際に収益化や投資としてDAppsのフレームワークやゲームの発表をしている会社も出てきています。

DAppsの目指す世界

※ここからは個人論

今のインターネットは、退職エントリでお馴染みのGAFA(Google, Apple, Facebook, Amazon)にある意味で管理されてしまっている世界になっています。web3、Ethereumが目指す世界は、こういったGAFAに奪われてしまったインターネットの指揮権や管理をユーザーの手に取り戻す、というのが目標なのかなとモバイルファクトリーの社員さんとある機会で話したりしました。

皆さんも、GAFAからインターネットを取り戻してみませんか?興味を持った方はぜひ私のいる研究室に来てほしいですが、色々と難しいでしょうから、興味だけでも持って貰えたら嬉しいです。

ちなみに僕はGAFA入れるなら行きたいですね〜

Share: