Neutrinoで働くブロックチェーンエンジニアのブログ

渋谷の専門特化コワークNeutrinoに入居してブロックチェーンエンジニアとして働いています。元丸の内。(Neutrino運営企業とは直接関係ありません)

EthereumのGasについて-Yellow Paper5章より

f:id:naomasabit:20180409114233j:plain
Ethereum

Ethereum界隈はPlasma、Sharding、PoSと騒がしいですが、このタイミングで逆行してYellow Paperを精読しています笑

White Paperが概念とするなら、Yellow Paperは実装の仕様書に当たります。Ethereumでは相当細かく定義されており、詳細仕様書に近い気がします。

適宜新しい仕様が更新されていっています。Plasmaは日本語訳を有志がされていますが、Yellow Paperはまだ日本語訳がされていないんですよね。

5章のGas and Paymentについてまとめていきます。

なお、読んでいるYellowPaperのバージョンは「BYZANTIUM VERSION e94ebda - 2018-06-05」です。

以下の引用は全てEthereum Yellow Paperの「5. Gas and Payment」からのものとご認識ください。

Gasと計算に関連するOPCODE

f:id:naomasabit:20180906031423j:plain

GasとはEthereum上でトランザクションを利用するための手数料の単位です。

通貨としてEtherがありますが、別の概念です。Gasはトランザクションの送信でも、スマートコントラクトのデプロイ、ストレージ領域の利用、EVM上でのOPCODE実行にもかかります。

スマートコントラクトの実行時のGasは、スマートコントラクトがEVMで実行されるOPCODEに変換され、その実行単位ごとにかかります。

例を挙げます。

ethfiddle.com

上記の様な簡単なコントラクトをコンパイルすると以下の様なバイトコードが生まれます。

6080604052600436106049576000357c0100000000000000000000000000000
000000000000000000000000000900463ffffffff16806360fe47b114604e57
80636d4ce63c146078575b600080fd5b348015605957600080fd5b506076600
4803603810190808035906020019092919050505060a0565b005b3480156083
57600080fd5b50608a60aa565b6040518082815260200191505060405180910
390f35b8060008190555050565b600080549050905600a165627a7a72305820
d54b1c9f41f33b6d64f70fa185cfdf713f0b4f01eb132fcb6c1a851db95a22c
50029

これだけだと何が何だかわかりませんが、

Appendix H. Virtual Machine Specificationを参照すると、バイトコードと人間が読みやすいOPCODEとの対応表が載っています。

対応表の抜粋

bytecode OPCODE 説明
0x00 STOP コードの実行停止
0x01 ADD 足し算
0x60 PUSH1 1byteをスタックに入れる
0x61 PUSH2 2byteをスタックに入れる
0x72 PUSH32 32byteをスタックに入れる
0x80 DUP1 スタックに入っている最初のアイテムを複製する
0x30 ADDRESS 現在コードを実行中のアドレスを取得する

上記のbytecodeをOPCODEに変換すると以下の様になります。

EthFiddleのコンパイル結果にも出ますのできになる方はそちらをご参照ください。

PUSH1 0x80 
PUSH1 0x40
MSTORE
CALLVALUE
DUP1
ISZERO
PUSH2 0x10
...
...
SWAP16
COINBASE
RETURN
EXTCODESIZE
PUSH14 0x64F70FA185CFDF713F0B4F01EB13 0x2f 0xcb
PUSH13 0x1A851DB95A22C5002900000000

上記OPCODE等から実行に必要なgas量が計算されます。

gasの計算に重要なのはOPCODEの量とgasの各OPCODEのgas高低です。

支払上限のGasLimitと支払金額のGasPrice

f:id:naomasabit:20180906031453j:plain

GasLimit

Gasは基本的にはトランザクション送信者の残高から消費されます。ただし送信者がスマートコントラクトを実行する場合などに、想定しているよりも多くのGasを消費しないように、上限値を定めておきます。その上限値がGasLimit。

A higher gas price on a transaction will therefore cost the sender more in terms of Ether and deliver a greater value to the miner and thus will more likely be selected for inclusion by more miners.

信頼性の高いコードが置かれているアドレスに対しては、比較的高いGasLimitが設定されるだろう、とYellow Paperには書いています。

GasPrice

The purchase happens at the according gasPrice, also specied in the transaction.

1Gas単位にいくらEtherを払うかを設定するものがGasPriceです。利用されるGasにGasPriceがかけられて、Etherの単位に直されます。

トランザクション実行後に消費されなかったGasは、購入時のGasPriceでEtherとして払い戻されます。(払い戻し上限はあります)

Gasを購入するために使われたEtherで払い戻しされない分はマイナーの報酬となるとしています。

Transactors are free to specify any gasPrice that they wish, however miners are free to ignore transactions as they choose.

マイナーはマイニングするトランザクションを自由に選べます。

高いgasPriceを設定すると、マイナーにトランザクションが選択されるインセンティブになります。

送信者が早くトランザクションを承認してほしいとき、高いgasPriceを設定する手段が使えます。

Miners, in general, will choose to advertise the minimum gas price for which they will execute transactions and transactors will be free to canvas these prices in determining what gas price to offer.

マイナーは、マイニングする際の最低gas priceを宣伝して、取引者はgasPriceの設定時にこれらのマイナーの主張を参考にする、と見込んでいます。

Gasはなぜ必要なのか

In order to avoid issues of network abuse and to sidestepthe inevitable questions stemming from Turing completeness, all programmable computation in Ethereum is subject to fees.

ネットワークの乱用や攻撃を避け、チューリング完全性を保つためにはプログラムに対して手数料をかける必要があります。

Ethereumはワールドコンピュータとしての思想で作られているのでチューリング完全性を担保しようとしています。

しかし、自由に無限ループなどを起こすことができてしまうと、ネットワークを停止させかねません。

チューリング完全性をもつことで利便性が上がるが、攻撃も自由にできてしまうというジレンマが発生します。

そのため、何らかの形で実行制限をつける必要があり、gasという手数料を設けています。

無限ループを起こしたとしてもgasが延々と消費されてしまうので、攻撃のインセンティブは減ります。

ちなみにBitcoinはチューリング不完全な形にして攻撃なども自由にできない様にしています。

今回はEthereumのGasについて見ました。

Yellow Paperは根幹的なことが書かれているので、また紐解いていきたいと思います。

ブロックチェーンアプリケーション開発の教科書

ブロックチェーンアプリケーション開発の教科書