LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-04-18

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

この内容は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

2
1
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
  3. You can use dark theme
What you can do with signing up
2
1