eosio.system スマートコントラクト入門 (2) システムリソース

EOSIO ベースのブロックチェーンは、RAM、CPU、NET の 3 つのシステム リソースを使用します。ブロックチェーン アカウントには、ブロックチェーン上にデプロイされたスマート コントラクトと対話するために十分なシステム リソースが必要です。このチュートリアルでは、eosio.system スマート コントラクトのシステム リソース モジュールを詳しく紹介します。RAM の売買、CPU のプレッジとプレッジのキャンセル、プレッジとプレッジのキャンセルの方法に精通している EOS スマート コントラクトのジュニア開発者に適しています。 NETなどの

01

概要

(1) RAMリソースの紹介

1. RAM はブロックチェーンがデータを保存するメモリ リソースです。

スマート コントラクトがブロックチェーン上にデータを保存する方法は、データベースでの操作と似ており、マルチインデックス テーブルまたはシングルトンを使用してブロックチェーンの RAM に保存できます。EOSIOベースのブロックチェーンは記憶媒体としてRAMを使用しており、他のブロックチェーンでは達成できない高いパフォーマンスを備えているため、ブロックチェーンデータへのアクセスが非常に高速です。

2. RAM は限られたリソースであり、ブロックチェーンには異なる RAM ポリシーとルールが存在する可能性があります

たとえば、パブリック EOS ブロックチェーンは 64 GB の RAM で開始されましたが、その後、ブロック生産者はメモリをブロックあたり 1 KB に増やすことを決定し、ブロックチェーン アプリケーションの需要に応じて価格が変動しないように RAM の供給を継続的に増加させました。 . 増加し、高くなりすぎます。

3. RAM は、ブロックチェーンに送信される多くの操作を実行するために使用されます

たとえば、新しいアカウント操作を作成するには、新しいアカウントの情報をブロックチェーン メモリに保存する必要があります。同様に、アカウントが新しいタイプのトークンを受け取ると、新しいレコードがブロックチェーン メモリに作成される必要があります。レコードは保存されます。 受け取った新しいタイプのトークンの残高とブロックチェーン上のこのストレージスペースは、トークンを転送するアカウントまたは新しいタイプのトークンを受け取るアカウントによって購入する必要があります。

4. スマート コントラクトが割り当てられた RAM をすべて消費すると、追加情報を保存できなくなります

スマート コントラクトが割り当てられた RAM をすべて消費した場合、ブロックチェーン データベースへのデータの保存を続行するには、次の 2 つの条件のいずれかが満たされる必要があります: スマート コントラクトが占有されている RAM の一部を解放する; RAM がスマート コントラクト アカウントに割り当てられるRAMの購入プロセス。

(2) CPUとNETリソースの紹介

1. CPU はブロックチェーン アカウントに処理能力を提供します

アカウントが所有する CPU の量はマイクロ秒単位で測定され、cleos get account コマンド出力では CPU 帯域幅と呼ばれます。CPU 帯域幅は、コントラクトに送信された操作がブロックチェーンによって実行されるときに、アカウントが自由に使える処理時間を表します。ブロックチェーンはトランザクションの実行時に CPU を消費するため、トランザクションを完了するには十分な CPU を抵当に入れる必要があります。

2. NET はトランザクションにネットワーク帯域幅を提供します

アカウントが所有する NET の量はバイト単位で測定され、cleos get account コマンド出力ではネット帯域幅と呼ばれます。NET は空間単位のリソースであり、P2P 層の送信中にトランザクションによって消費されるネットワークのシェアを測定するために使用されます。NET はブロックチェーンがトランザクションを実行するときに消費されるため、トランザクションを完了するには十分な NET を抵当に入れる必要があります。

3. CPU および NET リソースは、プレッジ メカニズムを通じてアカウント所有者によって割り当てられます。

CPU と NET をステークすると、他のすべてのユーザーが同時に同じシステム リソースに対してステーキングしたトークンの合計量に比例して、システム リソースにアクセスできるようになります。これは、ステーキングされたトークンの制限内で、無料でトランザクションを実行できることを意味します。自由市場がどのように変化しても、約束されたトークンはリソースの割合を保証できます。アカウントが割り当てられたすべての CPU および NET リソースを消費する場合、この時点で 2 つのオプションがあります: ブロックチェーンが消費されたリソースを補充するのを待つか、プレッジ メカニズムを通じてさらにリソースを割り当てます。

