diff --git a/crates/rooch-framework/src/natives/rooch_framework/bcs.rs b/crates/rooch-framework/src/natives/rooch_framework/bcs.rs index 1bbd7b3081..639dc40335 100644 --- a/crates/rooch-framework/src/natives/rooch_framework/bcs.rs +++ b/crates/rooch-framework/src/natives/rooch_framework/bcs.rs @@ -12,6 +12,8 @@ use move_vm_types::{ use smallvec::smallvec; use std::collections::VecDeque; +const E_TYPE_NOT_MATCH: u64 = 1; + #[derive(Debug, Clone)] pub struct FromBytesGasParameters { pub base: InternalGas, @@ -27,7 +29,7 @@ impl FromBytesGasParameters { /// Bytes are in BCS (Binary Canonical Serialization) format. #[inline] fn native_from_bytes( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -35,7 +37,7 @@ fn native_from_bytes( debug_assert_eq!(ty_args.len(), 1); debug_assert_eq!(args.len(), 1); - let cost = 0.into(); + let cost = gas_params.base; // TODO(Gas): charge for getting the layout let layout = context.type_to_type_layout(&ty_args[0])?.ok_or_else(|| { @@ -49,8 +51,10 @@ fn native_from_bytes( let val = match Value::simple_deserialize(&bytes, &layout) { Some(val) => val, None => { - // TODO(gas): charge the gas for the failure. - return Err(PartialVMError::new(StatusCode::VALUE_DESERIALIZATION_ERROR)); + return Ok(NativeResult::err( + cost, + moveos_types::move_std::error::invalid_argument(E_TYPE_NOT_MATCH), + )); } }; // TODO(gas): charge gas for deserialization diff --git a/crates/rooch-framework/src/natives/rooch_framework/crypto/decoding.rs b/crates/rooch-framework/src/natives/rooch_framework/crypto/decoding.rs index 5dfffe5115..8ca8aa2285 100644 --- a/crates/rooch-framework/src/natives/rooch_framework/crypto/decoding.rs +++ b/crates/rooch-framework/src/natives/rooch_framework/crypto/decoding.rs @@ -14,7 +14,7 @@ use move_vm_types::{ use smallvec::smallvec; use std::collections::VecDeque; -pub const DECODE_FAILED: u64 = 1; +pub const E_DECODE_FAILED: u64 = 1; /*************************************************************************************************** * native fun base58 @@ -24,7 +24,7 @@ pub const DECODE_FAILED: u64 = 1; * + decoding_base58_data_cost_per_block * num_blocks | cost depends on number of blocks in message **************************************************************************************************/ pub fn native_base58( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -34,14 +34,14 @@ pub fn native_base58( // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; let encoded_address_bytes = pop_arg!(args, VectorRef); let Ok(bs58_raw_bytes) = bs58::decode(encoded_address_bytes.as_bytes_ref().to_vec()) .into_vec() else { - return Ok(NativeResult::err(cost, DECODE_FAILED)); + return Ok(NativeResult::err(cost, moveos_types::move_std::error::invalid_argument(E_DECODE_FAILED))); }; Ok(NativeResult::ok( @@ -58,7 +58,7 @@ pub fn native_base58( * + decoding_base58check_data_cost_per_block * num_blocks | cost depends on number of blocks in message **************************************************************************************************/ pub fn native_base58check( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -68,7 +68,7 @@ pub fn native_base58check( // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; let version_byte = pop_arg!(args, u8); let encoded_address_bytes = pop_arg!(args, VectorRef); @@ -77,7 +77,7 @@ pub fn native_base58check( .with_check(Some(version_byte)) .into_vec() else { - return Ok(NativeResult::err(cost, DECODE_FAILED)); + return Ok(NativeResult::err(cost, moveos_types::move_std::error::invalid_argument(E_DECODE_FAILED))); }; Ok(NativeResult::ok( diff --git a/crates/rooch-framework/src/natives/rooch_framework/crypto/ecdsa_k1.rs b/crates/rooch-framework/src/natives/rooch_framework/crypto/ecdsa_k1.rs index d0009e58cc..99605dc340 100644 --- a/crates/rooch-framework/src/natives/rooch_framework/crypto/ecdsa_k1.rs +++ b/crates/rooch-framework/src/natives/rooch_framework/crypto/ecdsa_k1.rs @@ -19,14 +19,14 @@ use move_vm_types::{ use smallvec::smallvec; use std::collections::VecDeque; -pub const INVALID_SIGNATURE: u64 = 1; -pub const INVALID_PUBKEY: u64 = 2; +pub const E_INVALID_SIGNATURE: u64 = 1; +pub const E_INVALID_PUBKEY: u64 = 2; pub const KECCAK256: u8 = 0; pub const SHA256: u8 = 1; pub fn native_verify( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -46,14 +46,14 @@ pub fn native_verify( // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; let Ok(sig) = ::from_bytes(&signature_bytes_ref) else { - return Ok(NativeResult::err(cost, INVALID_SIGNATURE)); + return Ok(NativeResult::err(cost, moveos_types::move_std::error::invalid_argument(E_INVALID_SIGNATURE))); }; let Ok(public_key) = ::from_bytes(&public_key_bytes_ref) else { - return Ok(NativeResult::err(cost, INVALID_PUBKEY)); + return Ok(NativeResult::err(cost, moveos_types::move_std::error::invalid_argument(E_INVALID_PUBKEY))); }; let result = match hash { diff --git a/crates/rooch-framework/src/natives/rooch_framework/crypto/ecdsa_k1_recoverable.rs b/crates/rooch-framework/src/natives/rooch_framework/crypto/ecdsa_k1_recoverable.rs index da48ebca70..6e9569c39d 100644 --- a/crates/rooch-framework/src/natives/rooch_framework/crypto/ecdsa_k1_recoverable.rs +++ b/crates/rooch-framework/src/natives/rooch_framework/crypto/ecdsa_k1_recoverable.rs @@ -20,15 +20,16 @@ use move_vm_types::{ use smallvec::smallvec; use std::collections::VecDeque; -pub const FAIL_TO_RECOVER_PUBKEY: u64 = 1; -pub const INVALID_SIGNATURE: u64 = 2; -pub const INVALID_PUBKEY: u64 = 3; +pub const E_FAIL_TO_RECOVER_PUBKEY: u64 = 1; +pub const E_INVALID_SIGNATURE: u64 = 2; +pub const E_INVALID_PUBKEY: u64 = 3; +pub const E_INVALID_HASH_TYPE: u64 = 4; pub const KECCAK256: u8 = 0; pub const SHA256: u8 = 1; pub fn native_ecrecover( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -45,16 +46,21 @@ pub fn native_ecrecover( // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; let Ok(sig) = ::from_bytes(&signature_ref) else { - return Ok(NativeResult::err(cost, INVALID_SIGNATURE)); + return Ok(NativeResult::err(cost, moveos_types::move_std::error::invalid_argument(E_INVALID_SIGNATURE))); }; let pk = match hash { KECCAK256 => sig.recover_with_hash::(&msg_ref), SHA256 => sig.recover_with_hash::(&msg_ref), - _ => Err(FastCryptoError::InvalidInput), // We should never reach here + _ => { + return Ok(NativeResult::err( + cost, + moveos_types::move_std::error::invalid_argument(E_INVALID_HASH_TYPE), + )) + } // We should never reach here }; match pk { @@ -62,12 +68,15 @@ pub fn native_ecrecover( cost, smallvec![Value::vector_u8(pk.as_bytes().to_vec())], )), - Err(_) => Ok(NativeResult::err(cost, FAIL_TO_RECOVER_PUBKEY)), + Err(_) => Ok(NativeResult::err( + cost, + moveos_types::move_std::error::internal(E_FAIL_TO_RECOVER_PUBKEY), + )), } } pub fn native_decompress_pubkey( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -79,7 +88,7 @@ pub fn native_decompress_pubkey( let pubkey_ref = pubkey.as_bytes_ref(); // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; match Secp256k1PublicKey::from_bytes(&pubkey_ref) { Ok(pubkey) => { @@ -89,12 +98,15 @@ pub fn native_decompress_pubkey( smallvec![Value::vector_u8(uncompressed.to_vec())], )) } - Err(_) => Ok(NativeResult::err(cost, INVALID_PUBKEY)), + Err(_) => Ok(NativeResult::err( + cost, + moveos_types::move_std::error::invalid_argument(E_INVALID_PUBKEY), + )), } } pub fn native_verify( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -112,10 +124,10 @@ pub fn native_verify( // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; let Ok(sig) = ::from_bytes(&signature_bytes_ref) else { - return Ok(NativeResult::err(cost, INVALID_SIGNATURE)); + return Ok(NativeResult::err(cost, moveos_types::move_std::error::invalid_argument(E_INVALID_SIGNATURE))); }; let pk = match hash { diff --git a/crates/rooch-framework/src/natives/rooch_framework/crypto/ed25519.rs b/crates/rooch-framework/src/natives/rooch_framework/crypto/ed25519.rs index 037a84e9a3..95e76a606c 100644 --- a/crates/rooch-framework/src/natives/rooch_framework/crypto/ed25519.rs +++ b/crates/rooch-framework/src/natives/rooch_framework/crypto/ed25519.rs @@ -28,7 +28,7 @@ use std::collections::VecDeque; * + ed25519_ed25519_verify_msg_cost_per_block * block_size | cost depends on number of blocks in message **************************************************************************************************/ pub fn native_verify( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -38,7 +38,7 @@ pub fn native_verify( // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; let msg = pop_arg!(args, VectorRef); let msg_ref = msg.as_bytes_ref(); diff --git a/crates/rooch-framework/src/natives/rooch_framework/crypto/encoding.rs b/crates/rooch-framework/src/natives/rooch_framework/crypto/encoding.rs index 02a8f0b563..59334e0b43 100644 --- a/crates/rooch-framework/src/natives/rooch_framework/crypto/encoding.rs +++ b/crates/rooch-framework/src/natives/rooch_framework/crypto/encoding.rs @@ -18,10 +18,10 @@ use move_vm_types::{ use smallvec::smallvec; use std::collections::VecDeque; -pub const INVALID_PUBKEY: u64 = 1; -pub const EXCESSIVE_SCRIPT_SIZE: u64 = 2; -pub const INVALID_DATA: u64 = 3; -pub const INVALID_SCRIPT_VERSION: u64 = 4; +pub const E_INVALID_PUBKEY: u64 = 1; +pub const E_EXCESSIVE_SCRIPT_SIZE: u64 = 2; +pub const E_INVALID_DATA: u64 = 3; +pub const E_INVALID_SCRIPT_VERSION: u64 = 4; /*************************************************************************************************** * native fun base58 @@ -31,7 +31,7 @@ pub const INVALID_SCRIPT_VERSION: u64 = 4; * + encoding_base58_data_cost_per_block * num_blocks | cost depends on number of blocks in message **************************************************************************************************/ pub fn native_base58( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -41,7 +41,7 @@ pub fn native_base58( // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; let address_bytes = pop_arg!(args, VectorRef); @@ -61,7 +61,7 @@ pub fn native_base58( * + encoding_base58check_data_cost_per_block * num_blocks | cost depends on number of blocks in message **************************************************************************************************/ pub fn native_base58check( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -71,7 +71,7 @@ pub fn native_base58check( // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; let version_byte = pop_arg!(args, u8); let address_bytes = pop_arg!(args, VectorRef); @@ -94,7 +94,7 @@ pub fn native_base58check( * + encoding_bech32_data_cost_per_block * num_blocks | cost depends on number of blocks in message **************************************************************************************************/ pub fn native_bech32( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -104,14 +104,14 @@ pub fn native_bech32( // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; let version = pop_arg!(args, u8); let public_key = pop_arg!(args, VectorRef); // Version 0 for bech32 encoding and 1-16 are for bech32m encoding let Ok(version) = u5::try_from_u8(version) else { - return Ok(NativeResult::err(cost, INVALID_DATA)); + return Ok(NativeResult::err(cost, E_INVALID_DATA)); }; let Ok(witness_program) = WitnessProgram::new( @@ -119,7 +119,7 @@ pub fn native_bech32( public_key.as_bytes_ref().to_vec(), Bech32Network::Bitcoin, // TODO network selection ) else { - return Ok(NativeResult::err(cost, INVALID_SCRIPT_VERSION)); + return Ok(NativeResult::err(cost, moveos_types::move_std::error::invalid_argument(E_INVALID_SCRIPT_VERSION))); }; let address = witness_program.to_address(); @@ -139,7 +139,7 @@ pub fn native_bech32( * + encoding_p2pkh_data_cost_per_block * num_blocks | cost depends on number of blocks in message **************************************************************************************************/ pub fn native_p2pkh( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -149,13 +149,13 @@ pub fn native_p2pkh( // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; let public_key = pop_arg!(args, VectorRef); let public_key_bytes_ref = public_key.as_bytes_ref(); let Ok(public_key) = ::from_bytes(&public_key_bytes_ref) else { - return Ok(NativeResult::err(cost, INVALID_PUBKEY)); + return Ok(NativeResult::err(cost, moveos_types::move_std::error::invalid_argument(E_INVALID_PUBKEY))); }; let bitcoin_public_key = PublicKey::new(public_key.pubkey); @@ -178,7 +178,7 @@ pub fn native_p2pkh( * + encoding_p2sh_data_cost_per_block * num_blocks | cost depends on number of blocks in message **************************************************************************************************/ pub fn native_p2sh( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -188,13 +188,13 @@ pub fn native_p2sh( // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; let public_key = pop_arg!(args, VectorRef); let public_key_bytes_ref = public_key.as_bytes_ref(); let Ok(public_key) = ::from_bytes(&public_key_bytes_ref) else { - return Ok(NativeResult::err(cost, INVALID_PUBKEY)); + return Ok(NativeResult::err(cost, moveos_types::move_std::error::invalid_argument(E_INVALID_PUBKEY))); }; let bitcoin_public_key = PublicKey::new(public_key.pubkey); @@ -207,7 +207,7 @@ pub fn native_p2sh( redeem_script, Network::Bitcoin, // TODO network selection ) else { - return Ok(NativeResult::err(cost, EXCESSIVE_SCRIPT_SIZE)); + return Ok(NativeResult::err(cost, moveos_types::move_std::error::internal(E_EXCESSIVE_SCRIPT_SIZE))); }; let p2sh_address_bytes = p2sh_address.to_string().as_bytes().to_vec(); diff --git a/crates/rooch-framework/src/natives/rooch_framework/crypto/schnorr.rs b/crates/rooch-framework/src/natives/rooch_framework/crypto/schnorr.rs index 413d533614..c74d02cf28 100644 --- a/crates/rooch-framework/src/natives/rooch_framework/crypto/schnorr.rs +++ b/crates/rooch-framework/src/natives/rooch_framework/crypto/schnorr.rs @@ -20,14 +20,14 @@ use rust_secp256k1::schnorr::Signature; use smallvec::smallvec; use std::collections::VecDeque; -pub const INVALID_SIGNATURE: u64 = 1; -pub const INVALID_PUBKEY: u64 = 2; +pub const E_INVALID_SIGNATURE: u64 = 1; +pub const E_INVALID_PUBKEY: u64 = 2; pub const KECCAK256: u8 = 0; pub const SHA256: u8 = 1; pub fn native_verify( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, _context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -46,14 +46,14 @@ pub fn native_verify( // TODO(Gas): Charge the arg size dependent costs - let cost = 0.into(); + let cost = gas_params.base; let Ok(sig) = Signature::from_slice(&signature_bytes_ref) else { - return Ok(NativeResult::err(cost, INVALID_SIGNATURE)); + return Ok(NativeResult::err(cost, moveos_types::move_std::error::invalid_argument(E_INVALID_SIGNATURE))); }; let Ok(public_key) = ::from_bytes(&public_key_bytes_ref) else { - return Ok(NativeResult::err(cost, INVALID_PUBKEY)); + return Ok(NativeResult::err(cost, moveos_types::move_std::error::invalid_argument(E_INVALID_PUBKEY))); }; let sign = SchnorrSignature::from(&sig); diff --git a/moveos/moveos-stdlib/src/natives/moveos_stdlib/bcs.rs b/moveos/moveos-stdlib/src/natives/moveos_stdlib/bcs.rs index 1bbd7b3081..639dc40335 100644 --- a/moveos/moveos-stdlib/src/natives/moveos_stdlib/bcs.rs +++ b/moveos/moveos-stdlib/src/natives/moveos_stdlib/bcs.rs @@ -12,6 +12,8 @@ use move_vm_types::{ use smallvec::smallvec; use std::collections::VecDeque; +const E_TYPE_NOT_MATCH: u64 = 1; + #[derive(Debug, Clone)] pub struct FromBytesGasParameters { pub base: InternalGas, @@ -27,7 +29,7 @@ impl FromBytesGasParameters { /// Bytes are in BCS (Binary Canonical Serialization) format. #[inline] fn native_from_bytes( - _gas_params: &FromBytesGasParameters, + gas_params: &FromBytesGasParameters, context: &mut NativeContext, ty_args: Vec, mut args: VecDeque, @@ -35,7 +37,7 @@ fn native_from_bytes( debug_assert_eq!(ty_args.len(), 1); debug_assert_eq!(args.len(), 1); - let cost = 0.into(); + let cost = gas_params.base; // TODO(Gas): charge for getting the layout let layout = context.type_to_type_layout(&ty_args[0])?.ok_or_else(|| { @@ -49,8 +51,10 @@ fn native_from_bytes( let val = match Value::simple_deserialize(&bytes, &layout) { Some(val) => val, None => { - // TODO(gas): charge the gas for the failure. - return Err(PartialVMError::new(StatusCode::VALUE_DESERIALIZATION_ERROR)); + return Ok(NativeResult::err( + cost, + moveos_types::move_std::error::invalid_argument(E_TYPE_NOT_MATCH), + )); } }; // TODO(gas): charge gas for deserialization 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 05ac798c08..0420d80632 100644 --- a/moveos/moveos-stdlib/src/natives/moveos_stdlib/move_module.rs +++ b/moveos/moveos-stdlib/src/natives/moveos_stdlib/move_module.rs @@ -29,6 +29,10 @@ use std::collections::{BTreeSet, VecDeque}; // ======================================================================================== +const E_ADDRESS_NOT_MATCH_WITH_SIGNER: u64 = 1; +const E_MODULE_VERIFICATION_ERROR: u64 = 2; +const E_MODULE_INCOMPATIBLE: u64 = 3; + /// The native module context. #[derive(Tid)] pub struct NativeModuleContext<'a> { @@ -69,7 +73,6 @@ fn native_module_name_inner( let name = module.self_id().name().to_owned().into_string(); let cost = gas_params.base + if gas_params.per_byte_in_str > 0.into() { - //TODO charge gas cost gas_params.per_byte_in_str * NumBytes::new(name.len() as u64) } else { 0.into() @@ -125,21 +128,25 @@ fn native_sort_and_verify_modules_inner( let mut init_identifier = vec![]; for module in &compiled_modules { if *module.self_id().address() != account_address { - return Err( - PartialVMError::new(StatusCode::VERIFICATION_ERROR).with_message(format!( - "Module address {:?} not match with signer address {:?}", - module.self_id().address(), - account_address - )), - ); + return Ok(NativeResult::err( + cost, + moveos_types::move_std::error::invalid_argument(E_ADDRESS_NOT_MATCH_WITH_SIGNER), + )); } let result = moveos_verifier::verifier::verify_module(module, module_context.resolver); match result { Ok(res) => { if res { init_identifier.push(module.self_id()); + module_names.push(module.self_id().name().to_owned().into_string()); + } else { + return Ok(NativeResult::err( + cost, + moveos_types::move_std::error::invalid_argument( + E_MODULE_VERIFICATION_ERROR, + ), + )); } - module_names.push(module.self_id().name().to_owned().into_string()); } Err(_) => return Err(PartialVMError::new(StatusCode::VERIFICATION_ERROR)), } @@ -248,7 +255,15 @@ fn check_compatibililty_inner( let new_m = normalized::Module::new(&new_module); let old_m = normalized::Module::new(&old_module); - compat.check(&old_m, &new_m)?; + match compat.check(&old_m, &new_m) { + Ok(_) => {} + Err(_) => { + return Ok(NativeResult::err( + cost, + moveos_types::move_std::error::invalid_argument(E_MODULE_INCOMPATIBLE), + )) + } + } } Ok(NativeResult::ok(cost, smallvec![])) }