jump_table.go 26.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// Copyright 2015 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.

17 18
package vm

19 20 21
import (
	"github.com/ethereum/go-ethereum/params"
)
22

23
type (
24
	executionFunc func(pc *uint64, interpreter *EVMInterpreter, callContext *ScopeContext) ([]byte, error)
25
	gasFunc       func(*EVM, *Contract, *Stack, *Memory, uint64) (uint64, error) // last parameter is the requested memory size as a uint64
26 27
	// memorySizeFunc returns the required size, and whether the operation overflowed a uint64
	memorySizeFunc func(*Stack) (size uint64, overflow bool)
28 29 30
)

type operation struct {
31
	// execute is the operation function
32 33 34 35 36 37 38 39 40
	execute     executionFunc
	constantGas uint64
	dynamicGas  gasFunc
	// minStack tells how many stack items are required
	minStack int
	// maxStack specifies the max length the stack can have for this operation
	// to not overflow the stack.
	maxStack int

41 42
	// memorySize returns the memory size required for the operation
	memorySize memorySizeFunc
43

44
	halts   bool // indicates whether the operation should halt further execution
45 46 47
	jumps   bool // indicates whether the program counter should not increment
	writes  bool // determines whether this a state modifying operation
	reverts bool // determines whether the operation reverts state (implicitly halts)
48
	returns bool // determines whether the operations sets the return data content
49 50
}

51
var (
52 53 54 55 56 57
	frontierInstructionSet         = newFrontierInstructionSet()
	homesteadInstructionSet        = newHomesteadInstructionSet()
	tangerineWhistleInstructionSet = newTangerineWhistleInstructionSet()
	spuriousDragonInstructionSet   = newSpuriousDragonInstructionSet()
	byzantiumInstructionSet        = newByzantiumInstructionSet()
	constantinopleInstructionSet   = newConstantinopleInstructionSet()
58
	istanbulInstructionSet         = newIstanbulInstructionSet()
59
	berlinInstructionSet           = newBerlinInstructionSet()
60
	londonInstructionSet           = newLondonInstructionSet()
61 62
)

63
// JumpTable contains the EVM opcodes supported at a given fork.
64
type JumpTable [256]*operation
65

66 67 68 69 70
// newLondonInstructionSet returns the frontier, homestead, byzantium,
// contantinople, istanbul, petersburg, berlin and london instructions.
func newLondonInstructionSet() JumpTable {
	instructionSet := newBerlinInstructionSet()
	enable3529(&instructionSet) // EIP-3529: Reduction in refunds https://eips.ethereum.org/EIPS/eip-3529
71
	enable3198(&instructionSet) // Base fee opcode https://eips.ethereum.org/EIPS/eip-3198
72 73 74
	return instructionSet
}

75 76 77
// newBerlinInstructionSet returns the frontier, homestead, byzantium,
// contantinople, istanbul, petersburg and berlin instructions.
func newBerlinInstructionSet() JumpTable {
78
	instructionSet := newIstanbulInstructionSet()
79
	enable2929(&instructionSet) // Access lists for trie accesses https://eips.ethereum.org/EIPS/eip-2929
80 81 82
	return instructionSet
}

83 84
// newIstanbulInstructionSet returns the frontier, homestead, byzantium,
// contantinople, istanbul and petersburg instructions.
85 86 87 88 89 90 91 92 93 94
func newIstanbulInstructionSet() JumpTable {
	instructionSet := newConstantinopleInstructionSet()

	enable1344(&instructionSet) // ChainID opcode - https://eips.ethereum.org/EIPS/eip-1344
	enable1884(&instructionSet) // Reprice reader opcodes - https://eips.ethereum.org/EIPS/eip-1884
	enable2200(&instructionSet) // Net metered SSTORE - https://eips.ethereum.org/EIPS/eip-2200

	return instructionSet
}

