Inside IOST #03: iwalletでアカウントやスマートコントラクトを操作する

Inside IOST for Developers

Takao Wada
31 min readJun 18, 2022

1. アカウント関連コマンド

1.1 アカウントの作成

新規にアカウントを作成します。テスト環境の場合はいいですが、作成にはIOSTが必要になりますので、慎重に生成してください。

iwallet --account <作成者アカウント> --amount_limit "ram:<使用可能RAM>|iost:<使用可能IOST>" account create <アカウント名> --initial_balance <初期残高> --initial_gas_pledge <初期GASプレッジ> --initial_ram <初期RAM> --chain_id <チェーンID>
  • <作成者アカウント> — アカウントを作成するアカウント、作成するには 10IOST 必要です。オプションで、GASやRAMを割り当てるなら、その分の残高も必要です。
  • [オプション] <アカウント名> — 新規に作成するアカウント名で、英数字または_([a-z0–9_])のみで構成され、長さは5–11文字でなければなりません。
  • [オプション] — amount_limit “ram:<使用可能RAM>|iost:<使用可能IOST>”— アカウントが一度のトランザクションで使用可能なRAMとIOSTの量
  • [オプション] — initial_balance<初期残高> — 付与するIOST量、0でもOK
  • [オプション] — initial_gas_pledge<初期GASプレッジ> —GAS取得のためにプレッジするIOST量、0でもOK
  • [オプション] — initial_ram<初期RAM> — 付与するRAM量、0でもOK
  • [オプション] — chain_id<チェーンID> — ブロックチェーンのチェーンID(デフォルト:1024)

次の例は、bobbyというアカウントを作成しています。秘密鍵は Owner permission key や Active permission keyで示された 7AxofrF3hk4v7vkKiY7c4YHvq4bivZxHgWgpQiwWdpXx です。この場合は同じものになります。.wallet フォルダに、bobby.json のようなアカウントファイルがすでにある場合は上書きされずに、見落とすと消えてしまいますので、気をつけてください。

$ docker exec -t iserver iwallet --account admin --amount_limit "ram:1000|iost:10" account create bobby --initial_balance 0 --initial_gas_pledge 10 --initial_ram 0 --chain_id 1020
Connecting to server localhost:30002 ...
Sending transaction...
Transaction:
{
"time": "1655548853110871000",
"expiration": "1655548943110871000",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "auth.iost",
"actionName": "signUp",
"data": "[\"bobby\", \"7AxofrF3hk4v7vkKiY7c4YHvq4bivZxHgWgpQiwWdpXx\", \"7AxofrF3hk4v7vkKiY7c4YHvq4bivZxHgWgpQiwWdpXx\"]"
}
],
"amountLimit": [
{
"token": "ram",
"value": "1000"
},
{
"token": "iost",
"value": "10"
}
],
"signers": [
],
"signatures": [
],
"publisher": "admin",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "lVtTQzhReEqqiZ77guCjiTaJuanvPl6XjRzm59B/AYnVgZKmqoQ7DNJiR5k2xZspFH062da2eQ6PiXiBbYSbDQ==",
"publicKey": "6BK1LqmtXLqamvA6/MbylCpFJLDfPANE3BlQcoMWcMQ="
}
]
}
Transaction has been sent.
The transaction hash is: FLZSpKLoSm3bEx4zHAxpXtuXjfAxFdGSwSubnbH1cQcv
Checking transaction receipt...
Transaction receipt:
{
"txHash": "FLZSpKLoSm3bEx4zHAxpXtuXjfAxFdGSwSubnbH1cQcv",
"gasUsage": 48528,
"ramUsage": {
"auth.iost": "396",
"gas.iost": "196"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[\"\"]"
],
"receipts": [
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"admin\",\"gas.iost\",\"10\",\"\"]"
},
{
"funcName": "gas.iost/pledge",
"content": "[\"admin\",\"bobby\",\"10\"]"
},
{
"funcName": "auth.iost/signUp",
"content": "[\"bobby\",\"7AxofrF3hk4v7vkKiY7c4YHvq4bivZxHgWgpQiwWdpXx\",\"7AxofrF3hk4v7vkKiY7c4YHvq4bivZxHgWgpQiwWdpXx\"]"
}
]
}
SUCCESS! Transaction has been irreversible
Account info of < bobby >:
{
"name": "bobby",
"balance": 0,
"gasInfo": {
"currentTotal": 1000017.25,
"transferableGas": 0,
"pledgeGas": 1000017.25,
"increaseSpeed": 11.5,
"limit": 3000000,
"pledgedInfo": [
]
},
"ramInfo": {
"available": "0",
"used": "0",
"total": "0"
},
"permissions": {
"active": {
"name": "active",
"groupNames": [
],
"items": [
{
"id": "7AxofrF3hk4v7vkKiY7c4YHvq4bivZxHgWgpQiwWdpXx",
"isKeyPair": true,
"weight": "100",
"permission": ""
}
],
"threshold": "100"
},
"owner": {
"name": "owner",
"groupNames": [
],
"items": [
{
"id": "7AxofrF3hk4v7vkKiY7c4YHvq4bivZxHgWgpQiwWdpXx",
"isKeyPair": true,
"weight": "100",
"permission": ""
}
],
"threshold": "100"
}
},
"groups": {
},
"frozenBalances": [
],
"voteInfos": [
]
}
The IOST account ID is: bobby
Owner permission key: 7AxofrF3hk4v7vkKiY7c4YHvq4bivZxHgWgpQiwWdpXx
Active permission key: 7AxofrF3hk4v7vkKiY7c4YHvq4bivZxHgWgpQiwWdpXx
keyfile of account bobby saved to /root/.iwallet/bobby.json

