実行ガス
ガスはIntrinsicGas
とExecutionGas
の和である。 ここでは、ExecutionGas
がどのように計算されるかに焦点を当てる。
実行ガス関連のハードフォーク変更は、このページの一番下にあります。 ハードフォーク変更へ。
概要
執行ガスは、3つの異なる状況下で契約を執行する際に発生する。 時には、いくつかの方針が省略されることもある。
- 最初の、そして最も一般的なものは
constantGas
である。 これは演算に不可欠な料金だ。 - これは、
CREATE
、CALL
、CALLCODE
の支払いの一部となる。 - 最後に、メモリ使用量の増加によりガス代がかかる場合がある。
Over an account's execution, the total fee payable for memory-usage payable is proportional to the smallest multiple of 32 bytes that are required to include all memory indices (whether for read or write) in the range. この料金はジャスト・イン・タイム方式で支払われる。そのため、以前にインデックス付けされたメモリよりも少なくとも32バイト大きいメモリ領域を参照すると、追加のメモリ使用料が発生する。 この手数料により、アドレスが32ビットの境界を超えることはまずない。 とはいえ、実装はこのような事態に対処できなければならない。
保管料には微妙なニュアンスがある。 ストレージの使用を最小化するインセンティブを与えるために、ストレージからエ ントリをクリアする操作の実行料金は、免除されるだけでなく、適格な払い戻しを引き出す。
オプコード・ガ ス・スケジュール
料金表G
は、トランザクションが負担する可能性のある抽象的な操作の数々 の相対的なコストに対応する37個のスカラー値のタプルである。 また、CALL_*
オペコードによって呼び出されるプリコンパイルされたコントラクトのガスを計算するためのガス項目もある。
オペコードの constantGas
を表すスカラー値。
名称 | 価値 | コードネーム | オプコード |
---|---|---|---|
G_base | 2 | GasQuickStep | ADDRESS , ORIGIN , CALLER , CALLVALUE , CALLDATASIZE , CODESIZE , GASPRICE , COINBASE , TIMESTAMP , NUMBER , PREVRANDAO (originally it was DIFFICULTY ), GASLIMIT , RETURNDATASIZE , POP , PC , MSIZE , GAS , CHAINID , BASEFEE , PUSH0 , BLOBBASEFEE |
G_verylow | 3 | GasFastestStep | ADD , SUB , LT , GT , SLT , SGT , EQ , ISZERO , AND , OR , XOR , NOT , BYTE , CALLDATALOAD , MLOAD , MSTORE , MSTORE8 , PUSH , DUP , SWAP , BLOBHASH , MCOPY |
G_low | 5 | GasFastStep | MUL , DIV , SDIV , MOD , SMOD , SIGNEXTEND , SELFBALANCE |
G_mid | 8 | GasMidStep | ADDMOD , MULMOD , JUMP |
G_high | 10 | GasSlowStep | JUMPI |
G_selfdestruct | 5000 | SelfdestructGas | SELFDESTRUCT |
G_warmStorageReadCost | 100 | WarmStorageReadCostEIP2929 | EXTCODECOPY , EXTCODESIZE , EXTCODEHASH , BALANCE , CALL , CALLCODE , STATICCALL , DELEGATECALL , TSTORE , TLOAD |
G_blockhash | 20 | GasExtStep | BLOCKHASH |
G_jumpdest | 1 | JumpdestGas | JUMPDEST |
G_sha3 | 30 | Sha3Gas | SHA3 |
G_create | 32000 | CreateGas | CREATE , CREATE2 |
メモリとログの使用量に基づいてガスを計算するために使用されるスカラー値
Name | Value | Name in Code | Description |
---|---|---|---|
G_memory | 3 | MemoryGas | メモリを拡張する際、1ワード増えるごとに支払うガス量 |
G_copy | 3 | コピーガス | COPY`操作の一部支払い、コピーされた単語数倍、切り上げ |
G_log | 375 | LogGas | LOG`操作の一部支払い |
G_logdata | 8 | LogDataGas | LOG`操作のデータの各バイトに対して支払われるガス量。 |
G_logtopic | 375 | LogTopicGas | LOG`操作のトピックごとに支払われるガス量 |
特定のオペコードのガスを計算するために使用されるスカラー値
Name | Value | Name in Code | Description |
---|---|---|---|
G_sset | 20000 | SstoreSetGas | 貯蔵設定時に貯蔵値が設定された場合に支払われるガス量 |
G_sreset | 5000 | SstoreResetGas | 貯蔵量がゼロのまま、またはゼロに設定された場合に支払われる ガス量 |
G_coldSloadCost | 2100 | ColdSloadCostEIP2929 | 貯蔵量がaccessListにない場合の支払ガス量 |
R_sclear | 15000 | SstoreClearsScheduleRefundEIP3529 | G_sreset - G_coldSloadCost + TxAccessListStorageKeyGas (1900) |
G_exp | 10 | ExpGas | Partial payment |
G_expbyte | 50 | ExpByte | ceil(log_256(指数))`を掛けた場合の一部支払い |
G_selfdestruct | 5000 | SelfdestructGas | SELFDESTRUCT`操作のために支払われたガス量 |
G_callvalue | 9000 | CallValueTransferGas | 非ゼロ・バリュー・トランスファーに支払われたガス量 |
G_callstipend | 2300 | CallStipend | ゼロでない値での移籍の場合、通話開始時に無料ガスが与えられる。 |
G_newaccount | 25000 | CallNewAccountGas | アカウント作成時に支払ったガス料金。 また、SELFDESTRUCT 操作を伴うCreateBySelfdestructGas としても定義される。 |
G_codedeposit | 200 | CreateDataGas | コードの状態への配置に成功した契約を作成するために1バイトあたりに支払われるガスの量 |
G_sha3word | 6 | Sha3WordGas | 入力データがSHA3 の場合、各単語の支払ガス量。 |
G_InitCodeWord | 2 | InitCodeWordGas | CREATE, CREATE2`のinitcodeの各単語に対して支払われるガス量。 |
契約ガス料金表
プリコンパイルされたコントラクトは、通常、複雑な暗号計算を行い、他のコントラクトによって開始される特別な種類のコントラクトである。
以下は、カイアのコンパイル済み契約のガス料金表です。 Input
はコンパイル済みのコントラクトのバイト配列の入力である。
Address | Precompiled contracts | Gas Cost |
---|---|---|
0x01 | ecrecover | 3,000 |
0x02 | sha256hash | numOfWords(input) * 12 + 60 |
0x03 | ripemd160hash | numOfWords(input) * 120 + 600 |
0x04 | dataCopy | numOfWords(input) * 3 + 15 |
0x05 | bigModExp | コードはこちら](https://github.com/kaiachain/kaia/blob/75c149a464998eb946311f3a290d4b1ea339eaba/blockchain/vm/contracts.go#L340) |
0x06 | bn256Add | 150 |
0x07 | bn256ScalarMul | 6,000 |
0x08 | bn256Pairing | numOfPairings(input) * 34,000 + 45,000 |
0x09 | blake2f | bigEndian(getRounds(input[0:4])) |
0x0A | kzg | 50,000 |
0x3FD | vmLog | len(input) * 20 + 100 |
0x3FE | feePayer | 300 |
0x3FF | validateSender | numOfSigs(input) * 5,000 |