ローカルネットでスマートコントラクトを触る
この内容は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で記述できる.
※しかし,すべての機能が使えるわけではない.
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": [
]
}
おわりに
今回はスマートコントラクトを動かしてみました!
次回は少しレベルアップしたコードを動かしてみたいと思います!
それでは〜