Inside IOST #04: iwalletでGASとRAMを操作する

Inside IOST for Developers

Takao Wada
67 min readJun 22, 2022

1. IOSTのGASとRAM

システムのリソースは、NET(ネットワーク帯域)、CPU(CPU使用量)、RAM(ストレージ使用量)に分けることができます。IOSTでは、NETとCPUはGASの支払いとして扱い、RAMはそのままRAMとして扱っています。

1.1 GAS

アカウントは、プレッジ(トークンを使えないようにロック)したトークンによりGASを取得できます。

  • GAS量の上限 — プレッジしたトークン数×300,000
  • 生成速度 — 100,000 GAS/トークン/日
  • プレッジしたトークンをアンプレッジで戻すことができます。その場合、上限は下げられ、上限以上のGASは破棄されます。
  • トランザクションの実行はGASを消費します。
  • トランザクションのGAS消費量 = コマンドのCGas(コマンドGAS)消費量 * コマンド数 * GAS比率
  • GASは取引できません。

1.2 RAM

RAMの使用にはトークンのデポジットが必要です。

  • システムの初期RAMの上限は128G
  • 1年ごとに64GずつRAMを増やし、RAMを購入するアカウントがあるたびにRAMを追加します。
  • ユーザーはシステムでRAMを売買でき、購入手数料が2%かかります。
    システムに残っているRAMが少ないほど価格は高くなり、多いほど安くなります。
  • システムから購入した RAM は他のユーザーに転送することができ、転送した後は回収できません。つまり、プレゼントすることになります。
  • 転送された RAM はシステムに売却できず、また他のユーザーに贈ることもできない、つまり RAM は一度しか取引できません。
  • システムは贈与された RAM を優先的に使用します。RAM が解放されたとき、RAM の属性(与えられた、システムが購入した)は変更されません。
  • スマートコントラクトは、payer パラメータで、コントラクト発行者とユーザーのどちらが RAM 使用料を支払うかを決めることができます。

2. GASとRAMをiwalletで扱う

2.1 テストシナリオ

  1. テストアカウントを作成
    1.1 admin で bobby、alice アカウントを作成
    (この時点で admin が、各アカウントに 10 IOSTプレッジ、RAMを 1,024付与するので、GAS limit 3,000, 000、RAM 1024)
    1.2 admin から bobby、alice に10,000 IOST 転送
  2. GASのテスト
    2.1 bobby が aliceに 1,000 IOST をプレッジ
    2.2 alice が 100 IOST アンプレッジ (エラー?)
    2.3 bobby が alice から 100 IOST をアンプレッジ
  3. RAMのテスト
    3.1 alice が 自分(alice) に 1,024 バイト RAM を購入
    3.2 aliceが bobby に 1024 バイトを購入
    3.3 bobby が 受け取った1,000 バイト RAM を売却し、自分で受け取る(エラー?)
    3.4 alice が 1,024 バイト 売却し、自分で受け取る

2.2 テスト用アカウントの作成

一度初期状態に戻して、アカウント作成してGASとRAMを試します。

  • 初期状態の admin アカウント
$ docker exec -t iserver iwallet balance admin
Connecting to server localhost:30002 ...
{
"name": "admin",
"balance": 20999997618.36,
"gasInfo": {
"currentTotal": 30000000,
"transferableGas": 0,
"pledgeGas": 30000000,
"increaseSpeed": 115,
"limit": 30000000,
"pledgedInfo": [
{
"pledger": "admin",
"amount": 100
},
{
"pledger": "foundation",
"amount": 100
},
{
"pledger": "producer000",
"amount": 100
}
]
},
"ramInfo": {
"available": "100000",
"used": "0",
"total": "100000"
},
"permissions": {
"active": {
"name": "active",
"groupNames": [],
"items": [
{
"id": "Gcv8c2tH8qZrUYnKdEEdTtASsxivic2834MQW6mgxqto",
"isKeyPair": true,
"weight": "100",
"permission": ""
}
],
"threshold": "100"
},
"owner": {
"name": "owner",
"groupNames": [],
"items": [
{
"id": "Gcv8c2tH8qZrUYnKdEEdTtASsxivic2834MQW6mgxqto",
"isKeyPair": true,
"weight": "100",
"permission": ""
}
],
"threshold": "100"
}
},
"groups": {},
"frozenBalances": [],
"voteInfos": []
}

admin アカウントで、bobby と alice というアカウントを作成し、それぞれに 10,000 IOST を転送しておきます。

$ docker exec -t iserver iwallet  account create bobby --account admin --chain_id 1020
$ docker exec -t iserver iwallet account create alice --account admin --chain_id 1020
$ docker exec -t iserver iwallet transfer bobby 10000 --account admin --chain_id 1020
$ docker exec -t iserver iwallet transfer alice 10000 --account admin --chain_id 1020

この段階での、admin、bobby、alice の状態は次のようになっています。bobby と alice に 10 IOST プレッジし、1,024 バイト RAM を付与しています。その分、IOST残高(balance)が 20,025.96 IOST 減っています。bobby と alice の残高は 10,000 IOST、RAM は 1,024 になっています。