95
// newConstantinopleInstructionSet returns the frontier, homestead,
96
// byzantium and contantinople instructions.
97
func newConstantinopleInstructionSet() JumpTable {
98
	instructionSet := newByzantiumInstructionSet()
99
	instructionSet[SHL] = &operation{
100 101 102 103
		execute:     opSHL,
		constantGas: GasFastestStep,
		minStack:    minStack(2, 1),
		maxStack:    maxStack(2, 1),
104
	}
105
	instructionSet[SHR] = &operation{
106 107 108 109
		execute:     opSHR,
		constantGas: GasFastestStep,
		minStack:    minStack(2, 1),
		maxStack:    maxStack(2, 1),
110
	}
111
	instructionSet[SAR] = &operation{
112 113 114 115
		execute:     opSAR,
		constantGas: GasFastestStep,
		minStack:    minStack(2, 1),
		maxStack:    maxStack(2, 1),
116
	}
117
	instructionSet[EXTCODEHASH] = &operation{
118
		execute:     opExtCodeHash,
119
		constantGas: params.ExtcodeHashGasConstantinople,
120 121
		minStack:    minStack(1, 1),
		maxStack:    maxStack(1, 1),
122
	}
123
	instructionSet[CREATE2] = &operation{
124 125 126 127 128 129 130 131
		execute:     opCreate2,
		constantGas: params.Create2Gas,
		dynamicGas:  gasCreate2,
		minStack:    minStack(4, 1),
		maxStack:    maxStack(4, 1),
		memorySize:  memoryCreate2,
		writes:      true,
		returns:     true,
132
	}
133 134 135
	return instructionSet
}

136
// newByzantiumInstructionSet returns the frontier, homestead and
137
// byzantium instructions.
138
func newByzantiumInstructionSet() JumpTable {
139
	instructionSet := newSpuriousDragonInstructionSet()
140
	instructionSet[STATICCALL] = &operation{
141 142 143 144 145 146 147
		execute:     opStaticCall,
		constantGas: params.CallGasEIP150,
		dynamicGas:  gasStaticCall,
		minStack:    minStack(6, 1),
		maxStack:    maxStack(6, 1),
		memorySize:  memoryStaticCall,
		returns:     true,
148
	}
149
	instructionSet[RETURNDATASIZE] = &operation{
150 151 152 153
		execute:     opReturnDataSize,
		constantGas: GasQuickStep,
		minStack:    minStack(0, 1),
		maxStack:    maxStack(0, 1),
154
	}
155
	instructionSet[RETURNDATACOPY] = &operation{
156 157 158 159 160 161
		execute:     opReturnDataCopy,
		constantGas: GasFastestStep,
		dynamicGas:  gasReturnDataCopy,
		minStack:    minStack(3, 0),
		maxStack:    maxStack(3, 0),
		memorySize:  memoryReturnDataCopy,
162
	}
163
	instructionSet[REVERT] = &operation{
164 165 166 167 168 169 170
		execute:    opRevert,
		dynamicGas: gasRevert,
		minStack:   minStack(2, 0),
		maxStack:   maxStack(2, 0),
		memorySize: memoryRevert,
		reverts:    true,
		returns:    true,
171
	}
172 173 174
	return instructionSet
}

175
// EIP 158 a.k.a Spurious Dragon
176
func newSpuriousDragonInstructionSet() JumpTable {
177 178 179 180 181 182 183
	instructionSet := newTangerineWhistleInstructionSet()
	instructionSet[EXP].dynamicGas = gasExpEIP158
	return instructionSet

}

// EIP 150 a.k.a Tangerine Whistle
184
func newTangerineWhistleInstructionSet() JumpTable {
185 186 187 188 189 190 191 192 193 194 195
	instructionSet := newHomesteadInstructionSet()
	instructionSet[BALANCE].constantGas = params.BalanceGasEIP150
	instructionSet[EXTCODESIZE].constantGas = params.ExtcodeSizeGasEIP150
	instructionSet[SLOAD].constantGas = params.SloadGasEIP150
	instructionSet[EXTCODECOPY].constantGas = params.ExtcodeCopyBaseEIP150
	instructionSet[CALL].constantGas = params.CallGasEIP150
	instructionSet[CALLCODE].constantGas = params.CallGasEIP150
	instructionSet[DELEGATECALL].constantGas = params.CallGasEIP150
	return instructionSet
}

196
// newHomesteadInstructionSet returns the frontier and homestead
197
// instructions that can be executed during the homestead phase.
198
func newHomesteadInstructionSet() JumpTable {
199
	instructionSet := newFrontierInstructionSet()
200
	instructionSet[DELEGATECALL] = &operation{
201 202 203 204 205 206 207
		execute:     opDelegateCall,
		dynamicGas:  gasDelegateCall,
		constantGas: params.CallGasFrontier,
		minStack:    minStack(6, 1),
		maxStack:    maxStack(6, 1),
		memorySize:  memoryDelegateCall,
		returns:     true,
208 209 210
	}
	return instructionSet
}
211

