はじめに
前回ローカルでGethを起動し、テストネットワーク上でユーザアカウント同士でEtherの送金まで行いました。
スマートコントラクト入門(1) ~ローカルにEthereum実行環境を整える~
スマートコントラクト入門(2) ~Etherを送金する~
今回は実際にスマートコントラクトを作成し、プライベートネットワーク上で実行するところまでやってみます。
動作環境
- macOS High Sierra Version 10.13
- Geth Version: 1.6.7-stable
コントラクト概要
まずコントラクトについて軽く説明します。
コントラクトとは、ブロックチェーン上で実行されるプログラムのことであり、あらかじめ定義された処理(契約)を実行することが出来ます。
取引履歴と同様にブロックチェーン上に記録されるので、改竄がほぼ不可能な契約システムを分散ネットワークで実現できます。
世の中のあらゆる契約活動の代替になるかもしれないということで注目されている技術です。
コントラクトの実態はプログラムです。エージェントのようなイメージで、内部状態を記録しておくための少しのストレージとコントラクトを実行する関数を持っています。
前回、他のユーザアカウントに向けてEtherを送金するトランザクションを生成しましたが、Contractに向けたトランザクションを発生させることでコントラクトが実行される仕組みです。
もちろん手数料としてetherを支払う必要があります。
これがEthereumにおいてetherが燃料みたいなものだと言った理由です。
Ethereum開発環境について
スマートコントラクト開発用のプログラミング言語はいくつか存在していますが、最もメジャーな言語であるSolidityを使ってコントラクトを開発していきます。
コンソール上で開発することも出来ますが、ここではSolidityの開発環境であるBrowser-Solidityを使って開発していきます。
Browser-SolidityはWebブラウザベースの開発環境であり、Ethereumノードへ接続し、トランザクションの実行やコントラクトのデプロイなどを行うことが出来ます。
利用する方法は2つあって、ひとつはオンラインで利用する方法。もうひとつはダウンロードしてオフラインで利用する方法です。
オフライン版Browser-Solidity
まずは、オフライン版Browser-Solidityのインストール手順を説明します。
Browser-SolidityのGitリポジトリから任意のローカル環境に落としてビルドします。
$ git clone https://github.com/ethereum/browser-solidity
$ cd browser-solidity
$ npm install
$ npm run prepublish
ビルドが完了したらアプリケーションを実行します。
$ npm start
> browser-solidity@0.0.0 start /Users/yuichi/ethereum/browser-solidity
> npm-run-all -lpr serve watch onchange
[watch ]
[watch ] > browser-solidity@0.0.0 watch /Users/yuichi/ethereum/browser-solidity
[watch ] > watchify src/index.js -dv -p browserify-reload -o build/app.js
[watch ]
[serve ]
[serve ] > browser-solidity@0.0.0 serve /Users/yuichi/ethereum/browser-solidity
[serve ] > execr --silent http-server .
[serve ]
[onchange]
[onchange] > browser-solidity@0.0.0 onchange /Users/yuichi/ethereum/browser-solidity
[onchange] > onchange build/app.js -- npm-run-all lint
[onchange]
[watch ] WS server listening on 53123
ブラウザから開発環境http://127.0.0.1:8080/にアクセスします。
するとWebアプリケーションが起動しています。
ここでプログラムの作成からコンパイル、実行までを行うことができます。
Gethの起動
Browser-Solidityをプライベートネットワークに接続して開発を行うため、ローカルでGethを起動しておきます。
Browser-Solidityと接続するためにはJSON-RPCモードを有効にしておく必要があります。
前回に引き続き以下のコマンドで実行します。
$ geth --datadir ~/ethereum/eth_test --networkid 1000 --nodiscover --mine --rpc --rpcaddr "localhost" --rpcport 8545 --rpccorsdomain "*" --unlock 0,1 --rpcapi "eth, admin, db, debug, miner, net, personal, web3" --password ~/ethereum/eth_test/password/password console 2>> ~/ethereum/eth_test/geth.log
--mine
マイニングを有効にする。
--rpc
HTTP-RPCサーバを有効にする。
--rpcaddr "0.0.0.0"
HTTP-RPCサーバのIPアドレスを指定。
--rpcport 8545
HTTP-RPCサーバのポートを指定。
--rpccorsdomain "*"
接続元IPを指定します。ここでは全ての接続元を許可しています。
--unlock 0,1
アカウントをのロックを解除します。
--rpcapi "eth, admin, db, debug, miner, net, personal, web3"
HTTP-RPCで許可するAPIを指定します。必要に応じて追加して下さい。
--password
アカウントのパスワードが格納されたファイルを指定。
Browser-Solidityからプライベートネットワークに接続する
右ペインのRunタブを開き、Environmentに’Web3 Provider’を選択します。
「OK」で進みます。
接続先アドレスを聞かれるので、ローカルで起動するGethのRPCアドレスを設定します。
これでコントラクト開発環境が整いました。
オンライン版Browser-Solidity
http://remix.ethereum.org/からアクセスすることができます。
httpsだとネットワークに接続できないので注意してください。
プライベートネットワークへの接続方法はオフライン版と同じです。
ローカルのSolidityファイルなども読み込んで実行できるので、簡単なプロトタイプ開発にオススメです。
コントラクトの作成
簡単なコントラクトを作成してみます。
今回はオンライン版Solidity-Browserで行いました。
まず左ペインの「+」(New File)ボタンから新規ファイルを作成し、コントラクトを記述します。
solidityコンパイルのバージョンは0.4.13で実行します。
Settingsタブからコンパイルのバージョンを”0.4.13+commit.fb4cb1a”にします。
Conpileタブでコンパイルが成功していることを確認します。
今回は数値を記録するだけのシンプルなコントラクトを作成します。
冒頭にSolidityのコンパイルバージョンを定義します。
コントラクトとしては、数値を記録するための変数と値を設定するための関数(Setter)、そして値を取り出すための関数(Getter)を定義します。
pragma solidity ^0.4.13;
contract Sample {
uint public num;
function Sample(uint _num) public {
num = _num;
}
function setter(uint _num) public {
num = _num;
}
function getter() constant returns (uint) {
return num;
}
}
コントラクトが記述できたら右ペインのRunタブから”Create”をクリックします。
その際、プルダウンで作成したコントラクトを指定されていることを確認してください。
プライベートネットワークだと10秒程度でコントラクトが作成完了するはずです。
すると右ペインの下にコントラクトの操作用のUIが表示されます。
ここから関数を実行したり、格納されている値を確認することができます。
setter関数を使ってみます。
パラメータに100を入力して”setter”を実行します。
するとコントラクトのnumに100が格納されます。
getter関数で格納された値を取得することができます。
最後に
シンプルですがプライベートネットワーク上にコントラクトを作成し、実行してみました。
JavaScriptライクなSolidity言語でスマートコントラクトを開発できることがわかりました。
アイデア次第で面白いアプリが作れそうなので色々作ってみたいと思います!