{
"name": "admin",
"balance": 20999977592.4,
"gasInfo": {
"currentTotal": 29866263,
"transferableGas": 0,
"pledgeGas": 29866263,
"increaseSpeed": 115,
"limit": 30000000,
"pledgedInfo": [
{
"pledger": "admin",
"amount": 100
},
{
"pledger": "foundation",
"amount": 100
},
{
"pledger": "producer000",
"amount": 100
},
{
"pledger": "bobby",
"amount": 10
},
{
"pledger": "alice",
"amount": 10
}
]
},
"ramInfo": {
"available": "100000",
"used": "0",
"total": "100000"
},
--snip--
}
{
"name": "bobby",
"balance": 10000,
"gasInfo": {
"currentTotal": 1009014.31,
"transferableGas": 0,
"pledgeGas": 1009014.31,
"increaseSpeed": 11.5,
"limit": 3000000,
"pledgedInfo": []
},
"ramInfo": {
"available": "1024",
"used": "0",
"total": "1024"
},
--snip--
}
{
"name": "alice",
"balance": 10000,
"gasInfo": {
"currentTotal": 1008820.5,
"transferableGas": 0,
"pledgeGas": 1008820.5,
"increaseSpeed": 11.5,
"limit": 3000000,
"pledgedInfo": []
},
"ramInfo": {
"available": "1024",
"used": "0",
"total": "1024"
},
--snip--
}

2.3 システム操作系 iwalletコマンド

システム操作系のコマンドは、system または省略形で sys を付与して、次の形になっています。その中に、GASとRAMを扱うコマンドがあります。

iwallet system サブコマンド

今回扱うGASとRAMを扱うサブコマンドの一覧です。

3. GASを扱う

IOST をプレッジして、GAS 量の上限を増やすことができます。自分自身が使うためだけではなく、他の人が使うためにプレッジすることもできます。また、アンプレッジして IOST を取り戻すこともできます。

3.1 GASをプレッジする

GAS の上限を増やすことで、処理の多いトランザクションの実行が可能になります。

iwallet sys gas-pledge <プレッジ量> --account <プレッジするアカウント> --gas_user <付与されるアカウント> --chain_id <チェーンID>
  • gas-pledge は、pledgeと省略可能です。
  • <プレッジ量> — プレッジするIOSTの量。
  • <プレッジするアカウント> — IOSTをプレッジするアカウントです。
  • [オプション] <付与されるアカウント> —GASが付与されるアカウントです。省略するとプレッジ者自身になります。
  • [オプション] — chain_id<チェーンID> — ブロックチェーンのチェーンID(デフォルト:1024)

次の例では、bobby が alice に 1,000 IOST プレッジしています。

$ docker exec -t iserver iwallet sys pledge 1000 --account bobby --gas_user alice --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655894533443039171",
"expiration": "1655894623443039171",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "gas.iost",
"actionName": "pledge",
"data": "[\"bobby\",\"alice\",\"1000\"]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "bobby",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "nDMLiQwdaTrdASsPUw+HDoRfphaKU6uTvtYJOqm8l6BOYwQ1/EFRn2XpqKp+WZyFn9i6JIWIHvFGnOIKIa0cAA==",
"publicKey": "JYarqhc6j0vzY9oxdPJ5wvbSe8vtoUjZ7QwW+DzY9JA="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: 6uCxvPPUvoqFpQC96zanTECZ9Q6D5e1LFMMjQabb3YkG
Checking transaction receipt...
Transaction receipt:
{
"txHash": "6uCxvPPUvoqFpQC96zanTECZ9Q6D5e1LFMMjQabb3YkG",
"gasUsage": 11322,
"ramUsage": {
"gas.iost": "48"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[]"
],
"receipts": [
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"bobby\",\"gas.iost\",\"1000\",\"\"]"
},
{
"funcName": "gas.iost/pledge",
"content": "[\"bobby\",\"alice\",\"1000\"]"
}
]
}
SUCCESS! Transaction has been irreversible

プレッジ後は、bobby の alice へのプレッジが 1,000 増えて、1,000 になっています。alice の limit は、300, 000, 000 増えて、303,000,000 になっています。

{
"name": "bobby",
"balance": 9000,
"gasInfo": {
"currentTotal": 991552.96,
"transferableGas": 0,
"pledgeGas": 991552.96,
"increaseSpeed": 11.5,
"limit": 3000000,
"pledgedInfo": [
{
"pledger": "alice",
"amount": 1000
}
]
},
--snip--
"frozenBalances": [],
--snip--
}
{
"name": "alice",
"balance": 10000,
"gasInfo": {
"currentTotal": 101129287.87,
"transferableGas": 0,
"pledgeGas": 101129287.87,
"increaseSpeed": 1161.5,
"limit": 303000000,
"pledgedInfo": []
},
--snip--
"frozenBalances": [],
--snip--
}

3.2 GASをアンプレッジする

IOSTをアンプレッジして、トークンを戻すこともできます。成功すると、凍結状態になり、3日後に使用可能になります。

iwallet sys gas-unpledge <アンプレッジ量> --account <アンプレッジするアカウント> --gas_user <付与されていたアカウント> --chain_id <チェーンID>
  • gas-unpledge は、unpledgeと省略可能です。
  • <プレッジ量> — プレッジするIOSTの量。
  • <プレッジするアカウント> — IOSTをプレッジするアカウントです。
  • [オプション] <付与されていたアカウント> — アンプレッジする対象のアカウントです。省略するとアンプレッジ者自身になります。
  • [オプション] — chain_id<チェーンID> — ブロックチェーンのチェーンID(デフォルト:1024)

alice アカウントで、自分向けに 100 IOST アンプレッジしてみます。

