LoginSignup
1

More than 3 years have passed since last update.

posted at

updated at

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

ローカルネットでスマートコントラクトを触る

この内容はMac上にiwalletをインストールし,IOSTのローカルネット環境がある前提です.また,Macにiwalletが入らなかった人のために,今後の作業はすべてdocker内でのものとなります.
環境構築はIOSTに触れてみる!!を参考にしてくださると幸いです.

1. dockerコンソール内に入る

$ docker exec -it iserver /bin/bash

2. adminアカウントをインポートする

# 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内でコードを記述するかを行う.
コードがあるディレクトリで以下のコマンドを実行する.

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

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

# 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!と出れば成功.

# 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を覗いて実行を確認してみる.

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

おわりに

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

参考文献

IOSTブロックチェーンでスマートコントラクトを書く その1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1