4. ブロックチェーンは、消費された CPU と NET リソースを自動的に補充します。

トランザクションを実行する前に、ブロックチェーンはまずトランザクションを実行するアカウントが消費できるリソースの量を計算します。データが欠落している場合、計算では線形外挿による指数移動平均が使用され、現在の累積平均に (ウィンドウ内のブロック数 - 前回の更新以降のブロック数) / (ウィンドウ内のブロック数) が乗算されます。ウィンドウは 24 時間ウィンドウに設定されます。

02

環境整備

(1) 実行可能でアクセス可能なブロックチェーン

China Mobile Chain (EOS ベース) テスト環境のセットアップ:

https://mp.weixin.qq.com/s/NBNFk9Xk9FCukMVgl0tfHA

(2) ローカルウォレットが開かれ、ロックが解除されていることを確認してください

ウォレットの作成方法:

https://developers.eos.io/manuals/eos/latest/cleos/how-to-guides/how-to-create-a-wallet

(3) eosio.contracts の構築と展開が完了しました

eosio.contracts の構築方法:

https://developers.eos.io/manuals/eosio.contracts/latest/build-and-deploy

(4) トークンの作成、発行、譲渡が完了しました

トークンの作成、発行、転送方法:

https://developers.eos.io/manuals/eosio.contracts/latest/guides/how-to-create-issue-and-transfer-a-token

03

RAMの動作

(1) RAMの購入

次のコマンドを実行して、アカウント testaccount1 に 0.1 SYS 相当の RAM リソースを購入します。 ここで、eosio=RAM を支払うアカウント、testaccount1=RAM の購入を受け取るアカウント、0.1 SYS=RAM に支払ったトークンの数、-p eosio@active= 承認用に購入しましたアクセス許可 (この場合はアクティブなアクセス許可)。

cleos system buyram eosio testaccount1 "0.1 SYS" -p eosio@active

# 示例输出:
executed transaction: e669b474e985c4346fddcbd98344580d56683a3856874e529d6bff065615c155  128 bytes  466 us
#         eosio <= eosio::buyram                {"payer":"eosio","receiver":"testaccount1","quant":"0.1000 SYS"}
#   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"eosio.ram","quantity":"0.0995 SYS","memo":"buy ram"}
#   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"eosio.ramfee","quantity":"0.0005 SYS","memo":"ram fee"}
#         eosio <= eosio.token::transfer        {"from":"eosio","to":"eosio.ram","quantity":"0.0995 SYS","memo":"buy ram"}
#     eosio.ram <= eosio.token::transfer        {"from":"eosio","to":"eosio.ram","quantity":"0.0995 SYS","memo":"buy ram"}
#         eosio <= eosio.token::transfer        {"from":"eosio","to":"eosio.ramfee","quantity":"0.0005 SYS","memo":"ram fee"}
#  eosio.ramfee <= eosio.token::transfer        {"from":"eosio","to":"eosio.ramfee","quantity":"0.0005 SYS","memo":"ram fee"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

(2) RAMの販売

次のコマンドを実行して、testaccount1 アカウントの 1024 バイトの RAM リソースを販売します。ここで、testaccount1= RAM リソースを販売するアカウント、1024= 販売される RAM のバイト数、-p testaccount1@active= 販売を承認するために使用される権限、この場合、それはアクティブな権限です。

cleos system sellram testaccount1 1024 -p testaccount1@active