では、残高を確認してみましょう。

$ docker exec -t iserver iwallet balance bobby
Connecting to server localhost:30002 ...
{
"name": "bobby",
"balance": 0,
"gasInfo": {
"currentTotal": 1000914.22,
"transferableGas": 0,
"pledgeGas": 1000914.22,
"increaseSpeed": 11.5,
"limit": 3000000,
"pledgedInfo": [
]
},
"ramInfo": {
"available": "0",
"used": "0",
"total": "0"
},
"permissions": {
"active": {
"name": "active",
"groupNames": [
],
"items": [
{
"id": "7AxofrF3hk4v7vkKiY7c4YHvq4bivZxHgWgpQiwWdpXx",
"isKeyPair": true,
"weight": "100",
"permission": ""
}
],
"threshold": "100"
},
"owner": {
"name": "owner",
"groupNames": [
],
"items": [
{
"id": "7AxofrF3hk4v7vkKiY7c4YHvq4bivZxHgWgpQiwWdpXx",
"isKeyPair": true,
"weight": "100",
"permission": ""
}
],
"threshold": "100"
}
},
"groups": {
},
"frozenBalances": [
],
"voteInfos": [
]

1.2 キーペアの作成

キーペアだけを作成することもできます。オプションでアルゴリズムを変更できます。

iwallet key
  • --sign_algo <アルゴリズム名>: デフォルトはed25519、それ以外ならsecp256k1 (2022年6月現在)

実際に生成してみます。

$ docker exec -t iserver iwallet key
{
"Algorithm": "ed25519",
"Pubkey": "D64zC1VFi9sEkwPE7bhgGVBPRxAJRKz66uhvnkSLF6R4",
"Seckey": "3VTiin1x23XhBr2YVuqrXbkqCotjQ1nhEtBJ3Wd1MZKZYgx6cVPHUUFyJQYFNnvsVTDd1zvdFAmtym2UKhRryFt"
}
  • Pubkey: 生成された公開鍵
  • Seckey: 生成された秘密鍵

1.3 IOSTトークンの転送

IOSTトークンを転送します。

iwallet transfer <送信先アカウント> <送信量> --account <送信元アカウント> --chain_id <チェーンID>
  • <送信元アカウント>: 送信元のアカウント
  • <送信先アカウント>: 送信先のアカウント
  • <送信量>: 送信するIOST量
  • [オプション] — chain_id<チェーンID> — ブロックチェーンのチェーンID(デフォルト:1024)

admin から bobby に 100IOST を送ってみます。

$ docker exec -t iserver iwallet transfer bobby 100 --account admin --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655565146099411634",
"expiration": "1655565236099411634",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "token.iost",
"actionName": "transfer",
"data": "[\"iost\",\"admin\",\"bobby\",\"100\",\"\"]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "admin",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "6r1s5ELTrlSr/yO8X0NAZf9/OpDxZNvMh5TrjJ1qko8rbHwkwASg7+Zzp1WrYjLQYh7LW44prZNWKcJh+CHmAQ==",
"publicKey": "6BK1LqmtXLqamvA6/MbylCpFJLDfPANE3BlQcoMWcMQ="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: 7XwQ2oNkG4jAWRS1pvcMtLi1iJ6igCoUW6nwGBQzvtu9
Checking transaction receipt...
Transaction receipt:
{
"txHash": "7XwQ2oNkG4jAWRS1pvcMtLi1iJ6igCoUW6nwGBQzvtu9",
"gasUsage": 7495,
"ramUsage": {
"token.iost": "46"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[]"
],
"receipts": [
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"admin\",\"bobby\",\"100\",\"\"]"
}
]
}
SUCCESS! Transaction has been irreversible

