(第二弾)IOSTでスマートコントラクトを書くよ
どうも、みやざきです。 IOSTスマートコントラクト第2弾です。
まずスマートコントラクトを書く前に準備がいるので、ローカルテストノードを立ち上げるためには下の記事の1.までやってみてください。 すぐ終わると思います。
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やってます。もしよかったらどうぞ。