# 示例输出:
executed transaction: 9a4d3cc802a152cc26ce897571cf95b506cd56aa254becde5efc24f3304cd779  112 bytes  467 us
#         eosio <= eosio::sellram               {"account":"testaccount1","bytes":1024}
#   eosio.token <= eosio.token::transfer        {"from":"eosio.ram","to":"testaccount1","quantity":"0.0149 SYS","memo":"sell ram"}
#   eosio.token <= eosio.token::transfer        {"from":"testaccount1","to":"eosio.ramfee","quantity":"0.0001 SYS","memo":"sell ram fee"}
#     eosio.ram <= eosio.token::transfer        {"from":"eosio.ram","to":"testaccount1","quantity":"0.0149 SYS","memo":"sell ram"}
#  testaccount1 <= eosio.token::transfer        {"from":"eosio.ram","to":"testaccount1","quantity":"0.0149 SYS","memo":"sell ram"}
#  testaccount1 <= eosio.token::transfer        {"from":"testaccount1","to":"eosio.ramfee","quantity":"0.0001 SYS","memo":"sell ram fee"}
#  eosio.ramfee <= eosio.token::transfer        {"from":"testaccount1","to":"eosio.ramfee","quantity":"0.0001 SYS","memo":"sell ram fee"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

04

CPU動作

(1) CPUの誓約

次のコマンドを実行して、testaccount1 アカウントに 0.01 SYS の CPU リソースをプレッジします。ここで、eosio= プレッジされた CPU 帯域幅に対して 0.01 SYS を支払うアカウント、testaccount1= CPU 帯域幅をプレッジするアカウント、0 SYS= プレッジされた SYS トークンの量NET 帯域幅、0.01 SYS = ステーキング CPU 帯域幅に割り当てられた SYS トークンの量、-p eosio@active = ステーキングを承認する権限、この場合はアクティブな権限。

cleos system sellram testaccount1 1024 -p testaccount1@active

# 示例输出:
executed transaction: 9a4d3cc802a152cc26ce897571cf95b506cd56aa254becde5efc24f3304cd779  112 bytes  467 us
#         eosio <= eosio::sellram               {"account":"testaccount1","bytes":1024}
#   eosio.token <= eosio.token::transfer        {"from":"eosio.ram","to":"testaccount1","quantity":"0.0149 SYS","memo":"sell ram"}
#   eosio.token <= eosio.token::transfer        {"from":"testaccount1","to":"eosio.ramfee","quantity":"0.0001 SYS","memo":"sell ram fee"}
#     eosio.ram <= eosio.token::transfer        {"from":"eosio.ram","to":"testaccount1","quantity":"0.0149 SYS","memo":"sell ram"}
#  testaccount1 <= eosio.token::transfer        {"from":"eosio.ram","to":"testaccount1","quantity":"0.0149 SYS","memo":"sell ram"}
#  testaccount1 <= eosio.token::transfer        {"from":"testaccount1","to":"eosio.ramfee","quantity":"0.0001 SYS","memo":"sell ram fee"}
#  eosio.ramfee <= eosio.token::transfer        {"from":"testaccount1","to":"eosio.ramfee","quantity":"0.0001 SYS","memo":"sell ram fee"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

(2) CPUの質権を解除する

次のコマンドを実行して、testaccount1 アカウントの CPU リソースの 0.01 SYS のプレッジをキャンセルします。ここで、eosio= プレッジされた CPU 帯域幅に対して 0.01 SYS を支払ったアカウント、testaccount1= CPU 帯域幅をプレッジしたアカウント、0 SYS= SYS トークンの量誓約された NET 帯域幅に割り当てられ、0.01 SYS=ステーキング CPU 帯域幅に割り当てられた SYS トークンの量、-p eosio@active=アンステーキングを承認する権限、この場合はアクティブな権限。

cleos system undelegatebw eosio testaccount1 "0 SYS" "0.01 SYS" -p eosio@active

# 示例输出:
executed transaction: e7e7edb6c5556de933f9d663fea8b4a9cd56ece6ff2cebf056ddd0835efa6606  184 bytes  452 us
#         eosio <= eosio::undelegatebw          {"from":"eosio","receiver":"testaccount1","unstake_net_quantity":"0.0000 SYS","unstake_cpu_qu...
warning: transaction executed locally, but may not be confirmed by the network yet         ]

05

NET操作

(1) プレッジNET

