From 1838caa38d2e575a225fb8a4796338d849604a6b Mon Sep 17 00:00:00 2001 From: Steven Watanabe Date: Mon, 14 Sep 2020 17:01:53 -0400 Subject: [PATCH 1/3] Profiling support for WASM - To profile a contract use --profile-account - For rodeos filters use the --profile-filter option --- libraries/chain/controller.cpp | 6 +- .../chain/include/eosio/chain/controller.hpp | 4 + .../include/eosio/chain/wasm_interface.hpp | 2 +- .../eosio/chain/wasm_interface_private.hpp | 8 +- .../eosio/chain/webassembly/eos-vm.hpp | 17 +++- .../chain/webassembly/runtime_interface.hpp | 1 + libraries/chain/wasm_interface.cpp | 4 +- .../chain/webassembly/runtimes/eos-vm.cpp | 92 +++++++++++++++++++ libraries/eos-vm | 2 +- libraries/rodeos/embedded_rodeos.cpp | 2 +- libraries/rodeos/include/b1/rodeos/filter.hpp | 2 +- libraries/rodeos/include/b1/rodeos/rodeos.hpp | 4 +- libraries/rodeos/rodeos.cpp | 6 +- plugins/chain_plugin/chain_plugin.cpp | 4 + programs/rodeos/cloner_plugin.cpp | 5 +- tests/rodeos_test.py | 3 +- 16 files changed, 147 insertions(+), 15 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index ade0d2e2a3f..b12d041d30d 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -322,7 +322,7 @@ struct controller_impl { cfg.reversible_cache_size, false, cfg.db_map_mode, cfg.db_hugepage_paths ), blog( cfg.blog ), fork_db( cfg.state_dir ), - wasmif( cfg.wasm_runtime, cfg.eosvmoc_tierup, db, cfg.state_dir, cfg.eosvmoc_config ), + wasmif( cfg.wasm_runtime, cfg.eosvmoc_tierup, db, cfg.state_dir, cfg.eosvmoc_config, !cfg.profile_accounts.empty() ), resource_limits( db, [&s]() { return s.get_deep_mind_logger(); }), authorization( s, db ), protocol_features( std::move(pfs), [&s]() { return s.get_deep_mind_logger(); } ), @@ -3190,6 +3190,10 @@ bool controller::contracts_console()const { return my->conf.contracts_console; } +bool controller::is_profiling(account_name account) const { + return my->conf.profile_accounts.find(account) != my->conf.profile_accounts.end(); +} + chain_id_type controller::get_chain_id()const { return my->chain_id; } diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index 173d4bfe207..9628f7a889c 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -100,6 +100,8 @@ namespace eosio { namespace chain { flat_set resource_greylist; flat_set trusted_producers; uint32_t greylist_limit = chain::config::maximum_elastic_resource_multiplier; + + flat_set profile_accounts; }; enum class block_status { @@ -289,6 +291,8 @@ namespace eosio { namespace chain { bool contracts_console()const; + bool is_profiling(account_name name) const; + chain_id_type get_chain_id()const; db_read_mode get_read_mode()const; diff --git a/libraries/chain/include/eosio/chain/wasm_interface.hpp b/libraries/chain/include/eosio/chain/wasm_interface.hpp index 8b08a4edb58..48b6c365dfb 100644 --- a/libraries/chain/include/eosio/chain/wasm_interface.hpp +++ b/libraries/chain/include/eosio/chain/wasm_interface.hpp @@ -44,7 +44,7 @@ namespace eosio { namespace chain { } } - wasm_interface(vm_type vm, bool eosvmoc_tierup, const chainbase::database& d, const boost::filesystem::path data_dir, const eosvmoc::config& eosvmoc_config); + wasm_interface(vm_type vm, bool eosvmoc_tierup, const chainbase::database& d, const boost::filesystem::path data_dir, const eosvmoc::config& eosvmoc_config, bool profile); ~wasm_interface(); //call before dtor to skip what can be minutes of dtor overhead with some runtimes; can cause leaks diff --git a/libraries/chain/include/eosio/chain/wasm_interface_private.hpp b/libraries/chain/include/eosio/chain/wasm_interface_private.hpp index 08b707cb4f7..0e9e9ec9b03 100644 --- a/libraries/chain/include/eosio/chain/wasm_interface_private.hpp +++ b/libraries/chain/include/eosio/chain/wasm_interface_private.hpp @@ -59,13 +59,15 @@ namespace eosio { namespace chain { }; #endif - wasm_interface_impl(wasm_interface::vm_type vm, bool eosvmoc_tierup, const chainbase::database& d, const boost::filesystem::path data_dir, const eosvmoc::config& eosvmoc_config) : db(d), wasm_runtime_time(vm) { + wasm_interface_impl(wasm_interface::vm_type vm, bool eosvmoc_tierup, const chainbase::database& d, const boost::filesystem::path data_dir, const eosvmoc::config& eosvmoc_config, bool profile) : db(d), wasm_runtime_time(vm) { #ifdef EOSIO_EOS_VM_RUNTIME_ENABLED if(vm == wasm_interface::vm_type::eos_vm) runtime_interface = std::make_unique>(); #endif #ifdef EOSIO_EOS_VM_JIT_RUNTIME_ENABLED - if(vm == wasm_interface::vm_type::eos_vm_jit) + if(vm == wasm_interface::vm_type::eos_vm_jit && profile) + runtime_interface = std::make_unique(); + if(vm == wasm_interface::vm_type::eos_vm_jit && !profile) runtime_interface = std::make_unique>(); #endif #ifdef EOSIO_EOS_VM_OC_RUNTIME_ENABLED @@ -87,7 +89,7 @@ namespace eosio { namespace chain { if(is_shutting_down) for(wasm_cache_index::iterator it = wasm_instantiation_cache.begin(); it != wasm_instantiation_cache.end(); ++it) wasm_instantiation_cache.modify(it, [](wasm_cache_entry& e) { - e.module.release(); + e.module.release()->fast_shutdown(); }); } diff --git a/libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp b/libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp index 6f4bf2ceccd..03af69ba096 100644 --- a/libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp @@ -10,6 +10,7 @@ //eos-vm includes #include +#include namespace eosio { namespace chain { namespace webassembly { namespace eos_vm_runtime { @@ -18,7 +19,7 @@ struct apply_options; }} template -using eos_vm_backend_t = eosio::vm::backend; +using eos_vm_backend_t = eosio::vm::backend; template using eos_vm_null_backend_t = eosio::vm::backend; @@ -34,6 +35,10 @@ void validate(const bytes& code, const wasm_config& cfg, const whitelisted_intri struct apply_options; +struct profile_config { + boost::container::flat_set accounts_to_profile; +}; + template class eos_vm_runtime : public eosio::chain::wasm_runtime_interface { public: @@ -54,4 +59,14 @@ class eos_vm_runtime : public eosio::chain::wasm_runtime_interface { friend class eos_vm_instantiated_module; }; +class eos_vm_profile_runtime : public eosio::chain::wasm_runtime_interface { + public: + eos_vm_profile_runtime(); + bool inject_module(IR::Module&) override; + std::unique_ptr instantiate_module(const char* code_bytes, size_t code_size, std::vector, + const digest_type& code_hash, const uint8_t& vm_type, const uint8_t& vm_version) override; + + void immediately_exit_currently_running_module() override; +}; + }}}}// eosio::chain::webassembly::eos_vm_runtime diff --git a/libraries/chain/include/eosio/chain/webassembly/runtime_interface.hpp b/libraries/chain/include/eosio/chain/webassembly/runtime_interface.hpp index 882ea2169da..b75b53adf2c 100644 --- a/libraries/chain/include/eosio/chain/webassembly/runtime_interface.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/runtime_interface.hpp @@ -13,6 +13,7 @@ class apply_context; class wasm_instantiated_module_interface { public: virtual void apply(apply_context& context) = 0; + virtual void fast_shutdown() {} virtual ~wasm_instantiated_module_interface(); }; diff --git a/libraries/chain/wasm_interface.cpp b/libraries/chain/wasm_interface.cpp index 5a53207bc3a..7a35ec0ca8a 100644 --- a/libraries/chain/wasm_interface.cpp +++ b/libraries/chain/wasm_interface.cpp @@ -33,8 +33,8 @@ namespace eosio { namespace chain { - wasm_interface::wasm_interface(vm_type vm, bool eosvmoc_tierup, const chainbase::database& d, const boost::filesystem::path data_dir, const eosvmoc::config& eosvmoc_config) - : my( new wasm_interface_impl(vm, eosvmoc_tierup, d, data_dir, eosvmoc_config) ) {} + wasm_interface::wasm_interface(vm_type vm, bool eosvmoc_tierup, const chainbase::database& d, const boost::filesystem::path data_dir, const eosvmoc::config& eosvmoc_config, bool profile) + : my( new wasm_interface_impl(vm, eosvmoc_tierup, d, data_dir, eosvmoc_config, profile) ) {} wasm_interface::~wasm_interface() {} diff --git a/libraries/chain/webassembly/runtimes/eos-vm.cpp b/libraries/chain/webassembly/runtimes/eos-vm.cpp index b6502ea1a1a..12617c9b32f 100644 --- a/libraries/chain/webassembly/runtimes/eos-vm.cpp +++ b/libraries/chain/webassembly/runtimes/eos-vm.cpp @@ -156,6 +156,72 @@ class eos_vm_instantiated_module : public wasm_instantiated_module_interface { std::unique_ptr _instantiated_module; }; +class eos_vm_profiling_module : public wasm_instantiated_module_interface { + using backend_t = eosio::vm::backend; + public: + eos_vm_profiling_module(std::unique_ptr mod, const char * code, std::size_t code_size) : + _instantiated_module(std::move(mod)), + _original_code(code, code + code_size) {} + + + void apply(apply_context& context) override { + _instantiated_module->set_wasm_allocator(&context.control.get_wasm_allocator()); + apply_options opts; + if(context.control.is_builtin_activated(builtin_protocol_feature_t::configurable_wasm_limits)) { + const wasm_config& config = context.control.get_global_properties().wasm_configuration; + opts = {config.max_pages, config.max_call_depth}; + } + auto fn = [&]() { + eosio::chain::webassembly::interface iface(context); + _instantiated_module->initialize(&iface, opts); + _instantiated_module->call( + iface, "env", "apply", + context.get_receiver().to_uint64_t(), + context.get_action().account.to_uint64_t(), + context.get_action().name.to_uint64_t()); + }; + profile_data* prof = start(context); + try { + scoped_profile profile_runner(prof); + checktime_watchdog wd(context.trx_context.transaction_timer); + _instantiated_module->timed_run(wd, fn); + } catch(eosio::vm::timeout_exception&) { + context.trx_context.checktime(); + } catch(eosio::vm::wasm_memory_exception& e) { + FC_THROW_EXCEPTION(wasm_execution_error, "access violation"); + } catch(eosio::vm::exception& e) { + FC_THROW_EXCEPTION(wasm_execution_error, "eos-vm system failure"); + } + } + + void fast_shutdown() override { + _prof.clear(); + } + + profile_data* start(apply_context& context) { + name account = context.get_receiver(); + if(!context.control.is_profiling(account)) return nullptr; + if(auto it = _prof.find(account); it != _prof.end()) { + return it->second.get(); + } else { + auto code_sequence = context.control.db().get(account).code_sequence; + std::string basename = account.to_string() + "." + std::to_string(code_sequence); + auto prof = std::make_unique(basename + ".profile", *_instantiated_module); + auto [pos,_] = _prof.insert(std::pair{ account, std::move(prof)}); + std::ofstream outfile(basename + ".wasm"); + outfile.write(_original_code.data(), _original_code.size()); + return pos->second.get(); + } + return nullptr; + } + + private: + + std::unique_ptr _instantiated_module; + boost::container::flat_map> _prof; + std::vector _original_code; +}; + template eos_vm_runtime::eos_vm_runtime() {} @@ -189,4 +255,30 @@ std::unique_ptr eos_vm_runtime::instan template class eos_vm_runtime; template class eos_vm_runtime; +eos_vm_profile_runtime::eos_vm_profile_runtime() {} + +void eos_vm_profile_runtime::immediately_exit_currently_running_module() { + throw wasm_exit{}; +} + +bool eos_vm_profile_runtime::inject_module(IR::Module& module) { + return false; +} + +std::unique_ptr eos_vm_profile_runtime::instantiate_module(const char* code_bytes, size_t code_size, std::vector, + const digest_type&, const uint8_t&, const uint8_t&) { + + using backend_t = eosio::vm::backend; + try { + wasm_code_ptr code((uint8_t*)code_bytes, code_size); + apply_options options = { .max_pages = 65536, + .max_call_depth = 0 }; + std::unique_ptr bkend = std::make_unique(code, code_size, nullptr, options); + eos_vm_host_functions_t::resolve(bkend->get_module()); + return std::make_unique(std::move(bkend), code_bytes, code_size); + } catch(eosio::vm::exception& e) { + FC_THROW_EXCEPTION(wasm_execution_error, "Error building eos-vm interp: ${e}", ("e", e.what())); + } +} + }}}} diff --git a/libraries/eos-vm b/libraries/eos-vm index 5f5cf516465..a7beb294535 160000 --- a/libraries/eos-vm +++ b/libraries/eos-vm @@ -1 +1 @@ -Subproject commit 5f5cf516465d6c6b9f212a99651ffe3b28760462 +Subproject commit a7beb294535e8e8a122521a46f8ce233dcde22c4 diff --git a/libraries/rodeos/embedded_rodeos.cpp b/libraries/rodeos/embedded_rodeos.cpp index fcfe3d88d47..708a35292b0 100644 --- a/libraries/rodeos/embedded_rodeos.cpp +++ b/libraries/rodeos/embedded_rodeos.cpp @@ -193,7 +193,7 @@ extern "C" rodeos_bool rodeos_write_deltas(rodeos_error* error, rodeos_db_snapsh extern "C" rodeos_filter* rodeos_create_filter(rodeos_error* error, uint64_t name, const char* wasm_filename) { return handle_exceptions(error, nullptr, [&]() -> rodeos_filter* { // - return std::make_unique(eosio::name{ name }, wasm_filename).release(); + return std::make_unique(eosio::name{ name }, wasm_filename, false).release(); }); } diff --git a/libraries/rodeos/include/b1/rodeos/filter.hpp b/libraries/rodeos/include/b1/rodeos/filter.hpp index 8b4b405d288..cae8d796ce0 100644 --- a/libraries/rodeos/include/b1/rodeos/filter.hpp +++ b/libraries/rodeos/include/b1/rodeos/filter.hpp @@ -15,7 +15,7 @@ namespace b1::rodeos::filter { struct callbacks; using rhf_t = registered_host_functions; -using backend_t = eosio::vm::backend; +using backend_t = eosio::vm::backend; struct filter_state : b1::rodeos::data_state, b1::rodeos::console_state, b1::rodeos::filter_callback_state { eosio::vm::wasm_allocator wa = {}; diff --git a/libraries/rodeos/include/b1/rodeos/rodeos.hpp b/libraries/rodeos/include/b1/rodeos/rodeos.hpp index 68b492ae13e..a74b51c0174 100644 --- a/libraries/rodeos/include/b1/rodeos/rodeos.hpp +++ b/libraries/rodeos/include/b1/rodeos/rodeos.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include namespace b1::rodeos { @@ -73,8 +74,9 @@ struct rodeos_filter { eosio::name name = {}; std::unique_ptr backend = {}; std::unique_ptr filter_state = {}; + std::unique_ptr prof = {}; - rodeos_filter(eosio::name name, const std::string& wasm_filename); + rodeos_filter(eosio::name name, const std::string& wasm_filename, bool profile); void process(rodeos_db_snapshot& snapshot, const eosio::ship_protocol::get_blocks_result_base& result, eosio::input_stream bin, const std::function& push_data); diff --git a/libraries/rodeos/rodeos.cpp b/libraries/rodeos/rodeos.cpp index ffe292a576c..ffc82c5f5f4 100644 --- a/libraries/rodeos/rodeos.cpp +++ b/libraries/rodeos/rodeos.cpp @@ -260,7 +260,7 @@ void rodeos_db_snapshot::write_deltas(const ship_protocol::get_blocks_result_v1& std::once_flag registered_filter_callbacks; -rodeos_filter::rodeos_filter(eosio::name name, const std::string& wasm_filename) : name{ name } { +rodeos_filter::rodeos_filter(eosio::name name, const std::string& wasm_filename, bool profile) : name{ name } { std::call_once(registered_filter_callbacks, filter::register_callbacks); std::ifstream wasm_file(wasm_filename, std::ios::binary); @@ -278,6 +278,9 @@ rodeos_filter::rodeos_filter(eosio::name name, const std::string& wasm_filename) backend = std::make_unique(code, nullptr); filter_state = std::make_unique(); filter::rhf_t::resolve(backend->get_module()); + if (profile) { + prof = std::make_unique(wasm_filename + ".profile", *backend); + } } void rodeos_filter::process(rodeos_db_snapshot& snapshot, const ship_protocol::get_blocks_result_base& result, @@ -297,6 +300,7 @@ void rodeos_filter::process(rodeos_db_snapshot& snapshot, const ship_protocol::g backend->set_wasm_allocator(&filter_state->wa); backend->initialize(&cb); try { + eosio::vm::scoped_profile profile_runner(prof.get()); (*backend)(cb, "env", "apply", uint64_t(0), uint64_t(0), uint64_t(0)); if (!filter_state->console.empty()) diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index ca6edd3f138..edccc127e3a 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -260,6 +260,8 @@ void chain_plugin::set_program_options(options_description& cli, options_descrip #endif })->default_value(eosio::chain::config::default_wasm_runtime, default_wasm_runtime_str), wasm_runtime_opt.c_str() ) + ("profile-account", boost::program_options::value>()->composing(), + "The name of an account whose code will be profiled") ("abi-serializer-max-time-ms", bpo::value()->default_value(config::default_abi_serializer_max_time_us / 1000), "Override default maximum ABI serialization time allowed in ms") ("chain-state-db-size-mb", bpo::value()->default_value(config::default_state_size / (1024 * 1024)), "Maximum size (in MiB) of the chain state database") @@ -754,6 +756,8 @@ void chain_plugin::plugin_initialize(const variables_map& options) { if( options.count( "wasm-runtime" )) my->wasm_runtime = options.at( "wasm-runtime" ).as(); + LOAD_VALUE_SET( options, "profile-account", my->chain_config->profile_accounts ); + if(options.count("abi-serializer-max-time-ms")) { my->abi_serializer_max_time_us = fc::microseconds(options.at("abi-serializer-max-time-ms").as() * 1000); my->chain_config->abi_serializer_max_time_us = my->abi_serializer_max_time_us; diff --git a/programs/rodeos/cloner_plugin.cpp b/programs/rodeos/cloner_plugin.cpp index 2621c4f7157..6da0ea3faf9 100644 --- a/programs/rodeos/cloner_plugin.cpp +++ b/programs/rodeos/cloner_plugin.cpp @@ -35,6 +35,7 @@ struct cloner_config : ship_client::connection_config { bool exit_on_filter_wasm_error = false; eosio::name filter_name = {}; // todo: remove std::string filter_wasm = {}; // todo: remove + bool profile = false; }; struct cloner_plugin_impl : std::enable_shared_from_this { @@ -73,7 +74,7 @@ struct cloner_session : ship_client::connection_callbacks, std::enable_shared_fr cloner_session(cloner_plugin_impl* my) : my(my), config(my->config) { // todo: remove if (!config->filter_wasm.empty()) - filter = std::make_unique(config->filter_name, config->filter_wasm); + filter = std::make_unique(config->filter_name, config->filter_wasm, config->profile); } void connect(asio::io_context& ioc) { @@ -227,6 +228,7 @@ void cloner_plugin::set_program_options(options_description& cli, options_descri // todo: remove op("filter-name", bpo::value(), "Filter name"); op("filter-wasm", bpo::value(), "Filter wasm"); + op("profile-filter", bpo::bool_switch(), "Enable filter profiling"); } void cloner_plugin::plugin_initialize(const variables_map& options) { @@ -245,6 +247,7 @@ void cloner_plugin::plugin_initialize(const variables_map& options) { if (options.count("filter-name") && options.count("filter-wasm")) { my->config->filter_name = eosio::name{ options["filter-name"].as() }; my->config->filter_wasm = options["filter-wasm"].as(); + my->config->profile = options["profile-filter"].as(); } else if (options.count("filter-name") || options.count("filter-wasm")) { throw std::runtime_error("filter-name and filter-wasm must be used together"); } diff --git a/tests/rodeos_test.py b/tests/rodeos_test.py index b4a79b8c911..affdddf4813 100755 --- a/tests/rodeos_test.py +++ b/tests/rodeos_test.py @@ -121,7 +121,8 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): if self.rodeos is not None: - self.rodeos.kill() + self.rodeos.send_signal(signal.SIGINT) + self.rodeos.wait() if self.rodeosStdout is not None: self.rodeosStdout.close() if self.rodeosStderr is not None: From ed6dd61c02ed2b2b8e44cc38ada7ff5bcb817628 Mon Sep 17 00:00:00 2001 From: Steven Watanabe Date: Thu, 1 Oct 2020 08:34:31 -0400 Subject: [PATCH 2/3] Update eos-vm --- .../chain/include/eosio/chain/wasm_interface_private.hpp | 4 +++- libraries/chain/webassembly/runtimes/eos-vm.cpp | 4 ++-- libraries/eos-vm | 2 +- libraries/rodeos/include/b1/rodeos/filter.hpp | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/libraries/chain/include/eosio/chain/wasm_interface_private.hpp b/libraries/chain/include/eosio/chain/wasm_interface_private.hpp index 0e9e9ec9b03..79bde1b58ed 100644 --- a/libraries/chain/include/eosio/chain/wasm_interface_private.hpp +++ b/libraries/chain/include/eosio/chain/wasm_interface_private.hpp @@ -65,8 +65,10 @@ namespace eosio { namespace chain { runtime_interface = std::make_unique>(); #endif #ifdef EOSIO_EOS_VM_JIT_RUNTIME_ENABLED - if(vm == wasm_interface::vm_type::eos_vm_jit && profile) + if(vm == wasm_interface::vm_type::eos_vm_jit && profile) { + eosio::vm::set_profile_interval_us(200); runtime_interface = std::make_unique(); + } if(vm == wasm_interface::vm_type::eos_vm_jit && !profile) runtime_interface = std::make_unique>(); #endif diff --git a/libraries/chain/webassembly/runtimes/eos-vm.cpp b/libraries/chain/webassembly/runtimes/eos-vm.cpp index 12617c9b32f..fe378bd0318 100644 --- a/libraries/chain/webassembly/runtimes/eos-vm.cpp +++ b/libraries/chain/webassembly/runtimes/eos-vm.cpp @@ -157,7 +157,7 @@ class eos_vm_instantiated_module : public wasm_instantiated_module_interface { }; class eos_vm_profiling_module : public wasm_instantiated_module_interface { - using backend_t = eosio::vm::backend; + using backend_t = eosio::vm::backend; public: eos_vm_profiling_module(std::unique_ptr mod, const char * code, std::size_t code_size) : _instantiated_module(std::move(mod)), @@ -268,7 +268,7 @@ bool eos_vm_profile_runtime::inject_module(IR::Module& module) { std::unique_ptr eos_vm_profile_runtime::instantiate_module(const char* code_bytes, size_t code_size, std::vector, const digest_type&, const uint8_t&, const uint8_t&) { - using backend_t = eosio::vm::backend; + using backend_t = eosio::vm::backend; try { wasm_code_ptr code((uint8_t*)code_bytes, code_size); apply_options options = { .max_pages = 65536, diff --git a/libraries/eos-vm b/libraries/eos-vm index a7beb294535..7d393f438f8 160000 --- a/libraries/eos-vm +++ b/libraries/eos-vm @@ -1 +1 @@ -Subproject commit a7beb294535e8e8a122521a46f8ce233dcde22c4 +Subproject commit 7d393f438f8c99229beac8827e6dce4bd3259aa7 diff --git a/libraries/rodeos/include/b1/rodeos/filter.hpp b/libraries/rodeos/include/b1/rodeos/filter.hpp index cae8d796ce0..c157fffd634 100644 --- a/libraries/rodeos/include/b1/rodeos/filter.hpp +++ b/libraries/rodeos/include/b1/rodeos/filter.hpp @@ -15,7 +15,7 @@ namespace b1::rodeos::filter { struct callbacks; using rhf_t = registered_host_functions; -using backend_t = eosio::vm::backend; +using backend_t = eosio::vm::backend; struct filter_state : b1::rodeos::data_state, b1::rodeos::console_state, b1::rodeos::filter_callback_state { eosio::vm::wasm_allocator wa = {}; From d94dfddf47d5e166e380f958c83f202292239b65 Mon Sep 17 00:00:00 2001 From: Steven Watanabe Date: Fri, 30 Oct 2020 15:27:22 -0400 Subject: [PATCH 3/3] Update eos-vm --- libraries/eos-vm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/eos-vm b/libraries/eos-vm index 7d393f438f8..530e758c580 160000 --- a/libraries/eos-vm +++ b/libraries/eos-vm @@ -1 +1 @@ -Subproject commit 7d393f438f8c99229beac8827e6dce4bd3259aa7 +Subproject commit 530e758c580ce6f0d842ab63f262539ab257edcc