ブロックチェーン界では、「スマートコントラクト」というキーワードをよく聞きます。直訳すると「賢い契約」。これが何を意味するのかは後でご紹介するとして、数あるブロックチェーン基盤のうち、Ethereumはこの「スマートコントラクト」のデファクトスタンダードとも言えるブロックチェーン基盤なのです。
今回は、「Remix(Browser-Solidity)」というIDE(統合開発環境)を使って、簡単なコントラクトをつくってみたいと思います。
目次
スマートコントラクトとは
コントラクトとは、一言で表すと「ブロックチェーン上で動作するアプリケーション」です。なんらかの処理を書いたプログラム(ビジネスロジック)を「コントラクト」と呼んでいる、と思って良いでしょう。では、「スマート」は何なのか?これはイコール「自動化」と捉えて良いかと思います。つまり、事前に定義した契約処理(=ビジネスロジック)をブロックチェーン上にデプロイし、条件に合致したイベントが発生した際に、定義していた契約処理が自動的に実行される、ということです。
スマートコントラクトの例として、よく取り上げられるのが「自動販売機」です。「お金を入れる」「ボタンを押す」という2つの条件が満たされた場合に、「飲み物を提供する」という契約が実行される、というわけです。
「賢い契約」はあまりピンと来ませんでしたが、「契約の自動化」だとなんとなく理解できる気がしますよね!
スマートコントラクトのメリットは、例えば以下のようなものが挙げられます。
- 不正を防止できる
ブロックチェーンの特性から、コントラクト自体の改ざんはほぼ不可能。
また、後から誰でも過去の契約内容を閲覧することができる。 - コストの削減
契約プロセスを自動化するため、仲介者が不要。(=信頼コストが低い)
そのため、契約に関する手数料も安く抑えられる。
これから実際に簡単なコントラクトを実装し、ブロックチェーン上にデプロイして動かしてみたいと思います。
Remix(Browser-Solidity)をインストールする
今回は、Remixというコントラクト開発用のIDEを使いたいと思います。Remixは、以下のいずれかの方法でインストールすることができます。
今回は方法1でRemixを準備したいと思います。方法1だと、インターネット環境がなくてもコントラクト自体の開発には支障がありません。方法2は、インターネット環境が必要ですが、すぐに使えるという利点があります。開発スタイルに合わせて、お好きな方を選択してください!
それでは、Remixのリポジトリをクローンします。クローンと言いつつ、ZIPダウンロードでOKです。クローンまたはZIPダウンロードし、index.htmlをブラウザで開けばRemixが立ち上がります。
Solidityをインストールする
Remixが導入できたら、一先ずRemixはそのまま置いておいて、コントラクトのコンパイラをインストールしましょう。コントラクト開発はSolidityという言語が主要言語となっており、構文はJavaScriptに似ていると言われています。
前々回の記事でプライベートネットワークを構築しました。
この環境に、Solidityのコンパイラ「solc」をインストールします。
1 |
# apt-get install solc |
インストールが完了したら、–versionオプションでバージョンを確認しましょう。
1 2 3 |
# solc --version solc, the solidity compiler commandline interface Version: 0.4.21+commit.dfe3193c.Linux.g++ |
プライベートネットワークを立ち上げる
次は、プライベートネットワークを立ち上げます。
1 2 3 4 5 6 |
# nohup geth --networkid "10" --nodiscover --maxpeers 0 \ > --datadir "/root/eth_private_net" --mine --minerthreads 1 \ > --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpccorsdomain "*" \ > --rpcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" \ > --unlock 0 --password "/root/eth_private_net/passwd" --verbosity 6 2>> \ >/root/eth_private_net/geth.log & |
今回はnohupコマンドを使用し、常時バックグラウンドでGethを起動させます。起動と同時にマイニングを有効にし、アカウントのロックも解除しておきます。(ここではeth.accounts[0]をアンロック)また、HTTP-RPCサーバを有効にし、リモートから接続できるようにしておきます。
Remixからプライベートネットワークに接続する
さて、ここまで出来たらRemixに戻ります。Remixの画面右側に表示されているメニューから、[Run]タブを開き、[Environment]のドロップダウンから「Web3 Provider」を選択します。
「Web3 Provider」を選択すると、確認ポップアップが表示されます。[OK]をクリックすると、以下のようなポップアップが表示され、接続するEthereumノードのIPアドレスとポート番号を聞かれます。
デフォルトで「http://localhost:8545」と入力された状態になっているので、そのまま[OK]をクリックします。接続が成功すると、[Account]ドロップダウンにアカウントのリストが表示されます。
コントラクトをつくる
それではコントラクトをつくってみましょう!今回は、簡単なSampleTokenコントラクトをつくります。Remixのエディタに以下のコードを入力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
pragma solidity ^0.4.21; contract SampleToken { // 状態変数の宣言 string public name; // トークンの名前 string public symbol; // トークンの単位 uint8 public decimals; // 小数点以下の桁数 uint256 public totalSupply; // トークンの総量 mapping (address => uint256) public balanceOf; // 各アドレスの残高 // イベント通知 event Transfer(address indexed from, address indexed to, uint256 value); // コンストラクタ function SampleToken(uint256 _supply, string _name, string _symbol, uint8 _decimals) { balanceOf[msg.sender] = _supply; name = _name; symbol = _symbol; decimals = _decimals; totalSupply = _supply; } // 送金 function transfer(address _to, uint256 _value) { // 送信アドレスと受信アドレスの残高を更新 balanceOf[msg.sender] -= _value; balanceOf[_to] += _value; // イベント通知 Transfer(msg.sender, _to, _value); } } |
Solidity言語で書かれたプログラムは、拡張子「.sol」で保存します。また、[Settings]タブを開き、[Solidity version]で先程インストールしたSolidityのバージョンを選択しておきましょう。これで指定したバージョンのSolidityでコンパイルしてくれるようになります。また、コードの1行目の「pragma solidity ~」の部分も、選択したSolidityのバージョンに合わせて記述しておきましょう。
上記のSampleTokenでは、いくつかの状態変数(name、symbol、totalSupply等)を持っています。これらの状態変数は、コントラクトのデプロイ時に実行されるコンストラクタによって、初期値として設定されるものです。balanceOf変数はmapping型(Key-Value配列)になっており、Keyがアカウントのアドレス、Valueが残高を表します。送金機能(transfer)を持っており、送金先のアカウントアドレスと送金額を指定することでトークンを送ることができます。
コントラクトをデプロイして動かす
それでは、つくったコントラクトをプライベートネットワークにデプロイしてみましょう。
Remixの画面右側のメニューにて、[Account]ドロップダウンから任意のアカウントを選択します。一番上のアドレスがEtherbase(eth.accounts[0])のアカウントアドレスになっているので、基本的にはデフォルト選択のままでOKです。今回もデフォルト選択のまま、アカウントはeth.accounts[0]で実行します。
アカウントを選択したら、その下に「SampleToken」が選択された状態のドロップダウンが表示されているかと思います。その下の[Create]ボタン左の入力テキストに、状態変数の初期値を入力します。
上記のように入力すると、トークンの名前や単位が設定される他、デプロイを実行するアカウント(今回はeth.accounts[0])の残高として、10000ST(今回作成したトークンの単位がST)が入金されます。
入力したら、[Create]ボタンをクリックしてデプロイしましょう!デプロイが完了したら、コンソールにログが表示され、画面右下にデプロイされたコントラクトのアドレスやメソッドが表示されます。
状態変数の確認
totalSupply、symbol、name、decimalsのそれぞれのボタンをクリックしてみると、初期値として設定した値がそれぞれ表示されると思います。
balanceOfは、指定したアカウントアドレスの残高を照会することができます。今はまだeth.accounts[0]にしか入金されていない状態ですので、eth.accounts[0]のアドレスを指定し、[balanceOf]ボタンをクリックしてみます。初期値の10000STが入金されていることが確認できます。
指定アドレスへの送金
transferメソッドを使って、指定したアドレスへトークンを送金することができます。eth.accounts[0]からeth.accounts[1]へ、1000ST送金してみましょう。
[transfer]ボタン右の入力欄に、送信先のアドレス(ここではeth.accounts[1]のアドレス)と送金額を入力し、[transfer]ボタンをクリックします。
コンソールにTransferのイベント通知ログが出力されていれば、正常に処理が完了したということになります。それでは、balanceOfを使って、eth.accounts[0]とeth.accounts[1]の残高を確認してみましょう。上がeth.accounts[0]、下がeth.accounts[1]の残高です。
eth.accounts[0]が残高9000ST、eth.accounts[1]が残高1000STであることが確認できました。
ちなみに、eth.accounts[0]以外から送金したい場合は、Remix画面右上のアカウント選択ドロップダウンで送金元のアカウントアドレスを選択してください。このとき、選択したアカウントのロックを解除するのを忘れずに!ロックの解除はGethコンソール(以下のコマンドで接続)から行うことができます。
1 |
# geth attach rpc:http://localhost:8545 |
まとめ
長くなってしまいましたが、今回はコントラクトについてでした!
Remixは、Solidity言語でのコントラクト開発においてはかなり一般的なIDEらしく、インターネットで検索するとたくさんの情報を得ることができます。バージョンアップも結構頻繁なので、UIが見るたびに少しずつアップデートされていっています。Remixを使うための面倒な登録なども無いので、かなりお手軽に使えるIDEだと思います。ちょっとコントラクト開発をやってみたいな~という方はぜひ!使ってみてください。
執筆者プロフィール
![Yamazaki Naoko](https://www.tdi.co.jp/miso/wp-content/uploads/2017/10/yamazaki-500x280.jpg)
- tdi デジタルイノベーション技術部
- 社内の開発プロジェクトの技術支援や、新技術の検証に従事しています。主にアプリケーション開発系支援担当で、Java&サーバサイドが得意です。最近は、サーバーレスonAWSを推進しています。