From 40f9938b80ff4c66abdc9e2595f3a43292068090 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Tue, 16 Jan 2018 13:59:34 +0000 Subject: [PATCH 1/2] EEI: implement getReturnDataSize and returnDataCopy --- src/eei.cpp | 33 ++++++++++++++++++++++++++++++--- src/eei.h | 1 + 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/eei.cpp b/src/eei.cpp index 0a6a2ec12..63768bfbb 100644 --- a/src/eei.cpp +++ b/src/eei.cpp @@ -161,7 +161,7 @@ namespace HeraVM { if (import->base == Name("getCallDataSize")) { HERA_DEBUG << "callDataSize\n"; - return Literal((uint32_t)msg.input_size); + return Literal(static_cast(msg.input_size)); } if (import->base == Name("callDataCopy")) { @@ -212,7 +212,7 @@ namespace HeraVM { if (import->base == Name("getCodeSize")) { HERA_DEBUG << "getCodeSize\n"; - return Literal((uint32_t)code.size()); + return Literal(static_cast(code.size())); } if (import->base == Name("externalCodeCopy")) { @@ -243,7 +243,7 @@ namespace HeraVM { evm_address address = loadUint160(addressOffset); size_t code_size = context->fn_table->get_code(NULL, context, &address); - return Literal((uint32_t)code_size); + return Literal(static_cast(code_size)); } if (import->base == Name("getBlockCoinbase")) { @@ -405,6 +405,23 @@ namespace HeraVM { return Literal(); } + if (import->base == Name("getReturnDataSize")) { + HERA_DEBUG << "getReturnDataSize\n"; + return Literal(static_cast(lastReturnData.size())); + } + + if (import->base == Name("returnDataCopy")) { + uint32_t dataOffset = arguments[0].geti32(); + uint32_t offset = arguments[1].geti32(); + uint32_t size = arguments[2].geti32(); + + HERA_DEBUG << "returnDataCopy " << hex << offset << " " << size << dec << "\n"; + + storeMemory(lastReturnData, dataOffset, offset, size); + + return Literal(); + } + if ( import->base == Name("call") || import->base == Name("callCode") || @@ -489,6 +506,10 @@ namespace HeraVM { vector result(call_result.output_data, call_result.output_data + call_result.output_size); result.resize(resultLength); storeMemory(result, 0, resultOffset, resultLength); + + lastReturnData.assign(call_result.output_data, call_result.output_data + call_result.output_size); + } else { + lastReturnData.clear(); } if (call_result.release) @@ -535,6 +556,12 @@ namespace HeraVM { context->fn_table->call(&create_result, context, &create_message); storeUint160(create_result.create_address, resultOffset); + if (create_result.output_data) { + lastReturnData.assign(create_result.output_data, create_result.output_data + create_result.output_size); + } else { + lastReturnData.clear(); + } + if (create_result.release) create_result.release(&create_result); diff --git a/src/eei.h b/src/eei.h index 22f625d9b..e98bdb495 100644 --- a/src/eei.h +++ b/src/eei.h @@ -111,6 +111,7 @@ struct EthereumInterface : ShellExternalInterface { struct evm_context* context = nullptr; std::vector const& code; struct evm_message const& msg; + std::vector lastReturnData; ExecutionResult & result; }; From 76db892c5dc5d659585da37dae2acff8c896a085 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Tue, 16 Jan 2018 17:56:17 +0000 Subject: [PATCH 2/2] EEI: on create failure the resultOffset should not be written to --- src/eei.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/eei.cpp b/src/eei.cpp index 63768bfbb..1a6223e4a 100644 --- a/src/eei.cpp +++ b/src/eei.cpp @@ -554,7 +554,8 @@ namespace HeraVM { evm_result create_result; context->fn_table->call(&create_result, context, &create_message); - storeUint160(create_result.create_address, resultOffset); + if (create_result.status_code == EVM_SUCCESS) + storeUint160(create_result.create_address, resultOffset); if (create_result.output_data) { lastReturnData.assign(create_result.output_data, create_result.output_data + create_result.output_size);