2. コントラクトの作成と公開

2.1 コントラクトの作成

サンプルとして、次のような挨拶をするHelloコントラクトを hello.js として用意します。

class Hello {
init() {}
say(to) {
return "Hi, " + to + "."
}
}
module.exports = Hello;

コントラクトをコンパイルして、ABIファイルを生成します。

$ docker exec -t iserver iwallet compile hello.js
Successfully generated abi file as: hello.js.abi

生成されたABIファイルは、元のファイル名に .abi が付与された名前になります。オプションで変更もできます。生成された hello.js.abi は、次のようになっています。

{
"lang": "javascript",
"version": "1.0.0",
"abi": [
{
"name": "say",
"args": [
"string"
],
"amountLimit": [],
"description": ""
}
]
}

2.2 コントラクトの公開

コントラクトをブロックチェーン上に公開すると、他から利用できるようになります。

iwallet publish <コントラクトソース・ファイル> <ABIファイル> --account admin --chain_id <チェーンID>
  • <コントラクトソースファイル>: コントラクトのソースファイル
  • <ABIファイル>: ABIスファイル

Helloコントラクトを公開してみます。

$ docker exec -t iserver iwallet publish hello.js hello.js.abi --account admin --chain_id 1020
Connecting to server localhost:30002 ...
Sending transaction...
Transaction:
{
"time": "1655563100411227000",
"expiration": "1655563190411227000",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "system.iost",
"actionName": "setCode",
"data": "[\"{\\\"info\\\":{\\\"lang\\\":\\\"javascript\\\",\\\"version\\\":\\\"1.0.0\\\",\\\"abi\\\":[{\\\"name\\\":\\\"say\\\",\\\"args\\\":[\\\"string\\\"]}]},\\\"code\\\":\\\"class Hello {\\\\n init() {}\\\\n say(to) {\\\\n return \\\\\\\"Hi, \\\\\\\" + to + \\\\\\\".\\\\\\\"\\\\n }\\\\n}\\\\nmodule.exports = Hello;\\\\n\\\"}\"]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [
],
"signatures": [
],
"publisher": "admin",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "3asWoKhjK7TOErlZd+2xzqrWIx7x9nYcbX58dyj0el1wsIUdC6nadpGpXcHfxg3wW1NFHW8qdYehluIKQvhHCQ==",
"publicKey": "6BK1LqmtXLqamvA6/MbylCpFJLDfPANE3BlQcoMWcMQ="
}
]
}
Transaction has been sent.
The transaction hash is: 2Wjr64WT19aWCJZ8K1178KUSxJ49FwxeUQRaYbiUdCqM
Checking transaction receipt...
Transaction receipt:
{
"txHash": "2Wjr64WT19aWCJZ8K1178KUSxJ49FwxeUQRaYbiUdCqM",
"gasUsage": 243792,
"ramUsage": {
"admin": "497"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[\"Contract2Wjr64WT19aWCJZ8K1178KUSxJ49FwxeUQRaYbiUdCqM\"]"
],
"receipts": [
]
}
SUCCESS! Transaction has been irreversible
The contract id is: Contract2Wjr64WT19aWCJZ8K1178KUSxJ49FwxeUQRaYbiUdCqM

“SUCCSESS” と表示されているようであれば、成功です。失敗した場合も何度かトライすると成功する場合があります。失敗するケースとしては、ソースコードの不具合以外に、GASやRAMの不足などが考えられます。この例では、243,792 GAS と 497 RAM が使用されています。

トランザクションハッシュは、 2Wjr64WT19aWCJZ8K1178KUSxJ49FwxeUQRaYbiUdCqM で、このハッシュ値で、トランザクション情報やレシート情報を取得することができます。

最終的に生成されたコントラクトIDが、 Contract2Wjr64WT19aWCJZ8K1178KUSxJ49FwxeUQRaYbiUdCqM になります。コントラクトの処理を実行するには、このIDが必要ですので、必ずメモするようにしてください。

2.3 スマートコントラクトの処理を呼び出す

作成した スマートコントラクトやシステムコントラクトの関数を呼び出すことができます。

iwallet call "<コントラクトID>" "<関数名>" "[<引数>]" --account <呼び出しアカウント> --chain_id <チェーンID>
  • <コントラクトID>: コントラクトID
  • <関数名>: 指定したコントラクトに含まれる関数名
  • <引数>: 引数をカンマ区切りでJavaScript配列の形で指定します。文字列を表すダブルクオーテーションはバックスラッシュ(\)でエスケープしてください。
  • <呼び出しアカウント>: コントラクトを呼びだすアカウント
  • [オプション] — chain_id<チェーンID> — ブロックチェーンのチェーンID(デフォルト:1024)

先ほど作成した Hello コントラクトの say 関数を呼び出してみます。

$ docker exec -t iserver iwallet call "Contract2Wjr64WT19aWCJZ8K1178KUSxJ49FwxeUQRaYbiUdCqM" "say" "[\"IOST\"]" --account admin --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655569054375648720",
"expiration": "1655569144375648720",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "Contract2Wjr64WT19aWCJZ8K1178KUSxJ49FwxeUQRaYbiUdCqM",
"actionName": "say",
"data": "[\"IOST\"]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "admin",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "7Rk/KrOsRw/tFdCKLATDE6SarsJZ3/mK1hUMViT5CooRzzzN9blBbb9bpfTp0oul+NZRmujmoe9I8JWyxKiYAg==",
"publicKey": "6BK1LqmtXLqamvA6/MbylCpFJLDfPANE3BlQcoMWcMQ="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: 611AYt4Nyiv6r5v6AGAi5Ci5UMKpY7yWKdHRpQZ2iKhJ
Checking transaction receipt...
Transaction receipt:
{
"txHash": "611AYt4Nyiv6r5v6AGAi5Ci5UMKpY7yWKdHRpQZ2iKhJ",
"gasUsage": 33617,
"ramUsage": {},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[\"Hi, IOST.\"]"
],
"receipts": []
}
SUCCESS! Transaction has been irreversible

3. トランザクション

3.1 トランザクションを保存

直接処理を行わず、トランザクションをファイルに保存できます。

<iwalletトランザクション処理> --tx_time_delay <処理遅延時間> --output <保存するファイルパス> --chain_id <チェーンID>
  • <iwalletトランザクション処理>: トランザクションを発行するiwallet処理
  • <処理遅延時間>: トランザクション処理後、保存するまでの待ち時間
  • <保存するファイルパス>: 保存したトランザクションファイル
  • [オプション] — chain_id<チェーンID> — ブロックチェーンのチェーンID(デフォルト:1024)

IOST転送コマンドをファイルに書き出してみます。

$ docker exec -t iserver iwallet transfer bobby 10 --account admin --tx_time_delay 60 --output tx.json --chain_id 1020
Transaction:
{
"time": "1655567762863225678",
"expiration": "1655567852863225678",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "token.iost",
"actionName": "transfer",
"data": "[\"iost\",\"admin\",\"bobby\",\"10\",\"\"]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "",
"publisherSigs": []
}
Successfully saved transaction request as json file: tx.json

保存された tx.json ファイルは次のようになります。

{
"time": "1655567762863225678",
"expiration": "1655567852863225678",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "token.iost",
"actionName": "transfer",
"data": "[\"iost\",\"admin\",\"bobby\",\"10\",\"\"]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "",
"publisherSigs": []
}

3.2 トランザクションに署名

書き出したトランザクションに署名することができます。

iwallet sign <トランザクションファイル> <アカウントファイルパス> <署名ファイル>
  • <トランザクションファイル>: 書き出されたトランザクションファイル
  • <アカウントファイルパス>: アカウントファイルへのパス
  • <署名ファイル>: 署名ファイル

上で作成した、トランザクションに admin アカウントで署名して、署名をsig.jsonファイルに書き出します。

$ docker exec -t iserver iwallet sign tx.json /root/.iwallet/admin.json sig.json
Signature:
{
"algorithm": "ED25519",
"signature": "tB1eU3qkMGnkMUQNN2kZEKjAHZr30m5rHvNUiraVixkohoZlg18t+tD7NHKj928S+qhG15mKcPJqdov6x9LlBQ==",
"publicKey": "6BK1LqmtXLqamvA6/MbylCpFJLDfPANE3BlQcoMWcMQ=
}
Successfully saved signature as: sig.json

書き出された sig.json ファイルは次のようになります。

{
"algorithm": "ED25519",
"signature": "j4qb9YY3NEwAOnku7dUi6PuaLKh7Lyv0aNlhFoHd/wdWNnLHPBu9KQ//NI+TucE5k4/G8CedHep9q3/niSE9Bg==",
"publicKey": "6BK1LqmtXLqamvA6/MbylCpFJLDfPANE3BlQcoMWcMQ="=
}

3.3 トランザクションの送信

署名されたトランザクションをブロックチェーンに送信します。トランザクションが作成してから時間が経つと送信に失敗します。

iwallet send <トランザクションファイル> --signature_files <署名ファイル> --account <発行アカウント>
  • <トランザクションファイル>: トランザクションファイル
  • <署名ファイル>: 署名ファイル
  • <発行アカウント>: トランザクションを発行するアカウント

上で署名されたしトランザクションを実際に送信してみます。

$ docker exec -t iserver iwallet send tx.json --signature_files sig.json --account admin
Successfully added signature contained in: sig.json
The transaction time is: 2022-06-18T15:56:02Z
Waiting 44 seconds to reach the transaction time...
Waiting 40 seconds to reach the transaction time...
Waiting 30 seconds to reach the transaction time...
Waiting 20 seconds to reach the transaction time...
Waiting 10 seconds to reach the transaction time...
Sending transaction...
Transaction:
{
"time": "1655567762863225678",
"expiration": "1655567852863225678",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "token.iost",
"actionName": "transfer",
"data": "[\"iost\",\"admin\",\"bobby\",\"10\",\"\"]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [
{
"algorithm": "ED25519",
"signature": "tB1eU3qkMGnkMUQNN2kZEKjAHZr30m5rHvNUiraVixkohoZlg18t+tD7NHKj928S+qhG15mKcPJqdov6x9LlBQ==",
"publicKey": "6BK1LqmtXLqamvA6/MbylCpFJLDfPANE3BlQcoMWcMQ="
}
],
"publisher": "admin",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "CdD4Eo+cot96xCjzZQ/Mix2L4gZL3iYD5SZXF5iIp1eVsekLZciRRApfhQzyrvGJwdS+iybJaSIgWFZ7PWA8Bw==",
"publicKey": "6BK1LqmtXLqamvA6/MbylCpFJLDfPANE3BlQcoMWcMQ="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: E9Nqv5V3Svd6c64MU1iktevUtzfg2H4mSJv2MTGVCu5J
Checking transaction receipt...
Transaction receipt:
{
"txHash": "E9Nqv5V3Svd6c64MU1iktevUtzfg2H4mSJv2MTGVCu5J",
"gasUsage": 8865,
"ramUsage": {},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[]"
],
"receipts": [
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"admin\",\"bobby\",\"10\",\"\"]"
}
]
}
SUCCESS! Transaction has been irreversible

