katonobo’s blog

プログラミング中心の雑記ブログ

Dappsアプリ「わしが育てたおじさん2.0」のSolidityコード

前回書いた記事の技術的な部分です。Solidityのコントラクトについて説明と、つまづいたところを書きます。

(8/22 わしが育てたおじさんは終了しました。たくさん遊んでいただきありがとうございました)

www.katonobo.com 

Solidityコードでやっていること

「わしが育てたおじさん2.0」ではコントラクト側では、投稿者名、コンテンツ内容、投稿時間の三つを「構造体(struct)」に入れ、indexという形で取り出せるように設計しています。まずはコードを見て見ましょう。

 

WashiOji.sol

pragma solidity ^0.4.22;

 

contract WashiOji {

 

    event NewWashiOji(uint id, string name, string title, uint time);

 

    struct washiOji {

        string name;

        string title;

        uint time;

    }

 

    washiOji public washiojis;

 

  function set(string _name, string _title, uint _time) public {

 

     uint id =  washiojis.push(washiOji(_name, _title, _time)) - 1;

     emit NewWashiOji(id, _name, _title, _time);

    }

 

    function get(uint _index) public view returns (string, string, uint) {

        return (washiojis[_index].name, washiojis[_index].title, washiojis[_index].time );

    }

 

    function getLength() public view returns  (uint){

       return washiojis.length;

   }

}

 

とてもシンプルです。少し細かく説明します。

各コードの説明

struct

struct washiOji {

        string name;

        string title;

        uint time;

    }

 structで構造体を作成しています。

 

配列

washiOji public washiojis;

こちらは作成した構造体を入れる配列を作っています。これがないと新しいデータを入れる場所が無くなります。

 

関数

function set(string _name, string _title, uint _time) public {

     uint id =  washiojis.push(washiOji(_name, _title, _time)) - 1;

     emit NewWashiOji(id, _name, _title, _time);

    }

 

 これはデータをフロントエンドから受け取り、コントラクトに刻むための関数です。idをつけているのは、投稿内容を管理するためです。

 

function get(uint _index) public view returns (string, string, uint) {

        return (washiojis[_index].name, washiojis[_index].title, washiojis[_index].time );

    }

 

このfunction getは、フロントエンドからの命令を受けた時にデータをコントラクトから引っ張ってくるコードです。ここが一番の引っかかりポイントだったのですが、Solidityはまだ一気に構造体をreturnで返すことができないらしく、このように各変数を一旦別々に分けて受け取るように指定しています。

 

function getLength() public view returns  (uint){

       return washiojis.length;

  

こちらは、配列の数を受け取るための関数です。フロントエンドでは、この関数を呼び出して配列数を取得し、配列の数だけ先ほどのget関数を呼び出すようにしています。

 

まとめ

大変シンプルなコードであることがわかっていただけたと思います。Solidityはまだまだ途上であるため、どんどん仕様も変更されます。そのためしっかりキャッチアップする必要がありますが、その分やりがいもあるように感じています。

Remixで試していただければ、動きもなんとなくわかると思います。

Remix - Solidity IDE