From c552b702601f6adc9c23e5d72646fda338bf4849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Wo=C5=9B?= Date: Tue, 10 Oct 2023 11:22:18 +0100 Subject: [PATCH] instantiate externs for version check --- packages/fuel-indexer-api-server/src/api.rs | 2 +- packages/fuel-indexer-api-server/src/ffi.rs | 29 ++++++++++++++++++-- packages/fuel-indexer-api-server/src/uses.rs | 8 +++++- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/packages/fuel-indexer-api-server/src/api.rs b/packages/fuel-indexer-api-server/src/api.rs index 81ad78bc6..05f7ecf6b 100644 --- a/packages/fuel-indexer-api-server/src/api.rs +++ b/packages/fuel-indexer-api-server/src/api.rs @@ -174,7 +174,7 @@ impl IntoResponse for ApiError { (StatusCode::BAD_REQUEST, format!("Invalid asset type: {e}")) } ApiError::ToolchainVersionMismatch{fuel_indexer_version, toolchain_version} => { - (StatusCode::METHOD_NOT_ALLOWED, format!("The toolchain version {toolchain_version} that the WASM module was compiled with does not match the fuel-indexer-versiion {fuel_indexer_version}")) + (StatusCode::METHOD_NOT_ALLOWED, format!("WASM module toolchain version `{toolchain_version}` does not match fuel-indexer version `{fuel_indexer_version}`")) } _ => (StatusCode::INTERNAL_SERVER_ERROR, generic_details), }; diff --git a/packages/fuel-indexer-api-server/src/ffi.rs b/packages/fuel-indexer-api-server/src/ffi.rs index 0f77f6a64..527308db3 100644 --- a/packages/fuel-indexer-api-server/src/ffi.rs +++ b/packages/fuel-indexer-api-server/src/ffi.rs @@ -1,11 +1,36 @@ -use wasmer::{AsStoreMut, Instance, MemoryView, StoreMut, WasmPtr}; +use wasmer::{ + imports, AsStoreMut, Exports, Function, Instance, MemoryView, StoreMut, WasmPtr, +}; pub(crate) fn check_wasm_toolchain_version(data: Vec) -> anyhow::Result { let mut store = wasmer::Store::default(); let module = wasmer::Module::new(&store, data.clone())?; - let imports = wasmer::imports! {}; + let mut exports = Exports::new(); + exports.insert( + "ff_put_object".to_string(), + Function::new_typed(&mut store, |_: i64, _: i32, _: i32| {}), + ); + exports.insert( + "ff_get_object".to_string(), + Function::new_typed(&mut store, |_: i64, _: i32, _: i32| 0i32), + ); + exports.insert( + "ff_early_exit".to_string(), + Function::new_typed(&mut store, |_: i32| {}), + ); + exports.insert( + "ff_put_many_to_many_record".to_string(), + Function::new_typed(&mut store, |_: i32, _: i32| {}), + ); + exports.insert( + "ff_log_data".to_string(), + Function::new_typed(&mut store, |_: i32, _: i32, _: i32| {}), + ); + + let mut imports = imports! {}; + wasmer::Imports::register_namespace(&mut imports, "env", exports); let instance = wasmer::Instance::new(&mut store, &module, &imports)?; diff --git a/packages/fuel-indexer-api-server/src/uses.rs b/packages/fuel-indexer-api-server/src/uses.rs index 323f36793..e28d5eb02 100644 --- a/packages/fuel-indexer-api-server/src/uses.rs +++ b/packages/fuel-indexer-api-server/src/uses.rs @@ -403,7 +403,13 @@ async fn parse_register_indexer_multipart( if asset_type == IndexerAssetType::Wasm { toolchain_version = crate::ffi::check_wasm_toolchain_version(data.clone().into()) - .unwrap_or("none".to_string()); + .map_err(|e| { + tracing::warn!( + "Failed to get WASM module toolchain version: {e}" + ); + e + }) + .unwrap_or("unknown".to_string()); }; assets.push((asset_type, data.to_vec())); }