トランザクション情報を表示してみます。

$ docker exec -t iserver iwallet transaction E9Nqv5V3Svd6c64MU1iktevUtzfg2H4mSJv2MTGVCu5J
Connecting to server localhost:30002 ...
{
"status": "IRREVERSIBLE",
"transaction": {
"hash": "E9Nqv5V3Svd6c64MU1iktevUtzfg2H4mSJv2MTGVCu5J",
"time": "1655567762863225678",
"expiration": "1655567852863225678",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "token.iost",
"actionName": "transfer",
"data": "[\"iost\",\"admin\",\"bobby\",\"10\",\"\"]"
}
],
"signers": [],
"publisher": "admin",
"referredTx": "",
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"txReceipt": {
"txHash": "E9Nqv5V3Svd6c64MU1iktevUtzfg2H4mSJv2MTGVCu5J",
"gasUsage": 8865,
"ramUsage": {},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[]"
],
"receipts": [
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"admin\",\"bobby\",\"10\",\"\"]"
}
]
}
},
"blockNumber": "40780"
}

レシート情報を表示してみます。

$ docker exec -t iserver iwallet receipt E9Nqv5V3Svd6c64MU1iktevUtzfg2H4mSJv2MTGVCu5J
Connecting to server localhost:30002 ...
{
"txHash": "E9Nqv5V3Svd6c64MU1iktevUtzfg2H4mSJv2MTGVCu5J",
"gasUsage": 8865,
"ramUsage": {},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[]"
],
"receipts": [
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"admin\",\"bobby\",\"10\",\"\"]"
}
]
}

関連記事

--

--