aknow2

自分の興味のある事を連々と(プログラミング、モバイルアプリ、プログラミング教育)

必要なのはブラウザ(Chrome)だけ!コントラクト指向言語SolidityでEthereumのスマートコントラクトを実装してみる。

Ethereum、特にスマートコントラクトとかに興味があるけど
何か環境とか色々準備するのが面倒くさそうと思っている方

Ethereumにはテスト環境が公開されているので、
スマートコントラクトを実装して実行する事は
ブラウザだけでも出来てしまいます。

今回はブラウザ上でSolidityという
スマートコントラクトを実装するための言語を用いて
実際にスマートコントラクトを実装して
動かしてみる所までやってみます。

そもそも、スマートコントラクトって何?という方は
コチラを読んでみてください。

スマートコントラクトとは何か? Smart Contractの定義 | block-chain.jp

準備物

以下のものをインストールしてください。
1. Chromeブラウザ - download
2. Metamaskプラグイン - download

Metamaskの設定

  1. Metamaskがインストール出来るとアドレスバーの横に
    Metamaskのアイコンであるキツネが現れるのでクリックします。(下図)
    f:id:aknow2:20171219221923p:plain

  2. acceptを押します。
    f:id:aknow2:20171219222231p:plain

  3. 8文字以上のパスワードを入れます。
    f:id:aknow2:20171219222447p:plain

  4. アカウントを復旧させたい時に使う
    12ワードが表示されるので
    誰もアクセス出来ない、どこかに保存しましょう。 f:id:aknow2:20171220094403p:plain

  5. 次にテスト用のネットワークに接続しましょう。
    左上のMain Networkのドロップダウンを開いて
    Ropsten Test Networkを選択しましょう。
    f:id:aknow2:20171220094746p:plain

Mainネットワークは実際に運用されている
パブリックなEthereumのネットワークです。
ここで送金すると本当に送金されませす。
テストネットワークは3つ準備されており
違いは以下参照のことでお願いします。
Ethereum Testnet Selection

6. 最後にEther(通貨)をゲットしましょう。
スマートコントラクトを登録するにも呼び出す場合にも
EtherというEthereumで使われている通貨が必要となります。
テストネット上では無料で貰えるのでお金がかかる事はありません。

Buyボタンを押します
f:id:aknow2:20171220095707p:plain

Ropsten test faucetを押下。
f:id:aknow2:20171220095752p:plain

そうするとMetaMask Ether Faucetというサイトに飛ぶので
request 1ether from faucetを押すと1etherが貰えます。 f:id:aknow2:20171220095914p:plain

ただ、貰えるまでしばらく時間がかかるので放置しておきます。(1,2分?)
ブラウザ右上のMetamaskのアイコンからダイアログを開いて
所持金が1Ethになっていれば成功です。
f:id:aknow2:20171220100356p:plain

スマートコントラクトを実装しよう

さて、いよいよスマートコントラクトを実装します。
まず、IDEを準備しましょう。
準備すると言っても、Remixというブラウザ上で動作するIDEを使用するので
下記のURLにアクセスするだけです。
Remix - Solidity IDE

アクセスしたら、右側にあるRunのタブを選択して
一番上のEnvironmentをnjected web3に選択してください。(下図)
f:id:aknow2:20171221140315p:plain

ballot.solというサンプルのコントラクトが
表示されていますが、今回は使用しません。
左側の+ボタンから新しいコントラクトを生成しましょう。
名前は「FirstContract.sol」とします。
f:id:aknow2:20171221142806p:plain

今回、実装するコントラクトは以下になります。
作成したFirstContract.sol内にコピペしてください。

今回は単純にuint8という符号無しの数値型をセットして
ゲットするだけのコントラクトになります。
詳細はソースコード内のコメントを参照ください。

pragma solidity ^0.4.19;

