Search in sources :

Example 6 with Stack

use of org.ethereum.vm.program.Stack in project rskj by rsksmart.

the class VM method dumpLine.

/*
     * Dumping the VM state at the current operation in various styles
     *  - standard  Not Yet Implemented
     *  - standard+ (owner address, program counter, operation, gas left)
     *  - pretty (stack, memory, storage, level, contract,
     *              vmCounter, internalSteps, operation
                    gasBefore, gasCost, memWords)
     */
private void dumpLine(OpCode op, long gasBefore, long gasCost, long memWords, Program program) {
    if ("standard+".equals(vmConfig.dumpStyle())) {
        switch(op) {
            case STOP:
            case RETURN:
            case SUICIDE:
                ContractDetails details = program.getStorage().getContractDetails(new RskAddress(program.getOwnerAddress()));
                List<DataWord> storageKeys = new ArrayList<>(details.getStorage().keySet());
                Collections.sort(storageKeys);
                storageKeys.forEach(key -> dumpLogger.trace("{} {}", Hex.toHexString(key.getNoLeadZeroesData()), Hex.toHexString(details.getStorage().get(key).getNoLeadZeroesData())));
                break;
            default:
                break;
        }
        String addressString = Hex.toHexString(program.getOwnerAddress().getLast20Bytes());
        String pcString = Hex.toHexString(new DataWord(program.getPC()).getNoLeadZeroesData());
        String opString = Hex.toHexString(new byte[] { op.val() });
        String gasString = Long.toHexString(program.getRemainingGas());
        dumpLogger.trace("{} {} {} {}", addressString, pcString, opString, gasString);
    } else if ("pretty".equals(vmConfig.dumpStyle())) {
        dumpLogger.trace("-------------------------------------------------------------------------");
        dumpLogger.trace("    STACK");
        program.getStack().forEach(item -> dumpLogger.trace("{}", item));
        dumpLogger.trace("    MEMORY");
        String memoryString = program.memoryToString();
        if (!"".equals(memoryString)) {
            dumpLogger.trace("{}", memoryString);
        }
        dumpLogger.trace("    STORAGE");
        ContractDetails details = program.getStorage().getContractDetails(new RskAddress(program.getOwnerAddress()));
        List<DataWord> storageKeys = new ArrayList<>(details.getStorage().keySet());
        Collections.sort(storageKeys);
        storageKeys.forEach(key -> dumpLogger.trace("{}: {}", key.shortHex(), details.getStorage().get(key).shortHex()));
        int level = program.getCallDeep();
        String contract = Hex.toHexString(program.getOwnerAddress().getLast20Bytes());
        String internalSteps = String.format("%4s", Integer.toHexString(program.getPC())).replace(' ', '0').toUpperCase();
        dumpLogger.trace("{} | {} | #{} | {} : {} | {} | -{} | {}x32", level, contract, vmCounter, internalSteps, op, gasBefore, gasCost, memWords);
    }
}
Also used : Logger(org.slf4j.Logger) MsgType(org.ethereum.vm.MessageCall.MsgType) HashUtil(org.ethereum.crypto.HashUtil) Hex(org.spongycastle.util.encoders.Hex) LoggerFactory(org.slf4j.LoggerFactory) EMPTY_BYTE_ARRAY(org.ethereum.util.ByteUtil.EMPTY_BYTE_ARRAY) RskAddress(co.rsk.core.RskAddress) ArrayList(java.util.ArrayList) Program(org.ethereum.vm.program.Program) List(java.util.List) VmConfig(co.rsk.config.VmConfig) ContractDetails(org.ethereum.db.ContractDetails) BigInteger(java.math.BigInteger) Stack(org.ethereum.vm.program.Stack) Collections(java.util.Collections) RskAddress(co.rsk.core.RskAddress) ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) List(java.util.List) ContractDetails(org.ethereum.db.ContractDetails)

Example 7 with Stack

use of org.ethereum.vm.program.Stack in project rskj by rsksmart.

the class VMExecutionTest method swapnTwentiethItem.

