diff --git a/libraries/chain/include/eosio/chain/wasm_interface_private.hpp b/libraries/chain/include/eosio/chain/wasm_interface_private.hpp index ac5687b882..faa4e0f260 100644 --- a/libraries/chain/include/eosio/chain/wasm_interface_private.hpp +++ b/libraries/chain/include/eosio/chain/wasm_interface_private.hpp @@ -109,24 +109,6 @@ namespace eosio { namespace chain { return it != wasm_instantiation_cache.end(); } - std::vector parse_initial_memory(const Module& module) { - std::vector mem_image; - - for(const DataSegment& data_segment : module.dataSegments) { - EOS_ASSERT(data_segment.baseOffset.type == InitializerExpression::Type::i32_const, wasm_exception, ""); - EOS_ASSERT(module.memories.defs.size(), wasm_exception, ""); - const U32 base_offset = data_segment.baseOffset.i32; - const Uptr memory_size = (module.memories.defs[0].type.size.min << IR::numBytesPerPageLog2); - if(base_offset >= memory_size || base_offset + data_segment.data.size() > memory_size) - FC_THROW_EXCEPTION(wasm_execution_error, "WASM data segment outside of valid memory range"); - if(base_offset + data_segment.data.size() > mem_image.size()) - mem_image.resize(base_offset + data_segment.data.size(), 0x00); - memcpy(mem_image.data() + base_offset, data_segment.data.data(), data_segment.data.size()); - } - - return mem_image; - } - void code_block_num_last_used(const digest_type& code_hash, const uint8_t& vm_type, const uint8_t& vm_version, const uint32_t& block_num) { wasm_cache_index::iterator it = wasm_instantiation_cache.find(boost::make_tuple(code_hash, vm_type, vm_version)); if(it != wasm_instantiation_cache.end()) @@ -173,24 +155,8 @@ namespace eosio { namespace chain { trx_context.resume_billing_timer(); }); trx_context.pause_billing_timer(); - IR::Module module; - std::vector bytes = { - (const U8*)codeobject->code.data(), - (const U8*)codeobject->code.data() + codeobject->code.size()}; - try { - Serialization::MemoryInputStream stream((const U8*)bytes.data(), - bytes.size()); - WASM::scoped_skip_checks no_check; - WASM::serialize(stream, module); - module.userSections.clear(); - } catch (const Serialization::FatalSerializationException& e) { - EOS_ASSERT(false, wasm_serialization_error, e.message.c_str()); - } catch (const IR::ValidationException& e) { - EOS_ASSERT(false, wasm_serialization_error, e.message.c_str()); - } - wasm_instantiation_cache.modify(it, [&](auto& c) { - c.module = runtime_interface->instantiate_module((const char*)bytes.data(), bytes.size(), parse_initial_memory(module), code_hash, vm_type, vm_version); + c.module = runtime_interface->instantiate_module(codeobject->code.data(), codeobject->code.size(), code_hash, vm_type, vm_version); }); } return it->module; diff --git a/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc.hpp b/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc.hpp index 02dcf48a19..4eb751d0c0 100644 --- a/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc.hpp @@ -30,7 +30,7 @@ class eosvmoc_runtime : public eosio::chain::wasm_runtime_interface { public: eosvmoc_runtime(const boost::filesystem::path data_dir, const eosvmoc::config& eosvmoc_config, const chainbase::database& db); ~eosvmoc_runtime(); - std::unique_ptr instantiate_module(const char* code_bytes, size_t code_size, std::vector initial_memory, + std::unique_ptr instantiate_module(const char* code_bytes, size_t code_size, const digest_type& code_hash, const uint8_t& vm_type, const uint8_t& vm_version) override; void immediately_exit_currently_running_module() override; diff --git a/libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp b/libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp index 94669c383f..9301676850 100644 --- a/libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp @@ -43,7 +43,7 @@ template class eos_vm_runtime : public eosio::chain::wasm_runtime_interface { public: eos_vm_runtime(); - std::unique_ptr instantiate_module(const char* code_bytes, size_t code_size, std::vector, + std::unique_ptr instantiate_module(const char* code_bytes, size_t code_size, const digest_type& code_hash, const uint8_t& vm_type, const uint8_t& vm_version) override; void immediately_exit_currently_running_module() override; @@ -61,7 +61,7 @@ class eos_vm_runtime : public eosio::chain::wasm_runtime_interface { class eos_vm_profile_runtime : public eosio::chain::wasm_runtime_interface { public: eos_vm_profile_runtime(); - std::unique_ptr instantiate_module(const char* code_bytes, size_t code_size, std::vector, + std::unique_ptr instantiate_module(const char* code_bytes, size_t code_size, const digest_type& code_hash, const uint8_t& vm_type, const uint8_t& vm_version) override; void immediately_exit_currently_running_module() override; diff --git a/libraries/chain/include/eosio/chain/webassembly/runtime_interface.hpp b/libraries/chain/include/eosio/chain/webassembly/runtime_interface.hpp index 685fe86f33..1c999f0bcd 100644 --- a/libraries/chain/include/eosio/chain/webassembly/runtime_interface.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/runtime_interface.hpp @@ -20,7 +20,7 @@ class wasm_instantiated_module_interface { class wasm_runtime_interface { public: - virtual std::unique_ptr instantiate_module(const char* code_bytes, size_t code_size, std::vector initial_memory, + virtual std::unique_ptr instantiate_module(const char* code_bytes, size_t code_size, const digest_type& code_hash, const uint8_t& vm_type, const uint8_t& vm_version) = 0; //immediately exit the currently running wasm_instantiated_module_interface. Yep, this assumes only one can possibly run at a time. diff --git a/libraries/chain/webassembly/runtimes/eos-vm-oc.cpp b/libraries/chain/webassembly/runtimes/eos-vm-oc.cpp index 831c507b4f..c4ba7335ce 100644 --- a/libraries/chain/webassembly/runtimes/eos-vm-oc.cpp +++ b/libraries/chain/webassembly/runtimes/eos-vm-oc.cpp @@ -50,7 +50,7 @@ eosvmoc_runtime::eosvmoc_runtime(const boost::filesystem::path data_dir, const e eosvmoc_runtime::~eosvmoc_runtime() { } -std::unique_ptr eosvmoc_runtime::instantiate_module(const char* code_bytes, size_t code_size, std::vector initial_memory, +std::unique_ptr eosvmoc_runtime::instantiate_module(const char* code_bytes, size_t code_size, const digest_type& code_hash, const uint8_t& vm_type, const uint8_t& vm_version) { return std::make_unique(code_hash, vm_type, *this); } diff --git a/libraries/chain/webassembly/runtimes/eos-vm.cpp b/libraries/chain/webassembly/runtimes/eos-vm.cpp index 1d78a1a7fa..39e549706e 100644 --- a/libraries/chain/webassembly/runtimes/eos-vm.cpp +++ b/libraries/chain/webassembly/runtimes/eos-vm.cpp @@ -239,7 +239,7 @@ void eos_vm_runtime::immediately_exit_currently_running_module() { } template -std::unique_ptr eos_vm_runtime::instantiate_module(const char* code_bytes, size_t code_size, std::vector, +std::unique_ptr eos_vm_runtime::instantiate_module(const char* code_bytes, size_t code_size, const digest_type&, const uint8_t&, const uint8_t&) { using backend_t = eos_vm_backend_t; @@ -265,7 +265,7 @@ void eos_vm_profile_runtime::immediately_exit_currently_running_module() { throw wasm_exit{}; } -std::unique_ptr eos_vm_profile_runtime::instantiate_module(const char* code_bytes, size_t code_size, std::vector, +std::unique_ptr eos_vm_profile_runtime::instantiate_module(const char* code_bytes, size_t code_size, const digest_type&, const uint8_t&, const uint8_t&) { using backend_t = eosio::vm::backend;