@tokamak-zk-evm/synthesizer
Version:
Tokamak zk-EVM Synthesizer - Processes Ethereum transactions into wire maps for Tokamak zk-SNARK proof generation
169 lines (167 loc) • 11.6 kB
text/typescript
// Generated using a script, which can be found in ./evm/scripts/stackDeltaGenerator.ts
export const stackDelta: {
[key: number]: {
inputs: number // Number of inputs to this operation
outputs: number // Number of outputs after this operation
name: string // Name of the opcode
intermediates: number // Intermediate bytes (such as 2 intermediates after a PUSH2)
terminating?: boolean // Marks the opcode as terminating. This opcode will exit the current CALL frame. (Such as STOP/RETURN)
}
} = {
0x00: { inputs: 0, outputs: 0, name: 'STOP', intermediates: 0, terminating: true },
0x01: { inputs: 2, outputs: 1, name: 'ADD', intermediates: 0 },
0x02: { inputs: 2, outputs: 1, name: 'MUL', intermediates: 0 },
0x03: { inputs: 2, outputs: 1, name: 'SUB', intermediates: 0 },
0x04: { inputs: 2, outputs: 1, name: 'DIV', intermediates: 0 },
0x05: { inputs: 2, outputs: 1, name: 'SDIV', intermediates: 0 },
0x06: { inputs: 2, outputs: 1, name: 'MOD', intermediates: 0 },
0x07: { inputs: 2, outputs: 1, name: 'SMOD', intermediates: 0 },
0x08: { inputs: 3, outputs: 1, name: 'ADDMOD', intermediates: 0 },
0x09: { inputs: 3, outputs: 1, name: 'MULMOD', intermediates: 0 },
0x0a: { inputs: 2, outputs: 1, name: 'EXP', intermediates: 0 },
0x0b: { inputs: 2, outputs: 1, name: 'SIGNEXTEND', intermediates: 0 },
0x10: { inputs: 2, outputs: 1, name: 'LT', intermediates: 0 },
0x11: { inputs: 2, outputs: 1, name: 'GT', intermediates: 0 },
0x12: { inputs: 2, outputs: 1, name: 'SLT', intermediates: 0 },
0x13: { inputs: 2, outputs: 1, name: 'SGT', intermediates: 0 },
0x14: { inputs: 2, outputs: 1, name: 'EQ', intermediates: 0 },
0x15: { inputs: 1, outputs: 1, name: 'ISZERO', intermediates: 0 },
0x16: { inputs: 2, outputs: 1, name: 'AND', intermediates: 0 },
0x17: { inputs: 2, outputs: 1, name: 'OR', intermediates: 0 },
0x18: { inputs: 2, outputs: 1, name: 'XOR', intermediates: 0 },
0x19: { inputs: 1, outputs: 1, name: 'NOT', intermediates: 0 },
0x1a: { inputs: 2, outputs: 1, name: 'BYTE', intermediates: 0 },
0x1b: { inputs: 2, outputs: 1, name: 'SHL', intermediates: 0 },
0x1c: { inputs: 2, outputs: 1, name: 'SHR', intermediates: 0 },
0x1d: { inputs: 2, outputs: 1, name: 'SAR', intermediates: 0 },
0x20: { inputs: 2, outputs: 1, name: 'SHA3', intermediates: 0 },
0x30: { inputs: 0, outputs: 1, name: 'ADDRESS', intermediates: 0 },
0x31: { inputs: 1, outputs: 1, name: 'BALANCE', intermediates: 0 },
0x32: { inputs: 0, outputs: 1, name: 'ORIGIN', intermediates: 0 },
0x33: { inputs: 0, outputs: 1, name: 'CALLER', intermediates: 0 },
0x34: { inputs: 0, outputs: 1, name: 'CALLVALUE', intermediates: 0 },
0x35: { inputs: 1, outputs: 1, name: 'CALLDATALOAD', intermediates: 0 },
0x36: { inputs: 0, outputs: 1, name: 'CALLDATASIZE', intermediates: 0 },
0x37: { inputs: 3, outputs: 0, name: 'CALLDATACOPY', intermediates: 0 },
0x3a: { inputs: 0, outputs: 1, name: 'GASPRICE', intermediates: 0 },
0x3d: { inputs: 0, outputs: 1, name: 'RETURNDATASIZE', intermediates: 0 },
0x3e: { inputs: 3, outputs: 0, name: 'RETURNDATACOPY', intermediates: 0 },
0x40: { inputs: 1, outputs: 1, name: 'BLOCKHASH', intermediates: 0 },
0x41: { inputs: 0, outputs: 1, name: 'COINBASE', intermediates: 0 },
0x42: { inputs: 0, outputs: 1, name: 'TIMESTAMP', intermediates: 0 },
0x43: { inputs: 0, outputs: 1, name: 'NUMBER', intermediates: 0 },
0x44: { inputs: 0, outputs: 1, name: 'PREVRANDAO', intermediates: 0 },
0x45: { inputs: 0, outputs: 1, name: 'GASLIMIT', intermediates: 0 },
0x46: { inputs: 0, outputs: 1, name: 'CHAINID', intermediates: 0 },
0x47: { inputs: 0, outputs: 1, name: 'SELFBALANCE', intermediates: 0 },
0x48: { inputs: 0, outputs: 1, name: 'BASEFEE', intermediates: 0 },
0x49: { inputs: 1, outputs: 1, name: 'BLOBAHASH', intermediates: 0 },
0x4a: { inputs: 0, outputs: 1, name: 'BLOBBASEFEE', intermediates: 0 },
0x50: { inputs: 1, outputs: 0, name: 'POP', intermediates: 0 },
0x51: { inputs: 1, outputs: 1, name: 'MLOAD', intermediates: 0 },
0x52: { inputs: 2, outputs: 0, name: 'MSTORE', intermediates: 0 },
0x53: { inputs: 2, outputs: 0, name: 'MSTORE8', intermediates: 0 },
0x54: { inputs: 1, outputs: 1, name: 'SLOAD', intermediates: 0 },
0x55: { inputs: 2, outputs: 0, name: 'SSTORE', intermediates: 0 },
0x59: { inputs: 0, outputs: 1, name: 'MSIZE', intermediates: 0 },
0x5b: { inputs: 0, outputs: 0, name: 'NOOP', intermediates: 0 },
0x5c: { inputs: 1, outputs: 1, name: 'TLOAD', intermediates: 0 },
0x5d: { inputs: 2, outputs: 0, name: 'TSTORE', intermediates: 0 },
0x5e: { inputs: 3, outputs: 0, name: 'MCOPY', intermediates: 0 },
0x5f: { inputs: 0, outputs: 1, name: 'PUSH0', intermediates: 0 },
0x60: { inputs: 0, outputs: 1, name: 'PUSH1', intermediates: 1 },
0x61: { inputs: 0, outputs: 1, name: 'PUSH2', intermediates: 2 },
0x62: { inputs: 0, outputs: 1, name: 'PUSH3', intermediates: 3 },
0x63: { inputs: 0, outputs: 1, name: 'PUSH4', intermediates: 4 },
0x64: { inputs: 0, outputs: 1, name: 'PUSH5', intermediates: 5 },
0x65: { inputs: 0, outputs: 1, name: 'PUSH6', intermediates: 6 },
0x66: { inputs: 0, outputs: 1, name: 'PUSH7', intermediates: 7 },
0x67: { inputs: 0, outputs: 1, name: 'PUSH8', intermediates: 8 },
0x68: { inputs: 0, outputs: 1, name: 'PUSH9', intermediates: 9 },
0x69: { inputs: 0, outputs: 1, name: 'PUSH10', intermediates: 10 },
0x6a: { inputs: 0, outputs: 1, name: 'PUSH11', intermediates: 11 },
0x6b: { inputs: 0, outputs: 1, name: 'PUSH12', intermediates: 12 },
0x6c: { inputs: 0, outputs: 1, name: 'PUSH13', intermediates: 13 },
0x6d: { inputs: 0, outputs: 1, name: 'PUSH14', intermediates: 14 },
0x6e: { inputs: 0, outputs: 1, name: 'PUSH15', intermediates: 15 },
0x6f: { inputs: 0, outputs: 1, name: 'PUSH16', intermediates: 16 },
0x70: { inputs: 0, outputs: 1, name: 'PUSH17', intermediates: 17 },
0x71: { inputs: 0, outputs: 1, name: 'PUSH18', intermediates: 18 },
0x72: { inputs: 0, outputs: 1, name: 'PUSH19', intermediates: 19 },
0x73: { inputs: 0, outputs: 1, name: 'PUSH20', intermediates: 20 },
0x74: { inputs: 0, outputs: 1, name: 'PUSH21', intermediates: 21 },
0x75: { inputs: 0, outputs: 1, name: 'PUSH22', intermediates: 22 },
0x76: { inputs: 0, outputs: 1, name: 'PUSH23', intermediates: 23 },
0x77: { inputs: 0, outputs: 1, name: 'PUSH24', intermediates: 24 },
0x78: { inputs: 0, outputs: 1, name: 'PUSH25', intermediates: 25 },
0x79: { inputs: 0, outputs: 1, name: 'PUSH26', intermediates: 26 },
0x7a: { inputs: 0, outputs: 1, name: 'PUSH27', intermediates: 27 },
0x7b: { inputs: 0, outputs: 1, name: 'PUSH28', intermediates: 28 },
0x7c: { inputs: 0, outputs: 1, name: 'PUSH29', intermediates: 29 },
0x7d: { inputs: 0, outputs: 1, name: 'PUSH30', intermediates: 30 },
0x7e: { inputs: 0, outputs: 1, name: 'PUSH31', intermediates: 31 },
0x7f: { inputs: 0, outputs: 1, name: 'PUSH32', intermediates: 32 },
0x80: { inputs: 1, outputs: 2, name: 'DUP1', intermediates: 0 },
0x81: { inputs: 2, outputs: 3, name: 'DUP2', intermediates: 0 },
0x82: { inputs: 3, outputs: 4, name: 'DUP3', intermediates: 0 },
0x83: { inputs: 4, outputs: 5, name: 'DUP4', intermediates: 0 },
0x84: { inputs: 5, outputs: 6, name: 'DUP5', intermediates: 0 },
0x85: { inputs: 6, outputs: 7, name: 'DUP6', intermediates: 0 },
0x86: { inputs: 7, outputs: 8, name: 'DUP7', intermediates: 0 },
0x87: { inputs: 8, outputs: 9, name: 'DUP8', intermediates: 0 },
0x88: { inputs: 9, outputs: 10, name: 'DUP9', intermediates: 0 },
0x89: { inputs: 10, outputs: 11, name: 'DUP10', intermediates: 0 },
0x8a: { inputs: 11, outputs: 12, name: 'DUP11', intermediates: 0 },
0x8b: { inputs: 12, outputs: 13, name: 'DUP12', intermediates: 0 },
0x8c: { inputs: 13, outputs: 14, name: 'DUP13', intermediates: 0 },
0x8d: { inputs: 14, outputs: 15, name: 'DUP14', intermediates: 0 },
0x8e: { inputs: 15, outputs: 16, name: 'DUP15', intermediates: 0 },
0x8f: { inputs: 16, outputs: 17, name: 'DUP16', intermediates: 0 },
0x90: { inputs: 2, outputs: 2, name: 'SWAP1', intermediates: 0 },
0x91: { inputs: 3, outputs: 3, name: 'SWAP2', intermediates: 0 },
0x92: { inputs: 4, outputs: 4, name: 'SWAP3', intermediates: 0 },
0x93: { inputs: 5, outputs: 5, name: 'SWAP4', intermediates: 0 },
0x94: { inputs: 6, outputs: 6, name: 'SWAP5', intermediates: 0 },
0x95: { inputs: 7, outputs: 7, name: 'SWAP6', intermediates: 0 },
0x96: { inputs: 8, outputs: 8, name: 'SWAP7', intermediates: 0 },
0x97: { inputs: 9, outputs: 9, name: 'SWAP8', intermediates: 0 },
0x98: { inputs: 10, outputs: 10, name: 'SWAP9', intermediates: 0 },
0x99: { inputs: 11, outputs: 11, name: 'SWAP10', intermediates: 0 },
0x9a: { inputs: 12, outputs: 12, name: 'SWAP11', intermediates: 0 },
0x9b: { inputs: 13, outputs: 13, name: 'SWAP12', intermediates: 0 },
0x9c: { inputs: 14, outputs: 14, name: 'SWAP13', intermediates: 0 },
0x9d: { inputs: 15, outputs: 15, name: 'SWAP14', intermediates: 0 },
0x9e: { inputs: 16, outputs: 16, name: 'SWAP15', intermediates: 0 },
0x9f: { inputs: 17, outputs: 17, name: 'SWAP16', intermediates: 0 },
0xa0: { inputs: 2, outputs: 0, name: 'LOG0', intermediates: 0 },
0xa1: { inputs: 3, outputs: 0, name: 'LOG1', intermediates: 0 },
0xa2: { inputs: 4, outputs: 0, name: 'LOG2', intermediates: 0 },
0xa3: { inputs: 5, outputs: 0, name: 'LOG3', intermediates: 0 },
0xa4: { inputs: 6, outputs: 0, name: 'LOG4', intermediates: 0 },
0xd0: { inputs: 1, outputs: 1, name: 'DATALOAD', intermediates: 0 },
0xd1: { inputs: 0, outputs: 1, name: 'DATALOADN', intermediates: 2 },
0xd2: { inputs: 0, outputs: 1, name: 'DATASIZE', intermediates: 0 },
0xd3: { inputs: 3, outputs: 0, name: 'DATACOPY', intermediates: 0 },
0xe0: { inputs: 0, outputs: 0, name: 'RJUMP', intermediates: 2 },
0xe1: { inputs: 1, outputs: 0, name: 'RJUMPI', intermediates: 2 },
// NOTE: for RJUMPV the intermediate byte is set to 0, this has to do with the validation algorithm specifics
// This has to do with the dynamic intermediate size of RJUMPV, which depends upon the table size byte right after RJUMPV
0xe2: { inputs: 1, outputs: 0, name: 'RJUMPV', intermediates: 0 },
// CALLF special case for stack validation algorithm: the inputs and outputs MUST stay 0
// (this is currently the case also in EVM)
0xe3: { inputs: 0, outputs: 0, name: 'CALLF', intermediates: 2 },
0xe4: { inputs: 0, outputs: 0, name: 'RETF', intermediates: 0, terminating: true },
0xe5: { inputs: 0, outputs: 0, name: 'JUMPF', intermediates: 2, terminating: true },
0xe6: { inputs: 0, outputs: 1, name: 'DUPN', intermediates: 1 },
0xe7: { inputs: 0, outputs: 0, name: 'SWAPN', intermediates: 1 },
0xe8: { inputs: 0, outputs: 0, name: 'EXCHANGE', intermediates: 1 },
0xec: { inputs: 4, outputs: 1, name: 'EOFCREATE', intermediates: 1 },
0xee: { inputs: 2, outputs: 0, name: 'RETURNCONTRACT', intermediates: 1, terminating: true },
0xf3: { inputs: 2, outputs: 0, name: 'RETURN', intermediates: 0, terminating: true },
0xf7: { inputs: 1, outputs: 1, name: 'RETURNDATALOAD', intermediates: 0 },
0xf8: { inputs: 4, outputs: 1, name: 'EXTCALL', intermediates: 0 },
0xf9: { inputs: 3, outputs: 1, name: 'EXTDELEGATECALL', intermediates: 0 },
0xfb: { inputs: 3, outputs: 1, name: 'EXTSTATICCALL', intermediates: 0 },
0xfd: { inputs: 2, outputs: 0, name: 'REVERT', intermediates: 0, terminating: true },
0xfe: { inputs: 0, outputs: 0, name: 'INVALID', intermediates: 0, terminating: true },
}