//コントラクトの宣言
contract FirstContract { 

    //storedDataと呼ばれるの状態変数です。                                       
    //このstoredNumがブロックチェーンのストレージ上に
    //保存される値になります。
    uint8 storedNum = 1; 


    //setter 
    //変数storedNumを書き換えます
    // 関数の宣言方法は
    // function 関数名(引数) アクセス修飾子 戻り値
    // の順となります。
    function set(uint8 num) public{
        storedNum = num;
    }

    //getter
    // 変数storedNumを取得します
    // returns(uint8)で戻り値の型を指定しています。
    // viewと宣言されているのは、この関数が値値を参照するだけで
    // 書き換えを行うものではないという事を指しています。
    function get() public view returns(uint8){
        return storedNum;
    }
}

コピペ出来たら、いよいよテストネットにコントラクトを登録します。
Remix右側のRunタブにあるCreateボタンを押してください。
f:id:aknow2:20171221105812p:plain

すると下図のようなMetamaskのダイアログが開きます。
EthereumではGas Feeというetherの送金や
コントラクト実行のための手数料がかかります。
なので、コントラクトを登録するにも手数料がかかります。
Max Transaction Feeと書かれている部分が手数料の見積もりとなります。
ただし、Max Transaction Feeなので最大でこれだけ使うであろう
という見積もりの値段になっています。
実際に使われる費用は登録してみないとわかりません。

先ほどMetamaskで1ther分取得しているので
それを使ってコントラクトを登録します。
そのまま、Submitボタンを押してください。
f:id:aknow2:20171221110027p:plain

SubmitするとPendingになり登録中の状態になります。(下図) f:id:aknow2:20171221110407p:plain

しばらく、ブロックチェーン内に登録出来たら
下図の様にコントラクト名とアドレスが表示されると思います。
また、Metamaskを確認するとEtherが少し減っていることも確認しましょう。
Ethereumではコントラクトにもアドレスが与えられます。 f:id:aknow2:20171221163738p:plain

おめでとうございます。
これで今回のスマートコントラクトの実装と登録完了です。

今回、作成したgetとsetの関数がちゃんと動くか確かめて見ましょう。
まずはgetから、確認方法はRemix上から呼び出す事が出来るのでとっても簡単
先ほど表示されたコントラスト名の下にあるgetを押してみましょう。(下図)
初期値の1が返ってくるはずです。 f:id:aknow2:20171222103343p:plain

次にset関数
setの横がテキストボックスになっているので
"5"と入力して, setを押してみましょう。
注意!必ず値は" "ダブルクォーテーションで囲いましょう。(下図)
f:id:aknow2:20171222104907p:plain

setを押すとmetamaskのダイアログが表示されると思います。(下図)
コントラクトを呼び出した時に値を書き換える時は手数料がかかります。
先ほどのgetで値を参照するだけの場合は手数料は基本的にかかりません
大きいデータ量を引き出す時は手数料がかかるそうです。
そのまま、submitボタンを押して手数料を支払いましょう。
f:id:aknow2:20171222105529p:plain

しばらく時間を置いて、get関数を再度呼び出し
5が返ってこれば成功です。(下図)
f:id:aknow2:20171222105759p:plain

あまりにも簡単過ぎて
本当に動いているのか怪しくなります。
ブロックチェーン上でどの様に
動いているのか確認してみましょう。
コントラクトのアドレスをコピーしてください。(下図)
f:id:aknow2:20171222110031p:plain

下記のサイトにアクセスして右上のテキストボックスに
コピーしたアドレスを貼り付けて、Goを押してください
TESTNET Ropsten BlockChain Explorer and Search
f:id:aknow2:20171222110232p:plain

コントラクトの取引した情報が表示されます。(下図)
取引は全部で「コントラクトの生成」と「set関数の呼び出し」の
2つが表示されていると思います。
下図のToを見てみると最初に呼ばれた方がContract Creationになっていて
コントラクトが生成されたのが分かります。
また、表の一番右を見ると実際に支払った手数料が表示されます。
最後にsetした時のトランザクション情報を見て見ましょう
トランザクションの情報はTxHashから見る事が出来ます。

f:id:aknow2:20171222114805p:plain

色々乗ってますが、一番下のinput dataの右端が5になっているはずです。
これはset関数を呼び出した時に5をセットした事を表しています。
f:id:aknow2:20171222115219p:plain

今回は以上となります。
   じゃあ実際にwebアプリとか作って
スマートコントラクトを呼び出すためにはどうすれば?
等々はまた次回という事で、、、。

[PR]