Dappsをローカルにデプロイするチュートリアルやってみた。

この記事は、ブロックチェーンプログラミングを始めようという、Dappsを作って、ローカルのノードにデプロイするまでのチュートリアルを、実際やってみたので、気づいたことをまとめました。

※個人的には、まずこれをやってから、クリプトゾンビをやるのがおすすめ。すぐ終わるし、全体像をつかんでからクリプトゾンビするのが良いと思う。

原文はこれ
A Beginner’s Guide to Blockchain Programming

コードはGithubにおいてます。
https://github.com/naogify/Eth_Grade_Manager

作るもの

solidityで、生徒の成績を管理して、検索できるスマートコントラクトを作成します。

事前準備

適当なエディタで、Grades.solというファイルを作成して開いてください。
Remixというツールで、ブラウザ上でSolidity環境を用意することもできます。

サンプルコード

//solidityのバージョンを指定。この場合0.4.18以上。
pragma solidity ^0.4.18;

//Gradesというコントラクトを作成
contract Grades{

    // 学年を保存する連想配列。保存される値の型を指定。(bytes32 => string)
    mapping (bytes32 => string) public grades;
    //生徒名を保存する配列
    bytes32[] public studentList;

    //引数にstudentNamesという配列を取り、studentListに割り振るコンストラクタ
    constructor(bytes32[] studentNames) public {
        studentList = studentNames;
    }

    //生徒に成績を割り振る
    function giveGradeToStudent(bytes32 student, string grade) public {
        require(validStudent(student));
        grades[student] = grade;
    }

    //生徒の存在チェック
    function validStudent(bytes32 student) view public returns (bool) {
        for(uint i = 0; i < studentList.length; i++) {
            if (studentList[i] == student) {
                return true;

            }

        }
        return false;
    }

    //生徒の名前を引数にして引数にして、成績を返す。
    function getGradeForStudent(bytes32 student) view public returns (string) {
        require(validStudent(student));
        return grades[student];
    }
}    

デプロイ

下の3つのツールを使って、プライベートチェーンにコードをデプロイします。

  • ganache-cli(ガナッシュ)ローカルでイーサリアムのノードを構築するツール。

  • solc:javascriptで書かれたイーサリアムのコンパイラ。

  • web3.js:Javascript(nodejs?)を使って、http経由で、イーサリアムのnodeとやりとりするライブラリ。


ganache-cli、web3.js、solcをインストール。
ローカルでノードを立ち上げる。アカウントを生成。

npm install ganache-cli web3@0.20.3 solc
node_modules/.bin/ganache-cli

コードをコンパイル。

node //nodeを使う
//Grades.solを読み込み、文字列にする。
code = fs.readFileSync('Grades.sol').toString()
//solcを読み込み。
solc = require('solc')
compiledCode = solc.compile(code)

Web3経由で、作成したスマートコントラクトをデプロイする。

Web3 = require('web3')
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
abiDefinition = JSON.parse(compiledCode.contracts[':Grades'].interface)
GradesContract = web3.eth.contract(abiDefinition)
byteCode = compiledCode.contracts[':Grades'].bytecode
deployedContract = GradesContract.new(['John','James'],{data: byteCode,
from: web3.eth.accounts[0], gas: 4700000})

コントラクト実行

John A+ の成績を与える。

$ deployedContract.giveGradeToStudent('John', 'A+', {from: web3.eth.accounts[0]})

johnの成績を呼び出す

$ deployedContract.getGradeForStudent.call('John')
'A+'

それぞれのライブラリの関係図

関係図

もしかしたら間違っているかも↑。つっこみ大歓迎です。

まだコントラクトコードをどのように、ブロックチェーンに保存するのかが分かってないので、また調べようと思う。