From f5ed0b4a1f8d922386f671432f0e2da3f69dacd7 Mon Sep 17 00:00:00 2001 From: Matt Witherspoon <32485495+spoonincode@users.noreply.github.com> Date: Thu, 1 Mar 2018 19:41:14 -0500 Subject: [PATCH] initial work at allowing wasm runtime to be configurable (not wired up yet) --- .../chain/include/eosio/chain/chain_controller.hpp | 1 + libraries/chain/include/eosio/chain/config.hpp | 3 +++ .../chain/include/eosio/chain/wasm_interface.hpp | 5 ++++- libraries/chain/wasm_interface.cpp | 11 +++++++++++ libraries/chain/webassembly/wavm.cpp | 1 + plugins/chain_plugin/chain_plugin.cpp | 11 ++++++++++- 6 files changed, 30 insertions(+), 2 deletions(-) diff --git a/libraries/chain/include/eosio/chain/chain_controller.hpp b/libraries/chain/include/eosio/chain/chain_controller.hpp index 99793ced9..922fbe558 100644 --- a/libraries/chain/include/eosio/chain/chain_controller.hpp +++ b/libraries/chain/include/eosio/chain/chain_controller.hpp @@ -77,6 +77,7 @@ namespace eosio { namespace chain { std::vector::slot_type> on_pending_transaction_callbacks; contracts::genesis_state_type genesis; runtime_limits limits; + wasm_interface::vm_type wasm_runtime = config::default_wasm_runtime; }; explicit chain_controller( const controller_config& cfg ); diff --git a/libraries/chain/include/eosio/chain/config.hpp b/libraries/chain/include/eosio/chain/config.hpp index 80aaadd82..d7c66678b 100644 --- a/libraries/chain/include/eosio/chain/config.hpp +++ b/libraries/chain/include/eosio/chain/config.hpp @@ -4,6 +4,7 @@ */ #pragma once #include +#include #include #pragma GCC diagnostic ignored "-Wunused-variable" @@ -64,6 +65,8 @@ const static uint32_t rate_limiting_precision = 1000*1000; const static uint16_t max_recursion_depth = 6; +const static eosio::chain::wasm_interface::vm_type default_wasm_runtime = eosio::chain::wasm_interface::vm_type::binaryen; + /** * The number of sequential blocks produced by a single producer */ diff --git a/libraries/chain/include/eosio/chain/wasm_interface.hpp b/libraries/chain/include/eosio/chain/wasm_interface.hpp index 310c4c56b..8f928fda5 100644 --- a/libraries/chain/include/eosio/chain/wasm_interface.hpp +++ b/libraries/chain/include/eosio/chain/wasm_interface.hpp @@ -1,5 +1,4 @@ #pragma once -#include #include namespace eosio { namespace chain { @@ -123,3 +122,7 @@ namespace eosio { namespace chain { }; } } // eosio::chain + +namespace eosio{ namespace chain { + std::istream& operator>>(std::istream& in, wasm_interface::vm_type& runtime); +}} \ No newline at end of file diff --git a/libraries/chain/wasm_interface.cpp b/libraries/chain/wasm_interface.cpp index 5a0cb0272..ba8169c92 100644 --- a/libraries/chain/wasm_interface.cpp +++ b/libraries/chain/wasm_interface.cpp @@ -1614,5 +1614,16 @@ REGISTER_INTRINSICS(db_index_api_key64x64x64_value_index_by_scope_primary, DB_ REGISTER_INTRINSICS(db_index_api_key64x64x64_value_index_by_scope_secondary, DB_INDEX_METHOD_SEQ(secondary_i64i64i64)); REGISTER_INTRINSICS(db_index_api_key64x64x64_value_index_by_scope_tertiary, DB_INDEX_METHOD_SEQ(tertiary_i64i64i64)); +std::istream& operator>>(std::istream& in, wasm_interface::vm_type& runtime) { + std::string s; + in >> s; + if (s == "wavm") + runtime = eosio::chain::wasm_interface::vm_type::wavm; + else if (s == "binaryen") + runtime = eosio::chain::wasm_interface::vm_type::binaryen; + else + in.setstate(std::ios_base::failbit); + return in; +} } } /// eosio::chain diff --git a/libraries/chain/webassembly/wavm.cpp b/libraries/chain/webassembly/wavm.cpp index 2eb210159..5b26239d9 100644 --- a/libraries/chain/webassembly/wavm.cpp +++ b/libraries/chain/webassembly/wavm.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "IR/Module.h" #include "Platform/Platform.h" diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index bc3941f32..8e835651e 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -10,7 +10,7 @@ #include #include #include - +#include #include #include @@ -27,6 +27,7 @@ namespace eosio { using namespace eosio; using namespace eosio::chain; using namespace eosio::chain::config; +using vm_type = wasm_interface::vm_type; using fc::flat_map; //using txn_msg_rate_limits = chain_controller::txn_msg_rate_limits; @@ -49,6 +50,7 @@ public: uint32_t max_reversible_block_time_ms; uint32_t max_pending_transaction_time_ms; //txn_msg_rate_limits rate_limits; + fc::optional wasm_runtime; }; chain_plugin::chain_plugin() @@ -69,6 +71,7 @@ void chain_plugin::set_program_options(options_description& cli, options_descrip "Limits the maximum time (in milliseconds) that a reversible block is allowed to run before being considered invalid") ("max-pending-transaction-time", bpo::value()->default_value(-1), "Limits the maximum time (in milliseconds) that is allowed a pushed transaction's code to execute before being considered invalid") + ("wasm-runtime", bpo::value(), "Override default WASM runtime; not supported") #warning TODO: rate limiting /*("per-authorized-account-transaction-msg-rate-limit-time-frame-sec", bpo::value()->default_value(default_per_auth_account_time_frame_seconds), "The time frame, in seconds, that the per-authorized-account-transaction-msg-rate-limit is imposed over.") @@ -161,6 +164,9 @@ void chain_plugin::plugin_initialize(const variables_map& options) { my->max_reversible_block_time_ms = options.at("max-reversible-block-time").as(); my->max_pending_transaction_time_ms = options.at("max-pending-transaction-time").as(); + if(options.count("wasm-runtime")) + my->wasm_runtime = options.at("wasm-runtime").as(); + #warning TODO: Rate Limits /*my->rate_limits.per_auth_account_time_frame_sec = fc::time_point_sec(options.at("per-authorized-account-transaction-msg-rate-limit-time-frame-sec").as()); my->rate_limits.per_auth_account = options.at("per-authorized-account-transaction-msg-rate-limit").as(); @@ -190,6 +196,9 @@ void chain_plugin::plugin_startup() my->chain_config->limits.max_push_transaction_us = fc::milliseconds(my->max_pending_transaction_time_ms); } + if(my->wasm_runtime) + my->chain_config->wasm_runtime = *my->wasm_runtime; + my->chain.emplace(*my->chain_config); if(!my->readonly) { -- GitLab