use of org.ethereum.vm.program.ProgramResult in project rskj by rsksmart.
the class EthModule method call.
public String call(Web3.CallArguments args, String bnOrId) {
String s = null;
try {
Block executionBlock = executionBlockRetriever.getExecutionBlock(bnOrId);
ProgramResult res = callConstant(args, executionBlock);
return s = toJsonHex(res.getHReturn());
} finally {
LOGGER.debug("eth_call(): {}", s);
}
}
use of org.ethereum.vm.program.ProgramResult in project rskj by rsksmart.
the class RskForksBridgeTest method callGetStateForDebuggingTx.
private BridgeState callGetStateForDebuggingTx() throws IOException, ClassNotFoundException {
Transaction rskTx = CallTransaction.createRawTransaction(config, 0, Long.MAX_VALUE, Long.MAX_VALUE, PrecompiledContracts.BRIDGE_ADDR, 0, Bridge.GET_STATE_FOR_DEBUGGING.encode(new Object[] {}));
rskTx.sign(new byte[32]);
TransactionExecutor executor = new TransactionExecutor(config, rskTx, 0, blockChain.getBestBlock().getCoinbase(), repository, blockChain.getBlockStore(), null, new ProgramInvokeFactoryImpl(), blockChain.getBestBlock()).setLocalCall(true);
executor.init();
executor.execute();
executor.go();
executor.finalization();
ProgramResult res = executor.getResult();
Object[] result = Bridge.GET_STATE_FOR_DEBUGGING.decodeResult(res.getHReturn());
return BridgeState.create(config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), (byte[]) result[0]);
}
use of org.ethereum.vm.program.ProgramResult in project rskj by rsksmart.
the class ReversibleTransactionExecutorTest method executeTransactionGreeterOtherSender.
@Test
public void executeTransactionGreeterOtherSender() {
TestContract greeter = TestContract.greeter();
CallTransaction.Function greeterFn = greeter.functions.get("greet");
ContractDetails contract = contractRunner.addContract(greeter.runtimeBytecode);
// someone else
RskAddress from = new RskAddress("0000000000000000000000000000000000000023");
byte[] gasPrice = Hex.decode("00");
byte[] value = Hex.decode("00");
byte[] gasLimit = Hex.decode("f424");
Block bestBlock = factory.getBlockchain().getBestBlock();
ProgramResult result = reversibleTransactionExecutor.executeTransaction(bestBlock, bestBlock.getCoinbase(), gasPrice, gasLimit, contract.getAddress(), value, greeterFn.encode("greet me"), from.getBytes());
Assert.assertTrue(result.isRevert());
}
use of org.ethereum.vm.program.ProgramResult in project rskj by rsksmart.
the class ReversibleTransactionExecutorTest method executeTransactionCountCallsMultipleTimes.
@Test
public void executeTransactionCountCallsMultipleTimes() {
TestContract countcalls = TestContract.countcalls();
CallTransaction.Function callsFn = countcalls.functions.get("calls");
ContractDetails contract = contractRunner.addContract(countcalls.runtimeBytecode);
// someone else
RskAddress from = new RskAddress("0000000000000000000000000000000000000023");
byte[] gasPrice = Hex.decode("00");
byte[] value = Hex.decode("00");
byte[] gasLimit = Hex.decode("f424");
Block bestBlock = factory.getBlockchain().getBestBlock();
ProgramResult result = reversibleTransactionExecutor.executeTransaction(bestBlock, bestBlock.getCoinbase(), gasPrice, gasLimit, contract.getAddress(), value, callsFn.encodeSignature(), from.getBytes());
Assert.assertNull(result.getException());
Assert.assertArrayEquals(new String[] { "calls: 1" }, callsFn.decodeResult(result.getHReturn()));
ProgramResult result2 = reversibleTransactionExecutor.executeTransaction(bestBlock, bestBlock.getCoinbase(), gasPrice, gasLimit, contract.getAddress(), value, callsFn.encodeSignature(), from.getBytes());
Assert.assertNull(result2.getException());
Assert.assertArrayEquals(new String[] { "calls: 1" }, callsFn.decodeResult(result2.getHReturn()));
}
use of org.ethereum.vm.program.ProgramResult in project rskj by rsksmart.
the class TransactionTest method constantCallConflictTest.
@Test
public void constantCallConflictTest() throws Exception {
/*
0x095e7baea6a6c7c4c2dfeb977efac326af552d87 contract is the following Solidity code:
contract Test {
uint a = 256;
function set(uint s) {
a = s;
}
function get() returns (uint) {
return a;
}
}
*/
String json = "{ " + " 'test1' : { " + " 'env' : { " + " 'currentCoinbase' : '2adc25665018aa1fe0e6bc666dac8fc2697ff9ba', " + " 'currentDifficulty' : '0x0100', " + " 'currentGasLimit' : '0x0f4240', " + " 'currentNumber' : '0x00', " + " 'currentTimestamp' : '0x01', " + " 'previousHash' : '5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6' " + " }, " + " 'logs' : [ " + " ], " + " 'out' : '0x', " + " 'post' : { " + " '095e7baea6a6c7c4c2dfeb977efac326af552d87' : { " + " 'balance' : '0x0de0b6b3a76586a0', " + " 'code' : '0x606060405260e060020a600035046360fe47b1811460245780636d4ce63c14602e575b005b6004356000556022565b6000546060908152602090f3', " + " 'nonce' : '0x00', " + " 'storage' : { " + " '0x00' : '0x0400' " + " } " + " }, " + " '0000000000000000000000000000000001000008' : { " + " 'balance' : '0x67EB', " + " 'code' : '0x', " + " 'nonce' : '0x00', " + " 'storage' : { " + " } " + " }, " + " 'a94f5374fce5edbc8e2a8697c15331677e6ebf0b' : { " + " 'balance' : '0x0DE0B6B3A7621175', " + " 'code' : '0x', " + " 'nonce' : '0x01', " + " 'storage' : { " + " } " + " } " + " }, " + " 'postStateRoot' : '17454a767e5f04461256f3812ffca930443c04a47d05ce3f38940c4a14b8c479', " + " 'pre' : { " + " '095e7baea6a6c7c4c2dfeb977efac326af552d87' : { " + " 'balance' : '0x0de0b6b3a7640000', " + " 'code' : '0x606060405260e060020a600035046360fe47b1811460245780636d4ce63c14602e575b005b6004356000556022565b6000546060908152602090f3', " + " 'nonce' : '0x00', " + " 'storage' : { " + " '0x00' : '0x02' " + " } " + " }, " + " 'a94f5374fce5edbc8e2a8697c15331677e6ebf0b' : { " + " 'balance' : '0x0de0b6b3a7640000', " + " 'code' : '0x', " + " 'nonce' : '0x00', " + " 'storage' : { " + " } " + " } " + " }, " + " 'transaction' : { " + " 'data' : '0x60fe47b10000000000000000000000000000000000000000000000000000000000000400', " + " 'gasLimit' : '0x061a80', " + " 'gasPrice' : '0x01', " + " 'nonce' : '0x00', " + " 'secretKey' : '45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8', " + " 'to' : '095e7baea6a6c7c4c2dfeb977efac326af552d87', " + " 'value' : '0x0186a0' " + " } " + " } " + "}";
StateTestSuite stateTestSuite = new StateTestSuite(json.replaceAll("'", "\""));
List<String> res = new StateTestRunner(stateTestSuite.getTestCases().get("test1")) {
@Override
protected ProgramResult executeTransaction(Transaction tx) {
// first emulating the constant call (Ethereum.callConstantFunction)
// to ensure it doesn't affect the final state
{
Repository track = repository.startTracking();
Transaction txConst = CallTransaction.createCallTransaction(config, 0, 0, 100000000000000L, new RskAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"), 0, CallTransaction.Function.fromSignature("get"));
txConst.sign(new byte[32]);
Block bestBlock = block;
TransactionExecutor executor = new TransactionExecutor(config, txConst, 0, bestBlock.getCoinbase(), track, new BlockStoreDummy(), null, invokeFactory, bestBlock).setLocalCall(true);
executor.init();
executor.execute();
executor.go();
executor.finalization();
track.rollback();
System.out.println("Return value: " + new CallTransaction.IntType("uint").decode(executor.getResult().getHReturn()));
}
// now executing the JSON test transaction
return super.executeTransaction(tx);
}
}.runImpl();
if (!res.isEmpty())
throw new RuntimeException("Test failed: " + res);
}
Aggregations