Skip to content

Commit

Permalink
Host API fallback (#1987)
Browse files Browse the repository at this point in the history
* Host API uniformation

* Refactor WAVM host method registration

* Fix exception processing

* Fix clang-15 detection
  • Loading branch information
Harrm authored Feb 20, 2024
1 parent f962437 commit fadb610
Show file tree
Hide file tree
Showing 15 changed files with 291 additions and 1,164 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,5 @@ examples/**/db
/examples/polkadot/syncing/
/examples/kusama/syncing/
/examples/rococo/syncing/

CMakeUserPresets.json
47 changes: 47 additions & 0 deletions CMakePresets.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{
"version": 6,
"configurePresets": [
{
"name": "base",
"toolchainFile": "${sourceDir}/cmake/toolchain/clang-15_cxx20.cmake",
"generator": "Ninja",
"hidden": true
},
{
"name": "base-debug",
"inherits": "base",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"TESTING": "ON",
"HUNTER_CONFIGURATION_TYPES": "Debug"
},
"hidden": true
},
{
"name": "base-release",
"inherits": "base",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "RelWithDebInfo",
"TESTING": "OFF",
"HUNTER_CONFIGURATION_TYPES": "Release"
},
"hidden": true
},
{
"name": "debug-wasmedge",
"binaryDir": "cmake-build-debug-wasmedge",
"inherits": "base-debug",
"cacheVariables": {
"WASM_COMPILER": "WasmEdge"
}
},
{
"name": "debug-wavm",
"binaryDir": "cmake-build-debug-wavm",
"inherits": "base-debug",
"cacheVariables": {
"WASM_COMPILER": "WAVM"
}
}
]
}
2 changes: 1 addition & 1 deletion cmake/Hunter/init.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
string(COMPARE EQUAL "$ENV{GITHUB_HUNTER_USERNAME}" "" username_is_empty)
string(COMPARE EQUAL "$ENV{GITHUB_HUNTER_TOKEN}" "" password_is_empty)