$ docker exec -t iserver iwallet sys unpledge 100 --account alice --gas_user alice --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655894758289512595",
"expiration": "1655894848289512595",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "gas.iost",
"actionName": "unpledge",
"data": "[\"alice\",\"alice\",\"100\"]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "alice",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "hQ4SE3GZh7DHqXu3IrZ+11Th4Hu3jVVICeVMcAfOVyCm0aCDA8LD7rdss/9thOwEydc842kwbkN2VcTHzdYkAQ==",
"publicKey": "oE6fFEh5U8zbNgG3X7E/5cRQHMBVrTgVB8Ige+4E5f4="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: EbWevjB4enFQ8hyuPwMi1tsv7Lbf8ZGW5kxZhri2G12T
Checking transaction receipt...
Transaction receipt:
{
"txHash": "EbWevjB4enFQ8hyuPwMi1tsv7Lbf8ZGW5kxZhri2G12T",
"gasUsage": 3392,
"ramUsage": {},
"statusCode": "RUNTIME_ERROR",
"message": "running action Action{Contract: gas.iost, ActionName: unpledge, Data: [\"alice\",\"alice\",\"100\"]}\n error: alice did not pledge for alice",
"returns": [],
"receipts": []
}
Transaction executed err
ERROR: running action Action{Contract: gas.iost, ActionName: unpledge, Data: ["alice","alice","100"]}
error: alice did not pledge for alice

alice は alice のためにプレッジしていないので、当然エラーになります

では、bobby アカウントで、自分(bobby)向けに 100 IOST アンプレッジしてみます。

$ docker exec -t iserver iwallet sys unpledge 100 --account bobby --gas_user alice --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655895345450378172",
"expiration": "1655895435450378172",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "gas.iost",
"actionName": "unpledge",
"data": "[\"bobby\",\"alice\",\"100\"]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "bobby",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "lTq+Z+L0UvbB0vvz5K7c8Z5Pt9gAqbY/y7Kz1xcwgmI+vtdrbBCZm7cNIsAoNrnEaFEidfmC8YhKBuzXG0u6AQ==",
"publicKey": "JYarqhc6j0vzY9oxdPJ5wvbSe8vtoUjZ7QwW+DzY9JA="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: 27ukV5JQPnNTXqZ1vmn7dXDWgGedeRXB5XYoJ2FnLaVJ
Checking transaction receipt...
Transaction receipt:
{
"txHash": "27ukV5JQPnNTXqZ1vmn7dXDWgGedeRXB5XYoJ2FnLaVJ",
"gasUsage": 12432,
"ramUsage": {
"bobby": "85"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[]"
],
"receipts": [
{
"funcName": "token.iost/transferFreeze",
"content": "[\"iost\",\"gas.iost\",\"bobby\",\"100\",1656154545502098297,\"\"]"
},
{
"funcName": "gas.iost/unpledge",
"content": "[\"bobby\",\"alice\",\"100\"]"
}
]
}
SUCCESS! Transaction has been irreversible

今度は正常にアンプレッジできました。GASが不足する場合は、少し待つか admin アカウントで bibby にプレッジしてください。

{
"name": "bobby",
"balance": 9000,
"gasInfo": {
"currentTotal": 994317.04,
"transferableGas": 0,
"pledgeGas": 994317.04,
"increaseSpeed": 11.5,
"limit": 3000000,
"pledgedInfo": [
{
"pledger": "alice",
"amount": 900
}
]
},
--snip--
"frozenBalances": [
{
"amount": 100,
"time": "1656147138008614550"
}
],
--snip--
}
{
"name": "alice",
"balance": 10000,
"gasInfo": {
"currentTotal": 101776371.58,
"transferableGas": 0,
"pledgeGas": 101776371.58,
"increaseSpeed": 1046.5,
"limit": 273000000,
"pledgedInfo": []
},
--snip--
"frozenBalances": [],
--snip--
}

実行後の各アカウントの状態は次のようになります。bobby の alice へのプレッジが 100 減って 900 になっています。alice の limit も 30,000,000 減って、273,000,000 になっています。戻された 100 IOST は、frozenBalnces として凍結されています。

{
"name": "bobby",
"balance": 9000,
"gasInfo": {
"currentTotal": 989252.45,
"transferableGas": 0,
"pledgeGas": 989252.45,
"increaseSpeed": 11.5,
"limit": 3000000,
"pledgedInfo": [
{
"pledger": "alice",
"amount": 900
}
]
},
"ramInfo": {
"available": "939",
"used": "85",
"total": "1024"
},
--snip--
"frozenBalances": [
{
"amount": 100,
"time": "1656151838502718252"
}
],
"voteInfos": []
}
{
"name": "alice",
"balance": 10000,
"gasInfo": {
"currentTotal": 102119438.05,
"transferableGas": 0,
"pledgeGas": 102119438.05,
"increaseSpeed": 1046.5,
"limit": 273000000,
"pledgedInfo": []
},
"ramInfo": {
"available": "1024",
"used": "0",
"total": "1024"
},
--snip--
"frozenBalances": [],
"voteInfos": []
}

次のテストのために。bobby と alice に 1000 IOST プレッジしておきます。

$ docker exec -t iserver iwallet sys pledge 1000 --account bobby --chain_id 1020

結果としては、次のようになります。

