From 58b5aa5f3940f091d8609010690510ca0629f482 Mon Sep 17 00:00:00 2001 From: andri lim Date: Wed, 30 Jan 2019 19:29:04 +0700 Subject: [PATCH] implement macro_assembler and opcodes test suite --- tests/all_tests.nim | 7 +- tests/macro_assembler.nim | 552 +++++++++++++++++++++++++ tests/test_op_arith.nim | 343 ++++++++++++++++ tests/test_op_bit.nim | 654 +++++++++++++++++++++++++++++ tests/test_op_custom.nim | 306 ++++++++++++++ tests/test_op_env.nim | 306 ++++++++++++++ tests/test_op_memory.nim | 840 ++++++++++++++++++++++++++++++++++++++ tests/test_op_misc.nim | 176 ++++++++ 8 files changed, 3183 insertions(+), 1 deletion(-) create mode 100644 tests/macro_assembler.nim create mode 100644 tests/test_op_arith.nim create mode 100644 tests/test_op_bit.nim create mode 100644 tests/test_op_custom.nim create mode 100644 tests/test_op_env.nim create mode 100644 tests/test_op_memory.nim create mode 100644 tests/test_op_misc.nim diff --git a/tests/all_tests.nim b/tests/all_tests.nim index 2e57b36ec..c3fa9b9fa 100644 --- a/tests/all_tests.nim +++ b/tests/all_tests.nim @@ -16,4 +16,9 @@ import ./test_code_stream, ./test_generalstate_json, ./test_tracer_json, ./test_persistblock_json, - ./test_rpc + ./test_rpc, + ./test_op_arith, + ./test_op_bit, + ./test_op_env, + ./test_op_memory, + ./test_op_misc \ No newline at end of file diff --git a/tests/macro_assembler.nim b/tests/macro_assembler.nim new file mode 100644 index 000000000..ec88b64f6 --- /dev/null +++ b/tests/macro_assembler.nim @@ -0,0 +1,552 @@ +import + macros, strutils, unittest, byteutils, chronicles, + ../nimbus/vm/interpreter/opcode_values, ranges, eth_common + +import + options, json, os, eth_trie/[db, hexary], + ../nimbus/[vm_state, tracer, vm_types, transaction], + ../nimbus/db/[db_chain, state_db], + ../nimbus/vm_state_transactions, + ../nimbus/vm/interpreter/[vm_forks, gas_costs], + ../nimbus/utils/addresses, + ../nimbus/vm/[message, computation, memory] + +export opcode_values, byteutils +{.experimental: "dynamicBindSym".} + +type + VMWord* = array[32, byte] + Storage* = tuple[key, val: VMWord] + + Assembler* = object + title*: string + stack*: seq[VMWord] + memory*: seq[VMWord] + storage*: seq[Storage] + code*: seq[byte] + logs*: seq[Log] + success*: bool + gasLimit*: GasInt + gasUsed*: GasInt + data*: seq[byte] + output*: seq[byte] + + OpcodeDesc = object + numParams: int + +var + g_asm {.compileTime.}: Assembler + g_code {.compileTime.}: NimNode + g_lookup {.compileTime.}: array[256, OpcodeDesc] + +proc writeLUT(opcode: Op, numParams: int) {.compileTime.} = + g_lookup[ord(opcode)] = OpcodeDesc(numParams: numParams) + +proc initializeLUT() {.compileTime.} = + writeLUT(Stop, 0) + writeLUT(Add, 2) + writeLUT(Mul, 2) + writeLUT(Sub, 2) + writeLUT(Div, 2) + writeLUT(Sdiv, 2) + writeLUT(Mod, 2) + writeLUT(Smod, 2) + writeLUT(Addmod, 3) + writeLUT(Mulmod, 3) + writeLUT(Exp, 2) + writeLUT(SignExtend, 2) + + writeLUT(Lt, 2) + writeLUT(Gt, 2) + writeLUT(Slt, 2) + writeLUT(Sgt, 2) + writeLUT(Eq, 2) + writeLUT(IsZero, 1) + writeLUT(And, 2) + writeLUT(Or, 2) + writeLUT(Xor, 2) + writeLUT(Not, 1) + writeLUT(Byte, 2) + + writeLUT(Sha3, 2) + + writeLUT(Address, 0) + writeLUT(Balance, 1) + writeLUT(Origin, 0) + writeLUT(Caller, 0) + writeLUT(CallValue, 0) + writeLUT(CallDataLoad, 1) + writeLUT(CallDataSize, 0) + writeLUT(CallDataCopy, 3) + writeLUT(CodeSize, 0) + writeLUT(CodeCopy, 3) + writeLUT(GasPrice, 0) + writeLUT(ExtCodeSize, 1) + writeLUT(ExtCodeCopy, 4) + writeLUT(ReturnDataSize, 0) + writeLUT(ReturnDataCopy, 3) + + writeLUT(Blockhash, 1) + writeLUT(Coinbase, 0) + writeLUT(Timestamp, 0) + writeLUT(Number, 0) + writeLUT(Difficulty, 0) + writeLUT(GasLimit, 0) + + writeLUT(Pop, 1) + writeLUT(Mload, 1) + writeLUT(Mstore, 2) + writeLUT(Mstore8, 2) + writeLUT(Sload, 1) + writeLUT(Sstore, 2) + writeLUT(Jump, 1) + writeLUT(JumpI, 2) + writeLUT(Pc, 0) + writeLUT(Msize, 0) + writeLUT(Gas, 0) + writeLUT(JumpDest, 0) + + for i in Push1 .. Push32: + writeLUT(i, 1) + + for i in Dup1 .. Dup16: + writeLUT(i, 0) + + for i in Swap1 .. Swap16: + writeLUT(i, 0) + + for i in Log0 .. Log4: + writeLUT(i, 0) + + writeLUT(Create, 3) + writeLUT(Call, 7) + writeLUT(CallCode, 7) + writeLUT(Return, 2) + writeLUT(DelegateCall, 6) + writeLUT(StaticCall, 6) + writeLUT(Revert, 2) + writeLUT(Invalid, 1) + writeLUT(SelfDestruct, 1) + +static: + initializeLUT() + +proc validateVMWord(val: string, n: NimNode): VMWord = + if val.len <= 2 or val.len > 66: + error("invalid hex string", n) + if not (val[0] == '0' and val[1] == 'x'): + error("invalid hex string", n) + let zerosLen = 64 - (val.len - 2) + let value = repeat('0', zerosLen) & val.substr(2) + hexToByteArray(value, result) + +proc validateVMWord(val: NimNode): VMWord = + val.expectKind(nnkStrLit) + validateVMWord(val.strVal, val) + +proc parseVMWords(list: NimNode): seq[VMWord] = + result = @[] + list.expectKind nnkStmtList + for val in list: + result.add validateVMWord(val) + +proc validateStorage(val: NimNode): Storage = + val.expectKind(nnkCall) + val[0].expectKind(nnkStrLit) + val[1].expectKind(nnkStmtList) + assert(val[1].len == 1) + val[1][0].expectKind(nnkStrLit) + result = (validateVMWord(val[0]), validateVMWord(val[1][0])) + +proc parseStorage(list: NimNode): seq[Storage] = + result = @[] + list.expectKind nnkStmtList + for val in list: + result.add validateStorage(val) + +proc parseSuccess(list: NimNode): bool = + list.expectKind nnkStmtList + list[0].expectKind(nnkIdent) + $list[0] == "true" + +proc parseData(list: NimNode): seq[byte] = + result = @[] + list.expectKind nnkStmtList + for n in list: + n.expectKind(nnkStrLit) + result.add hexToSeqByte(n.strVal) + +proc validateOpcode(sym: NimNode) = + let typ = getTypeInst(sym) + typ.expectKind(nnkSym) + if $typ != "Op": + error("unknown opcode '" & $sym & "'", sym) + +proc addOpCode(opcode: Op, node: NimNode, params: varargs[string]) = + let lut = g_lookup[opcode.ord] + if lut.numParams > 0 and params.len > 0: + if lut.numParams != params.len: + error("Opcode '" & $opcode & "' expect " & $lut.numParams & " params, but got " & $params.len, node) + case opcode + of Push1..Push32: + if params.len != 1: + error("expect 1 param, but got " & $params.len, node) + let paramWidth = (opcode.ord - 95) * 2 + var val = params[0] + if val[0] == '0' and val[1] == 'x': + val = val.substr(2) + if val.len != paramWidth: + error("expected param with " & $paramWidth & " hex digits, got " & $val.len, node) + g_asm.code.add byte(opcode) + g_asm.code.add hexToSeqByte(val) + else: + error("invalid hex format", node) + else: + if params.len > 0: + for i in countDown(params.len - 1, 0): + g_asm.code.add byte(Push32) + g_asm.code.add validateVMWord(params[i], node) + g_asm.code.add byte(opcode) + +proc addLiteral(node: NimNode, rawCode: string) = + if rawCode[0] == '0' and rawCode[1] == 'x': + let val = rawCode.substr(2) + g_asm.code.add hexToSeqByte(val) + else: + error("invalid hex format", node) + +proc generateVMProxy(boa: Assembler): NimNode = + let vmProxy = genSym(nskProc, "vmProxy") + var body = newStmtList() + let + boaIdent = ident("boa") + title = boa.title + success = ident(if boa.success: "true" else: "false") + code = boa.code.toHex() + blockNumber = ident("blockNumber") + chainDB = ident("chainDB") + gasLimit = boa.gasLimit + gasUsed = boa.gasUsed + data = boa.data.toHex() + output = boa.output.toHex() + + body.add quote do: + var `boaIdent`: Assembler + `boaIdent`.success = `success` + `boaIdent`.code = hexToSeqByte(`code`) + `boaIdent`.title = `title` + `boaIdent`.gasLimit = `gasLimit` + `boaIdent`.gasUsed = `gasUsed` + + if boa.data.len > 0: + body.add quote do: + `boaIdent`.data = hexToSeqByte(`data`) + + if boa.output.len > 0: + body.add quote do: + `boaIdent`.output = hexToSeqByte(`output`) + + if boa.stack.len > 0: + let len = boa.stack.len + body.add quote do: + `boaIdent`.stack = newSeq[VMWord](`len`) + + if boa.memory.len > 0: + let len = boa.memory.len + body.add quote do: + `boaIdent`.memory = newSeq[VMWord](`len`) + + if boa.storage.len > 0: + let len = boa.storage.len + body.add quote do: + `boaIdent`.storage = newSeq[Storage](`len`) + + for i, s in boa.stack: + let val = s.toHex() + body.add quote do: + hexToByteArray(`val`, `boaIdent`.stack[`i`]) + + for i, s in boa.memory: + let val = s.toHex() + body.add quote do: + hexToByteArray(`val`, `boaIdent`.memory[`i`]) + + for i, kv in boa.storage: + let key = kv[0].toHex() + let val = kv[1].toHex() + body.add quote do: + hexToByteArray(`key`, `boaIdent`.storage[`i`].key) + hexToByteArray(`val`, `boaIdent`.storage[`i`].val) + + if boa.logs.len > 0: + let len = boa.logs.len + body.add quote do: + `boaIdent`.logs = newSeq[Log](`len`) + + for i, log in boa.logs: + let address = log.address.toHex() + let data = log.data.toHex() + body.add quote do: + hexToByteArray(`address`, `boaIdent`.logs[`i`].address) + `boaIdent`.logs[`i`].data = hexToSeqByte(`data`) + if log.topics.len > 0: + let len = log.topics.len + body.add quote do: + `boaIdent`.logs[`i`].topics = newSeq[Topic](`len`) + for x, t in log.topics: + let topic = t.toHex() + body.add quote do: + hexToByteArray(`topic`, `boaIdent`.logs[`i`].topics[`x`]) + + body.add quote do: runVM(`blockNumber`, `chainDB`, `boaIdent`) + + result = quote do: + test `title`: + proc `vmProxy`(): bool = + `body` + check `vmProxy`() + + when defined(macro_assembler_debug): + echo result.toStrLit.strVal + +proc assemblerImpl(boa: var Assembler, codes: NimNode): NimNode = + g_code = codes + boa.code = @[] + codes.expectKind nnkStmtList + let macroName = genSym(nskMacro, "asmProxy") + var addStop = true + var body = newStmtList() + for pc, line in codes: + line.expectKind({nnkCommand, nnkIdent, nnkStrLit}) + if line.kind == nnkStrLit: + body.add quote do: + addLiteral(g_code[`pc`], `line`) + elif line.kind == nnkIdent: + let sym = bindSym(line) + validateOpcode(sym) + body.add quote do: + addOpCode(`sym`, g_code[`pc`]) + if pc == codes.len - 1: + if normalize($sym) == "stop": + addStop = false + elif line.kind == nnkCommand: + let ident = line[0] + let sym = bindSym(ident) + validateOpcode(sym) + var params = newNimNode(nnkBracket) + for i in 1 ..< line.len: + params.add line[i] + body.add quote do: + addOpCode(`sym`, g_code[`pc`], `params`) + else: + error("unknown syntax: " & line.toStrLit.strVal, line) + + let stop = ident("Stop") + if addStop: + body.add quote do: + addOpCode(`stop`, newEmptyNode()) + + let resIdent = ident("result") + + result = quote do: + macro `macroName`(): untyped = + `body` + `resIdent` = generateVMProxy(g_asm) + `macroName`() + + when defined(macro_assembler_debug): + echo result.toStrLit.strVal + +const + blockFile = "fixtures" / "PersistBlockTests" / "block47205.json" + +proc initComputation(vmState: BaseVMState, tx: Transaction, sender: EthAddress, data: seq[byte], forkOverride=none(Fork)) : BaseComputation = + assert tx.isContractCreation + + let fork = + if forkOverride.isSome: + forkOverride.get + else: + vmState.blockNumber.toFork + + let gasUsed = 0 #tx.payload.intrinsicGas.GasInt + gasFees[fork][GasTXCreate] + + let contractAddress = generateAddress(sender, tx.accountNonce) + let msg = newMessage(tx.gasLimit - gasUsed, tx.gasPrice, tx.to, sender, tx.value, data, tx.payload, + options = newMessageOptions(origin = sender, createAddress = contractAddress)) + + newBaseComputation(vmState, vmState.blockNumber, msg, some(fork)) + +proc initDatabase*(): (Uint256, BaseChainDB) = + let + node = json.parseFile(blockFile) + blockNumber = UInt256.fromHex(node["blockNumber"].getStr()) + memoryDB = newMemoryDB() + state = node["state"] + + for k, v in state: + let key = hexToSeqByte(k) + let value = hexToSeqByte(v.getStr()) + memoryDB.put(key, value) + + result = (blockNumber, newBaseChainDB(memoryDB, false)) + +proc initComputation(blockNumber: Uint256, chainDB: BaseChainDB, payload, data: seq[byte]): BaseComputation = + let + parentNumber = blockNumber - 1 + parent = chainDB.getBlockHeader(parentNumber) + header = chainDB.getBlockHeader(blockNumber) + headerHash = header.blockHash + body = chainDB.getBlockBody(headerHash) + vmState = newBaseVMState(parent, chainDB) + + var + tx = body.transactions[0] + sender = tracer.getSender(tx) + + tx.payload = payload + tx.gasLimit = 500000000 + initComputation(vmState, tx, sender, data, none(Fork)) + +proc runVM*(blockNumber: Uint256, chainDB: BaseChainDB, boa: Assembler): bool = + var computation = initComputation(blockNumber, chainDB, boa.code, boa.data) + + let gas = computation.gasMeter.gasRemaining + let computationResult = execComputation(computation) + let gasUsed = gas - computation.gasMeter.gasRemaining + + if computationResult: + if boa.success == false: + error "different success value", expected=boa.success, actual=true + return false + else: + if boa.success == true: + error "different success value", expected=boa.success, actual=false + return false + + if boa.stack.len != computation.stack.values.len: + error "different stack len", expected=boa.stack.len, actual=computation.stack.values.len + return false + + for i, v in computation.stack.values: + let actual = v.dumpHex() + let val = boa.stack[i].toHex() + if actual != val: + error "different stack value", idx=i, expected=val, actual=actual + return false + + const chunkLen = 32 + let numChunks = computation.memory.len div chunkLen + + if numChunks != boa.memory.len: + error "different memory len", expected=boa.memory.len, actual=numChunks + return false + + for i in 0 ..< numChunks: + let actual = computation.memory.bytes.toOpenArray(i * chunkLen, (i + 1) * chunkLen - 1).toHex() + let mem = boa.memory[i].toHex() + if mem != actual: + error "different memory value", idx=i, expected=mem, actual=actual + return false + + var + stateDB = computation.vmState.accountDb + account = stateDB.getAccount(computation.msg.storageAddress) + trie = initSecureHexaryTrie(chainDB.db, account.storageRoot) + + for kv in boa.storage: + let key = kv[0].toHex() + let val = kv[1].toHex() + let keyBytes = (@(kv[0])).toRange + let actual = trie.get(keyBytes).toOpenArray().toHex() + let zerosLen = 64 - (actual.len) + let value = repeat('0', zerosLen) & actual + if val != value: + error "storage has different value", key=key, expected=val, actual=value + return false + + let logs = computation.vmState.logEntries + if logs.len != boa.logs.len: + error "different logs len", expected=boa.logs.len, actual=logs.len + return false + + for i, log in boa.logs: + let eAddr = log.address.toHex() + let aAddr = logs[i].address.toHex() + if eAddr != aAddr: + error "different address", expected=eAddr, actual=aAddr, idx=i + return false + let eData = log.data.toHex() + let aData = logs[i].data.toHex() + if eData != aData: + error "different data", expected=eData, actual=aData, idx=i + return false + if log.topics.len != logs[i].topics.len: + error "different topics len", expected=log.topics.len, actual=logs[i].topics.len, idx=i + return false + for x, t in log.topics: + let eTopic = t.toHex() + let aTopic = logs[i].topics[x].toHex() + if eTopic != aTopic: + error "different topic in log entry", expected=eTopic, actual=aTopic, logIdx=i, topicIdx=x + return false + + if boa.output.len > 0: + let actual = computation.output.toHex() + let expected = boa.output.toHex() + if expected != actual: + error "different output detected", expected=expected, actual=actual + return false + + result = true + +proc parseLog(node: NimNode): Log = + node.expectKind(nnkPar) + for item in node: + item.expectKind(nnkExprColonExpr) + let label = item[0].strVal + let body = item[1] + case label.normalize + of "address": + body.expectKind(nnkStrLit) + let value = body.strVal + if value.len < 20: + error("bad address format", body) + hexToByteArray(value, result.address) + of "topics": + body.expectKind(nnkBracket) + for x in body: + result.topics.add validateVMWord(x.strVal, x) + of "data": + result.data = hexToSeqByte(body.strVal) + else:error("unknown log section '" & label & "'", item[0]) + +proc parseLogs(list: NimNode): seq[Log] = + result = @[] + list.expectKind nnkStmtList + for n in list: + result.add parseLog(n) + +macro assembler*(list: untyped): untyped = + var boa: Assembler + boa.success = true + list.expectKind nnkStmtList + for callSection in list: + callSection.expectKind(nnkCall) + let label = callSection[0].strVal + let body = callSection[1] + case label.normalize + of "title": + let title = body[0] + title.expectKind(nnkStrLit) + boa.title = title.strVal + of "code" : result = assemblerImpl(boa, body) + of "memory": boa.memory = parseVMWords(body) + of "stack" : boa.stack = parseVMWords(body) + of "storage": boa.storage = parseStorage(body) + of "logs": boa.logs = parseLogs(body) + of "success": boa.success = parseSuccess(body) + of "data": boa.data = parseData(body) + of "output": boa.output = parseData(body) + else: error("unknown section '" & label & "'", callSection[0]) + g_asm = boa diff --git a/tests/test_op_arith.nim b/tests/test_op_arith.nim new file mode 100644 index 000000000..cfafaca7f --- /dev/null +++ b/tests/test_op_arith.nim @@ -0,0 +1,343 @@ +import macro_assembler, unittest + +suite "Arithmetic Opcodes": + let (blockNumber, chainDB) = initDatabase() + + assembler: + title: "ADD_1" + code: + PUSH1 "0x02" + PUSH1 "0x02" + ADD + stack: "0x04" + + assembler: + title: "ADD_2" + code: + PUSH2 "0x1002" + PUSH1 "0x02" + ADD + stack: "0x1004" + + assembler: + title: "ADD_3" + code: + PUSH2 "0x1002" + PUSH6 "0x123456789009" + ADD + stack: "0x12345678A00B" + + assembler: + title: "ADD_4" + code: + PUSH2 "0x1234" + ADD + success: false + stack: "0x1234" + + assembler: + title: "ADDMOD_1" + code: + PUSH1 "0x02" + PUSH1 "0x02" + PUSH1 "0x03" + ADDMOD + stack: "0x01" + + assembler: + title: "ADDMOD_2" + code: + PUSH2 "0x1000" + PUSH1 "0x02" + PUSH2 "0x1002" + ADDMOD + PUSH1 "0x00" + stack: + "0x04" + "0x00" + + assembler: + title: "ADDMOD_3" + code: + PUSH2 "0x1002" + PUSH6 "0x123456789009" + PUSH1 "0x02" + ADDMOD + stack: "0x093B" + + assembler: + title: "ADDMOD_4" + code: + PUSH2 "0x1234" + ADDMOD + stack: "0x1234" + success: false + + assembler: + title: "MUL_1" + code: + PUSH1 "0x03" + PUSH1 "0x02" + MUL + stack: "0x06" + + assembler: + title: "MUL_2" + code: + PUSH3 "0x222222" + PUSH1 "0x03" + MUL + stack: "0x666666" + + assembler: + title: "MUL_3" + code: + PUSH3 "0x222222" + PUSH3 "0x333333" + MUL + stack: "0x6D3A05F92C6" + + assembler: + title: "MUL_4" + code: + PUSH1 "0x01" + MUL + stack: "0x01" + success: false + + assembler: # MULMOD OP + title: "MULMOD_2" + code: + PUSH3 "0x222222" + PUSH1 "0x03" + PUSH1 "0x04" + MULMOD + stack: "0x000000000000000000000000000000000000000000000000000000000000000C" + + assembler: # MULMOD OP + title: "MULMOD_3" + code: + PUSH3 "0x222222" + PUSH3 "0x333333" + PUSH3 "0x444444" + MULMOD + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # MULMOD OP mal + title: "MULMOD_4" + code: + PUSH1 "0x01" + MULMOD + success: false + stack: "0x01" + + assembler: # DIV OP + title: "DIV_1" + code: + PUSH1 "0x02" + PUSH1 "0x04" + DIV + stack: "0x0000000000000000000000000000000000000000000000000000000000000002" + + assembler: # DIV OP + title: "DIV_2" + code: + PUSH1 "0x33" + PUSH1 "0x99" + DIV + stack: "0x0000000000000000000000000000000000000000000000000000000000000003" + + assembler: # DIV OP + title: "DIV_3" + code: + PUSH1 "0x22" + PUSH1 "0x99" + DIV + stack: "0x0000000000000000000000000000000000000000000000000000000000000004" + + assembler: # DIV OP + title: "DIV_4" + code: + PUSH1 "0x15" + PUSH1 "0x99" + DIV + stack: "0x0000000000000000000000000000000000000000000000000000000000000007" + + assembler: # DIV OP + title: "DIV_5" + code: + PUSH1 "0x04" + PUSH1 "0x07" + DIV + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # DIV OP + title: "DIV_6" + code: + PUSH1 "0x07" + DIV + success: false + stack: "0x07" + + assembler: # SDIV OP + title: "SDIV_1" + code: + PUSH2 "0x03E8" + PUSH32 "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC18" + SDIV + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + + assembler: # SDIV OP + title: "SDIV_2" + code: + PUSH1 "0xFF" + PUSH1 "0xFF" + SDIV + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # SDIV OP + title: "SDIV_3" + code: + PUSH1 "0x00" + PUSH1 "0xFF" + SDIV + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SDIV OP mal + title: "SDIV_4" + code: + PUSH1 "0xFF" + SDIV + success: false + stack: "0xFF" + + assembler: # SUB OP + title: "SUB_1" + code: + PUSH1 "0x04" + PUSH1 "0x06" + SUB + stack: "0x0000000000000000000000000000000000000000000000000000000000000002" + + assembler: # SUB OP + title: "SUB_2" + code: + PUSH2 "0x4444" + PUSH2 "0x6666" + SUB + stack: "0x0000000000000000000000000000000000000000000000000000000000002222" + + assembler: # SUB OP + title: "SUB_3" + code: + PUSH2 "0x4444" + PUSH4 "0x99996666" + SUB + stack: "0x0000000000000000000000000000000000000000000000000000000099992222" + + assembler: # SUB OP mal + title: "SUB_4" + code: + PUSH4 "0x99996666" + SUB + success: false + stack: "0x99996666" + + assembler: # EXP OP + title: "EXP_1" + code: + PUSH1 "0x03" + PUSH1 "0x02" + EXP + stack: "0x0000000000000000000000000000000000000000000000000000000000000008" + #assertEquals(4, gas); + + assembler: # EXP OP + title: "EXP_2" + code: + PUSH1 "0x00" + PUSH3 "0x123456" + EXP + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + #assertEquals(3, gas); + + assembler: # EXP OP + title: "EXP_3" + code: + PUSH2 "0x1122" + PUSH1 "0x01" + EXP + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + #assertEquals(5, gas); + + assembler: # EXP OP mal + title: "EXP_4" + code: + PUSH3 "0x123456" + EXP + success: false + stack: "0x123456" + + assembler: # MOD OP + title: "MOD_1" + code: + PUSH1 "0x03" + PUSH1 "0x04" + MOD + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # MOD OP + title: "MOD_2" + code: + PUSH2 "0x012C" + PUSH2 "0x01F4" + MOD + stack: "0x00000000000000000000000000000000000000000000000000000000000000C8" + + assembler: # MOD OP + title: "MOD_3" + code: + PUSH1 "0x04" + PUSH1 "0x02" + MOD + stack: "0x0000000000000000000000000000000000000000000000000000000000000002" + + assembler: # MOD OP mal + title: "MOD_4" + code: + PUSH1 "0x04" + MOD + success: false + stack: "0x04" + + assembler: # SMOD OP + title: "SMOD_1" + code: + PUSH1 "0x03" + PUSH1 "0x04" + SMOD + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # SMOD OP + title: "SMOD_2" + code: + PUSH32 "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2" # -30 + PUSH32 "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" # -170 + SMOD + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC" + + assembler: # SMOD OP + title: "SMOD_3" + code: + PUSH32 "0x000000000000000000000000000000000000000000000000000000000000001E" # 30 + PUSH32 "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" # -170 + SMOD + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC" + + assembler: # SMOD OP mal + title: "SMOD_4" + code: + PUSH32 "0x000000000000000000000000000000000000000000000000000000000000001E" # 30 + SMOD + success: false + stack: "0x000000000000000000000000000000000000000000000000000000000000001E" diff --git a/tests/test_op_bit.nim b/tests/test_op_bit.nim new file mode 100644 index 000000000..628b55d71 --- /dev/null +++ b/tests/test_op_bit.nim @@ -0,0 +1,654 @@ +import macro_assembler, unittest + +suite "Bitwise Opcodes": + let (blockNumber, chainDB) = initDatabase() + + assembler: # AND OP + title: "AND_1" + code: + PUSH1 "0x0A" + PUSH1 "0x0A" + AND + stack: "0x000000000000000000000000000000000000000000000000000000000000000A" + + assembler: # AND OP + title: "AND_2" + code: + PUSH1 "0xC0" + PUSH1 "0x0A" + AND + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # AND OP mal data + title: "AND_3" + code: + PUSH1 "0xC0" + AND + success: false + stack: "0xC0" + + assembler: # OR OP + title: "OR_1" + code: + PUSH1 "0xF0" + PUSH1 "0x0F" + OR + stack: "0x00000000000000000000000000000000000000000000000000000000000000FF" + + assembler: # OR OP + title: "OR_2" + code: + PUSH1 "0xC3" + PUSH1 "0x3C" + OR + stack: "0x00000000000000000000000000000000000000000000000000000000000000FF" + + assembler: # OR OP mal data + title: "OR_3" + code: + PUSH1 "0xC0" + OR + success: false + stack: "0xC0" + + assembler: # XOR OP + title: "XOR_1" + code: + PUSH1 "0xFF" + PUSH1 "0xFF" + XOR + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # XOR OP + title: "XOR_2" + code: + PUSH1 "0x0F" + PUSH1 "0xF0" + XOR + stack: "0x00000000000000000000000000000000000000000000000000000000000000FF" + + assembler: # XOR OP mal data + title: "XOR_3" + code: + PUSH1 "0xC0" + XOR + success: false + stack: "0xC0" + + assembler: # BYTE OP + title: "BYTE_1" + code: + PUSH6 "0xAABBCCDDEEFF" + PUSH1 "0x1E" + BYTE + stack: "0x00000000000000000000000000000000000000000000000000000000000000EE" + + assembler: # BYTE OP + title: "BYTE_2" + code: + PUSH6 "0xAABBCCDDEEFF" + PUSH1 "0x20" + BYTE + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # BYTE OP + title: "BYTE_3" + code: + PUSH6 "0xAABBCCDDEE3A" + PUSH1 "0x1F" + BYTE + stack: "0x000000000000000000000000000000000000000000000000000000000000003A" + + assembler: # BYTE OP mal data + title: "BYTE_4" + code: + PUSH6 "0xAABBCCDDEE3A" + BYTE + success: false + stack: "0xAABBCCDDEE3A" +#[ + assembler: # SHL OP + title: "SHL_1" + code: + PUSH32 "0x0000000000000000000000000000000000000000000000000000000000000001" + PUSH1 "0x00" + SHL + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # SHL OP + title: "SHL_2" + code: + PUSH32 "0x0000000000000000000000000000000000000000000000000000000000000001" + PUSH1 "0x01" SHL + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000002" + + assembler: # SHL OP + title: "SHL_3" + code: + PUSH32 "0x0000000000000000000000000000000000000000000000000000000000000001" + PUSH1 "0xff" + SHL + fork: constantinople + stack: "0x8000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SHL OP + title: "SHL_4" + code: + PUSH32 "0x0000000000000000000000000000000000000000000000000000000000000001" + PUSH2 "0x0100" + SHL + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SHL OP + title: "SHL_5" + code: + PUSH32 "0x0000000000000000000000000000000000000000000000000000000000000001" + PUSH2 "0x0101" + SHL + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SHL OP + title: "SHL_6" + code: + PUSH32 "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0x00" + SHL + fork: constantinople + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + + assembler: # SHL OP + title: "SHL_7" + code: + PUSH32 "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0x01" + SHL + fork: constantinople + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE" + + assembler: # SHL OP + title: "SHL_8" + code: + PUSH32 "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0xff" + SHL + fork: constantinople + stack: "0x8000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SHL OP + title: "SHL_9" + code: + PUSH32 "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH2 "0x0100" + SHL + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SHL OP + title: "SHL_10" + code: + PUSH32 "0x0000000000000000000000000000000000000000000000000000000000000000" + PUSH1 "0x01" + SHL + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SHL OP + title: "SHL_11" + code: + PUSH32 "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0x01" + SHL + fork: constantinople + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE" + + assembler: # SHR OP + title: "SHR_1" + code: + PUSH32 "0x0000000000000000000000000000000000000000000000000000000000000001" + PUSH1 "0x00" + SHR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # SHR OP + title: "SHR_2" + code: + PUSH32 "0x0000000000000000000000000000000000000000000000000000000000000001" + PUSH1 "0x01" + SHR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SHR OP + title: "SHR_3" + code: + PUSH32 "0x8000000000000000000000000000000000000000000000000000000000000000" + PUSH1 "0x01" + SHR + fork: constantinople + stack: "0x4000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SHR OP + title: "SHR_4" + code: + PUSH32 "0x8000000000000000000000000000000000000000000000000000000000000000" + PUSH1 "0xff" + SHR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # SHR OP + title: "SHR_5" + code: + PUSH32 "0x8000000000000000000000000000000000000000000000000000000000000000" + PUSH2 "0x0100" + SHR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SHR OP + title: "SHR_6" + code: + PUSH32 "0x8000000000000000000000000000000000000000000000000000000000000000" + PUSH2 "0x0101" + SHR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SHR OP + title: "SHR_7" + code: + PUSH32 "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0x00" + SHR + fork: constantinople + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + + assembler: # SHR OP + title: "SHR_8" + code: + PUSH32 "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0x01" + SHR + fork: constantinople + stack: "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + + assembler: # SHR OP + title: "SHR_9" + code: + PUSH32 "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0xff" + SHR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # SHR OP + title: "SHR_10" + code: + PUSH32 "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH2 "0x0100" + SHR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SHR OP + title: "SHR_11" + code: + PUSH32 "0x0000000000000000000000000000000000000000000000000000000000000000" + PUSH1 "0x01" + SHR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SAR OP + title: "SAR_1" + code: + PUSH32 "0x0000000000000000000000000000000000000000000000000000000000000001" + PUSH1 "0x00" + SAR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # SAR OP + title: "SAR_2" + code: + PUSH32 "0x0000000000000000000000000000000000000000000000000000000000000001" + PUSH1 "0x01" + SAR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SAR OP + title: "SAR_3" + code: + PUSH32 "0x8000000000000000000000000000000000000000000000000000000000000000" + PUSH1 "0x01" + SAR + fork: constantinople + stack: "0xC000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SAR OP + title: "SAR_4" + code: + PUSH32 "0x8000000000000000000000000000000000000000000000000000000000000000" + PUSH1 "0xff" + SAR + fork: constantinople + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + + assembler: # SAR OP + title: "SAR_5" + code: + PUSH32 "0x8000000000000000000000000000000000000000000000000000000000000000" + PUSH2 "0x0100" + SAR + fork: constantinople + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + + assembler: # SAR OP + title: "SAR_6" + code: + PUSH32 "0x8000000000000000000000000000000000000000000000000000000000000000" + PUSH2 "0x0101" + SAR + fork: constantinople + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + + assembler: # SAR OP + title: "SAR_7" + code: + PUSH32 "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0x00" + SAR + fork: constantinople + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + + assembler: # SAR OP + title: "SAR_8" + code: + PUSH32 "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0x01" + SAR + fork: constantinople + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + + assembler: # SAR OP + title: "SAR_9" + code: + PUSH32 "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0xff" + SAR + fork: constantinople + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + + assembler: # SAR OP + title: "SAR_10" + code: + PUSH32 "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH2 "0x0100" + SAR + fork: constantinople + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + + assembler: # SAR OP + title: "SAR_11" + code: + PUSH32 "0x0000000000000000000000000000000000000000000000000000000000000000" + PUSH1 "0x01" + SAR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SAR OP + title: "SAR_12" + code: + PUSH32 "0x4000000000000000000000000000000000000000000000000000000000000000" + PUSH1 "0xfe" + SAR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # SAR OP + title: "SAR_13" + code: + PUSH32 "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0xf8" + SAR + fork: constantinople + stack: "0x000000000000000000000000000000000000000000000000000000000000007F" + + assembler: # SAR OP + title: "SAR_14" + code: + PUSH32 "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0xfe" + SAR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # SAR OP + title: "SAR_15" + code: + PUSH32 "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH1 "0xff" + SAR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SAR OP + title: "SAR_16" + code: + PUSH32 "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + PUSH2 "0x0100" + SAR + fork: constantinople + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" +]# + assembler: # ISZERO OP + title: "ISZERO_1" + code: + PUSH1 "0x00" + ISZERO + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # ISZERO OP + title: "ISZERO_2" + code: + PUSH1 "0x2A" + ISZERO + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # ISZERO OP mal data + title: "ISZERO_3" + code: ISZERO + success: false + + assembler: # EQ OP + title: "EQ_1" + code: + PUSH1 "0x2A" + PUSH1 "0x2A" + EQ + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # EQ OP + title: "EQ_2" + code: + PUSH3 "0x2A3B4C" + PUSH3 "0x2A3B4C" + EQ + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # EQ OP + title: "EQ_3" + code: + PUSH3 "0x2A3B5C" + PUSH3 "0x2A3B4C" + EQ + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # EQ OP mal data + title: "EQ_4" + code: + PUSH3 "0x2A3B4C" + EQ + success: false + stack: "0x2A3B4C" + + assembler: # GT OP + title: "GT_1" + code: + PUSH1 "0x01" + PUSH1 "0x02" + GT + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # GT OP + title: "GT_2" + code: + PUSH1 "0x01" + PUSH2 "0x0F00" + GT + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # GT OP + title: "GT_3" + code: + PUSH4 "0x01020304" + PUSH2 "0x0F00" + GT + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # GT OP mal data + title: "GT_4" + code: + PUSH3 "0x2A3B4C" + GT + success: false + stack: "0x2A3B4C" + + assembler: # SGT OP + title: "SGT_1" + code: + PUSH1 "0x01" + PUSH1 "0x02" + SGT + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # SGT OP + title: "SGT_2" + code: + PUSH32 "0x000000000000000000000000000000000000000000000000000000000000001E" # 30 + PUSH32 "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" # -170 + SGT + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SGT OP + title: "SGT_3" + code: + PUSH32 "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" # -170 + PUSH32 "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57" # -169 + SGT + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # SGT OP mal + title: "SGT_4" + code: + PUSH32 "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" # -170 + SGT + success: false + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + + assembler: # LT OP + title: "LT_1" + code: + PUSH1 "0x01" + PUSH1 "0x02" + LT + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # LT OP + title: "LT_2" + code: + PUSH1 "0x01" + PUSH2 "0x0F00" + LT + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # LT OP + title: "LT_3" + code: + PUSH4 "0x01020304" + PUSH2 "0x0F00" + LT + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # LT OP mal data + title: "LT_4" + code: + PUSH3 "0x2A3B4C" + LT + success: false + stack: "0x2A3B4C" + + assembler: # SLT OP + title: "SLT_1" + code: + PUSH1 "0x01" + PUSH1 "0x02" + SLT + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SLT OP + title: "SLT_2" + code: + PUSH32 "0x000000000000000000000000000000000000000000000000000000000000001E" # 30 + PUSH32 "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" # -170 + SLT + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # SLT OP + title: "SLT_3" + code: + PUSH32 "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" # -170 + PUSH32 "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57" # -169 + SLT + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SLT OP mal + title: "SLT_4" + code: + PUSH32 "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" # -170 + SLT + success: false + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + + assembler: # NOT OP + title: "NOT_1" + code: + PUSH1 "0x01" + NOT + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE" + + assembler: # NOT OP + title: "NOT_2" + code: + PUSH2 "0xA003" + NOT + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5FFC" + + assembler: # BNOT OP + title: "BNOT_4" + code: NOT + success: false + + assembler: # NOT OP + title: "NOT_5" + code: + PUSH1 "0x00" + NOT + stack: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" diff --git a/tests/test_op_custom.nim b/tests/test_op_custom.nim new file mode 100644 index 000000000..21dd001b9 --- /dev/null +++ b/tests/test_op_custom.nim @@ -0,0 +1,306 @@ +import + macro_assembler, unittest, macros, strutils, + byteutils, eth_common, ../nimbus/db/state_db, + ../nimbus/db/db_chain, ranges + +suite "Custom Opcodes Test": + let (blockNumber, chainDB) = initDatabase() + + var acc: EthAddress + hexToByteArray("0xc669eaad75042be84daaf9b461b0e868b9ac1871", acc) + var + parent = chainDB.getBlockHeader(blockNumber - 1) + stateDB = newAccountStateDB(chainDB.db, parent.stateRoot, false) + + stateDB.setBalance(acc, 1000.u256) + parent.stateRoot = stateDB.rootHash + chainDB.setHead(parent, true) + + assembler: # CALLDATASIZE OP + title: "CALLDATASIZE_1" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: + CallDataSize + stack: "0x0000000000000000000000000000000000000000000000000000000000000040" + + assembler: # CALLDATALOAD OP + title: "CALLDATALOAD_1" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: + Push1 "0x00" + CallDataLoad + stack: "0x00000000000000000000000000000000000000000000000000000000000000A1" + + assembler: # CALLDATALOAD OP + title: "CALLDATALOAD_2" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: + Push1 "0x02" + CallDataLoad + stack: "0x0000000000000000000000000000000000000000000000000000000000A10000" + + assembler: # CALLDATALOAD OP + title: "CALLDATALOAD_3" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: + Push1 "0x20" + CallDataLoad + stack: "0x00000000000000000000000000000000000000000000000000000000000000B1" + + assembler: # CALLDATALOAD OP + title: "CALLDATALOAD_4" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: + Push1 "0x23" + CallDataLoad + stack: "0x00000000000000000000000000000000000000000000000000000000B1000000" + + assembler: # CALLDATALOAD OP + title: "CALLDATALOAD_5" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: + Push1 "0x3F" + CallDataLoad + stack: "0xB100000000000000000000000000000000000000000000000000000000000000" + + assembler: # CALLDATALOAD OP mal + title: "CALLDATALOAD_6" + code: + CallDataLoad + success: false + + + assembler: # CALLDATACOPY OP + title: "CALLDATACOPY_1" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: + Push1 "0x20" + Push1 "0x00" + Push1 "0x00" + CallDataCopy + memory: "0x00000000000000000000000000000000000000000000000000000000000000A1" + + assembler: # CALLDATACOPY OP + title: "CALLDATACOPY_2" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: + Push1 "0x40" + Push1 "0x00" + Push1 "0x00" + CallDataCopy + memory: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + + assembler: # CALLDATACOPY OP + title: "CALLDATACOPY_3" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: + Push1 "0x40" + Push1 "0x04" + Push1 "0x00" + CallDataCopy + memory: + "0x000000000000000000000000000000000000000000000000000000A100000000" + "0x000000000000000000000000000000000000000000000000000000B100000000" + + assembler: # CALLDATACOPY OP + title: "CALLDATACOPY_4" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: + Push1 "0x40" + Push1 "0x00" + Push1 "0x04" + CallDataCopy + memory: + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x000000A100000000000000000000000000000000000000000000000000000000" + "0x000000B100000000000000000000000000000000000000000000000000000000" + + assembler: # CALLDATACOPY OP + title: "CALLDATACOPY_5" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: + Push1 "0x40" + Push1 "0x00" + Push1 "0x04" + CallDataCopy + memory: + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x000000A100000000000000000000000000000000000000000000000000000000" + "0x000000B100000000000000000000000000000000000000000000000000000000" + + assembler: # CALLDATACOPY OP mal + title: "CALLDATACOPY_6" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: + Push1 "0x40" + Push1 "0x00" + CallDataCopy + success: false + stack: + "0x40" + "0x00" + + assembler: # CALLDATACOPY OP mal + title: "CALLDATACOPY_7" + data: + "0x00000000000000000000000000000000000000000000000000000000000000A1" + "0x00000000000000000000000000000000000000000000000000000000000000B1" + code: "0x6020600073CC0929EB16730E7C14FEFC63006AC2D794C5795637" + success: false + + assembler: # ADDRESS OP + title: "ADDRESS_1" + code: + Address + stack: "0x000000000000000000000000c669eaad75042be84daaf9b461b0e868b9ac1871" + + assembler: # BALANCE OP + title: "BALANCE_1" + code: + Address + Balance + stack: "0x00000000000000000000000000000000000000000000000000000000000003E8" + + assembler: # ORIGIN OP + title: "ORIGIN_1" + code: + Origin + stack: "0x000000000000000000000000fbe0afcd7658ba86be41922059dd879c192d4c73" + + assembler: # CALLER OP + title: "CALLER_1" + code: + Caller + stack: "0x000000000000000000000000fbe0afcd7658ba86be41922059dd879c192d4c73" + + assembler: # CALLVALUE OP + title: "CALLVALUE_1" + code: + CallValue + stack: "0xcff56a1b273a8000" + + assembler: # SHA3 OP + title: "SHA3_1" + code: + Push1 "0x01" + Push1 "0x00" + Mstore8 + Push1 "0x01" + Push1 "0x00" + Sha3 + stack: "0x5FE7F977E71DBA2EA1A68E21057BEEBB9BE2AC30C6410AA38D4F3FBE41DCFFD2" + memory: "0x0100000000000000000000000000000000000000000000000000000000000000" + + assembler: # SHA3 OP + title: "SHA3_2" + code: + Push2 "0x0201" + Push1 "0x00" + Mstore + Push1 "0x02" + Push1 "0x1E" + Sha3 + stack: "0x114A3FE82A0219FCC31ABD15617966A125F12B0FD3409105FC83B487A9D82DE4" + memory: "0x0000000000000000000000000000000000000000000000000000000000000201" + + assembler: # SHA3 OP mal + title: "SHA3_3" + code: + Push2 "0x0201" + Push1 "0x00" + Mstore + Push1 "0x02" + Sha3 + success: false + stack: "0x02" + memory: "0x0000000000000000000000000000000000000000000000000000000000000201" + +#[ + assembler: # BLOCKHASH OP + title: "BLOCKHASH_1" + code: + Push1 "0x01" + Blockhash + stack: "0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6" +]# + + # current coinbase or parent coinbase? + assembler: # COINBASE OP + title: "COINBASE_1" + code: + Coinbase + stack: "0x000000000000000000000000c0ede9a639d107851462c15f2fb729c7c61bbf62" + + # current timestamp or parent timestamp? + assembler: # TIMESTAMP OP + title: "TIMESTAMP_1" + code: + TimeStamp + stack: "0x0000000000000000000000000000000000000000000000000000000055c46bb3" + + # current number or parent number? + assembler: # NUMBER OP + title: "NUMBER_1" + code: + Number + stack: "0x000000000000000000000000000000000000000000000000000000000000b864" + + # current difficulty or parent dificulty? + assembler: # DIFFICULTY OP + title: "DIFFICULTY_1" + code: + Difficulty + stack: "0x0000000000000000000000000000000000000000000000000000015451e94505" + + # ?? + assembler: # GASPRICE OP + title: "GASPRICE_1" + code: + GasPrice + stack: "0x000000000000000000000000000000000000000000000000000000746a528800" + + # ?? + assembler: # GAS OP + title: "GAS_1" + code: + Gas + stack: "0x000000000000000000000000000000000000000000000000000000001dcd64fe" + + # ?? + assembler: # GASLIMIT OP + title: "GASLIMIT_1" + code: + GasLimit + stack: "0x000000000000000000000000000000000000000000000000000000000000a271" + + assembler: # INVALID OP + title: "INVALID_1" + code: "0x60012F6002" + stack: "0x0000000000000000000000000000000000000000000000000000000000000001" + success: false diff --git a/tests/test_op_env.nim b/tests/test_op_env.nim new file mode 100644 index 000000000..7e4284de5 --- /dev/null +++ b/tests/test_op_env.nim @@ -0,0 +1,306 @@ +import + macro_assembler, unittest, macros, strutils, + byteutils, eth_common, ../nimbus/db/state_db, + ../nimbus/db/db_chain, ranges + +suite "Environmental Information Opcodes": + let (blockNumber, chainDB) = initDatabase() + + assembler: # CODECOPY OP + title: "CODECOPY_1" + code: + PUSH1 "0x03" # size + PUSH1 "0x08" # copy start pos + PUSH1 "0x00" # mem start pos + CODECOPY + STOP + SLT + CALLVALUE + JUMP + memory: "0x1234560000000000000000000000000000000000000000000000000000000000" + # assertEquals(6, gas); ?? + + assembler: # CODECOPY OP + title: "CODECOPY_2" + code: + PUSH1 "0x5E" # size + PUSH1 "0x08" # copy start pos + PUSH1 "0x00" # mem start pos + CODECOPY + STOP + PUSH1 "0x00" + PUSH1 "0x5f" + SSTORE + PUSH1 "0x14" + PUSH1 "0x00" + SLOAD + PUSH1 "0x1e" + PUSH1 "0x20" + SLOAD + PUSH4 "0xabcddcba" + PUSH1 "0x40" + SLOAD + JUMPDEST + MLOAD + PUSH1 "0x20" + ADD + PUSH1 "0x0a" + MSTORE + SLOAD + MLOAD + PUSH1 "0x40" + ADD + PUSH1 "0x14" + MSTORE + SLOAD + MLOAD + PUSH1 "0x60" + ADD + PUSH1 "0x1e" + MSTORE + SLOAD + MLOAD + PUSH1 "0x80" + ADD + PUSH1 "0x28" + MSTORE + SLOAD + PUSH1 "0xa0" + MSTORE + SLOAD + PUSH1 "0x16" + PUSH1 "0x48" + PUSH1 "0x00" + CODECOPY + PUSH1 "0x16" + PUSH1 "0x00" + CALLCODE + PUSH1 "0x00" + PUSH1 "0x3f" + SSTORE + PUSH2 "0x03e7" + JUMP + PUSH1 "0x00" + SLOAD + PUSH1 "0x00" + MSTORE8 + PUSH1 "0x20" + MUL + CALLDATALOAD + PUSH1 "0x20" + SLOAD + memory: + "0x6000605F556014600054601E60205463ABCDDCBA6040545B51602001600A5254" + "0x516040016014525451606001601E5254516080016028525460A0525460166048" + "0x60003960166000F26000603F556103E756600054600053602002356020540000" + #assertEquals(10, gas); ?? + + assembler: # CODECOPY OP + title: "CODECOPY_3" + # cost for that: + # 94 - data copied + # 95 - new bytes allocated + code: + Push1 "0x5E" + Push1 "0x08" + Push1 "0x00" + CodeCopy + STOP + "0x6000605f556014600054601e60205463abcddcba6040545b" + "0x51602001600a5254516040016014525451606001601e52545160800160285254" + "0x60a052546016604860003960166000f26000603f556103e75660005460005360" + "0x20023500" + memory: + "0x6000605F556014600054601E60205463ABCDDCBA6040545B51602001600A5254" + "0x516040016014525451606001601E5254516080016028525460A0525460166048" + "0x60003960166000F26000603F556103E756600054600053602002350000000000" + #assertEquals(10, program.getResult().getGasUsed()); + + assembler: # CODECOPY OP + title: "CODECOPY_4" + code: + Push1 "0x5E" + Push1 "0x07" + Push1 "0x00" + CodeCopy + STOP + "0x6000605f556014600054601e60205463abcddcba6040545b51" + "0x602001600a5254516040016014525451606001601e5254516080016028525460" + "0xa052546016604860003960166000f26000603f556103e756600054600053602002351234" + memory: + "0x006000605F556014600054601E60205463ABCDDCBA6040545B51602001600A52" + "0x54516040016014525451606001601E5254516080016028525460A05254601660" + "0x4860003960166000F26000603F556103E7566000546000536020023512340000" + #assertEquals(10, program.getResult().getGasUsed()); + + assembler: # CODECOPY OP + title: "CODECOPY_5" + code: + Push2 "0x1234" + Push1 "0x00" + Sload + Push2 "0x5566" + Push1 "0x20" + Sload + Push1 "0x70" + Push1 "0x00" + Push1 "0x20" + CodeCopy + STOP + "0x6000605f55601460" + "0x0054601e60205463abcddcba6040545b51602001600a525451604001" + "0x6014525451606001601e5254516080016028525460a0525460166048" + "0x60003960166000f26000603f556103e75660005460005360200235123400" + stack: + "0x1234" + "0x00" + "0x5566" + "0x00" + memory: + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x61123460005461556660205460706000602039006000605f556014600054601e" + "0x60205463abcddcba6040545b51602001600a5254516040016014525451606001" + "0x601e5254516080016028525460a052546016604860003960166000f26000603f" + "0x556103e756600054600053602002351200000000000000000000000000000000" + + assembler: # CODECOPY OP mal + title: "CODECOPY_6" + code: + "0x605E6007396000605f556014600054601e60205463abcddcba604054" + "0x5b51602001600a5254516040016014525451606001601e5254516080" + "0x016028525460a052546016604860003960166000f26000603f556103" + "0xe756600054600053602002351234" + success: false + stack: + "0x5e" + "0x07" + + var acc: EthAddress + hexToByteArray("0xfbe0afcd7658ba86be41922059dd879c192d4c73", acc) + var + parent = chainDB.getBlockHeader(blockNumber - 1) + stateDB = newAccountStateDB(chainDB.db, parent.stateRoot, false) + code = hexToSeqByte("0x0102030405060708090A0B0C0D0E0F" & + "611234600054615566602054603E6000602073471FD3AD3E9EEADEEC4608B92D" & + "16CE6B500704CC3C6000605f556014600054601e60205463abcddcba6040545b" & + "51602001600a5254516040016014525451606001601e52545160800160285254" & + "60a052546016604860003960166000f26000603f556103e756600054600053602002351234") + + stateDB.setCode(acc, code.toRange) + parent.stateRoot = stateDB.rootHash + chainDB.setHead(parent, true) + + assembler: # EXTCODECOPY OP + title: "EXTCODECOPY_1" + code: + Push1 "0x04" # size + Push1 "0x07" # code pos + Push1 "0x00" # mem pos + Push20 "0xfbe0afcd7658ba86be41922059dd879c192d4c73" + ExtCodeCopy + STOP + Slt + CallValue + Jump + Stop + memory: "0x08090a0b00000000000000000000000000000000000000000000000000000000" + + assembler: # EXTCODECOPY OP + title: "EXTCODECOPY_2" + code: + Push1 "0x3E" + Push1 "0x07" + Push1 "0x00" + Push20 "0xfbe0afcd7658ba86be41922059dd879c192d4c73" + ExtCodeCopy + STOP + "0x6000605f" + "0x556014600054601e60205463abcddcba6040545b51602001600a525451604001" + "0x6014525451606001601e5254516080016028525460a052546016604860003960" + "0x166000f26000603f556103e75660005460005360200235602054" + memory: + "0x08090a0b0c0d0e0f611234600054615566602054603e6000602073471fd3ad3e" + "0x9eeadeec4608b92d16ce6b500704cc3c6000605f556014600054601e60200000" + + assembler: # EXTCODECOPY OP + title: "EXTCODECOPY_3" + code: + Push1 "0x5E" + Push1 "0x07" + Push1 "0x00" + Push20 "0xfbe0afcd7658ba86be41922059dd879c192d4c73" + ExtCodeCopy + STOP + "0x6000605f" + "0x556014600054601e60205463abcddcba6040545b51602001600a525451604001" + "0x6014525451606001601e5254516080016028525460a052546016604860003960" + "0x166000f26000603f556103e75660005460005360200235" + memory: + "0x08090a0b0c0d0e0f611234600054615566602054603e6000602073471fd3ad3e" + "0x9eeadeec4608b92d16ce6b500704cc3c6000605f556014600054601e60205463" + "0xabcddcba6040545b51602001600a5254516040016014525451606001601e0000" + + assembler: # EXTCODECOPY OP + title: "EXTCODECOPY_4" + code: + Push2 "0x1234" + Push1 "0x00" + Sload + Push2 "0x5566" + Push1 "0x20" + Sload + Push1 "0x3E" + Push1 "0x00" + Push1 "0x20" + Push20 "0xfbe0afcd7658ba86be41922059dd879c192d4c73" + ExtCodeCopy + STOP + "0x6000605f556014600054601e60205463abcddcba6040545b" + "0x51602001600a5254516040016014525451606001601e52545160800160285254" + "0x60a052546016604860003960166000f26000603f556103e756600054600053602002351234" + stack: + "0x1234" + "0x00" + "0x5566" + "0x00" + memory: + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0102030405060708090a0b0c0d0e0f611234600054615566602054603e600060" + "0x2073471fd3ad3e9eeadeec4608b92d16ce6b500704cc3c6000605f5560140000" + + assembler: # EXTCODECOPY OP mal + title: "EXTCODECOPY_5" + code: + Push1 "0x5E" + Push1 "0x07" + Push20 "0x471FD3AD3E9EEADEEC4608B92D16CE6B500704CC" + ExtCodeCopy + success: false + stack: + "0x5E" + "0x07" + + # macro_assembler automatically insert STOP instruction at the end, + # so codesize become 63, not 62 like ethereumj + assembler: # CODESIZE OP + title: "CODESIZE_1" + code: + "0x385E60076000396000605f556014600054601e60205463abcddcba6040545b51" + "0x602001600a5254516040016014525451606001601e5254516080016028525460" + "0xa052546016604860003960166000f26000603f556103e75660005460005360200235" + stack: + "0x0000000000000000000000000000000000000000000000000000000000000063" + success: false + + # 0x94 == 148 bytes + assembler: # EXTCODESIZE OP + title: "EXTCODESIZE_1" + code: + Push20 "0xfbe0afcd7658ba86be41922059dd879c192d4c73" + ExtCodeSize + STOP + "0x5E60076000396000605f" + "0x556014600054601e60205463abcddcba6040545b51602001600a525451604001" + "0x6014525451606001601e5254516080016028525460a052546016604860003960" + "0x166000f26000603f556103e75660005460005360200235" + stack: "0x94" diff --git a/tests/test_op_memory.nim b/tests/test_op_memory.nim new file mode 100644 index 000000000..0c80601ad --- /dev/null +++ b/tests/test_op_memory.nim @@ -0,0 +1,840 @@ +import macro_assembler, unittest, macros, strutils + +suite "Memory Opcodes": + let (blockNumber, chainDB) = initDatabase() + + assembler: # PUSH1 OP + title: "PUSH1" + code: + PUSH1 "0xa0" + stack: "0x00000000000000000000000000000000000000000000000000000000000000A0" + + assembler: # PUSH2 OP + title: "PUSH2" + code: + PUSH2 "0xa0b0" + stack: "0x000000000000000000000000000000000000000000000000000000000000A0B0" + + assembler: # PUSH3 OP + title: "PUSH3" + code: + PUSH3 "0xA0B0C0" + stack: "0x0000000000000000000000000000000000000000000000000000000000A0B0C0" + + assembler: # PUSH4 OP + title: "PUSH4" + code: + PUSH4 "0xA0B0C0D0" + stack: "0x00000000000000000000000000000000000000000000000000000000A0B0C0D0" + + assembler: # PUSH5 OP + title: "PUSH5" + code: + PUSH5 "0xA0B0C0D0E0" + stack: "0x000000000000000000000000000000000000000000000000000000A0B0C0D0E0" + + assembler: # PUSH6 OP + title: "PUSH6" + code: + PUSH6 "0xA0B0C0D0E0F0" + stack: "0x0000000000000000000000000000000000000000000000000000A0B0C0D0E0F0" + + assembler: # PUSH7 OP + title: "PUSH7" + code: + PUSH7 "0xA0B0C0D0E0F0A1" + stack: "0x00000000000000000000000000000000000000000000000000A0B0C0D0E0F0A1" + + assembler: # PUSH8 OP + title: "PUSH8" + code: + PUSH8 "0xA0B0C0D0E0F0A1B1" + stack: "0x000000000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1" + + assembler: # PUSH9 OP + title: "PUSH9" + code: + PUSH9 "0xA0B0C0D0E0F0A1B1C1" + stack: "0x0000000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1" + + assembler: # PUSH10 OP + title: "PUSH10" + code: + PUSH10 "0xA0B0C0D0E0F0A1B1C1D1" + stack: "0x00000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1" + + assembler: # PUSH11 OP + title: "PUSH11" + code: + PUSH11 "0xA0B0C0D0E0F0A1B1C1D1E1" + stack: "0x000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1" + + assembler: # PUSH12 OP + title: "PUSH12" + code: + PUSH12 "0xA0B0C0D0E0F0A1B1C1D1E1F1" + stack: "0x0000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1" + + assembler: # PUSH13 OP + title: "PUSH13" + code: + PUSH13 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2" + stack: "0x00000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2" + + assembler: # PUSH14 OP + title: "PUSH14" + code: + PUSH14 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2" + stack: "0x000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2" + + assembler: # PUSH15 OP + title: "PUSH15" + code: + PUSH15 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2" + stack: "0x0000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2" + + assembler: # PUSH16 OP + title: "PUSH16" + code: + PUSH16 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2" + stack: "0x00000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2" + + assembler: # PUSH17 OP + title: "PUSH17" + code: + PUSH17 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2" + stack: "0x000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2" + + assembler: # PUSH18 OP + title: "PUSH18" + code: + PUSH18 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2" + stack: "0x0000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2" + + assembler: # PUSH19 OP + title: "PUSH19" + code: + PUSH19 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3" + stack: "0x00000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3" + + assembler: # PUSH20 OP + title: "PUSH20" + code: + PUSH20 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3" + stack: "0x000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3" + + assembler: # PUSH21 OP + title: "PUSH21" + code: + PUSH21 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3" + stack: "0x0000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3" + + assembler: # PUSH22 OP + title: "PUSH22" + code: + PUSH22 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3" + stack: "0x00000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3" + + assembler: # PUSH23 OP + title: "PUSH23" + code: + PUSH23 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3" + stack: "0x000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3" + + assembler: # PUSH24 OP + title: "PUSH24" + code: + PUSH24 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3" + stack: "0x0000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3" + + assembler: # PUSH25 OP + title: "PUSH25" + code: + PUSH25 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4" + stack: "0x00000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4" + + assembler: # PUSH26 OP + title: "PUSH26" + code: + PUSH26 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4" + stack: "0x000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4" + + assembler: # PUSH27 OP + title: "PUSH27" + code: + PUSH27 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4" + stack: "0x0000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4" + + assembler: # PUSH28 OP + title: "PUSH28" + code: + PUSH28 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4" + stack: "0x00000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4" + + assembler: # PUSH29 OP + title: "PUSH29" + code: + PUSH29 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4" + stack: "0x000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4" + + assembler: # PUSH30 OP + title: "PUSH30" + code: + PUSH30 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4" + stack: "0x0000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4" + + assembler: # PUSH31 OP + title: "PUSH31" + code: + PUSH31 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1" + stack: "0x00A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1" + + assembler: # PUSH32 OP + title: "PUSH32" + code: + PUSH32 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1" + stack: "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1" + + # macro assembler prevented this + #assembler: # PUSHN OP not enough data + # title: "PUSHN_1" + # code: + # PUSH2 "0xAA" + # stack: "0x000000000000000000000000000000000000000000000000000000000000AA00" + # success: false + # + #assembler: # PUSHN OP not enough data + # title: "PUSHN_2" + # code: + # PUSH32 "0xAABB" + # stack: "0xAABB000000000000000000000000000000000000000000000000000000000000" + # success: false + + assembler: # POP OP + title: "POP_1" + code: + PUSH2 "0x0000" + PUSH1 "0x01" + PUSH3 "0x000002" + POP + stack: + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0000000000000000000000000000000000000000000000000000000000000001" + + assembler: # POP OP + title: "POP_2" + code: + PUSH2 "0x0000" + PUSH1 "0x01" + PUSH3 "0x000002" + POP + POP + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler:# POP OP mal data + title: "POP_3" + code: + PUSH2 "0x0000" + PUSH1 "0x01" + PUSH3 "0x000002" + POP + POP + POP + POP + success: false + + macro generateDUPS(): untyped = + result = newStmtList() + + for i in 1 .. 16: + let title = newStmtList(newLit("DUP_" & $i)) + let pushIdent = ident("PUSH1") + var body = newStmtList() + var stack = newStmtList() + + for x in 0 ..< i: + let val = newLit("0x" & toHex(x+10, 2)) + body.add quote do: + `pushIdent` `val` + stack.add quote do: + `val` + + let stackVal = newLit("0x" & toHex(10, 2)) + stack.add quote do: + `stackVal` + + let dupIdent = ident("DUP" & $i) + body.add quote do: + `dupIdent` + + let titleCall = newCall(ident("title"), title) + let codeCall = newCall(ident("code"), body) + let stackCall = newCall(ident("stack"), stack) + + result.add quote do: + assembler: + `titleCall` + `codeCall` + `stackCall` + + generateDUPS() + + assembler: # DUPN OP mal data + title: "DUPN_2" + code: + DUP1 + success: false + + macro generateSWAPS(): untyped = + result = newStmtList() + + for i in 1 .. 16: + let title = newStmtList(newLit("SWAP_" & $i)) + let pushIdent = ident("PUSH1") + var body = newStmtList() + var stack = newStmtList() + + for x in countDown(i, 0): + let val = newLit("0x" & toHex(x+10, 2)) + body.add quote do: + `pushIdent` `val` + if x == i: + let val = newLit("0x" & toHex(0+10, 2)) + stack.add quote do: + `val` + elif x == 0: + let val = newLit("0x" & toHex(i+10, 2)) + stack.add quote do: + `val` + else: + stack.add quote do: + `val` + + let swapIdent = ident("SWAP" & $i) + body.add quote do: + `swapIdent` + + let titleCall = newCall(ident("title"), title) + let codeCall = newCall(ident("code"), body) + let stackCall = newCall(ident("stack"), stack) + + result.add quote do: + assembler: + `titleCall` + `codeCall` + `stackCall` + + generateSWAPS() + + assembler:# SWAPN OP mal data + title: "SWAPN_2" + code: + SWAP1 + success: false + + assembler: # MSTORE OP + title: "MSTORE_1" + code: + PUSH2 "0x1234" + PUSH1 "0x00" + MSTORE + memory: "0x0000000000000000000000000000000000000000000000000000000000001234" + + assembler: # MSTORE OP + title: "MSTORE_2" + code: + PUSH2 "0x1234" + PUSH1 "0x00" + MSTORE + PUSH2 "0x5566" + PUSH1 "0x20" + MSTORE + memory: + "0x0000000000000000000000000000000000000000000000000000000000001234" + "0x0000000000000000000000000000000000000000000000000000000000005566" + + assembler: # MSTORE OP + title: "MSTORE_3" + code: + PUSH2 "0x1234" + PUSH1 "0x00" + MSTORE + PUSH2 "0x5566" + PUSH1 "0x20" + MSTORE + PUSH2 "0x8888" + PUSH1 "0x00" + MSTORE + memory: + "0x0000000000000000000000000000000000000000000000000000000000008888" + "0x0000000000000000000000000000000000000000000000000000000000005566" + + assembler: # MSTORE OP + title: "MSTORE_4" + code: + PUSH2 "0x1234" + PUSH1 "0xA0" + MSTORE + memory: + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0000000000000000000000000000000000000000000000000000000000001234" + + assembler: # MSTORE OP + title: "MSTORE_5" + code: + PUSH2 "0x1234" + MSTORE + success: false + stack: "0x1234" + + assembler: # MLOAD OP + title: "MLOAD_1" + code: + PUSH1 "0x00" + MLOAD + memory: "0x0000000000000000000000000000000000000000000000000000000000000000" + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # MLOAD OP + title: "MLOAD_2" + code: + PUSH1 "0x22" + MLOAD + memory: + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0000000000000000000000000000000000000000000000000000000000000000" + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # MLOAD OP + title: "MLOAD_3" + code: + PUSH1 "0x20" + MLOAD + memory: + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0000000000000000000000000000000000000000000000000000000000000000" + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # MLOAD OP + title: "MLOAD_4" + code: + PUSH2 "0x1234" + PUSH1 "0x20" + MSTORE + PUSH1 "0x20" + MLOAD + memory: + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0000000000000000000000000000000000000000000000000000000000001234" + stack: "0x0000000000000000000000000000000000000000000000000000000000001234" + + assembler: # MLOAD OP + title: "MLOAD_5" + code: + PUSH2 "0x1234" + PUSH1 "0x20" + MSTORE + PUSH1 "0x1F" + MLOAD + memory: + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0000000000000000000000000000000000000000000000000000000000001234" + stack: "0x0000000000000000000000000000000000000000000000000000000000000012" + + assembler: # MLOAD OP mal data + title: "MLOAD_6" + code: + MLOAD + success: false + + assembler: # MSTORE8 OP + title: "MSTORE8_1" + code: + PUSH1 "0x11" + PUSH1 "0x00" + MSTORE8 + memory: "0x1100000000000000000000000000000000000000000000000000000000000000" + + assembler: # MSTORE8 OP + title: "MSTORE8_2" + code: + PUSH1 "0x22" + PUSH1 "0x01" + MSTORE8 + memory: "0x0022000000000000000000000000000000000000000000000000000000000000" + + assembler: # MSTORE8 OP + title: "MSTORE8_3" + code: + PUSH1 "0x22" + PUSH1 "0x21" + MSTORE8 + memory: + "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0022000000000000000000000000000000000000000000000000000000000000" + + assembler: # MSTORE8 OP mal + title: "MSTORE8_4" + code: + PUSH1 "0x22" + MSTORE8 + success: false + stack: "0x22" + + assembler: # SSTORE OP + title: "SSTORE_1" + code: + PUSH1 "0x22" + PUSH1 "0xAA" + SSTORE + storage: + "0xAA": "0x22" + + assembler: # SSTORE OP + title: "SSTORE_2" + code: + PUSH1 "0x22" + PUSH1 "0xAA" + SSTORE + PUSH1 "0x22" + PUSH1 "0xBB" + SSTORE + storage: + "0xAA": "0x22" + "0xBB": "0x22" + + assembler: # SSTORE OP + title: "SSTORE_3" + code: + PUSH1 "0x22" + SSTORE + success: false + stack: "0x22" +#[ + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_1" + code: "60006000556000600055" + fork: constantinople + # assertEquals(412, program.getResult().getGasUsed()) + # assertEquals(0, program.getResult().getFutureRefund()) + + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_2" + code: "60006000556001600055" + fork: constantinople + # assertEquals(20212, program.getResult().getGasUsed()) + # assertEquals(0, program.getResult().getFutureRefund()) + + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_3" + code: "60016000556000600055" + fork: constantinople + # assertEquals(20212, program.getResult().getGasUsed()) + # assertEquals(19800, program.getResult().getFutureRefund()) + + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_4" + code: "60016000556002600055" + fork: constantinople + # assertEquals(20212, program.getResult().getGasUsed()) + # assertEquals(0, program.getResult().getFutureRefund()) + + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_5" + code: "60016000556001600055" + fork: constantinople + # assertEquals(20212, program.getResult().getGasUsed()) + # assertEquals(0, program.getResult().getFutureRefund()) + + # Sets Storage row on "cow" address: + # 0: 1 + # private void setStorageToOne(VM vm) { + # # Sets storage value to 1 and commits + # code: "60006000556001600055" + # fork: constantinople + # invoke.getRepository().commit() + # invoke.setOrigRepository(invoke.getRepository()) + + setStorageToOne(vm) + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_6" + code: "60006000556000600055" + fork: constantinople + # assertEquals(5212, program.getResult().getGasUsed()) + # assertEquals(15000, program.getResult().getFutureRefund()) + + setStorageToOne(vm) + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_7" + code: "60006000556001600055" + fork: constantinople + # assertEquals(5212, program.getResult().getGasUsed()) + # assertEquals(4800, program.getResult().getFutureRefund()) + + setStorageToOne(vm) + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_8" + code: "60006000556002600055" + fork: constantinople + # assertEquals(5212, program.getResult().getGasUsed()) + # assertEquals(0, program.getResult().getFutureRefund()) + + setStorageToOne(vm) + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_9" + code: "60026000556000600055" + fork: constantinople + # assertEquals(5212, program.getResult().getGasUsed()) + # assertEquals(15000, program.getResult().getFutureRefund()) + + setStorageToOne(vm) + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_10" + code: "60026000556003600055" + fork: constantinople + # assertEquals(5212, program.getResult().getGasUsed()) + # assertEquals(0, program.getResult().getFutureRefund()) + + setStorageToOne(vm) + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_11" + code: "60026000556001600055" + fork: constantinople + # assertEquals(5212, program.getResult().getGasUsed()) + # assertEquals(4800, program.getResult().getFutureRefund()) + + setStorageToOne(vm) + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_12" + code: "60026000556002600055" + fork: constantinople + # assertEquals(5212, program.getResult().getGasUsed()) + # assertEquals(0, program.getResult().getFutureRefund()) + + setStorageToOne(vm) + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_13" + code: "60016000556000600055" + fork: constantinople + # assertEquals(5212, program.getResult().getGasUsed()) + # assertEquals(15000, program.getResult().getFutureRefund()) + + setStorageToOne(vm) + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_14" + code: "60016000556002600055" + fork: constantinople + # assertEquals(5212, program.getResult().getGasUsed()) + # assertEquals(0, program.getResult().getFutureRefund()) + + setStorageToOne(vm) + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_15" + code: "60016000556001600055" + fork: constantinople + # assertEquals(412, program.getResult().getGasUsed()) + # assertEquals(0, program.getResult().getFutureRefund()) + + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_16" + code: "600160005560006000556001600055" + fork: constantinople + # assertEquals(40218, program.getResult().getGasUsed()) + # assertEquals(19800, program.getResult().getFutureRefund()) + + setStorageToOne(vm) + assembler: # SSTORE EIP1283 + title: "SSTORE_NET_17" + code: "600060005560016000556000600055" + fork: constantinople + # assertEquals(10218, program.getResult().getGasUsed()) + # assertEquals(19800, program.getResult().getFutureRefund()) +]# + assembler: # SLOAD OP + title: "SLOAD_1" + code: + PUSH1 "0xAA" + SLOAD + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # SLOAD OP + title: "SLOAD_2" + code: + PUSH1 "0x22" + PUSH1 "0xAA" + SSTORE + PUSH1 "0xAA" + SLOAD + stack: "0x0000000000000000000000000000000000000000000000000000000000000022" + + assembler: # SLOAD OP + title: "SLOAD_3" + code: + PUSH1 "0x22" + PUSH1 "0xAA" + SSTORE + PUSH1 "0x33" + PUSH1 "0xCC" + SSTORE + PUSH1 "0xCC" + SLOAD + stack: "0x0000000000000000000000000000000000000000000000000000000000000033" + + assembler: # SLOAD OP + title: "SLOAD_4" + code: SLOAD + success: false + + assembler: # PC OP + title: "PC_1" + code: PC + stack: + "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # PC OP + title: "PC_2" + code: + PUSH1 "0x22" + PUSH1 "0xAA" + MSTORE + PUSH1 "0xAA" + SLOAD + PC + stack: + "0x00" + "0x0000000000000000000000000000000000000000000000000000000000000008" + memory: + "0x00" + "0x00" + "0x00" + "0x00" + "0x00" + "0x00" + "0x0000000000000000002200000000000000000000000000000000000000000000" + + assembler: # JUMP OP mal data + title: "JUMP_1" + code: + PUSH1 "0xAA" + PUSH1 "0xBB" + PUSH1 "0x0E" + JUMP + PUSH1 "0xCC" + PUSH1 "0xDD" + PUSH1 "0xEE" + JUMPDEST + PUSH1 "0xFF" + stack: + "0xaa" + "0x00000000000000000000000000000000000000000000000000000000000000bb" + success: false + + assembler: # JUMP OP mal data + title: "JUMP_2" + code: + PUSH1 "0x0C" + PUSH1 "0x0C" + SWAP1 + JUMP + PUSH1 "0xCC" + PUSH1 "0xDD" + PUSH1 "0xEE" + PUSH1 "0xFF" + success: false + stack : "0x0C" + + assembler: # JUMPI OP + title: "JUMPI_1" + code: + PUSH1 "0x01" + PUSH1 "0x05" + JUMPI + JUMPDEST + PUSH1 "0xCC" + stack: "0x00000000000000000000000000000000000000000000000000000000000000CC" + + assembler: # JUMPI OP + title: "JUMPI_2" + code: + PUSH4 "0x00000000" + PUSH1 "0x44" + JUMPI + PUSH1 "0xCC" + PUSH1 "0xDD" + stack: + "0x00000000000000000000000000000000000000000000000000000000000000CC" + "0x00000000000000000000000000000000000000000000000000000000000000DD" + + assembler: # JUMPI OP mal + title: "JUMPI_3" + code: + PUSH1 "0x01" + JUMPI + success: false + stack: "0x01" + + assembler: # JUMPI OP mal + title: "JUMPI_4" + code: + PUSH1 "0x01" + PUSH1 "0x22" + SWAP1 + SWAP1 + JUMPI + success: false + + assembler: # JUMP OP mal data + title: "JUMPDEST_1" + code: + PUSH1 "0x23" + PUSH1 "0x08" + JUMP + PUSH1 "0x01" + JUMPDEST + PUSH1 "0x02" + SSTORE + storage: + "0x02": "0x00" + stack: "0x23" + success: false + + # success or not? + assembler: # JUMPDEST OP for JUMPI + title: "JUMPDEST_2" + code: + PUSH1 "0x23" + PUSH1 "0x01" + PUSH1 "0x09" + JUMPI + PUSH1 "0x01" + JUMPDEST + PUSH1 "0x02" + SSTORE + #success: false + storage: + "0x02": "0x23" + + assembler: # MSIZE OP + title: "MSIZE_1" + code: + MSIZE + stack: "0x0000000000000000000000000000000000000000000000000000000000000000" + + assembler: # MSIZE OP + title: "MSIZE_2" + code: + PUSH1 "0x20" + PUSH1 "0x30" + MSTORE + MSIZE + stack: + "0x60" + memory: + "0x00" + "0x00" + "0x0000000000000000000000000000002000000000000000000000000000000000" diff --git a/tests/test_op_misc.nim b/tests/test_op_misc.nim new file mode 100644 index 000000000..0131205b9 --- /dev/null +++ b/tests/test_op_misc.nim @@ -0,0 +1,176 @@ +import + macro_assembler, unittest, macros, strutils, + byteutils, eth_common, ../nimbus/db/state_db, + ../nimbus/db/db_chain, ranges + +suite "Misc Opcodes": + let (blockNumber, chainDB) = initDatabase() + + assembler: # LOG0 OP + title: "Log0" + code: + PUSH2 "0x1234" + PUSH1 "0x00" + MSTORE + PUSH1 "0x20" + PUSH1 "0x00" + LOG0 + memory: + "0x1234" + logs: + ( + address: "0xc669eaad75042be84daaf9b461b0e868b9ac1871", + data: "0x0000000000000000000000000000000000000000000000000000000000001234" + ) + + assembler: # LOG1 OP + title: "Log1" + code: + PUSH2 "0x1234" + PUSH1 "0x00" + MSTORE + PUSH2 "0x9999" + PUSH1 "0x20" + PUSH1 "0x00" + LOG1 + memory: + "0x1234" + logs: + ( + address: "0xc669eaad75042be84daaf9b461b0e868b9ac1871", + topics: ["0x9999"], + data: "0x0000000000000000000000000000000000000000000000000000000000001234" + ) + + assembler: # LOG2 OP + title: "Log2" + code: + PUSH2 "0x1234" + PUSH1 "0x00" + MSTORE + PUSH2 "0x9999" + PUSH2 "0x6666" + PUSH1 "0x20" + PUSH1 "0x00" + LOG2 + memory: + "0x1234" + logs: + ( + address: "0xc669eaad75042be84daaf9b461b0e868b9ac1871", + topics: ["0x6666", "0x9999"], + data: "0x0000000000000000000000000000000000000000000000000000000000001234" + ) + + assembler: # LOG3 OP + title: "Log3" + code: + PUSH2 "0x1234" + PUSH1 "0x00" + MSTORE + PUSH2 "0x9999" + PUSH2 "0x6666" + PUSH2 "0x3333" + PUSH1 "0x20" + PUSH1 "0x00" + LOG3 + memory: + "0x1234" + logs: + ( + address: "0xc669eaad75042be84daaf9b461b0e868b9ac1871", + topics: ["0x3333", "0x6666", "0x9999"], + data: "0x0000000000000000000000000000000000000000000000000000000000001234" + ) + + assembler: # LOG4 OP + title: "Log4" + code: + PUSH2 "0x1234" + PUSH1 "0x00" + MSTORE + PUSH2 "0x9999" + PUSH2 "0x6666" + PUSH2 "0x3333" + PUSH2 "0x5555" + PUSH1 "0x20" + PUSH1 "0x00" + LOG4 + memory: + "0x1234" + logs: + ( + address: "0xc669eaad75042be84daaf9b461b0e868b9ac1871", + topics: ["0x5555", "0x3333", "0x6666", "0x9999"], + data: "0x0000000000000000000000000000000000000000000000000000000000001234" + ) + + assembler: # STOP OP + title: "STOP_1" + code: + PUSH1 "0x20" + PUSH1 "0x30" + PUSH1 "0x10" + PUSH1 "0x30" + PUSH1 "0x11" + PUSH1 "0x23" + STOP + stack: + "0x20" + "0x30" + "0x10" + "0x30" + "0x11" + "0x23" + + assembler: # RETURN OP + title: "RETURN_1" + code: + PUSH2 "0x1234" + PUSH1 "0x00" + MSTORE + PUSH1 "0x20" + PUSH1 "0x00" + RETURN + memory: "0x1234" + output: "0x0000000000000000000000000000000000000000000000000000000000001234" + + assembler: # RETURN OP + title: "RETURN_2" + code: + PUSH2 "0x1234" + PUSH1 "0x00" + MSTORE + PUSH1 "0x20" + PUSH1 "0x1F" + RETURN + memory: + "0x1234" + "0x00" + output: "0x3400000000000000000000000000000000000000000000000000000000000000" + + assembler: # RETURN OP + title: "RETURN_3" + code: + PUSH32 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1" + PUSH1 "0x00" + MSTORE + PUSH1 "0x20" + PUSH1 "0x00" + RETURN + memory: "0xa0b0c0d0e0f0a1b1c1d1e1f1a2b2c2d2e2f2a3b3c3d3e3f3a4b4c4d4e4f4a1b1" + output: "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1" + + assembler: # RETURN OP + title: "RETURN_4" + code: + PUSH32 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1" + PUSH1 "0x00" + MSTORE + PUSH1 "0x20" + PUSH1 "0x10" + RETURN + output: "0xE2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B100000000000000000000000000000000" + memory: + "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1" + "0x00"