たのしい工学

プログラミングを学んで、モノをつくりたいひと、効率的に仕事をしたい人のための硬派なブログになりました

【Dappsアプリ】選挙投票Dappsの作成-その1-

   

truffleからフレームワークをダウンロードする

アプリ開発用のディレクトリ「election」をつくります。
そして、そのディレクトリに移動したら、スマートコントラクトのテスト用フレームワークであるTruffleから、pet-shopというフレームワークをダウンロードしましょう。

traffle unbox pet-shop

すると、パッケージがダウンロードされます。

contractsというディレクトリのなかには、すでにMigration.solというスマートコントラクトのファイルがダウンロードされています。

Image from Gyazo
(空だったelectionディレクトリのなかにこのようなフレームワークのファイルがインストールされます。)

このMigration.solファイルがスマートコントラクトをブロックチェーンネットワーク上にデプロイするときの各種処理のハンドリングを行います。

その下のMigrationディレクトリは、スマートコントラクトをブロックチェーンネットワーク上にデプロイした際に生成されるファイルが格納されます。

このMigrationというのは、たとえばwebアプリケーションの他の環境からデータベースを移すことと同様です。

実際にMigration.solでスマートコントラクトが実行されたときに起きていることというのは、ブロックチェーンネットワーク(データベース)に対するトランザクションの発行です。つまり、スマートコントラクトが発行されることで、データベースの状態を変更するように、ブロックチェーンネットワーク(データベース )の状態の変化が起きます。

node_moduleディレクトリはこれらのブロックチェーンシステムに依存性のないディレクトリです。

srcディレクトリでは、クライアントサイドアプリケーションの開発を行います。

testディレクトリでは、テストファイルを保存しておき、すべてのファイル依存性を特定するパッケージJSONがあります。
その中にあるtruffle.jsファイルがmainのconfigurationファイルになります。

コントラクトのコードを書いていく

contrantsディレクトリに「Election.sol」というファイルを作成しましょう。注意点として、ファイル名の先頭を大文字にしましょう。ファイル名を大文字にしたファイルは、冒頭で利用するsolidityのversionを宣言します。

そして、コントラクトの宣言を行います。

その中でコンストラクタの定義をしましょう。
コンストラクタはマイグレーションを行うときや、コントラクトをブロックチェーンネットワークにデプロイするときには必ず実行されます。

コンストラクタは、コントラクトと同名で定義します。
(新しいversionではconstructor () public{}として宣言が可能。)


【Election.sol】

pragma solidity ^0.4.24;
 
contract Election {
    // Model a Candidate
    struct Candidate{
        uint id;
        string name;
        uint voteCount;
    }
    // Store candidate
    // Fetch candidatei
    mapping(uint => Candidate) public candidates; // when we add candidate to this mapping we are changing the state of our contract
    // Store candidates Count
    uint public candidatesCount;


    constructor() public{
        addCandidate("Candidate 1");
        addCandidate("Candidate 2");
    }
}

マイグレーションを生成するために、スマートコントラクトをブロックチェーン上にデプロイする必要があります。

ターミナルに

truffle migrate

を入力しましょう。

Image from Gyazo

migration.jsファイルはマイグレーションを実行するための参照点となります。実際にこれを実行するために、migrationsディレクトリの中に、”2”という番号付きのファイルを生成する必要があります。

これにより、truffleフレームワークにファイルの実行順序を認識させることができます。

truffle consoleでブロックチェーンネットワークと通信ができるかを確認します。
Image from Gyazo

truffleコンソールを立ち上げたら、

Election.deployed().then(function(instance){app = instance})

を実行して、先ほどデプロイしたスマートコントラクトによって発行されたtransactionがどのような状態を持っているかを確認します。

Image from Gyazo

app.addressで発行したtransactionのアドレスの確認をします。app.candidate()で Election.solでElectionコントラクトに記述した、constructorに定義した”candidate 1”という値がブロックチェーンネットワーク上のトランザクションにセットされていることが確かに確認できました。ちなみに、このcandidate()という関数は、solidityが与える標準関数なので、私たちのほうでなんらかの宣言等をする必要もなく使用することができます。
(ちなみに、truffleコンソールからは ctrl + cで抜けられます)

中断して、もう一度migrateしたいときには、buildフォルダ内contractフォルダを削除して、ふたたびtruffle migrateするとうまくいきます。

ブロックチェーン上の変化を見てみる

ではganacheを見てみましょう。一番上のアドレスのBALANCEの値が99.95ETHになっています。

Image from Gyazo

ethereumブロックチェーン上のデータを読み込むのはタダ(コストがかからない)ですが、書き込むにはgasというコストがかかります。

つまり、ethereumブロックチェーンにコントラクトをデプロイするたびに、gasというコスト(お金みたいなもの)がかかるということです。

なお、ブロックチェーンについて本腰を入れて学びたいひとは、Udemyなどにたくさんよいレッスンがあったりします。ぜひUdemyでブロックチェーンと検索してみてください。

今回はここまでです。

つづき
【Dappsアプリ】選挙投票Dappsの作成-その2-

ではまた!

 - solidity, BlockChain, プログラミング系