@Test
public void swapnTwentiethItem() {
    Program program = executeCode("PUSH1 0x01 PUSH1 0x02 PUSH1 0x03 PUSH1 0x04 PUSH1 0x05 PUSH1 0x06 PUSH1 0x07 PUSH1 0x08 PUSH1 0x09 PUSH1 0x0a PUSH1 0x0b PUSH1 0x0c PUSH1 0x0d PUSH1 0x0e PUSH1 0x0f PUSH1 0x10 PUSH1 0x11 PUSH1 0x12 PUSH1 0x13 PUSH1 0x14 PUSH1 0x12 SWAPN", 22);
    Stack stack = program.getStack();
    Assert.assertEquals(20, stack.size());
    Assert.assertEquals(new DataWord(1), stack.peek());
    Assert.assertEquals(new DataWord(20), stack.get(0));
    for (int k = 1; k < 19; k++) Assert.assertEquals(new DataWord(k + 1), stack.get(k));
}
Also used : Program(org.ethereum.vm.program.Program) DataWord(org.ethereum.vm.DataWord) Stack(org.ethereum.vm.program.Stack) Test(org.junit.Test)

Example 8 with Stack

use of org.ethereum.vm.program.Stack in project rskj by rsksmart.

the class VMExecutionTest method swapnFourthItem.

@Test
public void swapnFourthItem() {
    Program program = executeCode("PUSH1 0x01 PUSH1 0x02 PUSH1 0x03 PUSH1 0x04 PUSH1 0x02 SWAPN", 6);
    Stack stack = program.getStack();
    Assert.assertEquals(4, stack.size());
    Assert.assertEquals(new DataWord(1), stack.peek());
    Assert.assertEquals(new DataWord(4), stack.get(0));
    Assert.assertEquals(new DataWord(2), stack.get(1));
    Assert.assertEquals(new DataWord(3), stack.get(2));
}
Also used : Program(org.ethereum.vm.program.Program) DataWord(org.ethereum.vm.DataWord) Stack(org.ethereum.vm.program.Stack) Test(org.junit.Test)

Example 9 with Stack

use of org.ethereum.vm.program.Stack in project rskj by rsksmart.

the class VMExecutionTest method testSub.

@Test
public void testSub() {
    Program program = executeCode("PUSH1 1 PUSH1 2 SUB", 3);
    Stack stack = program.getStack();
    Assert.assertEquals(1, stack.size());
    Assert.assertEquals(new DataWord(1), stack.peek());
}
Also used : Program(org.ethereum.vm.program.Program) DataWord(org.ethereum.vm.DataWord) Stack(org.ethereum.vm.program.Stack) Test(org.junit.Test)

Example 10 with Stack

use of org.ethereum.vm.program.Stack in project rskj by rsksmart.

the class VMExecutionTest method dupnFirstItem.

@Test
public void dupnFirstItem() {
    Program program = executeCode("PUSH1 0x01 PUSH1 0x00 DUPN", 3);
    Stack stack = program.getStack();
    Assert.assertEquals(2, stack.size());
    Assert.assertEquals(new DataWord(1), stack.peek());
    Assert.assertEquals(new DataWord(1), stack.get(0));
}
Also used : Program(org.ethereum.vm.program.Program) DataWord(org.ethereum.vm.DataWord) Stack(org.ethereum.vm.program.Stack) Test(org.junit.Test)

Aggregations

Program (org.ethereum.vm.program.Program)13 Stack (org.ethereum.vm.program.Stack)13 DataWord (org.ethereum.vm.DataWord)12 Test (org.junit.Test)12 VmConfig (co.rsk.config.VmConfig)1 RskAddress (co.rsk.core.RskAddress)1 BigInteger (java.math.BigInteger)1 ArrayList (java.util.ArrayList)1 Collections (java.util.Collections)1 List (java.util.List)1 HashUtil (org.ethereum.crypto.HashUtil)1 ContractDetails (org.ethereum.db.ContractDetails)1 EMPTY_BYTE_ARRAY (org.ethereum.util.ByteUtil.EMPTY_BYTE_ARRAY)1 MsgType (org.ethereum.vm.MessageCall.MsgType)1 Logger (org.slf4j.Logger)1 LoggerFactory (org.slf4j.LoggerFactory)1 Hex (org.spongycastle.util.encoders.Hex)1