From 7967076cdb8395afed5d827303e4a224ec58e5a0 Mon Sep 17 00:00:00 2001 From: 0xpause Date: Tue, 24 Oct 2023 22:55:20 +0800 Subject: [PATCH] update test --- .../src/natives/gas_parameter/move_module.rs | 2 + examples/publish_modules/sources/publish.move | 42 ++++--------------- .../moveos-stdlib/doc/move_module.md | 1 + .../moveos-stdlib/sources/move_module.move | 34 +++++++++++++++ .../src/natives/moveos_stdlib/move_module.rs | 31 ++++++++------ 5 files changed, 62 insertions(+), 48 deletions(-) diff --git a/crates/rooch-framework/src/natives/gas_parameter/move_module.rs b/crates/rooch-framework/src/natives/gas_parameter/move_module.rs index 6cc7fce22f..a75895f368 100644 --- a/crates/rooch-framework/src/natives/gas_parameter/move_module.rs +++ b/crates/rooch-framework/src/natives/gas_parameter/move_module.rs @@ -13,4 +13,6 @@ crate::natives::gas_parameter::native::define_gas_parameters_for_natives!(GasPar [.request_init_functions.per_byte, "request_init_functions.per_byte", (5 + 1) * MUL], [.check_compatibililty_inner.base, "check_compatibililty_inner.base", (5 + 1) * MUL], [.check_compatibililty_inner.per_byte, "check_compatibililty_inner.per_byte", (5 + 1) * MUL], + [.remap_addresses.base, "remap_addresses.base", (5 + 1) * MUL], + [.remap_addresses.per_byte, "remap_addresses.per_byte", (5 + 1) * MUL], ]); diff --git a/examples/publish_modules/sources/publish.move b/examples/publish_modules/sources/publish.move index d86e542571..f51a0f3565 100644 --- a/examples/publish_modules/sources/publish.move +++ b/examples/publish_modules/sources/publish.move @@ -25,43 +25,15 @@ module rooch_examples::publish { account_storage::publish_modules(ctx, account, vector::singleton(m)); } - #[test(account=@0x42)] - fun test_get_module_name(account: &signer) { - let addr = signer::address_of(account); - let ctx = context::new_test_context(addr); - // The following is the bytes and hex of the compiled module: example/counter/sources/counter.move - // with account 0x42 - let module_bytes: vector = x"a11ceb0b060000000b010006020608030e26043406053a32076c7d08e9014006a902220acb02050cd002560da6030200000101010200030c00020400000005000100000600010000070201000008030400010907080108010a09010108010b0a0b0108040605060606010708010002070801060c0106080101030107080001080002070801050107090003070801060c090002060801050106090007636f756e7465720f6163636f756e745f73746f7261676507636f6e7465787407436f756e74657207436f6e7465787408696e63726561736509696e6372656173655f04696e69740576616c756511676c6f62616c5f626f72726f775f6d75740e676c6f62616c5f6d6f76655f746f0d676c6f62616c5f626f72726f77000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000020520000000000000000000000000000000000000000000000000000000000000004200020108030001040001030b0011010201010000050d0b00070038000c010a01100014060100000000000000160b010f0015020200000001060b000b0106000000000000000012003801020301000001060b000700380210001402000000"; - let m: MoveModule = move_module::new(module_bytes); - let name = move_module::module_name(&m); - debug::print(&name); - context::drop_test_context(ctx); - } - - #[test(account=@0x42)] - fun test_verify_modules(account: &signer) { - let addr = signer::address_of(account); - let ctx = context::new_test_context(addr); + public entry fun publish_counter_example(ctx: &mut Context, account: &signer) { + account_storage::ensure_account_storage(ctx, signer::address_of(account)); // The following is the bytes and hex of the compiled module: example/counter/sources/counter.move // with account 0x42 let module_bytes: vector = x"a11ceb0b060000000b010006020608030e26043406053a32076c7d08e9014006a902220acb02050cd002560da6030200000101010200030c00020400000005000100000600010000070201000008030400010907080108010a09010108010b0a0b0108040605060606010708010002070801060c0106080101030107080001080002070801050107090003070801060c090002060801050106090007636f756e7465720f6163636f756e745f73746f7261676507636f6e7465787407436f756e74657207436f6e7465787408696e63726561736509696e6372656173655f04696e69740576616c756511676c6f62616c5f626f72726f775f6d75740e676c6f62616c5f6d6f76655f746f0d676c6f62616c5f626f72726f77000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000020520000000000000000000000000000000000000000000000000000000000000004200020108030001040001030b0011010201010000050d0b00070038000c010a01100014060100000000000000160b010f0015020200000001060b000b0106000000000000000012003801020301000001060b000700380210001402000000"; - let m: MoveModule = move_module::new(module_bytes); - let modules = vector::singleton(m); - let (module_names, _module_names_with_init_fn) = move_module::sort_and_verify_modules(&modules, addr); - debug::print(&module_names); - context::drop_test_context(ctx); - } - - #[test(account=@0x42)] - fun test_publish_modules(account: &signer) { - let addr = signer::address_of(account); - let ctx = context::new_test_context(addr); - account_storage::create_account_storage(&mut ctx, addr); - // The following is the bytes and hex of the compiled module: example/counter/sources/counter.move - // with account 0x42 - let module_bytes: vector = x"a11ceb0b060000000b010006020608030e26043406053a32076c7d08e9014006a902220acb02050cd002560da6030200000101010200030c00020400000005000100000600010000070201000008030400010907080108010a09010108010b0a0b0108040605060606010708010002070801060c0106080101030107080001080002070801050107090003070801060c090002060801050106090007636f756e7465720f6163636f756e745f73746f7261676507636f6e7465787407436f756e74657207436f6e7465787408696e63726561736509696e6372656173655f04696e69740576616c756511676c6f62616c5f626f72726f775f6d75740e676c6f62616c5f6d6f76655f746f0d676c6f62616c5f626f72726f77000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000020520000000000000000000000000000000000000000000000000000000000000004200020108030001040001030b0011010201010000050d0b00070038000c010a01100014060100000000000000160b010f0015020200000001060b000b0106000000000000000012003801020301000001060b000700380210001402000000"; - let m: MoveModule = move_module::new(module_bytes); - account_storage::publish_modules(&mut ctx, account, vector::singleton(m)); - context::drop_test_context(ctx); + let modules = vector::singleton(move_module::new(module_bytes)); + let old_addresses = vector::singleton(@0x42); + let new_addresses = vector::singleton(signer::address_of(account)); + let remapped_modules = move_module::remap_module_addresses(modules, old_addresses, new_addresses); + account_storage::publish_modules(ctx, account, remapped_modules); } } diff --git a/moveos/moveos-stdlib/moveos-stdlib/doc/move_module.md b/moveos/moveos-stdlib/moveos-stdlib/doc/move_module.md index 7e02a6e305..75d63747ae 100644 --- a/moveos/moveos-stdlib/moveos-stdlib/doc/move_module.md +++ b/moveos/moveos-stdlib/moveos-stdlib/doc/move_module.md @@ -241,6 +241,7 @@ Remap addresses in module binary where the length of i = i + 1; }; let remapped_bytes = remap_module_addresses_inner(bytes_vec, old_addresses, new_addresses); + // let remapped_bytes = remap_module_addresses_inner(bytes_vec); let remapped_modules = vector::empty<MoveModule>(); i = 0u64; let len = vector::length(&remapped_bytes); diff --git a/moveos/moveos-stdlib/moveos-stdlib/sources/move_module.move b/moveos/moveos-stdlib/moveos-stdlib/sources/move_module.move index b1f66c5d18..e805b3c91f 100644 --- a/moveos/moveos-stdlib/moveos-stdlib/sources/move_module.move +++ b/moveos/moveos-stdlib/moveos-stdlib/sources/move_module.move @@ -74,6 +74,7 @@ module moveos_std::move_module { i = i + 1; }; let remapped_bytes = remap_module_addresses_inner(bytes_vec, old_addresses, new_addresses); + // let remapped_bytes = remap_module_addresses_inner(bytes_vec); let remapped_modules = vector::empty(); i = 0u64; let len = vector::length(&remapped_bytes); @@ -143,5 +144,38 @@ module moveos_std::move_module { context::drop_test_context(ctx); } + #[test(account=@0x1314)] + #[expected_failure(abort_code = 0x10001, location = Self)] + fun test_address_mismatch_failure(account: &signer) { + let addr = signer::address_of(account); + let ctx = context::new_test_context(addr); + // The following is the bytes and hex of the compiled module: example/counter/sources/counter.move + // with account 0x42 + let module_bytes: vector = x"a11ceb0b060000000b010006020608030e26043406053a32076c7d08e9014006a902220acb02050cd002560da6030200000101010200030c00020400000005000100000600010000070201000008030400010907080108010a09010108010b0a0b0108040605060606010708010002070801060c0106080101030107080001080002070801050107090003070801060c090002060801050106090007636f756e7465720f6163636f756e745f73746f7261676507636f6e7465787407436f756e74657207436f6e7465787408696e63726561736509696e6372656173655f04696e69740576616c756511676c6f62616c5f626f72726f775f6d75740e676c6f62616c5f6d6f76655f746f0d676c6f62616c5f626f72726f77000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000020520000000000000000000000000000000000000000000000000000000000000004200020108030001040001030b0011010201010000050d0b00070038000c010a01100014060100000000000000160b010f0015020200000001060b000b0106000000000000000012003801020301000001060b000700380210001402000000"; + let m: MoveModule = Self::new(module_bytes); + let modules = vector::singleton(m); + let (module_names, _module_names_with_init_fn) = Self::sort_and_verify_modules(&modules, addr); + debug::print(&module_names); + context::drop_test_context(ctx); + } + + #[test(account=@0x1314)] + fun test_remap_address(account: &signer) { + let addr = signer::address_of(account); + let ctx = context::new_test_context(addr); + // The following is the bytes and hex of the compiled module: example/counter/sources/counter.move + // with account 0x42 + let module_bytes: vector = x"a11ceb0b060000000b010006020608030e26043406053a32076c7d08e9014006a902220acb02050cd002560da6030200000101010200030c00020400000005000100000600010000070201000008030400010907080108010a09010108010b0a0b0108040605060606010708010002070801060c0106080101030107080001080002070801050107090003070801060c090002060801050106090007636f756e7465720f6163636f756e745f73746f7261676507636f6e7465787407436f756e74657207436f6e7465787408696e63726561736509696e6372656173655f04696e69740576616c756511676c6f62616c5f626f72726f775f6d75740e676c6f62616c5f6d6f76655f746f0d676c6f62616c5f626f72726f77000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000020520000000000000000000000000000000000000000000000000000000000000004200020108030001040001030b0011010201010000050d0b00070038000c010a01100014060100000000000000160b010f0015020200000001060b000b0106000000000000000012003801020301000001060b000700380210001402000000"; + let m: MoveModule = Self::new(module_bytes); + let modules = vector::singleton(m); + let new_addresses = vector::singleton(addr); + let old_addresses = vector::singleton(@0x42); + let remapped_modules = Self::remap_module_addresses(modules, old_addresses, new_addresses); + // In `sort_and_verify_modules`, addresses of modules are ensured to be the same with signer address + // So if the remapping is failed, the verification will fail + let (module_names, _module_names_with_init_fn) = Self::sort_and_verify_modules(&remapped_modules, addr); + debug::print(&module_names); + context::drop_test_context(ctx); + } } \ No newline at end of file diff --git a/moveos/moveos-stdlib/src/natives/moveos_stdlib/move_module.rs b/moveos/moveos-stdlib/src/natives/moveos_stdlib/move_module.rs index 83c8111635..4188b958b0 100644 --- a/moveos/moveos-stdlib/src/natives/moveos_stdlib/move_module.rs +++ b/moveos/moveos-stdlib/src/natives/moveos_stdlib/move_module.rs @@ -34,7 +34,7 @@ use std::collections::{BTreeSet, HashMap, VecDeque}; const E_ADDRESS_NOT_MATCH_WITH_SIGNER: u64 = 1; const E_MODULE_VERIFICATION_ERROR: u64 = 2; const E_MODULE_INCOMPATIBLE: u64 = 3; -const _E_LENTH_NOT_MATCH: u64 = 4; +const E_LENTH_NOT_MATCH: u64 = 4; /// The native module context. #[derive(Tid)] @@ -290,12 +290,23 @@ fn remap_module_addresses_inner( _ty_args: Vec, mut args: VecDeque, ) -> PartialVMResult { + debug_assert!(args.len() == 3, "Wrong number of arguments"); let mut cost = gas_params.base; - let new_address_vec = pop_arg!(args, Vec); - let old_address_vec = pop_arg!(args, Vec); + let new_address_vec = pop_arg!(args, Vector); + let old_address_vec = pop_arg!(args, Vector); + let num_addresses = new_address_vec.elem_views().len(); + if num_addresses != old_address_vec.elem_views().len() { + return Ok(NativeResult::err( + cost, + moveos_types::move_std::error::invalid_argument(E_LENTH_NOT_MATCH), + )); + }; + let num_addresses = num_addresses as u64; + let new_addresses = new_address_vec.unpack(&Type::Address, num_addresses)?; + let old_addresses = old_address_vec.unpack(&Type::Address, num_addresses)?; let address_mapping: HashMap = - zip_eq(old_address_vec, new_address_vec) + zip_eq(old_addresses, new_addresses) .map(|(a, b)| { Ok(( a.value_as::()?, @@ -321,19 +332,13 @@ fn remap_module_addresses_inner( module_remap_addresses(m, &address_mapping)?; let mut binary: Vec = vec![]; m.serialize(&mut binary).map_err(|e| { - PartialVMError::new(StatusCode::INTERNAL_TYPE_ERROR).with_message(e.to_string()) + PartialVMError::new(StatusCode::VALUE_SERIALIZATION_ERROR).with_message(e.to_string()) })?; let value = Value::vector_u8(binary); remapped_bubdles.push(value); } - - Ok(NativeResult::ok( - cost, - smallvec![Vector::pack( - &Type::Vector(Box::new(Type::U8)), - remapped_bubdles - )?], - )) + let output_modules = Vector::pack(&Type::Vector(Box::new(Type::U8)), remapped_bubdles)?; + Ok(NativeResult::ok(cost, smallvec![output_modules])) } fn module_remap_constant_addresses(value: &mut MoveValue, f: &dyn Fn(&mut AccountAddress)) {