Edited 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