# binary cache can be uploaded to soramitsu/hunter-binary-cache so others will not build same dependencies twice
# binary cache can be uploaded to qdrvm/hunter-binary-cache so others will not build same dependencies twice
if (NOT password_is_empty AND NOT username_is_empty)
option(HUNTER_RUN_UPLOAD "Upload cache binaries" YES)
message("Binary cache uploading is ENABLED.")
Expand Down
4 changes: 2 additions & 2 deletions core/network/impl/peer_manager_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -622,7 +622,7 @@ namespace kagome::network {
auto &peer_id = peer_info.id;

if (not stream_res.has_value()) {
self->log_->warn("Unable to create stream {} with {}: {}",
self->log_->verbose("Unable to create stream {} with {}: {}",
protocol->protocolName(),
peer_id,
stream_res.error());
Expand Down Expand Up @@ -719,7 +719,7 @@ namespace kagome::network {

auto &peer_id = peer_info.id;
if (!stream_result.has_value()) {
self->log_->warn(
self->log_->verbose(
"Unable to create stream {} with {}: {}",
validation_protocol->protocolName(),
peer_id,
Expand Down
2 changes: 1 addition & 1 deletion core/parachain/validator/impl/parachain_processor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1115,7 +1115,7 @@ namespace kagome::parachain {
stream_engine->dropReserveOutgoing(peer_id, protocol);

if (!stream_result.has_value()) {
self->logger_->warn("Unable to create stream {} with {}: {}",
self->logger_->verbose("Unable to create stream {} with {}: {}",
protocol->protocolName(),
peer_id,
stream_result.error());
Expand Down
141 changes: 11 additions & 130 deletions core/runtime/binaryen/runtime_external_interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "runtime/binaryen/runtime_external_interface.hpp"

#include "host_api/host_api_factory.hpp"
#include "runtime/common/register_host_api.hpp"
#include "runtime/memory.hpp"

namespace {
Expand Down Expand Up @@ -117,10 +118,8 @@ namespace {
* @param name method name
* @return result of method invocation
*/
#define REGISTER_HOST_API_FUNC(name) \
imports_[#name] = \
&importCall<&host_api::HostApi ::name> // hack to make macro call look
// natural by ending with ';'
#define REGISTER_HOST_METHOD(Ret, name, ...) \
imports_[#name] = &importCall<&host_api::HostApi ::name>;

namespace kagome::runtime {
class TrieStorageProvider;
Expand All @@ -134,128 +133,8 @@ namespace kagome::runtime::binaryen {
* https://github.com/WebAssembly/binaryen/blob/master/src/shell-interface.h
*/

void RuntimeExternalInterface::methodsRegistration() {
/// memory externals
REGISTER_HOST_API_FUNC(ext_default_child_storage_root_version_1);
REGISTER_HOST_API_FUNC(ext_default_child_storage_root_version_2);
REGISTER_HOST_API_FUNC(ext_default_child_storage_set_version_1);
REGISTER_HOST_API_FUNC(ext_default_child_storage_get_version_1);
REGISTER_HOST_API_FUNC(ext_default_child_storage_clear_version_1);
REGISTER_HOST_API_FUNC(ext_default_child_storage_clear_prefix_version_1);
REGISTER_HOST_API_FUNC(ext_default_child_storage_clear_prefix_version_2);
REGISTER_HOST_API_FUNC(ext_default_child_storage_next_key_version_1);
REGISTER_HOST_API_FUNC(ext_default_child_storage_storage_kill_version_1);
REGISTER_HOST_API_FUNC(ext_default_child_storage_storage_kill_version_3);
REGISTER_HOST_API_FUNC(ext_default_child_storage_read_version_1);
REGISTER_HOST_API_FUNC(ext_default_child_storage_exists_version_1);
REGISTER_HOST_API_FUNC(ext_logging_log_version_1);
REGISTER_HOST_API_FUNC(ext_logging_max_level_version_1);

// -------------------------- crypto functions ---------------------------

REGISTER_HOST_API_FUNC(ext_crypto_start_batch_verify_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_finish_batch_verify_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_ed25519_public_keys_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_ed25519_generate_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_ed25519_sign_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_ed25519_verify_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_ed25519_batch_verify_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_sr25519_public_keys_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_sr25519_generate_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_sr25519_sign_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_sr25519_verify_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_sr25519_verify_version_2);
REGISTER_HOST_API_FUNC(ext_crypto_sr25519_batch_verify_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_ecdsa_public_keys_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_ecdsa_sign_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_ecdsa_sign_prehashed_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_ecdsa_generate_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_ecdsa_verify_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_ecdsa_verify_version_2);
REGISTER_HOST_API_FUNC(ext_crypto_ecdsa_verify_prehashed_version_1);
/**
* secp256k1 recovery algorithms version_1 and version_2
* are not different for our bitcoin secp256k1 library.
* They have difference only for rust implementation and it
* is use of `parse_standard` instead of
* `parse_overflowing`. In comment, @see
* https://github.com/paritytech/libsecp256k1/blob/d2ca104ea2cbda8f0708a6d80eb1da63e0cc0e69/src/lib.rs#L461
* it is said that `parse_overflowing` is implementation
* specific and won't be used in any other standard
* libraries
*/
REGISTER_HOST_API_FUNC(ext_crypto_secp256k1_ecdsa_recover_version_1);
REGISTER_HOST_API_FUNC(ext_crypto_secp256k1_ecdsa_recover_version_2);
REGISTER_HOST_API_FUNC(
ext_crypto_secp256k1_ecdsa_recover_compressed_version_1);
REGISTER_HOST_API_FUNC(
ext_crypto_secp256k1_ecdsa_recover_compressed_version_2);

// -------------------------- hashing functions --------------------------

REGISTER_HOST_API_FUNC(ext_hashing_keccak_256_version_1);
REGISTER_HOST_API_FUNC(ext_hashing_sha2_256_version_1);
REGISTER_HOST_API_FUNC(ext_hashing_blake2_128_version_1);
REGISTER_HOST_API_FUNC(ext_hashing_blake2_256_version_1);
REGISTER_HOST_API_FUNC(ext_hashing_twox_256_version_1);
REGISTER_HOST_API_FUNC(ext_hashing_twox_128_version_1);
REGISTER_HOST_API_FUNC(ext_hashing_twox_64_version_1);

// -------------------------- memory functions ---------------------------

REGISTER_HOST_API_FUNC(ext_allocator_malloc_version_1);
REGISTER_HOST_API_FUNC(ext_allocator_free_version_1);

// -------------------------- storage functions --------------------------

REGISTER_HOST_API_FUNC(ext_storage_set_version_1);
REGISTER_HOST_API_FUNC(ext_storage_get_version_1);
REGISTER_HOST_API_FUNC(ext_storage_clear_version_1);
REGISTER_HOST_API_FUNC(ext_storage_exists_version_1);
REGISTER_HOST_API_FUNC(ext_storage_read_version_1);
REGISTER_HOST_API_FUNC(ext_storage_clear_prefix_version_1);
REGISTER_HOST_API_FUNC(ext_storage_clear_prefix_version_2);
REGISTER_HOST_API_FUNC(ext_storage_root_version_1);
REGISTER_HOST_API_FUNC(ext_storage_root_version_2);
REGISTER_HOST_API_FUNC(ext_storage_changes_root_version_1);
REGISTER_HOST_API_FUNC(ext_storage_next_key_version_1);
REGISTER_HOST_API_FUNC(ext_storage_append_version_1);
REGISTER_HOST_API_FUNC(ext_storage_start_transaction_version_1);
REGISTER_HOST_API_FUNC(ext_storage_commit_transaction_version_1);
REGISTER_HOST_API_FUNC(ext_storage_rollback_transaction_version_1);
REGISTER_HOST_API_FUNC(ext_trie_blake2_256_root_version_1);
REGISTER_HOST_API_FUNC(ext_trie_blake2_256_ordered_root_version_1);
REGISTER_HOST_API_FUNC(ext_trie_blake2_256_ordered_root_version_2);
REGISTER_HOST_API_FUNC(ext_trie_keccak_256_ordered_root_version_2);
REGISTER_HOST_API_FUNC(ext_misc_print_hex_version_1);
REGISTER_HOST_API_FUNC(ext_misc_print_num_version_1);
REGISTER_HOST_API_FUNC(ext_misc_print_utf8_version_1);
REGISTER_HOST_API_FUNC(ext_misc_runtime_version_version_1);

// ------------------------- Offchain extension --------------------------

REGISTER_HOST_API_FUNC(ext_offchain_is_validator_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_submit_transaction_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_network_state_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_timestamp_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_sleep_until_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_random_seed_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_local_storage_set_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_local_storage_clear_version_1);
REGISTER_HOST_API_FUNC(
ext_offchain_local_storage_compare_and_set_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_local_storage_get_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_http_request_start_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_http_request_add_header_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_http_request_write_body_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_http_response_wait_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_http_response_headers_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_http_response_read_body_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_set_authorized_nodes_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_index_set_version_1);
REGISTER_HOST_API_FUNC(ext_offchain_index_clear_version_1);

REGISTER_HOST_API_FUNC(ext_panic_handler_abort_on_panic_version_1);
void RuntimeExternalInterface::registerMethods() {
REGISTER_HOST_METHODS;
}

RuntimeExternalInterface::RuntimeExternalInterface(
Expand All @@ -264,7 +143,7 @@ namespace kagome::runtime::binaryen {
logger_{log::createLogger("RuntimeExternalInterface", "binaryen")} {
memory.resize(kInitialMemorySize);
BOOST_ASSERT(host_api_);
methodsRegistration();
registerMethods();
}

RuntimeExternalInterface::InternalMemory *
Expand All @@ -283,9 +162,11 @@ namespace kagome::runtime::binaryen {
}
}

wasm::Fatal() << "callImport: unknown import: " << import->module.str << "."
<< import->name.str;
throw wasm::TrapException{};
trap(fmt::format("Unknown Host method called: {}.{}",
import->module.str,
import->name.str)
.c_str());
return {};
}

void RuntimeExternalInterface::checkArguments(std::string_view extern_name,
Expand Down
3 changes: 2 additions & 1 deletion core/runtime/binaryen/runtime_external_interface.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ namespace kagome::runtime::binaryen {
memory.resize(newSize);
}

[[noreturn]]
void trap(const char *why) override {
logger_->error("Trap: {}", why);
throw wasm::TrapException{};
Expand All @@ -183,7 +184,7 @@ namespace kagome::runtime::binaryen {
size_t expected,
size_t actual);

void methodsRegistration();
void registerMethods();

template <auto mf>
static wasm::Literal importCall(RuntimeExternalInterface &this_,
Expand Down
Loading

0 comments on commit fadb610

Please sign in to comment.