IOSTでスマートコントラクトを動かしてみる！！

# ローカルネットでスマートコントラクトを触る
_この内容はMac上にiwalletをインストールし，IOSTのローカルネット環境がある前提です．また，Macにiwalletが入らなかった人のために，今後の作業はすべてdocker内でのものとなります．_
_環境構築は[IOSTに触れてみる！！](https://qiita.com/kunroku/items/f153d53ab14b72c84997)を参考にしてくださると幸いです．_

##1. dockerコンソール内に入る
```console
$ docker exec -it iserver /bin/bash
```
##2. adminアカウントをインポートする
```console
# iwallet account import admin 2yquS3ySrGWPEKywCPzX4RTJugqRh7kJSo5aehsLYPEWkUxBWA39oMrZ7ZxuM4fgyXYs2cPwh5n8aNNpH5x2VyK1
import account admin done
```

##3. コードを記述する
IOSTのスマートコントラクトは，JavaScriptで記述できる．
※しかし，すべての機能が使えるわけではない．

```HelloWorld.js
class HelloWorld {
  // コントラクトを最初にデプロイしたときに実行されるメソッド
  init() {}
  // 引数に挨拶を返す
  hello(someone) {
    return "hello, "+ someone
  }
}
module.exports = HelloWorld;
```
##4. iwalletでコンパイルする
dockerと母艦でコードを共有するか，docker内でコードを記述するかを行う．
コードがあるディレクトリで以下のコマンドを実行する．

```console
# iwallet compile HelloWorld.js
Successfully generated abi file as: HelloWorld.js.abi
```

##5. iwalletでスマートコントラクトをデプロイ

```console
# iwallet --account admin publish HelloWorld.js HelloWorld.js.abi
Connecting to server localhost:30002 ...
Sending transaction...
Transaction:
{
    "time": "1555598648064816800",
    "expiration": "1555598738064816800",
    "gasRatio": 1,
    "gasLimit": 1000000,
    "delay": "0",
    "chainId": 1024,
    "actions": [
        {
            "contract": "system.iost",
            "actionName": "setCode",
            "data": "[\"{\\\"info\\\":{\\\"lang\\\":\\\"javascript\\\",\\\"version\\\":\\\"1.0.0\\\",\\\"abi\\\":[{\\\"name\\\":\\\"hello\\\",\\\"args\\\":[\\\"string\\\"]}]},\\\"code\\\":\\\"class HelloWorld {\\\\n  // コントラクトを最初にデプロイしたときに実行されるメソッド\\\\n  init() {}\\\\n  // 受け取った引数に挨拶を返す\\\\n  hello(someone) {\\\\n    return \\\\\\\"hello, \\\\\\\"+ someone\\\\n  }\\\\n  /*\\\\n  // トランザクションを送ったアカウントに挨拶を返す\\\\n  hello() {\\\\n    return \\\\\\\"hello, \\\\\\\"tx.publisher;\\\\n  }*/\\\\n}\\\\nmodule.exports = HelloWorld;\\\\n\\\"}\"]"
        }
    ],
    "amountLimit": [
        {
            "token": "*",
            "value": "unlimited"
        }
    ],
    "signers": [
    ],
    "signatures": [
    ],
    "publisher": "admin",
    "publisherSigs": [
        {
            "algorithm": "ED25519",
            "signature": "Jih0XbF1cYmkm+yn5pCa8J+n0xrfa1TVG+wqST3VGSD9u1xYVVX6UPD6ifJOM28lTvPT9KQzTSdtrUI/NrBmAA==",
            "publicKey": "6BK1LqmtXLqamvA6/MbylCpFJLDfPANE3BlQcoMWcMQ="
        }
    ]
}
Transaction has been sent.
The transaction hash is: 8pLHto6Naew79wEb2bN4fXyW1WDMrgGEWpdZgZmQtgdL
Checking transaction receipt...
Transaction receipt:
{
    "txHash": "8pLHto6Naew79wEb2bN4fXyW1WDMrgGEWpdZgZmQtgdL",
    "gasUsage": 266997,
    "ramUsage": {
        "admin": "498"
    },
    "statusCode": "SUCCESS",
    "message": "",
    "returns": [
        "[\"Contract8pLHto6Naew79wEb2bN4fXyW1WDMrgGEWpdZgZmQtgdL\"]"
    ],
    "receipts": [
    ]
}

SUCCESS! Transaction has been irreversible
The contract id is: Contract8pLHto6Naew79wEb2bN4fXyW1WDMrgGEWpdZgZmQtgdL

```
みたいな感じでコントラクトアドレスが帰ってくるはず．
※以下のエラーが出た場合は何度かデプロイし直してみてください．
何度か試してみたら行ける可能性があります．（再現性のないエラーのようなので原因はよく分かりません．）

```
ERROR: running action Action{Contract: system.iost, ActionName: setCode, Data: ["{\"info\":{\"lang\":\"javascript\",\"vers... error: execution killed
```

##6. スマートコントラクトをcallしてみる
iwalletからスマコンをcallしてみる．
helloメソッドを引数無しで実行してみる．
SUCCESS!と出れば成功．

```console
# iwallet --account admin call "Contract<transaction hash>" "hello" '["world!"]'
Sending transaction...
Transaction has been sent.
The transaction hash is: <transaction hash>
Checking transaction receipt...
SUCCESS!
```
receiptを覗いて実行を確認してみる．

```console
# iwallet receipt <transaction hash>
{
    "txHash": <transaction hash>,
    "gasUsage": 33745,
    "ramUsage": {
    },
    "statusCode": "SUCCESS",
    "message": "",
    "returns": [
        "[\"hello, world!\"]"
    ],
    "receipts": [
    ]
}
```

## おわりに
今回はスマートコントラクトを動かしてみました！
次回は少しレベルアップしたコードを動かしてみたいと思います！
それでは〜

## 参考文献
[IOSTブロックチェーンでスマートコントラクトを書く その１](https://medium.com/@takao_wada/iost%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%A7%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%AF%E3%83%88%E3%82%92%E6%9B%B8%E3%81%8F-%E3%81%9D%E3%81%AE%EF%BC%91-eb60de0b744e)