212
// newFrontierInstructionSet returns the frontier instructions
213
// that can be executed during the frontier phase.
214 215
func newFrontierInstructionSet() JumpTable {
	return JumpTable{
216
		STOP: {
217 218 219 220 221
			execute:     opStop,
			constantGas: 0,
			minStack:    minStack(0, 0),
			maxStack:    maxStack(0, 0),
			halts:       true,
222
		},
223
		ADD: {
224 225 226 227
			execute:     opAdd,
			constantGas: GasFastestStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
228
		},
Felix Lange's avatar
Felix Lange committed
229
		MUL: {
230 231 232 233
			execute:     opMul,
			constantGas: GasFastStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
234 235
		},
		SUB: {
236 237 238 239
			execute:     opSub,
			constantGas: GasFastestStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
240
		},
Felix Lange's avatar
Felix Lange committed
241
		DIV: {
242 243 244 245
			execute:     opDiv,
			constantGas: GasFastStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
246
		},
Felix Lange's avatar
Felix Lange committed
247
		SDIV: {
248 249 250 251
			execute:     opSdiv,
			constantGas: GasFastStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
252
		},
Felix Lange's avatar
Felix Lange committed
253
		MOD: {
254 255 256 257
			execute:     opMod,
			constantGas: GasFastStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
258
		},
Felix Lange's avatar
Felix Lange committed
259
		SMOD: {
260 261 262 263
			execute:     opSmod,
			constantGas: GasFastStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
264 265
		},
		ADDMOD: {
266 267 268 269
			execute:     opAddmod,
			constantGas: GasMidStep,
			minStack:    minStack(3, 1),
			maxStack:    maxStack(3, 1),
270 271
		},
		MULMOD: {
272 273 274 275
			execute:     opMulmod,
			constantGas: GasMidStep,
			minStack:    minStack(3, 1),
			maxStack:    maxStack(3, 1),
276
		},
Felix Lange's avatar
Felix Lange committed
277
		EXP: {
278
			execute:    opExp,
279
			dynamicGas: gasExpFrontier,
280 281
			minStack:   minStack(2, 1),
			maxStack:   maxStack(2, 1),
282
		},
Felix Lange's avatar
Felix Lange committed
283
		SIGNEXTEND: {
284 285 286 287
			execute:     opSignExtend,
			constantGas: GasFastStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
288
		},
Felix Lange's avatar
Felix Lange committed
289
		LT: {
290 291 292 293
			execute:     opLt,
			constantGas: GasFastestStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
294
		},
Felix Lange's avatar
Felix Lange committed
295
		GT: {
296 297 298 299
			execute:     opGt,
			constantGas: GasFastestStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
300
		},
Felix Lange's avatar
Felix Lange committed
301
		SLT: {
302 303 304 305
			execute:     opSlt,
			constantGas: GasFastestStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
306
		},
Felix Lange's avatar
Felix Lange committed
307
		SGT: {
308 309 310 311
			execute:     opSgt,
			constantGas: GasFastestStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
312
		},
Felix Lange's avatar
Felix Lange committed
313
		EQ: {
314 315 316 317
			execute:     opEq,
			constantGas: GasFastestStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
318
		},
Felix Lange's avatar
Felix Lange committed
319
		ISZERO: {
320 321 322 323
			execute:     opIszero,
			constantGas: GasFastestStep,
			minStack:    minStack(1, 1),
			maxStack:    maxStack(1, 1),
324
		},
Felix Lange's avatar
Felix Lange committed
325
		AND: {
326 327 328 329
			execute:     opAnd,
			constantGas: GasFastestStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
330 331
		},
		XOR: {
332 333 334 335
			execute:     opXor,
			constantGas: GasFastestStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
336
		},
Felix Lange's avatar
Felix Lange committed
337
		OR: {
338 339 340 341
			execute:     opOr,
			constantGas: GasFastestStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
342
		},
343
		NOT: {
344 345 346 347
			execute:     opNot,
			constantGas: GasFastestStep,
			minStack:    minStack(1, 1),
			maxStack:    maxStack(1, 1),
348
		},
Felix Lange's avatar
Felix Lange committed
349
		BYTE: {
350 351 352 353
			execute:     opByte,
			constantGas: GasFastestStep,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
354
		},
Felix Lange's avatar
Felix Lange committed
355
		SHA3: {
356 357 358 359 360 361
			execute:     opSha3,
			constantGas: params.Sha3Gas,
			dynamicGas:  gasSha3,
			minStack:    minStack(2, 1),
			maxStack:    maxStack(2, 1),
			memorySize:  memorySha3,
362
		},
Felix Lange's avatar
Felix Lange committed
363
		ADDRESS: {
364 365 366 367
			execute:     opAddress,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
368
		},
Felix Lange's avatar
Felix Lange committed
369
		BALANCE: {
370 371 372 373
			execute:     opBalance,
			constantGas: params.BalanceGasFrontier,
			minStack:    minStack(1, 1),
			maxStack:    maxStack(1, 1),
374
		},
Felix Lange's avatar
Felix Lange committed
375
		ORIGIN: {
376 377 378 379
			execute:     opOrigin,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
380
		},
Felix Lange's avatar
Felix Lange committed
381
		CALLER: {
382 383 384 385
			execute:     opCaller,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
386
		},
Felix Lange's avatar
Felix Lange committed
387
		CALLVALUE: {
388 389 390 391
			execute:     opCallValue,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
392
		},
Felix Lange's avatar
Felix Lange committed
393
		CALLDATALOAD: {
394 395 396 397
			execute:     opCallDataLoad,
			constantGas: GasFastestStep,
			minStack:    minStack(1, 1),
			maxStack:    maxStack(1, 1),
398
		},
Felix Lange's avatar
Felix Lange committed
399
		CALLDATASIZE: {
400 401 402 403
			execute:     opCallDataSize,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
404
		},
Felix Lange's avatar
Felix Lange committed
405
		CALLDATACOPY: {
406 407 408 409 410 411
			execute:     opCallDataCopy,
			constantGas: GasFastestStep,
			dynamicGas:  gasCallDataCopy,
			minStack:    minStack(3, 0),
			maxStack:    maxStack(3, 0),
			memorySize:  memoryCallDataCopy,
412
		},
Felix Lange's avatar
Felix Lange committed
413
		CODESIZE: {
414 415 416 417
			execute:     opCodeSize,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
418
		},
Felix Lange's avatar
Felix Lange committed
419
		CODECOPY: {
420 421 422 423 424 425
			execute:     opCodeCopy,
			constantGas: GasFastestStep,
			dynamicGas:  gasCodeCopy,
			minStack:    minStack(3, 0),
			maxStack:    maxStack(3, 0),
			memorySize:  memoryCodeCopy,
426
		},
Felix Lange's avatar
Felix Lange committed
427
		GASPRICE: {
428 429 430 431
			execute:     opGasprice,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
432
		},
433
		EXTCODESIZE: {
434 435 436 437
			execute:     opExtCodeSize,
			constantGas: params.ExtcodeSizeGasFrontier,
			minStack:    minStack(1, 1),
			maxStack:    maxStack(1, 1),
438 439
		},
		EXTCODECOPY: {
440 441 442 443 444 445
			execute:     opExtCodeCopy,
			constantGas: params.ExtcodeCopyBaseFrontier,
			dynamicGas:  gasExtCodeCopy,
			minStack:    minStack(4, 0),
			maxStack:    maxStack(4, 0),
			memorySize:  memoryExtCodeCopy,
446
		},
Felix Lange's avatar
Felix Lange committed
447
		BLOCKHASH: {
448 449 450 451
			execute:     opBlockhash,
			constantGas: GasExtStep,
			minStack:    minStack(1, 1),
			maxStack:    maxStack(1, 1),
452
		},
Felix Lange's avatar
Felix Lange committed
453
		COINBASE: {
454 455 456 457
			execute:     opCoinbase,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
458
		},
Felix Lange's avatar
Felix Lange committed
459
		TIMESTAMP: {
460 461 462 463
			execute:     opTimestamp,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
464
		},
Felix Lange's avatar
Felix Lange committed
465
		NUMBER: {
466 467 468 469
			execute:     opNumber,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
470
		},
Felix Lange's avatar
Felix Lange committed
471
		DIFFICULTY: {
472 473 474 475
			execute:     opDifficulty,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
476
		},
Felix Lange's avatar
Felix Lange committed
477
		GASLIMIT: {
478 479 480 481
			execute:     opGasLimit,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
482
		},
Felix Lange's avatar
Felix Lange committed
483
		POP: {
484 485 486 487
			execute:     opPop,
			constantGas: GasQuickStep,
			minStack:    minStack(1, 0),
			maxStack:    maxStack(1, 0),
488
		},
Felix Lange's avatar
Felix Lange committed
489
		MLOAD: {
490 491 492 493 494 495
			execute:     opMload,
			constantGas: GasFastestStep,
			dynamicGas:  gasMLoad,
			minStack:    minStack(1, 1),
			maxStack:    maxStack(1, 1),
			memorySize:  memoryMLoad,
496
		},
Felix Lange's avatar
Felix Lange committed
497
		MSTORE: {
498 499 500 501 502 503
			execute:     opMstore,
			constantGas: GasFastestStep,
			dynamicGas:  gasMStore,
			minStack:    minStack(2, 0),
			maxStack:    maxStack(2, 0),
			memorySize:  memoryMStore,
504
		},
Felix Lange's avatar
Felix Lange committed
505
		MSTORE8: {
506 507 508 509 510 511
			execute:     opMstore8,
			constantGas: GasFastestStep,
			dynamicGas:  gasMStore8,
			memorySize:  memoryMStore8,
			minStack:    minStack(2, 0),
			maxStack:    maxStack(2, 0),
512
		},
Felix Lange's avatar
Felix Lange committed
513
		SLOAD: {
514 515 516 517
			execute:     opSload,
			constantGas: params.SloadGasFrontier,
			minStack:    minStack(1, 1),
			maxStack:    maxStack(1, 1),
518
		},
Felix Lange's avatar
Felix Lange committed
519
		SSTORE: {
520 521 522 523 524
			execute:    opSstore,
			dynamicGas: gasSStore,
			minStack:   minStack(2, 0),
			maxStack:   maxStack(2, 0),
			writes:     true,
525
		},
526
		JUMP: {
527 528 529 530 531
			execute:     opJump,
			constantGas: GasMidStep,
			minStack:    minStack(1, 0),
			maxStack:    maxStack(1, 0),
			jumps:       true,
532 533
		},
		JUMPI: {
534 535 536 537 538
			execute:     opJumpi,
			constantGas: GasSlowStep,
			minStack:    minStack(2, 0),
			maxStack:    maxStack(2, 0),
			jumps:       true,
539
		},
Felix Lange's avatar
Felix Lange committed
540
		PC: {
541 542 543 544
			execute:     opPc,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
545
		},
Felix Lange's avatar
Felix Lange committed
546
		MSIZE: {
547 548 549 550
			execute:     opMsize,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
551
		},
Felix Lange's avatar
Felix Lange committed
552
		GAS: {
553 554 555 556
			execute:     opGas,
			constantGas: GasQuickStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
557
		},
558
		JUMPDEST: {
559 560 561 562
			execute:     opJumpdest,
			constantGas: params.JumpdestGas,
			minStack:    minStack(0, 0),
			maxStack:    maxStack(0, 0),
563
		},
Felix Lange's avatar
Felix Lange committed
564
		PUSH1: {
565 566 567 568
			execute:     opPush1,
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
569
		},
Felix Lange's avatar
Felix Lange committed
570
		PUSH2: {
571 572 573 574
			execute:     makePush(2, 2),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
575
		},
Felix Lange's avatar
Felix Lange committed
576
		PUSH3: {
577 578 579 580
			execute:     makePush(3, 3),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
581
		},
Felix Lange's avatar
Felix Lange committed
582
		PUSH4: {
583 584 585 586
			execute:     makePush(4, 4),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
587
		},
Felix Lange's avatar
Felix Lange committed
588
		PUSH5: {
589 590 591 592
			execute:     makePush(5, 5),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
593
		},
Felix Lange's avatar
Felix Lange committed
594
		PUSH6: {
595 596 597 598
			execute:     makePush(6, 6),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
599
		},
Felix Lange's avatar
Felix Lange committed
600
		PUSH7: {
601 602 603 604
			execute:     makePush(7, 7),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
605
		},
Felix Lange's avatar
Felix Lange committed
606
		PUSH8: {
607 608 609 610
			execute:     makePush(8, 8),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
611
		},
Felix Lange's avatar
Felix Lange committed
612
		PUSH9: {
613 614 615 616
			execute:     makePush(9, 9),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
617
		},
Felix Lange's avatar
Felix Lange committed
618
		PUSH10: {
619 620 621 622
			execute:     makePush(10, 10),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
623
		},
Felix Lange's avatar
Felix Lange committed
624
		PUSH11: {
625 626 627 628
			execute:     makePush(11, 11),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
629
		},
Felix Lange's avatar
Felix Lange committed
630
		PUSH12: {
631 632 633 634
			execute:     makePush(12, 12),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
635
		},
Felix Lange's avatar
Felix Lange committed
636
		PUSH13: {
637 638 639 640
			execute:     makePush(13, 13),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
641
		},
Felix Lange's avatar
Felix Lange committed
642
		PUSH14: {
643 644 645 646
			execute:     makePush(14, 14),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
647
		},
Felix Lange's avatar
Felix Lange committed
648
		PUSH15: {
649 650 651 652
			execute:     makePush(15, 15),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
653
		},
Felix Lange's avatar
Felix Lange committed
654
		PUSH16: {
655 656 657 658
			execute:     makePush(16, 16),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
659
		},
Felix Lange's avatar
Felix Lange committed
660
		PUSH17: {
661 662 663 664
			execute:     makePush(17, 17),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
665
		},
Felix Lange's avatar
Felix Lange committed
666
		PUSH18: {
667 668 669 670
			execute:     makePush(18, 18),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
671
		},
Felix Lange's avatar
Felix Lange committed
672
		PUSH19: {
673 674 675 676
			execute:     makePush(19, 19),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
677
		},
Felix Lange's avatar
Felix Lange committed
678
		PUSH20: {
679 680 681 682
			execute:     makePush(20, 20),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
683
		},
Felix Lange's avatar
Felix Lange committed
684
		PUSH21: {
685 686 687 688
			execute:     makePush(21, 21),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
689
		},
Felix Lange's avatar
Felix Lange committed
690
		PUSH22: {
691 692 693 694
			execute:     makePush(22, 22),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
695
		},
Felix Lange's avatar
Felix Lange committed
696
		PUSH23: {
697 698 699 700
			execute:     makePush(23, 23),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
701
		},
Felix Lange's avatar
Felix Lange committed
702
		PUSH24: {
703 704 705 706
			execute:     makePush(24, 24),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
707
		},
Felix Lange's avatar
Felix Lange committed
708
		PUSH25: {
709 710 711 712
			execute:     makePush(25, 25),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
713
		},
Felix Lange's avatar
Felix Lange committed
714
		PUSH26: {
715 716 717 718
			execute:     makePush(26, 26),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
719
		},
Felix Lange's avatar
Felix Lange committed
720
		PUSH27: {
721 722 723 724
			execute:     makePush(27, 27),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
725
		},
Felix Lange's avatar
Felix Lange committed
726
		PUSH28: {
727 728 729 730
			execute:     makePush(28, 28),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
731
		},
Felix Lange's avatar
Felix Lange committed
732
		PUSH29: {
733 734 735 736
			execute:     makePush(29, 29),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
737
		},
Felix Lange's avatar
Felix Lange committed
738
		PUSH30: {
739 740 741 742
			execute:     makePush(30, 30),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
743
		},
Felix Lange's avatar
Felix Lange committed
744
		PUSH31: {
745 746 747 748
			execute:     makePush(31, 31),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
749
		},
Felix Lange's avatar
Felix Lange committed
750
		PUSH32: {
751 752 753 754
			execute:     makePush(32, 32),
			constantGas: GasFastestStep,
			minStack:    minStack(0, 1),
			maxStack:    maxStack(0, 1),
755
		},
Felix Lange's avatar
Felix Lange committed
756
		DUP1: {
757 758 759 760
			execute:     makeDup(1),
			constantGas: GasFastestStep,
			minStack:    minDupStack(1),
			maxStack:    maxDupStack(1),
761
		},
Felix Lange's avatar
Felix Lange committed
762
		DUP2: {
763 764 765 766
			execute:     makeDup(2),
			constantGas: GasFastestStep,
			minStack:    minDupStack(2),
			maxStack:    maxDupStack(2),
767
		},
Felix Lange's avatar
Felix Lange committed
768
		DUP3: {
769 770 771 772
			execute:     makeDup(3),
			constantGas: GasFastestStep,
			minStack:    minDupStack(3),
			maxStack:    maxDupStack(3),
773
		},
Felix Lange's avatar
Felix Lange committed
774
		DUP4: {
775 776 777 778
			execute:     makeDup(4),
			constantGas: GasFastestStep,
			minStack:    minDupStack(4),
			maxStack:    maxDupStack(4),
779
		},
Felix Lange's avatar
Felix Lange committed
780
		DUP5: {
781 782 783 784
			execute:     makeDup(5),
			constantGas: GasFastestStep,
			minStack:    minDupStack(5),
			maxStack:    maxDupStack(5),
785
		},
Felix Lange's avatar
Felix Lange committed
786
		DUP6: {
787 788 789 790
			execute:     makeDup(6),
			constantGas: GasFastestStep,
			minStack:    minDupStack(6),
			maxStack:    maxDupStack(6),
791
		},
Felix Lange's avatar
Felix Lange committed
792
		DUP7: {
793 794 795 796
			execute:     makeDup(7),
			constantGas: GasFastestStep,
			minStack:    minDupStack(7),
			maxStack:    maxDupStack(7),
797
		},
Felix Lange's avatar
Felix Lange committed
798
		DUP8: {
799 800 801 802
			execute:     makeDup(8),
			constantGas: GasFastestStep,
			minStack:    minDupStack(8),
			maxStack:    maxDupStack(8),
803
		},
Felix Lange's avatar
Felix Lange committed
804
		DUP9: {
805 806 807 808
			execute:     makeDup(9),
			constantGas: GasFastestStep,
			minStack:    minDupStack(9),
			maxStack:    maxDupStack(9),
809
		},
Felix Lange's avatar
Felix Lange committed
810
		DUP10: {
811 812 813 814
			execute:     makeDup(10),
			constantGas: GasFastestStep,
			minStack:    minDupStack(10),
			maxStack:    maxDupStack(10),
815
		},
Felix Lange's avatar
Felix Lange committed
816
		DUP11: {
817 818 819 820
			execute:     makeDup(11),
			constantGas: GasFastestStep,
			minStack:    minDupStack(11),
			maxStack:    maxDupStack(11),
821
		},
Felix Lange's avatar
Felix Lange committed
822
		DUP12: {
823 824 825 826
			execute:     makeDup(12),
			constantGas: GasFastestStep,
			minStack:    minDupStack(12),
			maxStack:    maxDupStack(12),
827
		},
Felix Lange's avatar
Felix Lange committed
828
		DUP13: {
829 830 831 832
			execute:     makeDup(13),
			constantGas: GasFastestStep,
			minStack:    minDupStack(13),
			maxStack:    maxDupStack(13),
833
		},
Felix Lange's avatar
Felix Lange committed
834
		DUP14: {
835 836 837 838
			execute:     makeDup(14),
			constantGas: GasFastestStep,
			minStack:    minDupStack(14),
			maxStack:    maxDupStack(14),
839
		},
Felix Lange's avatar
Felix Lange committed
840
		DUP15: {
841 842 843 844
			execute:     makeDup(15),
			constantGas: GasFastestStep,
			minStack:    minDupStack(15),
			maxStack:    maxDupStack(15),
845
		},
Felix Lange's avatar
Felix Lange committed
846
		DUP16: {
847 848 849 850
			execute:     makeDup(16),
			constantGas: GasFastestStep,
			minStack:    minDupStack(16),
			maxStack:    maxDupStack(16),
851 852
		},
		SWAP1: {
853 854 855 856
			execute:     makeSwap(1),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(2),
			maxStack:    maxSwapStack(2),
857 858
		},
		SWAP2: {
859 860 861 862
			execute:     makeSwap(2),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(3),
			maxStack:    maxSwapStack(3),
863 864
		},
		SWAP3: {
865 866 867 868
			execute:     makeSwap(3),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(4),
			maxStack:    maxSwapStack(4),
869 870
		},
		SWAP4: {
871 872 873 874
			execute:     makeSwap(4),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(5),
			maxStack:    maxSwapStack(5),
875 876
		},
		SWAP5: {
877 878 879 880
			execute:     makeSwap(5),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(6),
			maxStack:    maxSwapStack(6),
881 882
		},
		SWAP6: {
883 884 885 886
			execute:     makeSwap(6),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(7),
			maxStack:    maxSwapStack(7),
887 888
		},
		SWAP7: {
889 890 891 892
			execute:     makeSwap(7),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(8),
			maxStack:    maxSwapStack(8),
893 894
		},
		SWAP8: {
895 896 897 898
			execute:     makeSwap(8),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(9),
			maxStack:    maxSwapStack(9),
899 900
		},
		SWAP9: {
901 902 903 904
			execute:     makeSwap(9),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(10),
			maxStack:    maxSwapStack(10),
905 906
		},
		SWAP10: {
907 908 909 910
			execute:     makeSwap(10),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(11),
			maxStack:    maxSwapStack(11),
911 912
		},
		SWAP11: {
913 914 915 916
			execute:     makeSwap(11),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(12),
			maxStack:    maxSwapStack(12),
917 918
		},
		SWAP12: {
919 920 921 922
			execute:     makeSwap(12),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(13),
			maxStack:    maxSwapStack(13),
923 924
		},
		SWAP13: {
925 926 927 928
			execute:     makeSwap(13),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(14),
			maxStack:    maxSwapStack(14),
929 930
		},
		SWAP14: {
931 932 933 934
			execute:     makeSwap(14),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(15),
			maxStack:    maxSwapStack(15),
935 936
		},
		SWAP15: {
937 938 939 940
			execute:     makeSwap(15),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(16),
			maxStack:    maxSwapStack(16),
941 942
		},
		SWAP16: {
943 944 945 946
			execute:     makeSwap(16),
			constantGas: GasFastestStep,
			minStack:    minSwapStack(17),
			maxStack:    maxSwapStack(17),
947 948
		},
		LOG0: {
949 950 951 952 953 954
			execute:    makeLog(0),
			dynamicGas: makeGasLog(0),
			minStack:   minStack(2, 0),
			maxStack:   maxStack(2, 0),
			memorySize: memoryLog,
			writes:     true,
955 956
		},
		LOG1: {
957 958 959 960 961 962
			execute:    makeLog(1),
			dynamicGas: makeGasLog(1),
			minStack:   minStack(3, 0),
			maxStack:   maxStack(3, 0),
			memorySize: memoryLog,
			writes:     true,
963 964
		},
		LOG2: {
965 966 967 968 969 970
			execute:    makeLog(2),
			dynamicGas: makeGasLog(2),
			minStack:   minStack(4, 0),
			maxStack:   maxStack(4, 0),
			memorySize: memoryLog,
			writes:     true,
971 972
		},
		LOG3: {
973 974 975 976 977 978
			execute:    makeLog(3),
			dynamicGas: makeGasLog(3),
			minStack:   minStack(5, 0),
			maxStack:   maxStack(5, 0),
			memorySize: memoryLog,
			writes:     true,
979 980
		},
		LOG4: {
981 982 983 984 985 986
			execute:    makeLog(4),
			dynamicGas: makeGasLog(4),
			minStack:   minStack(6, 0),
			maxStack:   maxStack(6, 0),
			memorySize: memoryLog,
			writes:     true,
987 988
		},
		CREATE: {
989 990 991 992 993 994 995 996
			execute:     opCreate,
			constantGas: params.CreateGas,
			dynamicGas:  gasCreate,
			minStack:    minStack(3, 1),
			maxStack:    maxStack(3, 1),
			memorySize:  memoryCreate,
			writes:      true,
			returns:     true,
997 998
		},
		CALL: {
999 1000 1001 1002 1003 1004 1005
			execute:     opCall,
			constantGas: params.CallGasFrontier,
			dynamicGas:  gasCall,
			minStack:    minStack(7, 1),
			maxStack:    maxStack(7, 1),
			memorySize:  memoryCall,
			returns:     true,
1006 1007
		},
		CALLCODE: {
1008 1009 1010 1011 1012 1013 1014
			execute:     opCallCode,
			constantGas: params.CallGasFrontier,
			dynamicGas:  gasCallCode,
			minStack:    minStack(7, 1),
			maxStack:    maxStack(7, 1),
			memorySize:  memoryCall,
			returns:     true,
1015 1016
		},
		RETURN: {
1017 1018 1019 1020 1021 1022
			execute:    opReturn,
			dynamicGas: gasReturn,
			minStack:   minStack(2, 0),
			maxStack:   maxStack(2, 0),
			memorySize: memoryReturn,
			halts:      true,
1023 1024
		},
		SELFDESTRUCT: {
1025
			execute:    opSuicide,
1026
			dynamicGas: gasSelfdestruct,
1027 1028 1029 1030
			minStack:   minStack(1, 0),
			maxStack:   maxStack(1, 0),
			halts:      true,
			writes:     true,
1031
		},
1032
	}
1033
}