うどんの帝国

うどんとブロックチェーンって似てる

(第二弾)IOSTでスマートコントラクトを書くよ

どうも、みやざきです。 IOSTスマートコントラクト第2弾です。

まずスマートコントラクトを書く前に準備がいるので、ローカルテストノードを立ち上げるためには下の記事の1.までやってみてください。 すぐ終わると思います。

www.tama-fun95.tokyo

 1.スマートコントラクトを書く

では早速スマートコントラクトを書いてみましょう。

スマートコントラクトの中身はこんな感じです。

init関数:スマートコントラクトがパブリッシュされたときに動く関数。

can_update:公式が用意しているコントラクトアップデートのための関数。これをコントラクト内に書かなければアップデート不可にできます。

putText:ユーザーからのインプットを受け取ってストレージに保存する関数。

getText:ストレージから特定のTextを読み取ってユーザーに返します。

まず, その前に、IOSTのストレージにはJSON形式でデータが保存されます。 なので

ストレージに数値をしまいたければJSON.stringify

ストレージ取り出したい値を数値として使いたい場合はJSON.parse()して使う必要があります。

毎回書くとめんどくさいので最初にまとめて書いてしまいます。

_get(k){
    const val = JSON.parse(storage.get(k));
    return val;
}

_put(k,v){
    const val = JSON.stringify(v);
    storage.put(k,val);
} 

storage.put:ストレージにKey-Valueペアを保存 storage.get:ストレージからKeyをもとにValueを取ってくる。

などはIOSTのAPIです。

詳しくは公式ドキュメントのAPIページを見てください。

https://developers.iost.io/docs/en/3-smart-contract/IOST-Blockchain-API.html

では本題。

class TextRecorder {
    init (){
    //パブリッシュされたときに
      // {"count":"0", "text_count_0":"GENESIS_TEXT"}って感じで保存。
        this._put('count', 0);
        storage.put("text_count_0" ,"GENESIS_TEXT");
    }

    
//これはテンプレだと思います。
    can_update(data) {
        return blockchain.requireAuth(blockchain.contractOwner(), "active");
    }


    putText(txt){
     //"count"のValueを持ってきて数値化。
        let textId = this._get("count");
     // それに1を足してそれが今回のテキストの番号になる
        textId = textId + 1;
     //テキストは"count_#":"xxxx"という感じのペアで保存される。
        storage.put("count_" + JSON.stringify(textId), txt);
     //最後にcountを再度JSON化してストレージに保存して今のテキストの数を記録する。
        this._put("count", textId);
    }

//これはテスト用に書いたのでなくてもいいです。現在のcountを見られる。
    getStoryCount(){
        return storage.get("count");
    }

//テキストの番号をもとにストレージから対応するValueを返す。
    getStory(id){
        let textId = "count_" + id;
        let txt = storage.get(textId);
        return txt; 
     }

    _get(k){
       const val = JSON.parse(storage.get(k));
       return val;
     }

    _put(k,v){
       const val = JSON.stringify(v);
       storage.put(k,val);
     } 
}

このスマートコントラクトをざっくりまとめると、

テキストは"count_#":"xxxx"というのペアで保存される。

それとは別に"count":"xx"というペアがありputTextの度に”xx”の値が1ずつ増える。

こんな感じでストレージを使ってテキストに対してユニークな番号を割り当ててます。 今度はmapも使ったりしてやりたいと思います。

Qiitaにも同じ記事をあげるつもりです。

第3弾は実際に上記のスマートコントラクトをブロックチェーン上にパブリッシュ(ディプロイ)して動かしてみようと思います。

Twitterやってます。もしよかったらどうぞ。

twitter.com