Skip to content

Feature: Rust VM support #59

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 40 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
014520d
WasmerInstance public constructor
andrei-marinica Feb 27, 2025
3bf87c8
WasmerInstance fix new
andrei-marinica Feb 28, 2025
2a267cf
memory_load bugfix
andrei-marinica Mar 4, 2025
a03ee7d
wasmer5 crate
andrei-marinica Mar 14, 2025
0636d77
wasmer 5 - StoreMut attempt
andrei-marinica Mar 21, 2025
5bf7bc4
wasmer 5 - MemoryView attempt
andrei-marinica Mar 26, 2025
a0f70af
wasmer 5 - imports working solution
andrei-marinica Mar 26, 2025
cec781c
cargo fmt
andrei-marinica Mar 26, 2025
56079da
wasmer 5 - crate rename
andrei-marinica Mar 26, 2025
d40ec78
wasmer 5 - new interfaces, new vm hooks mechanism
andrei-marinica Mar 27, 2025
e444914
wasmer 5 - opcode control
andrei-marinica Mar 27, 2025
bef279a
wamser 5 - metering integration & cleanup
andrei-marinica Mar 29, 2025
2e6e008
wasmer 5 - middlewares refactor
andrei-marinica Mar 29, 2025
d810c09
new_cyclic_fallible tests
andrei-marinica Apr 1, 2025
4650ab6
first implementation + test
mihaicalinluca Apr 1, 2025
12041e8
using rc_new_cyclic_fallible crate
andrei-marinica Apr 3, 2025
2ba723a
gas schedule
mihaicalinluca Apr 3, 2025
8ccd7a3
build fix
andrei-marinica Apr 7, 2025
bc6e8f7
Merge remote-tracking branch 'origin/wasmer5' into opcode-cost-deseri…
mihaicalinluca Apr 7, 2025
c205bb0
Merge pull request #56 from multiversx/wasmer5
andrei-marinica Apr 8, 2025
39f9e88
added Serialize
mihaicalinluca Apr 8, 2025
7412e92
partialeq
mihaicalinluca Apr 9, 2025
69a5913
mut self in vm hooks
mihaicalinluca Apr 11, 2025
c51ce27
mutable fns in InstanceState
mihaicalinluca Apr 16, 2025
a12c094
mutable reference to InstanceState in VMHooksBuilder
mihaicalinluca Apr 16, 2025
5803320
changed visibility for opcodeCost setter in wasmerExecutorData
mihaicalinluca Apr 16, 2025
103e47e
replaced ubuntu version to the next long term support release
mihaicalinluca Apr 16, 2025
87b5286
Merge pull request #57 from multiversx/opcode-cost-deserialize
andrei-marinica Apr 17, 2025
3dd422a
fix after review, continuation style pattern
mihaicalinluca Apr 17, 2025
04c0a48
InstanceState mut ref in VMHooks
andrei-marinica Apr 18, 2025
19c2614
VM hooks builder specific to executor
andrei-marinica Apr 19, 2025
b3c936b
InstanceState cleanup - memory
andrei-marinica Apr 22, 2025
6060449
InstanceState cleanup - breakpoint, also error cleanup
andrei-marinica Apr 22, 2025
e2eddf5
experimental - gas limit kept in instance
andrei-marinica Apr 22, 2025
1bf5ba5
Merge pull request #62 from multiversx/instance-state-mut
andrei-marinica Apr 23, 2025
d6889fa
Merge pull request #61 from multiversx/vm-hooks-refactor
andrei-marinica Apr 23, 2025
12d5bc2
Wasmer 6.0 integration
andrei-marinica Apr 25, 2025
f6612f4
Merge pull request #63 from multiversx/wasmer6
andrei-marinica Apr 27, 2025
64f1c87
cleanup gasSchedule
mihaicalinluca Apr 30, 2025
89bfda4
Merge pull request #65 from multiversx/cleanup
andrei-marinica Apr 30, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/libvmexeccapi-build-linux-arm64.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ on:
jobs:
build:
name: Build library for Linux ARM64
runs-on: ubuntu-latest
runs-on: [ubuntu-22.04]
steps:
- name: Check out code
uses: actions/checkout@v4
Expand Down Expand Up @@ -38,7 +38,7 @@ jobs:
- name: Save artifacts
uses: actions/upload-artifact@v4
with:
name: artifacts-linux-arm64
name: lib-linux-arm
path: |
libvmexeccapi_arm.so
if-no-files-found: error
8 changes: 4 additions & 4 deletions .github/workflows/libvmexeccapi-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
strategy:
matrix:
include:
- os: ubuntu-20.04
- os: ubuntu-22.04
artifact_name: libvmexeccapi.so
make_target: capi-linux-amd64
- os: macos-13
Expand All @@ -29,7 +29,7 @@ jobs:
- name: Install rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: "1.77"
toolchain: "1.83"

- name: Checkout
uses: actions/checkout@v4
Expand All @@ -38,9 +38,9 @@ jobs:
run: make ${{ matrix.make_target }}