{
"name": "bobby",
"balance": 8000,
"gasInfo": {
"currentTotal": 101006144.59,
"transferableGas": 0,
"pledgeGas": 101006144.59,
"increaseSpeed": 1161.5,
"limit": 303000000,
"pledgedInfo": [
{
"pledger": "alice",
"amount": 900
},
{
"pledger": "bobby",
"amount": 1000
}
]
},
"ramInfo": {
"available": "939",
"used": "85",
"total": "1024"
},
--snip--
"frozenBalances": [
{
"amount": 100,
"time": "1656154545502098297"
}
],
"voteInfos": []
}
{
"name": "alice",
"balance": 9000,
"gasInfo": {
"currentTotal": 202280820.76,
"transferableGas": 0,
"pledgeGas": 202280820.76,
"increaseSpeed": 2196.5,
"limit": 573000000,
"pledgedInfo": [
{
"pledger": "alice",
"amount": 1000
}
]
},
"ramInfo": {
"available": "1024",
"used": "0",
"total": "1024"
},
--snip--
"frozenBalances": [],
"voteInfos": []
}

4. RAMを扱う

RAMはスマートコントラクトやデータなどを保存するためのストレージの領域です。スマートコントラクトを利用する場合は、適切な量を購入する必要があります。

4.1 RAMを購入する

自分自身が使うためだけではなく、他の人が使うために購入して付与することもできます。購入にはIOSTトークンが必要になります。RAMの価格は、その時のRAMの需給によって変動します。

iwallet sys ram-buy <購入量> --account <購入者アカウント> --ram_receiver <付与されるアカウント> --chain_id <チェーンID>
  • ram-buyは、buyと省略可能です。
  • <購入量> — 購入するRAMの量(バイト)。
  • <購入者アカウント> — RAMを購入するアカウントです。
  • [オプション] <付与されるアカウント> — RAMが付与されるアカウントです。省略すると購入者自身になります。
  • [オプション] — chain_id<チェーンID> — ブロックチェーンのチェーンID(デフォルト:1024)

まず、bobby が alice のために 1,000 バイトのRAMを購入します。

$ docker exec -t iserver iwallet sys buy 1000 --account bobby --ram_receiver alice --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655895864733451134",
"expiration": "1655895954733451134",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "ram.iost",
"actionName": "buy",
"data": "[\"bobby\",\"alice\",1000]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "bobby",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "SxJNYoU49pAycgldh/VStfPTkzqi2nUwolM7AWRNuGlSH4FSGoPMkPC/WzeeoIWFCxo0kdWhRaAiXfN25+7VBA==",
"publicKey": "JYarqhc6j0vzY9oxdPJ5wvbSe8vtoUjZ7QwW+DzY9JA="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: BoRSEsLaHr9uwaZh1yHXKkxGX1UuyYmLXeU1mYck4Myg
Checking transaction receipt...
Transaction receipt:
{
"txHash": "BoRSEsLaHr9uwaZh1yHXKkxGX1UuyYmLXeU1mYck4Myg",
"gasUsage": 65213,
"ramUsage": {
"token.iost": "10"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[\"2.91\"]"
],
"receipts": [
{
"funcName": "token.iost/issue",
"content": "[\"ram\",\"ram.iost\",\"3922344\"]"
},
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"bobby\",\"ram.iost\",\"2.91\",\"\"]"
},
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"ram.iost\",\"deadaddr\",\"0.06\",\"\"]"
},
{
"funcName": "token.iost/transfer",
"content": "[\"ram\",\"ram.iost\",\"alice\",\"1000\",\"\"]"
}
]
}
SUCCESS! Transaction has been irreversible

結果として、alice のRAMが 1,024バイト増えて、2,024 バイトになっています。購入費用は、2.91 IOST で、そのうち2%の0.06 IOST が手数料です。残高(balance)も8,000 −2.91=7997.09 IOST になっているのが確認できます。

{
"name": "bobby",
"balance": 7997.09,
--snip--
"ramInfo": {
"available": "939",
"used": "85",
"total": "1024"
},
--snip--
}
{
"name": "alice",
"balance": 9000,
--snip--
"ramInfo": {
"available": "2024",
"used": "0",
"total": "2024"
},
--snip--
}

4.2 RAMを貸し出す

iwallet sys ram-transfer <転送先アカウント> <転送量> --account <転送元アカウント> --chain_id <チェーンID>
  • ram-transferは、ram-trans または rtransと省略可能です。
  • <転送先アカウント> — RAMが転送されるアカウントです。
  • <転送元アカウント> — RAMを転送するアカウントです。
  • <転送量> — 転送するRAMの量(バイト)。
  • [オプション] — chain_id<チェーンID> — ブロックチェーンのチェーンID(デフォルト:1024)

まず、alice が最初に付与された 1,024 バイトの RAM を bobby へ貸し出します。

