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
GasとはEthereum上でトランザクションを利用するための手数料の単位です。
通貨としてEtherがありますが、別の概念です。Gasはトランザクションの送信でも、スマートコントラクトのデプロイ、ストレージ領域の利用、EVM上でのOPCODE実行にもかかります。
スマートコントラクトの実行時のGasは、スマートコントラクトがEVMで実行されるOPCODEに変換され、その実行単位ごとにかかります。
例を挙げます。
上記の様な簡単なコントラクトをコンパイルすると以下の様なバイトコードが生まれます。
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
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は根幹的なことが書かれているので、また紐解いていきたいと思います。
- 作者: 加嵜長門,篠原航,丸山弘詩
- 出版社/メーカー: マイナビ出版
- 発売日: 2018/02/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る