- name: Save artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: libs
name: lib-${{ matrix.make_target }}
path: |
target/release/*.so
target/release/*.dylib
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/rust-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ jobs:
- uses: actions-rs/toolchain@v1
with:
default: true
toolchain: "1.77"
toolchain: "1.83"
- name: Run rust tests
run: cargo +1.77 test
run: cargo +1.83 test --release
clippy_check:
permissions: write-all
name: Clippy linter check
Expand Down
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ members = [
"meta",
"c-api",
"vm-executor",
"vm-executor-experimental",
"vm-executor-wasmer",
]
4 changes: 2 additions & 2 deletions c-api/libvmexeccapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,7 @@ vm_exec_result_t vm_exec_instance_from_cache(vm_exec_executor_t *executor_ptr,
*
* C API function, works with raw object pointers.
*/
uint64_t vm_exec_instance_get_breakpoint_value(const vm_exec_instance_t *instance_ptr);
uint64_t vm_exec_instance_get_breakpoint_value(vm_exec_instance_t *instance_ptr);

/**
* Returns the number of points(gas) used by the given instance.
Expand Down Expand Up @@ -492,7 +492,7 @@ vm_exec_result_t vm_exec_instance_reset(vm_exec_instance_t *instance_ptr);
*
* C API function, works with raw object pointers.
*/
vm_exec_result_t vm_exec_instance_set_breakpoint_value(const vm_exec_instance_t *instance_ptr,
vm_exec_result_t vm_exec_instance_set_breakpoint_value(vm_exec_instance_t *instance_ptr,
uint64_t value);

/**
Expand Down
15 changes: 7 additions & 8 deletions c-api/src/capi_breakpoints.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use meta::capi_safe_unwind;
use multiversx_chain_vm_executor::Instance;
use multiversx_chain_vm_executor::InstanceFull;

use crate::capi_instance::{vm_exec_instance_t, CapiInstance};
use crate::service_singleton::with_service;
Expand All @@ -18,11 +18,11 @@ use crate::vm_exec_result_t;
#[no_mangle]
#[capi_safe_unwind(vm_exec_result_t::VM_EXEC_ERROR)]
pub unsafe extern "C" fn vm_exec_instance_set_breakpoint_value(
instance_ptr: *const vm_exec_instance_t,
instance_ptr: *mut vm_exec_instance_t,
value: u64,
) -> vm_exec_result_t {
let capi_instance = cast_input_const_ptr!(instance_ptr, CapiInstance, "instance ptr is null");
let result = set_breakpoint_value_u64(capi_instance.content.as_ref(), value);
let capi_instance = cast_input_ptr!(instance_ptr, CapiInstance, "instance ptr is null");
let result = set_breakpoint_value_u64(capi_instance.content.as_mut(), value);
match result {
Ok(()) => vm_exec_result_t::VM_EXEC_OK,
Err(message) => {
Expand All @@ -41,10 +41,9 @@ pub unsafe extern "C" fn vm_exec_instance_set_breakpoint_value(
#[no_mangle]
#[capi_safe_unwind(0)]
pub unsafe extern "C" fn vm_exec_instance_get_breakpoint_value(
instance_ptr: *const vm_exec_instance_t,
instance_ptr: *mut vm_exec_instance_t,
) -> u64 {
let capi_instance =
cast_input_const_ptr!(instance_ptr, CapiInstance, "instance ptr is null", 0);
let capi_instance = cast_input_ptr!(instance_ptr, CapiInstance, "instance ptr is null", 0);
let result = capi_instance.content.get_breakpoint_value();
match result {
Ok(breakpoint_value) => breakpoint_value.as_u64(),
Expand All @@ -55,6 +54,6 @@ pub unsafe extern "C" fn vm_exec_instance_get_breakpoint_value(
}
}

fn set_breakpoint_value_u64(instance: &dyn Instance, value: u64) -> Result<(), String> {
fn set_breakpoint_value_u64(instance: &mut dyn InstanceFull, value: u64) -> Result<(), String> {
instance.set_breakpoint_value(value.try_into()?)
}
4 changes: 2 additions & 2 deletions c-api/src/capi_executor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ use crate::{
};
use libc::c_void;
use meta::capi_safe_unwind;
use multiversx_chain_vm_executor::Executor;
use multiversx_chain_vm_executor::ExecutorFull;
use multiversx_chain_vm_executor_wasmer::force_sighandler_reinstall;

#[allow(non_camel_case_types)]
#[repr(C)]
pub struct vm_exec_executor_t;

pub struct CapiExecutor {
pub content: Box<dyn Executor>,
pub content: Box<dyn ExecutorFull>,
}

/// Creates a new VM executor.
Expand Down
6 changes: 3 additions & 3 deletions c-api/src/capi_instance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ use crate::{
service_singleton::with_service,
string_copy, vm_exec_result_t,
};
use meta::capi_safe_unwind;
use libc::{c_char, c_int};
use multiversx_chain_vm_executor::{CompilationOptions, Instance};
use meta::capi_safe_unwind;
use multiversx_chain_vm_executor::{CompilationOptions, InstanceFull};
use std::{ffi::CStr, slice};

/// Opaque pointer to a `wasmer_runtime::Instance` value in Rust.
Expand All @@ -24,7 +24,7 @@ pub struct vm_exec_instance_t;
pub struct vm_exec_compilation_options_t;

pub struct CapiInstance {
pub(crate) content: Box<dyn Instance>,
pub(crate) content: Box<dyn InstanceFull>,
}

/// Creates a new VM executor instance.
Expand Down
1 change: 1 addition & 0 deletions c-api/src/capi_vm_hook_pointers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use std::ffi::c_void;

#[repr(C)]
#[derive(Clone)]
#[allow(non_camel_case_types)]
#[rustfmt::skip]
pub struct vm_exec_vm_hook_c_func_pointers {
pub get_gas_left_func_ptr: extern "C" fn(context: *mut c_void) -> i64,
Expand Down
Loading
Loading