$ docker exec -t iserver iwallet sys ram-trans bobby 1024 --account alice --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655896021440218721",
"expiration": "1655896111440218721",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "ram.iost",
"actionName": "lend",
"data": "[\"alice\",\"bobby\",1024]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "alice",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "ki7wXdPnquiVVdsm7/+GbYxNsqVxSJM/GwEsCtw0sEcOjFMlbdC4ocr3Woeq2dpW1fTfn4PsQUvy+VjmSogtBg==",
"publicKey": "oE6fFEh5U8zbNgG3X7E/5cRQHMBVrTgVB8Ige+4E5f4="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: Ek32v7hhtcgV7Q8pEj2yqP7aqs74xNQdXWynpzbWqMgU
Checking transaction receipt...
Transaction receipt:
{
"txHash": "Ek32v7hhtcgV7Q8pEj2yqP7aqs74xNQdXWynpzbWqMgU",
"gasUsage": 41719,
"ramUsage": {
"token.iost": "10"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[\"\"]"
],
"receipts": [
{
"funcName": "token.iost/transfer",
"content": "[\"ram\",\"alice\",\"bobby\",\"1024\",\"\"]"
}
]
}
SUCCESS! Transaction has been irreversible

転送後のRAM情報は次のように確認できます。bobby の RAM は939+1,024=1,963、alice の RAM は 2,024−1,024=1,000 になります。

{
"name": "bobby",
"balance": 7997.09,
--snip--
"ramInfo": {
"available": "1963",
"used": "85",
"total": "2048"
},
--snip--
}
{
"name": "alice",
"balance": 9000,
--snip--
"ramInfo": {
"available": "1000",
"used": "0",
"total": "1000"
},
--snip--
}

次に、alice の残りの RAM 1,000 バイトを bobby に貸し出します。

$ docker exec -t iserver iwallet sys ram-trans bobby 1000 --account alice --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655896695588552338",
"expiration": "1655896785588552338",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "ram.iost",
"actionName": "lend",
"data": "[\"alice\",\"bobby\",1000]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "alice",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "Dw+FMH7jKEBxZQqkfyGGJPUuRNQDcR2UhI4Kx1lCJrUT90/kJ8W8GySHvjjYPfXSNoWuklEMvRn47duWT+FOBA==",
"publicKey": "oE6fFEh5U8zbNgG3X7E/5cRQHMBVrTgVB8Ige+4E5f4="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: 9mJEwnVv6Bx5BDtZGBnCuSxc9f7GDqHjWZTFw45ARmj5
Checking transaction receipt...
Transaction receipt:
{
"txHash": "9mJEwnVv6Bx5BDtZGBnCuSxc9f7GDqHjWZTFw45ARmj5",
"gasUsage": 41701,
"ramUsage": {
"ram.iost": "-6",
"token.iost": "10"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[\"\"]"
],
"receipts": [
{
"funcName": "token.iost/transfer",
"content": "[\"ram\",\"alice\",\"bobby\",\"1000\",\"\"]"
}
]
}
SUCCESS! Transaction has been irreversible

転送後のRAM情報は次のように確認できます。bobby の RAM は2,048+1,000=3,048、alice の RAM は 1,000−1,000=0 になります。

{
"name": "bobby",
"balance": 7997.09,
--snip--
"ramInfo": {
"available": "2963",
"used": "85",
"total": "3048"
},
--snip--
}
{
"name": "alice",
"balance": 9000,
--snip--
"ramInfo": {
"available": "0",
"used": "0",
"total": "0"
},
--snip--
}

逆に、bobby から alice へ1,000 バイト貸し出します。

$ docker exec -t iserver iwallet sys ram-trans alice 1000 --account bobby --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655897083765122504",
"expiration": "1655897173765122504",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "ram.iost",
"actionName": "lend",
"data": "[\"bobby\",\"alice\",1000]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "bobby",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "WsRptrZAmu0QfmC/r5OM3yTLaffIu/y8ssOMqe+Jr9tPZto1FemwcGbS+yU2kKBdnJPCB9F1oXUvdFoiFs2CBw==",
"publicKey": "JYarqhc6j0vzY9oxdPJ5wvbSe8vtoUjZ7QwW+DzY9JA="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: BPrLiwBHm9jWHCXvs26EqVNcsZo2wLKJ7Zve7h3Z4GfP
Checking transaction receipt...
Transaction receipt:
{
"txHash": "BPrLiwBHm9jWHCXvs26EqVNcsZo2wLKJ7Zve7h3Z4GfP",
"gasUsage": 41704,
"ramUsage": {
"ram.iost": "1",
"token.iost": "10"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[\"\"]"
],
"receipts": [
{
"funcName": "token.iost/transfer",
"content": "[\"ram\",\"bobby\",\"alice\",\"1000\",\"\"]"
}
]
}
SUCCESS! Transaction has been irreversible

結果は次のようになります。

{
"name": "bobby",
"balance": 7997.09,
--snip--
"ramInfo": {
"available": "1963",
"used": "85",
"total": "2048"
},
--snip--
}
{
"name": "alice",
"balance": 9000,
--snip--
"ramInfo": {
"available": "1000",
"used": "0",
"total": "1000"
},
--snip--
}

bobby の残りの 2,048 バイトをすべて alice に転送します。

$ docker exec -t iserver iwallet sys ram-trans alice 2048 --account bobby --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655897221264005054",
"expiration": "1655897311264005054",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "ram.iost",
"actionName": "lend",
"data": "[\"bobby\",\"alice\",2048]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "bobby",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "NRn8ac3fixJTDVnXasNE9F8bxEQ21CFtIaCKFnSWdyIyh+rDtRd7R/H+80hj2NSv2bqqaF+qVKblPo/ygBjYDg==",
"publicKey": "JYarqhc6j0vzY9oxdPJ5wvbSe8vtoUjZ7QwW+DzY9JA="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: AQct8FTNApVBZZXvgPEMVSXnXXzaugrTFMxzSkDv78Xn
Checking transaction receipt...
Transaction receipt:
{
"txHash": "AQct8FTNApVBZZXvgPEMVSXnXXzaugrTFMxzSkDv78Xn",
"gasUsage": 34266,
"ramUsage": {},
"statusCode": "RUNTIME_ERROR",
"message": "running action Action{Contract: ram.iost, ActionName: lend, Data: [\"bobby\",\"alice\",2048]}\n error: Uncaught exception: Error: self ram amount 24, not enough for lend\nat _default_name.js:270:61\n _IOSTInstruction_counter.incr(85.89999999999998);throw new Error(_IOSTBinaryOp(_IOSTBinaryOp('self ram amount ', this._getAccountSelfRAM(from), '+'), ', not enough for lend', '+'));\n ^\nStack tree: \nError: self ram amount 24, not enough for lend",
"returns": [],
"receipts": []
}
Transaction executed err
ERROR: running action Action{Contract: ram.iost, ActionName: lend, Data: ["bobby","alice",2048]}
error: Uncaught exception: Error: self ram amount 24, not enough for lend
at _default_name.js:270:61
_IOSTInstruction_counter.incr(85.89999999999998);throw new Error(_IOSTBinaryOp(_IOSTBinaryOp('self ram amount ', this._getAccountSelfRAM(from), '+'), ', not enough for lend', '+'));
^
Stack tree:
Error: self ram amount 24, not enough for lend

貸し出し可能なRAM が 24 バイトしかなく、転送できないというエラーになります。先程 1,000 バイト 転送したので、合わせて 1,024 バイトだけは貸し出しができるというになります。これは、最初に受け取った 1,024 バイトは転送可能で、転送で受け取った RAM は再度転送できないということになります。

4.3 RAMを売却する

iwallet sys ram-sell <売却量> --account <売却するアカウント>  --token_receiver <受取アカウント> --chain_id <チェーンID>
  • ram-sellは、sellと省略可能です。
  • <売却するアカウント> — RAM を売却するアカウントです。
  • <売却量> — 転送する RAM の量(バイト)。
  • [オプション] <受取アカウント> — 売却で得られた IOST トークンを受け取るアカウントです。省略すると売却者自身になります。
  • [オプション] — chain_id<チェーンID> — ブロックチェーンのチェーンID(デフォルト:1024)
$ docker exec -t iserver iwallet sys sell 1000 --token_receiver bobby --account bobby --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655898876107821500",
"expiration": "1655898966107821500",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "ram.iost",
"actionName": "sell",
"data": "[\"bobby\",\"bobby\",1000]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "bobby",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "P40HAowLfv5yy3MM8/ZajVAegTrdNEjHjHmMlZ+yLiydtgVrZZVHg/nLib7zZhH77WVqF4z/V7n+0BQiVGjJDA==",
"publicKey": "JYarqhc6j0vzY9oxdPJ5wvbSe8vtoUjZ7QwW+DzY9JA="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: HMR4MUwfdrrrRR3WvuT89sUK7AQUZpi2k1vEzFuoejW
Checking transaction receipt...
Transaction receipt:
{
"txHash": "HMR4MUwfdrrrRR3WvuT89sUK7AQUZpi2k1vEzFuoejW",
"gasUsage": 34266,
"ramUsage": {},
"statusCode": "RUNTIME_ERROR",
"message": "running action Action{Contract: ram.iost, ActionName: sell, Data: [\"bobby\",\"bobby\",1000]}\n error: Uncaught exception: Error: self ram amount 24, not enough for sell\nat _default_name.js:239:61\n _IOSTInstruction_counter.incr(85.89999999999998);throw new Error(_IOSTBinaryOp(_IOSTBinaryOp('self ram amount ', this._getAccountSelfRAM(account), '+'), ', not enough for sell', '+'));\n ^\nStack tree: \nError: self ram amount 24, not enough for sell",
"returns": [],
"receipts": []
}
Transaction executed err
ERROR: running action Action{Contract: ram.iost, ActionName: sell, Data: ["bobby","bobby",1000]}
error: Uncaught exception: Error: self ram amount 24, not enough for sell
at _default_name.js:239:61
_IOSTInstruction_counter.incr(85.89999999999998);throw new Error(_IOSTBinaryOp(_IOSTBinaryOp('self ram amount ', this._getAccountSelfRAM(account), '+'), ', not enough for sell', '+'));
^
Stack tree:
Error: self ram amount 24, not enough for sell

転送と同じように、売却できる RAM が24 バイトしかというエラーになります。

その 24 バイトを売却してみます。

$ docker exec -t iserver iwallet sys sell 24 --token_receiver bobby --account bobby --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655899347199084218",
"expiration": "1655899437199084218",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "ram.iost",
"actionName": "sell",
"data": "[\"bobby\",\"bobby\",24]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "bobby",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "lcVS2gimdd0Ds6QA3bC1mlWyY1tC4tlE0Mfpw5QQkXLK7hs0DWJY6qrApn2IjJ883T12M7KIm+k1UoMji4mlCA==",
"publicKey": "JYarqhc6j0vzY9oxdPJ5wvbSe8vtoUjZ7QwW+DzY9JA="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: EqxJmsZUhMYwcEKfWVp17rUmiAfx59r7JLyfBLpVXTPW
Checking transaction receipt...
Transaction receipt:
{
"txHash": "EqxJmsZUhMYwcEKfWVp17rUmiAfx59r7JLyfBLpVXTPW",
"gasUsage": 53128,
"ramUsage": {
"ram.iost": "-1",
"token.iost": "10"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[\"0.07\"]"
],
"receipts": [
{
"funcName": "token.iost/transfer",
"content": "[\"ram\",\"bobby\",\"ram.iost\",\"24\",\"\"]"
},
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"ram.iost\",\"bobby\",\"0.07\",\"\"]"
}
]
}
SUCCESS! Transaction has been irreversible

結果として、24 バイトの RAM が 0.07 IOST で売却され、IOST トークンは、7997.09+0.07=7997.16 になります。

{
"name": "bobby",
"balance": 7997.16,
--snip--
"ramInfo": {
"available": "1939",
"used": "85",
"total": "2024"
},
--snip--
}

また、alice でも同様に売却を試してみます。

$ docker exec -t iserver iwallet sys sell 1000 --token_receiver alice --account alice --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655898600109193261",
"expiration": "1655898690109193261",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "ram.iost",
"actionName": "sell",
"data": "[\"alice\",\"alice\",1000]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "alice",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "thlhrFrEsrsuJJeC4zlyhlnFCojGQo8AUSxYiv1hLFAXWFhmnn+oNbnKblkh9uQWZ64OOjolpGoFcGI6qcNoDg==",
"publicKey": "oE6fFEh5U8zbNgG3X7E/5cRQHMBVrTgVB8Ige+4E5f4="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: 8rXUVN6SxGVkQWQyoheVvg7bHktMeHdnuxe83v9GcMP5
Checking transaction receipt...
Transaction receipt:
{
"txHash": "8rXUVN6SxGVkQWQyoheVvg7bHktMeHdnuxe83v9GcMP5",
"gasUsage": 34258,
"ramUsage": {},
"statusCode": "RUNTIME_ERROR",
"message": "running action Action{Contract: ram.iost, ActionName: sell, Data: [\"alice\",\"alice\",1000]}\n error: Uncaught exception: Error: self ram amount 0, not enough for sell\nat _default_name.js:239:61\n _IOSTInstruction_counter.incr(85.89999999999998);throw new Error(_IOSTBinaryOp(_IOSTBinaryOp('self ram amount ', this._getAccountSelfRAM(account), '+'), ', not enough for sell', '+'));\n ^\nStack tree: \nError: self ram amount 0, not enough for sell",
"returns": [],
"receipts": []
}
Transaction executed err
ERROR: running action Action{Contract: ram.iost, ActionName: sell, Data: ["alice","alice",1000]}
error: Uncaught exception: Error: self ram amount 0, not enough for sell
at _default_name.js:239:61
_IOSTInstruction_counter.incr(85.89999999999998);throw new Error(_IOSTBinaryOp(_IOSTBinaryOp('self ram amount ', this._getAccountSelfRAM(account), '+'), ', not enough for sell', '+'));
^
Stack tree:
Error: self ram amount 0, not enough for sell

売却できる RAM が 0 で、不足しているというエラーになっています。alice は自分で購入していないので、売却はできません。

確認のために、再度 bobby で alice のために 1,000バイトの RAM を購入してみます。

$ docker exec -t iserver iwallet sys buy 1000 --account bobby --ram_receiver alice --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655900069004376219",
"expiration": "1655900159004376219",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "ram.iost",
"actionName": "buy",
"data": "[\"bobby\",\"alice\",1000]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "bobby",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "JJuFs8+mvJa3exH0v/GZbWh+idYUO8GhxC2xHfbaB6HE2WWdez3G57YCjNrVbZMrLrUDYSFKAtTe7vrZdcLpAw==",
"publicKey": "JYarqhc6j0vzY9oxdPJ5wvbSe8vtoUjZ7QwW+DzY9JA="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: FnNWiYGGyyrfpiX8ZtQMbRxuDZRarfSBc9Pjc4jYoC4r
Checking transaction receipt...
Transaction receipt:
{
"txHash": "FnNWiYGGyyrfpiX8ZtQMbRxuDZRarfSBc9Pjc4jYoC4r",
"gasUsage": 65204,
"ramUsage": {
"ram.iost": "3",
"token.iost": "10"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[\"2.91\"]"
],
"receipts": [
{
"funcName": "token.iost/issue",
"content": "[\"ram\",\"ram.iost\",\"9152136\"]"
},
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"bobby\",\"ram.iost\",\"2.91\",\"\"]"
},
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"ram.iost\",\"deadaddr\",\"0.06\",\"\"]"
},
{
"funcName": "token.iost/transfer",
"content": "[\"ram\",\"ram.iost\",\"alice\",\"1000\",\"\"]"
}
]
}
SUCCESS! Transaction has been irreversible

bobby の balance は 7997.16–2.91=7994.25 で、alice の RAM は 1000+1000 =2000 になっています。

{
"name": "bobby",
"balance": 7994.25,
--snip--
"ramInfo": {
"available": "1939",
"used": "85",
"total": "2024"
},
--snip--
}
{
"name": "alice",
"balance": 9000,
--snip--
"ramInfo": {
"available": "2000",
"used": "0",
"total": "2000"
},
--snip--
}

alice で 借りた1,000 バイトを bobby に戻すように売却してみます。

$ docker exec -t iserver iwallet sys sell 1000 --token_receiver bobby --account alice --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655900152541765674",
"expiration": "1655900242541765674",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "ram.iost",
"actionName": "sell",
"data": "[\"alice\",\"bobby\",1000]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "alice",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "QWLiMopnRY9CI9iclebwfVduPHV18GkadCDc7T0hK8et67+rxZh95eXn1Jjhpx3SLevS7Jq4a38M5tNbplP4Dg==",
"publicKey": "oE6fFEh5U8zbNgG3X7E/5cRQHMBVrTgVB8Ige+4E5f4="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: 5vZ21hpU6cLiSaiDaw6DB3PUKGiRi2RsW4PDEKe8VKG3
Checking transaction receipt...
Transaction receipt:
{
"txHash": "5vZ21hpU6cLiSaiDaw6DB3PUKGiRi2RsW4PDEKe8VKG3",
"gasUsage": 53172,
"ramUsage": {
"ram.iost": "-3"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[\"2.85\"]"
],
"receipts": [
{
"funcName": "token.iost/transfer",
"content": "[\"ram\",\"alice\",\"ram.iost\",\"1000\",\"\"]"
},
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"ram.iost\",\"bobby\",\"2.85\",\"\"]"
}
]
}
SUCCESS! Transaction has been irreversible

無事に1,000 バイトの RAM が 2.85 IOST で売却できました。bobby の balance は 7,994.25+2.85=7,997.1 で、alice の RAM は 2,000 ー1,000 =1,000 になります。

{
"name": "bobby",
"balance": 7997.1,
--snip--
"ramInfo": {
"available": "1939",
"used": "85",
"total": "2024"
},
--snip--
}
{
"name": "alice",
"balance": 9000,
--snip--
"ramInfo": {
"available": "1000",
"used": "0",
"total": "1000"
},
--snip--
}

もう一度、同じように bobby で alice に 1,000 バイトのRAM を購入してみます。

$ docker exec -t iserver iwallet sys buy 1000 --account bobby --ram_receiver alice --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655901137073396713",
"expiration": "1655901227073396713",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "ram.iost",
"actionName": "buy",
"data": "[\"bobby\",\"alice\",1000]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "bobby",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "s30LAr2uwwIdWwidTurcH0BjiP+HYjAHiRF2udvsdnNOjnrPnP5b7DPFS1I0e0lTbxe2zzbFY91GXk61VxiuCA==",
"publicKey": "JYarqhc6j0vzY9oxdPJ5wvbSe8vtoUjZ7QwW+DzY9JA="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: Fkc4R9D98WFhs1ZSXQN7wUpE2uZW6EzHpDd2uymYfJSg
Checking transaction receipt...
Transaction receipt:
{
"txHash": "Fkc4R9D98WFhs1ZSXQN7wUpE2uZW6EzHpDd2uymYfJSg",
"gasUsage": 65204,
"ramUsage": {
"ram.iost": "3",
"token.iost": "10"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[\"2.91\"]"
],
"receipts": [
{
"funcName": "token.iost/issue",
"content": "[\"ram\",\"ram.iost\",\"2614896\"]"
},
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"bobby\",\"ram.iost\",\"2.91\",\"\"]"
},
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"ram.iost\",\"deadaddr\",\"0.06\",\"\"]"
},
{
"funcName": "token.iost/transfer",
"content": "[\"ram\",\"ram.iost\",\"alice\",\"1000\",\"\"]"
}
]
}
SUCCESS! Transaction has been irreversible

結果次のようになります。

{
"name": "bobby",
"balance": 7994.19,
--snip--
"ramInfo": {
"available": "1939",
"used": "85",
"total": "2024"
},
--snip--
}
{
"name": "alice",
"balance": 9000,
--snip--
"ramInfo": {
"available": "2000",
"used": "0",
"total": "2000"
},
--snip--
}

今度は、alice が RAM を売却して、自分自身で受け取ってみます。

$ docker exec -t iserver iwallet sys sell 1000 --token_receiver alice --account alice --chain_id 1020
Sending transaction...
Transaction:
{
"time": "1655901538317873343",
"expiration": "1655901628317873343",
"gasRatio": 1,
"gasLimit": 1000000,
"delay": "0",
"chainId": 1020,
"actions": [
{
"contract": "ram.iost",
"actionName": "sell",
"data": "[\"alice\",\"alice\",1000]"
}
],
"amountLimit": [
{
"token": "*",
"value": "unlimited"
}
],
"signers": [],
"signatures": [],
"publisher": "alice",
"publisherSigs": [
{
"algorithm": "ED25519",
"signature": "kdZl2XZJBOR6CZagD9zt57FrjRIfH0x2/A1rckwzalaW3IufPoXs+9lvuXygv2CWSIPRMBi//RcaSmj0H9kZBw==",
"publicKey": "oE6fFEh5U8zbNgG3X7E/5cRQHMBVrTgVB8Ige+4E5f4="
}
]
}
Connecting to server localhost:30002 ...
Transaction has been sent.
The transaction hash is: EkyCQTTdxuxcAuskod8vfkzM3XtzjGcdLNcZ99TnNCj5
Checking transaction receipt...
Transaction receipt:
{
"txHash": "EkyCQTTdxuxcAuskod8vfkzM3XtzjGcdLNcZ99TnNCj5",
"gasUsage": 52852,
"ramUsage": {
"ram.iost": "-3"
},
"statusCode": "SUCCESS",
"message": "",
"returns": [
"[\"2.85\"]"
],
"receipts": [
{
"funcName": "token.iost/transfer",
"content": "[\"ram\",\"alice\",\"ram.iost\",\"1000\",\"\"]"
},
{
"funcName": "token.iost/transfer",
"content": "[\"iost\",\"ram.iost\",\"alice\",\"2.85\",\"\"]"
}
]
}
SUCCESS! Transaction has been irreversible

これも、無事に1,000 バイトの RAM が 2.85 IOST で売却できました。alice の balance は 9000+2.85=9,002.85 で、alice の RAM は 2,000 ー1,000 =1,000 になります。

{
"name": "alice",
"balance": 9002.85,
--snip--
"ramInfo": {
"available": "1000",
"used": "0",
"total": "1000"
},
--snip--
}

このように、付与されたRAMでも受け取った側で自由に転送や売却が売却できます。また、転送すると転送や売却ができなくなってしまいます。つまり、無駄になったRAMがあっても回収できないということです。システムを開発する場合は、RAMが必要になりますが、その点をよく考えて設計するようにする必要があります。

関連記事

--

--