イーサリアム(Ethereum)における手数料Gasとは?

目次

    はじめに

    今回と次回の記事で、イーサリアム(Ethereum)上での様々なトランザクションについて解説します。トランザクションは、誰かに仮想通貨を送金をしたり、コントラクトを実行するときに発生します。このようなトランザクションは、マイナーによって承認され、ブロックに記録されます。

    その際、ユーザーはマイナーに対してインセンティブとなる報酬として、手数料を払う必要があります。イーサリアムではスマートコントラクトという複雑処理が実行可能であるがゆえに、手数料の算出方法がビットコイン等のシンプルなトランザクションのみ実行するシステムとは異なります。つまり、少々複雑なのです。

    そこで今回は、この手数料がどのようにして決まるのかについて解説します。

    イーサリアム(Ethereum)の手数料 ~Gas~

    ユーザーは、イーサリアム(Ethereum)上で、送金や(スマート)コントラクトといったトランザクションを実行します。それらは、マイナーによって処理され検証されます。このとき、それぞれの操作に使われたマシーンパワー、すなわちマイナーの作業コストに対する対価が手数料として支払われます。手数料はGasという考え方で計算され、ETHで支払われます。

    Gasの概念を理解するために、車の運転に必要なガソリンのアナロジーから考えて見ましょう。

    長い距離を走ったり、より速い速度で走るには、それに応じた燃料が必要になります。そのため、ガソリンという燃料が必要で、ガソリンを燃やして車を動かします。

    イーサリアムでも同様で、マイナーがマシーンを動かして計算をするための燃料が、Gasです。ユーザーは送金やイーサリアム上でトランザクションを発行したとき、マイナーに対して手数料をETHで支払います。一方で、マイナー達は手数料をインセンティブとして、そのトランザクションを承認/計算します。

    では、実際にイーサリアム上でマイナーの原動力になる、支払うべき手数料は、どのように算出されるのでしょうか? 

    簡潔に述べると、手数料としてマイナーに支払われるETHは、

    手数料(Gas)総量 =  GasPrice × GasUsed

    で決まります。GasPriceはGasの単価で、GasUsedが使われたGasの総量です。この総量をマイナーが受け取ることになります。次の節では、GasUsedとGasPriceについて詳しく解説して行きます。

    GasUsed

    この節では、上で出てきたGasUsedについて解説します。

    GasUsedは、ガソリンの例で考えると、自動車を運転した時に使われるガソリンの量です。

    長い距離を走ると、使用する燃料であるガソリンを多く使います。GasUsedも同様で、マイナーがトランザクションを処理し、検証するときに、使ったマシーンの計算量などによって決まります。したがって、複雑な処理の方が、単純な処理を実行する時よりもより多くのGasが必要になります。具体的な処理とそれに必要なGasの量は、イーサリアムのBeige Paperに書かれています。例えば、前回の記事で述べたハッシュ化(SHA3)の作業には、30Gasが必要になることが書かれています。

    正確には、Gasは高級言語で記述されたcontract(コード)を、低級言語であるアセンブラに直した時に、アセンブラで処理する各プロセス(opecode)、計算ごとに消費するGasが定義されています。

    トランザクションを生成するユーザーはあらかじめ、そのトランザクションで消費しても良いと思う、十分なGasの量を指定します。この指定されたGasの量をGasLimitと呼びます。

    先ほども述べたように、スマートコントラクトのトランザクション実行時に消費されるGas量を前もって正確に見積もることは困難です。しかし、使われなかったGasはユーザーに返却されるため、多めにGasLimitを設定しておくのが良いでしょう。というのも、もしトランザクションの処理中にGasが切れた場合は(必要なGasがGasLimitを上回ったら)、そのトランザクションは中断されます。さらに、使われたGasはユーザーには返却されず、マイナーが受け取ります。

    ここで重要なのは、ユーザーの設定したGas Limitを超えては、Gasも手数料も取られないような仕組みになっていることです。もし、実行しようとしているプログラムに誤りがあり、無限に同じ操作を繰り返えすように設定されていたとしましょう。この場合、ユーザーは、無限にマイナーに対して手数料を払わなくてはいけない状態が発生します。(車の例だと、車が故障して家の周りを無限に回り続けるイメージです。しかし、燃料は決まった量しかないので減り続けていつか車は停止します。)。

    そのため、GasLimitは、払うGasの限界を定め、不必要に手数料を払い過ぎないような安全装置として機能します。プログラムに誤りがあり、何度も同じ操作が繰り返された場合は、設定しているGasLimitに対して使用するGas(GasUsed)が多くなり、そのトランザクションが中断されます。

    Gas Price

    再びガソリンの話に戻りましょう。GasUsedが使われたガソリンの量であったのに対して、GasPriceはガソリン1リットルあたりの価格(単価)に対応します。

    イーサリアムの場合、マシーンパワーを使って実行した仕事の単価がGasPriceです。

    先ほどユーザーが確実にトランザクションなどの処理を実行してもらえるように、十分な量をGas Limitとして設定しなければいけないことを述べました。GasPriceも同様に、ユーザーに決定権があります。では、このGasPriceが低いとどうなるのでしょうか。

    マイナーのインセンティブは手数料ですので、単価が安い仕事はやりたくないでしょう。したがって、GasPriceの安いトランザクションは後回しになってしまいます。安すぎる場合は、そのトランザクションは永遠に処理されないことになります。できるだけ早く承認してもらいたい場合は、このGasPriceを高く設定しましょう。

    Ethereum gas stationでは、現在の設定するGasPriceに対応する承認時間が書かれています。またMyEtherWalletでは、通常時(トランザクション詰まりなどが起きていないとき)の基準として

    • 40 GWEI Gas Price・・・ほとんどの場合、当該のトランザクションが次のブロックに格納される。
    • 20 GWEI Gas Price・・・ほとんどの場合、2~3個後のブロックに格納される。
    • 2 GWEI Gas Price・・・ほとんどの場合、8-12個後ブロックに格納される。

    と書かれています。

    ただし、通常の取引所ではこれらを自動で行ってもらえるので気にしなくても問題ありません。

    (ここで出てきたGas Priceの単位であるGWEIについては、次の節で説明していきます。)

    Example

    上記の復習として、Meta Maskの設定を参考にしながら、一度計算をしていきましょう。

    Meta Maskでは以下のように、はじめにGasLimitとGasPriceを設定する欄があります。

    今回はこの例にあるように、GasLimitを21000にして、GasPriceを1GWEIに設定しました。ここで、1 GWEI は 0.000 000 001 etherのことです。ETHの単位変換は以下の表を参考にしてください。

    単位

    ether

    wei(最小) 0.000000000000000001ether

    kwei

    0.000000000000001ether

    mwei

    0.000000000001ether

    gwei

    0.000000001ether

    szabo

    0.000001ether

    finney

    0.001ether

    ether

    1ether

    上記のようにユーザーが設定したとしましょう。したがって、ユーザーは最大の手数料(Gas)として

    最大手数料= 0.000 000 001 ether × 21000 = 0.000 021 ether

    を支払うことになります。しかし、実際にマイナーが処理したところ、使用されたGasが19000だったしましょう。これがちょうどGasUsedです。この時実際に支払われる手数料は、

    手数料= 0.000 000 001 ether × 19000 = 0.000 019 ether

    で、差額分の0.000 002 etherはユーザーに返却されます。

    まとめ

    今回の記事では、イーサリアムにおける手数料の仕組みであるGasについて説明しました。

    GasPriceとGasLimitを独立させることで、1)トランザクションに取り入れるか入れないかのマイナー心理と、2)プログラムでエラーが起きた時にお金を使い切らないような構造を独立させています。このような特徴もビットコイン(Bitcoin)にはない工夫されている部分です。

    コメントする

    メールアドレスが公開されることはありません。