diff --git a/api/bindings.h b/api/bindings.h index 1a844cba..afa976d4 100644 --- a/api/bindings.h +++ b/api/bindings.h @@ -267,13 +267,13 @@ UnmanagedVector execute_view_function(vm_t *vm_ptr, ByteSliceView view_function_payload, UnmanagedVector *errmsg); -void initialize(vm_t *vm_ptr, - Db db, - GoApi api, - ByteSliceView env_payload, - ByteSliceView module_bundle_payload, - ByteSliceView allowed_publishers_payload, - UnmanagedVector *errmsg); +UnmanagedVector initialize(vm_t *vm_ptr, + Db db, + GoApi api, + ByteSliceView env_payload, + ByteSliceView module_bundle_payload, + ByteSliceView allowed_publishers_payload, + UnmanagedVector *errmsg); UnmanagedVector new_unmanaged_vector(bool nil, const uint8_t *ptr, size_t length); diff --git a/api/vm.go b/api/vm.go index ad93e639..59f0addb 100644 --- a/api/vm.go +++ b/api/vm.go @@ -38,7 +38,7 @@ func Initialize( env []byte, moduleBundle []byte, allowedPublishers []byte, -) error { +) ([]byte, error) { var err error callID := startCall() @@ -59,13 +59,12 @@ func Initialize( errmsg := uninitializedUnmanagedVector() - _, err = C.initialize(vm.ptr, db, _api, e, mb, ap, &errmsg) + res, err := C.initialize(vm.ptr, db, _api, e, mb, ap, &errmsg) if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success { - // Depending on the nature of the error, `gasUsed` will either have a meaningful value, or just 0. │ struct ByteSliceView checksum, - return errorWithMessage(err, errmsg) + return nil, errorWithMessage(err, errmsg) } - return err + return copyAndDestroyUnmanagedVector(res), err } // ExecuteContract call ffi(`execute_contract`) to execute diff --git a/lib.go b/lib.go index 5fe88d27..3859a351 100644 --- a/lib.go +++ b/lib.go @@ -24,23 +24,23 @@ func (vm *VM) Initialize( env types.Env, moduleBundle types.ModuleBundle, allowedPublishers []types.AccountAddress, -) error { +) (types.ExecutionResult, error) { envBz, err := env.BcsSerialize() if err != nil { - return err + return types.ExecutionResult{}, err } moduleBundleBz, err := moduleBundle.BcsSerialize() if err != nil { - return err + return types.ExecutionResult{}, err } allowedPublishersBz, err := types.SerializeAddressVector(allowedPublishers) if err != nil { - return err + return types.ExecutionResult{}, err } - err = api.Initialize( + res, err := api.Initialize( vm.inner, kvStore, goApi, @@ -48,8 +48,12 @@ func (vm *VM) Initialize( moduleBundleBz, allowedPublishersBz, ) + if err != nil { + return types.ExecutionResult{}, err + } - return err + execRes, err := types.BcsDeserializeExecutionResult(res) + return execRes, err } // VM Destroyer @@ -124,7 +128,6 @@ func (vm *VM) ExecuteEntryFunction( sendersBz, bz, ) - if err != nil { return types.ExecutionResult{}, err } diff --git a/lib_test.go b/lib_test.go index f78cec6f..906d44d7 100644 --- a/lib_test.go +++ b/lib_test.go @@ -56,7 +56,7 @@ func initializeVM(t *testing.T, isMinitia bool) (vm.VM, *api.Lookup) { blockTime := uint64(time.Now().Unix()) vm := vm.NewVM(1000, 100) - err = vm.Initialize( + _, err = vm.Initialize( kvStore, api.NewEmptyMockAPI(blockTime), types.Env{ diff --git a/libmovevm/bindings.h b/libmovevm/bindings.h index 1a844cba..afa976d4 100644 --- a/libmovevm/bindings.h +++ b/libmovevm/bindings.h @@ -267,13 +267,13 @@ UnmanagedVector execute_view_function(vm_t *vm_ptr, ByteSliceView view_function_payload, UnmanagedVector *errmsg); -void initialize(vm_t *vm_ptr, - Db db, - GoApi api, - ByteSliceView env_payload, - ByteSliceView module_bundle_payload, - ByteSliceView allowed_publishers_payload, - UnmanagedVector *errmsg); +UnmanagedVector initialize(vm_t *vm_ptr, + Db db, + GoApi api, + ByteSliceView env_payload, + ByteSliceView module_bundle_payload, + ByteSliceView allowed_publishers_payload, + UnmanagedVector *errmsg); UnmanagedVector new_unmanaged_vector(bool nil, const uint8_t *ptr, size_t length); diff --git a/libmovevm/src/error/mod.rs b/libmovevm/src/error/mod.rs index 43b4dbc1..42ba2a11 100644 --- a/libmovevm/src/error/mod.rs +++ b/libmovevm/src/error/mod.rs @@ -3,6 +3,7 @@ mod rust; pub use go::GoError; +#[allow(unused_imports)] pub use rust::{handle_c_error_binary, handle_c_error_default, RustError as Error}; #[cfg(test)] diff --git a/libmovevm/src/interface.rs b/libmovevm/src/interface.rs index 2e3e5d05..b170bce6 100644 --- a/libmovevm/src/interface.rs +++ b/libmovevm/src/interface.rs @@ -1,7 +1,6 @@ use std::panic::{catch_unwind, AssertUnwindSafe}; use crate::args::VM_ARG; -use crate::error::handle_c_error_default; use crate::error::{handle_c_error_binary, Error}; use crate::move_api::handler as api_handler; use crate::{api::GoApi, vm, ByteSliceView, Db, UnmanagedVector}; @@ -58,7 +57,7 @@ pub extern "C" fn initialize( module_bundle_payload: ByteSliceView, allowed_publishers_payload: ByteSliceView, errmsg: Option<&mut UnmanagedVector>, -) { +) -> UnmanagedVector { let module_bundle: ModuleBundle = bcs::from_bytes(module_bundle_payload.read().unwrap()).unwrap(); let env: Env = bcs::from_bytes(env_payload.read().unwrap()).unwrap(); @@ -73,7 +72,8 @@ pub extern "C" fn initialize( None => Err(Error::unset_arg(VM_ARG)), }; - handle_c_error_default(res, errmsg) + let ret = handle_c_error_binary(res, errmsg); + UnmanagedVector::new(Some(ret)) } // exported function to execute (an entrypoint of) contract diff --git a/libmovevm/src/vm.rs b/libmovevm/src/vm.rs index 24322a88..9150fb91 100644 --- a/libmovevm/src/vm.rs +++ b/libmovevm/src/vm.rs @@ -28,7 +28,7 @@ pub(crate) fn initialize_vm( env: Env, module_bundle: ModuleBundle, allowed_publishers: Vec, -) -> Result<(), Error> { +) -> Result, Error> { let mut storage = GoStorage::new(&db_handle); let mut table_storage = GoTableStorage::new(&db_handle); @@ -46,7 +46,8 @@ pub(crate) fn initialize_vm( // write state change to storage push_write_set(&mut storage, output.write_set())?; - Ok(()) + let res = generate_result(output)?; + to_vec(&res) } pub(crate) fn execute_contract(