IOSTでスマートコントラクトいじってみた
どうも、みやざきです。
今回は軽くIOSTのスマートコントラクトをいじってみました。
今回やることは公式ドキュメント見れば大体載ってます、というか今のところこれ以外見るものがあまりない。
https://developers.iost.io/docs/en/3-smart-contract/ContractStart.html
この記事を読み進めえる前に注意なんですが、かなり初心者向けに書いてます。
というか僕が初心者なので自分に授業する感じで書いてます。
ので経験豊富なエンジニアの方にはすこし冗長かもしれませんがそこはご了承ください。あと読んでて、こいつここのところよくわかってないな、とか思ったらお手数ですがご指摘いただけるとありがたいです。
まず今回やるのは、
って感じです。
0.その前に、必要なもの
IOSTとは??
IOSTってそもそも何って方はこれ読んでみてください。
はい、始めます。
ノードを立ち上げる前に必要なものとして、
Docker最新版
iWallet (goが必要)
Node.js (僕はv10.15.3を使ってます。特に不具合は起きてない)
諸々インストールに関しては文献があふれかえってるので省略。
iWalletに関しては公式を参照する良いと思います。日本語もあります。
https://developers.iost.io/docs/en/4-running-iost-node/iWallet.html
iWalletはIOSTのコマンドラインツールです。
これがあればIOSTブロックチェーンに指示出したりして遊べるよってことですね。
1.Dockerでテストノードを立ち上げる。
なんのこっちゃって感じですが、僕の理解としては、自分だけのIOSTブロックチェーンを作ってそこでコントラクトを検証していくよ。ってことだと思います。
たぶん。
ではまず
Dockerを起動してDocker内でシェルを開きます。
1.
docker run --rm -d -p 30000-30003:30000-30003 iostio/iost-node
2.
docker ps
3.
docker exec --it <containeID> /bin/bash
1.まず runコマンドで起動、そのあとにオプションとイメージが付きます。
オプションの意味なんかは docker run --help ってやると出てきます。
--rm はコンテナが終了した時にコンテナを削除しますよってやつですね。
-d はバックグラウンドでコンテナを起動しときますよてやつですね。
これがないとローカルで作成したブロックチェーンの情報が延々とターミナル画面上を流れます。まあ新しいターミナル開けばいいんですけどめんどくさいですね。
-p は使うポートを指定してます。ローカルのポート:コンテナのポートって感じですね。ポートとかまだよくわかってないので頑張ります。
で最後の iostio/iost-node はイメージです。これを基にコンテナを作りますよってやつですね。
一番最初にこのコマンドを打つときはローカルにイメージがないのでダウンロードする分少し時間がかかります。二回目以降はすぐ立ち上がります。
2.これでいま起動しているコンテナの情報を見られます。
そしたらCONTAINER IDって書いてある12桁くらいの文字列をコピーして
3.のコマンドのcontainer ID のとこに入れましょう。
両脇の <> は除いてください
はい、成功すればこれでDocker 内でシェルが開きました。
workdir# ってなってると思います。
次に公式からローカルテストネット用のadminアカウントが用意されてるのでそれをインポートします。
このコマンドを全部一行で入力します。
iwallet account import admin 2yquS3ySrGWPEKywCPzX4RTJugqRh7kJSo5aehsLYPEWkUxBWA39oMrZ7ZxuM4fgyXYs2cPwh5n8aNNpH5x2VyK1
普通はIOSTネットワーク上にスマートコントラクトをパブリッシュしたりトランザクションを発行するときにはiGAS,iRAMというシステムリソースが必要なんですが、adminだとそういうの気にしないで出来るよってやつだと思います。
ここまで出来たらexit って入力するとコンテナの外に出られます。
とりあえず準備完了。
2.適当にコントラクトを書いてみよう。
IOSTの
スマートコントラクトはJavaScriptで書けます。
使えない表現もいくつかあるようです。
(banってなってるやつ)
配列、オブジェクトが使えないみたいですね。
https://developers.iost.io/docs/en/6-reference/GasChargeTable.html
簡単なコントラクトのコードも公式から借りてきました。
まずindex.jsファイルを作って次のコードを書きます。
ディレクトリは自分がわかりやすいところであればどこでもおっけい。
class HelloWorld {
init() {}
hello(someone) {
return "hello, "+ someone
}
}
module.exports = HelloWorld;
こんな感じ。
引数で文字列を受け取って、hello, someoneで返すっていう簡単なコードです。
でそのディレクトリ内で、
iwallet compile index.js
とコマンドを入力します。
これでディレクトリ内にindex.js.abiというファイルが出来ました。
中身はJSON文字列になっています。
IOSTのスマートコントラクトはコントラクトを直接外部から呼び出すのではなく、このabiを通じて呼び出すみたいです。
外部からそのコントラクトに向けられた呼び出しに対して、インプットの情報(引数など)をabiが受け取ってそれをコントラクトに伝達し、またアウトプットをabiが受け取ってコントラクトを呼び出した人に返す、みたいな感じです。
ここまで来たらあと一歩、
iwallet publish -a admin -s localhost:30002 index.js index.js.abi
これでスマートコントラクトをブロックチェーン上に乗っけることが出来ました。
このとき最後にコントラクトのIDが表示されます
Contract78SZgsZ9wuMVvgFTBWoNCy2hMy4x1Gn6SjFpCPEuUmqx
みたいな感じです。
IDはそれぞれのコントラクトを使いたいときに必要なので控えておく必要があります。
コントラクトをアップデートするときにも必要になります。
まあ今回はコピペできれば大丈夫です。
3.実際にコントラクトを呼び出してみる
では本当にブロックチェーン上にコントラクトが乗っているか確かめてみましょう.
先ほどのhello関数を動かしてみましょう。
iwallet call -a admin "Contract78SZgsZ9wuMVvgFTBWoNCy2hMy4x1Gn6SjFpCPEuUmqx" "hello" '["UDON"]'
callの後に
コントラクトID
そのあとにコントラクトに中の呼び出したい関数名
もしその関数が引数を取るのであればJSON配列の形で渡します。
ちょっとクオーテーションが多くてわかりずらいので気を付けてください。
シングルとダブルクオーテーションで使い分けてます。
これが成功するとトランザクションハッシュが発行されます。
それもまたコピペできるようにしていおいてください。
まだこれだけではトランザクションを発行してコントラクトを呼び出しただけなので、その結果はわかりません。結果を知るためにはレシートを見る必要があります。
iwallet receipt <Tx hash>
これでトランザクションの結果が見られます。
return のところに hello, UDON って書いてあったら成功です。
4.お疲れさまでした。
いやあ、これだけのことを説明するだけなのにめちゃくちゃ長くなってしまった。
エラーとか無視して書いてしまいました。
もしエラーとかあったらツイッターなどで教えてくださるとありがたいです。
技術記事書くのにはやっぱりmediumとかQiitaの方が書きやすいのかなと思いました。ので今度からそっちで書こうと思います。
あと技術記事書いてる人ってみんなターミナルのスクショとか載っけてるけどすごい労力だなと思いました。
僕もそこらへんめんどくさがらない大人になりたいなと思いました。
もう深夜なので寝ます。