技術シリーズ#6: スマートコントラクトの経済学 — Vite v.s. EOS
Viteのスマートコントラクトのコスト
Viteでは、スマートコントラクトのコストは、CPU、メモリ、ネットワーク帯域幅、ストレージ容量などを含む使用されるリソースに依存し、リソースの消費はクォータから計測されます。クォータはVITEコインをステーキングすることで取得できるものです。 クォータはステーク期間中はスナップショットブロックごとに補充されます。 ステーキング量は、契約で使用される実際のリソースに比例します。 使用するリソースが多いほど、より多くのVITEコインをステーキングする必要があります。
注: ステーキングとは別に、Viteは無料でクォータを得るためにPoWパズルを解く方法もサポートしています。それについては後述します。
一般的に、コストは2つの部分に分けることができます:
— コントラクト作成コスト:スマートコントラクトを作成するには、コントラクトの開発者が10 VITEのデプロイメント手数料を支払う必要があります。この手数料はバーンされます。 その間、開発者のアカウントから少量のクォータが消費され、デプロイメントトランザクションがトリガーされます。
— コントラクト呼び出しコスト:Viteのスマートコントラクトで採用されている非同期アーキテクチャにより、リクエスト(契約のトリガー)とレスポンス(契約の実行)の両方のトランザクションでクォータが消費されます。 前者はユーザーのアカウントから割り当てを使用しますが、後者は通常、コントラクト開発者がコントラクトアカウントにステーキングすることでクォータを確保します。
EOSのスマートコントラクトのコスト
EOSコントラクトのコストは、RAM、CPU、NETの3つのリソースで計測されます。 RAMは、アカウント残高、公開鍵、ステーキングおよび投票エントリ、契約状態などを含むチェーンストレージです。例えば、通常のEOSアカウントを作成するには、関連情報を保存するために4KBのRAMが必要です。 スマートコントラクトの場合、RAMはコントラクトのコードと状態の格納に使用されます。 具体的には、契約状態はEOSのDBインターフェースを介して保存されたデータです。 コストのこの部分は、契約での指定方法に応じて、契約開発者またはユーザーのいずれかが負担できます。 RAMは流通市場で購入する必要があり、リソースの解放後に回復できます。 RAMの販売価格はBancor アルゴリズムに従います。
CPUとNETは、EOS上のCPUリソースとネットワーク帯域幅を表します。 どちらもEOSコインをステーキングすることで取得され、取得されるリソースの量は、現在のすべてのステーキングの合計量に対するアカウントのステーキングの割合に依存します。 CPUおよびNETリソースの量は、アカウントが実行できるCPUサイクル(マイクロ秒単位)、およびアカウントが現在のウィンドウで利用できるネットワーク容量のサイズ(バイト単位)を指定します(ウィンドウはEOSの仕様によれば24時間に相当します)。 CPUとNETはEOSトランザクションごとに消費され、次のウィンドウで復元されます。
EOSコントラクトのコストも2つに分割できます:
— コントラクト作成コスト:EOSコントラクトを作成するには、コントラクト開発者はコントラクトの状態を保存するためのRAMと、コントラクト作成トランザクションを開始するためのCPUとNETを支払う必要があります。
— コントラクト呼び出しコスト:コントラクトを呼び出すには、ユーザーはコントラクトの呼び出しの実行にCPUとNETを費やす必要があります。 コントラクトに保存する新しい状態がある場合、RAMも課金されます。 ほとんどの場合、RAMを支払うのはユーザーです。
コスト比較
例
簡単なクイズのコントラクトを見てみましょう.
この契約には推測関数があり、0から9までの範囲の数字を受け取ります。この関数はランダムシードを生成し、ランダムシードの最後の桁が入力パラメータと同じであれば 「win」と出力し、そうでなければ 「lose」と出力します。
Viteでのコントラクトのコードは以下のようになります:
コントラクトを作成するには:
コントラクト開発者は、デプロイメント手数料として10 VITEを支払い、少なくとも400 VITEをステーキングするか、147722953の難易度でPoWを計算して、コントラクト作成トランザクションを開始します。 クォータの使用量は45956です。
コントラクトを呼び出すには:
ユーザーは少なくとも267 VITEをステークする必要があります(この場合、75スナップショットブロックごとに1回のリクエストをトリガーできます。これは約75秒です)、または、75164738の難易度でPoWを計算します(この場合、スナップショットブロックごとに1回のリクエストをトリガーできます。これは約1秒です)。 クォータ使用量は23448です。
コントラクト開発者は、約75秒ごと、75のスナップショットブロックごとにコントラクトレスポンスを実行するために、コントラクトに少なくとも267 VITEをステークする必要があります。 クォータの使用量は22288です。理想的には、コントラクトは3日間で最大3455のリクエストを処理できます。
EOSでのコントラクトのコードは以下のようになります:
コントラクトを作成するには:
コントラクト開発者は、200バイトのNETと214μsのCPUを消費する契約アカウントを作成する必要があります。
また、704バイトのNETと4664μsのCPUを消費して、コントラクトコードとABIを更新する必要があります。
コントラクトがデプロイされた後、合計10873バイトのRAMが使用されます。これには0.578 EOSがかかります。
コントラクトを呼び出すには:
ユーザーは、96バイトのNETと1665μsのCPUを消費してコントラクト呼び出し、トランザクションをトリガーします。 3日以内に3455コールを実行するには、少なくともNETに0.338EOS、CPUに63494.205EOSのステークが必要です。
注: 2020年6月11日、RAM価格は1EOSで約18.81KBのRAM、NET価格は1EOSで約0.98MBのNET、CPU価格は1EOSで約90.6μsのCPUとなっています。
異なる取引量でのViteとEOSのステーキングコストの比較(0.1TPSは10sで1回コントラクトが実行されることを意味します):
注: 1 VITE = 0.01538 USD,1 EOS = 2.6601 USD,1 EOS = 5167.98 EOS loan for 30 days
表によると、同じスマートコントラクトを2つのプラットフォームにデプロイする場合、EOSのステーキングコストはViteの77240.85倍です。コントラクトが1秒あたり5つのリクエストを処理する場合、ステーキングコストは、Viteの819.37ドルと比較して、EOSでは63,354,138.23ドルというとんでもない金額に達します。
2つのプラットフォーム間のステーキングコストの大きなギャップを考慮すると、ユーザーはリソースのためにステークする代わりに、EOSREXからリソースを借りることでコストを削減することができます。この場合、30日分のリソースを借りるためには、レンタル料として4608.637EOSを支払わなければならず、これは12258.97ドルに相当します。これでもViteのステークキングコストの14.96倍になります。
まとめ
- スマートコントラクトのコストは、EOSよりもViteの方がはるかに低くなります
- EOSと比較して、Viteは実行頻度の高いシナリオに特に適しています
参考情報