次のコマンドを実行して、testaccount1 アカウントに 0.01 SYS の NET リソースをプレッジします。ここで、eosio= プレッジされた NET 帯域幅に対して 0.01 SYS を支払ったアカウント、testaccount1= NET 帯域幅をプレッジしたアカウント、0 SYS= プレッジされた SYS トークンの量NET 帯域幅、0.01 SYS = ステーキング CPU 帯域幅に割り当てられた SYS トークンの量、-p eosio@active = ステーキングを承認する権限、この場合はアクティブな権限。

cleos system delegatebw eosio testaccount1 "0.01 SYS" "0 SYS" -p eosio@active

# 示例输出:
executed transaction: d25c7deff42f3a420081b8b717820a78a01cf42fc173fe57d305e7ddaebebc12  144 bytes  422 us
#         eosio <= eosio::delegatebw            {"from":"eosio","receiver":"testaccount1","stake_net_quantity":"0.0100 SYS","stake_cpu_quantity":"0....
#   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"eosio.stake","quantity":"0.0100 SYS","memo":"stake bandwidth"}
#         eosio <= eosio.token::transfer        {"from":"eosio","to":"eosio.stake","quantity":"0.0100 SYS","memo":"stake bandwidth"}
#   eosio.stake <= eosio.token::transfer        {"from":"eosio","to":"eosio.stake","quantity":"0.0100 SYS","memo":"stake bandwidth"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

(2) NETの質権を解除する

次のコマンドを実行して、アカウント testaccount1 の NET リソースの 0.01 SYS のプレッジをキャンセルします。ここで、eosio= プレッジされた NET 帯域幅に対して 0.01 SYS を支払ったアカウント、testaccount1= NET 帯域幅をプレッジしたアカウント、0 SYS= 割り当てられた SYS トークンの量誓約された NET 帯域幅の場合、0.01 SYS = ステーキング CPU 帯域幅に割り当てられた SYS トークンの量、 -p eosio@active = アンステーキングを承認する権限、この場合はアクティブな権限。

cleos system undelegatebw eosio testaccount1 "0.01 SYS" "0 SYS" -p eosio@active

# 示例输出:
executed transaction: e7e7edb6c5556de933f9d663fea8b4a9cd56ece6ff2cebf056ddd0835efa6606  184 bytes  452 us
#         eosio <= eosio::undelegatebw          {"from":"eosio","receiver":"testaccount1","unstake_net_quantity":"0.01 SYS","unstake_cpu_qu...
warning: transaction executed locally, but may not be confirmed by the network yet         ]

06

よくある問題

(1) sellram メソッドの実行時にエラーが報告されます: eosio_assert_message アサーション失敗?

回答: 販売された RAM バイト数が少なすぎます。0.0001 SYS に対応する最小バイト数に達していないため、さらに多くのバイトを販売する必要があります。

(2) 保証された CPU および NET リソースのトークン単位と確認方法は何ですか?

回答: プレッジされた CPU および NET リソースのトークン単位は通常、システム契約によって定義される SYS であり、CPU および NET 使用量のトークン単位は cleos get account を通じて照会できます。

(3) EOS の 3 つのリソース (RAM、NET、CPU) について、数量の単位は何ですか? 残量の計算方法は何ですか?

回答: cleos get account によって残りのリソース情報をクエリできます。RAM リソースの単位はバイトで、RAM 残量の対応するフィールドは次のとおりです:quota - used; NET リソースの単位もバイトで、対応するフィールドは残りの NET 数量が利用可能です。CPU リソースの単位は us で、残りの CPU の数に対応するフィールドは利用可能です。

(4) 一度に十分な RAM、CPU、NET リソースを初期化することが推奨されないのはなぜですか?

回答: RAM はサーバーのメモリ リソースに相当し、過剰に割り当てられると他のサービスの動作に影響を与える可能性があります。10,000 コピーの DDC によって消費される RAM を計算することで、各 DDC に必要な RAM を見積もることができるため、ビジネス ニーズに応じて一定期間に 1 回再充電できます。CPU および NET リソースはプレッジされており、トランザクション完了後 24 時間以内に直線的に返されるため、1 日に必要な CPU および NET リソースをリチャージするのに十分です。

-終わり-

おすすめ

転載: blog.csdn.net/BSN_yanxishe/article/details/131375757