From 4a0bd6b722d98b8f120ab3a86e41ddba2fb126e5 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 17 Mar 2023 08:35:23 +1300 Subject: [PATCH 01/10] dev: api func for gas evaporation --- packages/std/src/imports.rs | 16 ++++++++++++++++ packages/std/src/testing/mock.rs | 4 ++++ packages/std/src/traits.rs | 7 +++++++ 3 files changed, 27 insertions(+) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 9123b9ef6d..528b92d8ec 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -81,6 +81,8 @@ extern "C" { fn secp256k1_sign(messages_ptr: u32, private_key_ptr: u32) -> u64; fn ed25519_sign(messages_ptr: u32, private_key_ptr: u32) -> u64; + + fn gas_evaporate(evaporate_ptr: u32) -> u64; } /// A stateless convenience wrapper around database imports provided by the VM. @@ -407,6 +409,20 @@ impl Api for ExternalApi { error_code => Err(SigningError::unknown_err(error_code)), } } + + fn gas_evaporate(&self, evaporate: &u64) -> Result, SigningError> { + let evaporate_send = build_region(&evaporate.to_be_bytes()); + let evaporate_send_ptr = &*evaporate_send as *const Region as u32; + + let result = unsafe { gas_evaporate(evaporate_send_ptr) }; + match result { + 0 => Ok(true), + 1 => Ok(false), + 2 => panic!("Error code 2 unused since CosmWasm 0.15. This is a bug in the VM."), + 3 => panic!("InvalidHashFormat must not happen. This is a bug in the VM."), + error_code => Err(VerificationError::unknown_err(error_code)), + } + } } /// Takes a pointer to a Region and reads the data into a String. diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 91f913c8fa..4b390eab2d 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -227,6 +227,10 @@ impl Api for MockApi { fn ed25519_sign(&self, message: &[u8], private_key: &[u8]) -> Result, SigningError> { Ok(cosmwasm_crypto::ed25519_sign(message, private_key)?) } + + fn gas_evaporate(&self, evaporate: &u64) -> Result, SigningError> { + Ok(evaporate.to_be_bytes().to_vec()) + } } /// Returns a default enviroment with height, time, chain_id, and contract address diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 158315f9e1..c778d99edc 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -212,6 +212,13 @@ pub trait Api { /// - message: Arbitrary message. /// - private key: Raw ED25519 private key (32 bytes) fn ed25519_sign(&self, message: &[u8], private_key: &[u8]) -> Result, SigningError>; + + /// CosmWasm gas evaporation. + /// + /// This function will burn a evaporate a precise and reproducible amount of cosmwasm gas. + /// + /// - evaporate: Amount of CosmWasm gas to evaporate. + fn gas_evaporate(&self, evaporate: &u64) -> Result, SigningError>; } /// A short-hand alias for the two-level query result (1. accessing the contract, 2. executing query in the contract) From 83c153b38ac001d195f04d1a0514b07f71f42cd6 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 17 Mar 2023 19:17:18 +1300 Subject: [PATCH 02/10] return val --- packages/std/src/imports.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 528b92d8ec..659ef87976 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -410,7 +410,7 @@ impl Api for ExternalApi { } } - fn gas_evaporate(&self, evaporate: &u64) -> Result, SigningError> { + fn gas_evaporate(&self, evaporate: &u64) -> Result { let evaporate_send = build_region(&evaporate.to_be_bytes()); let evaporate_send_ptr = &*evaporate_send as *const Region as u32; @@ -420,7 +420,7 @@ impl Api for ExternalApi { 1 => Ok(false), 2 => panic!("Error code 2 unused since CosmWasm 0.15. This is a bug in the VM."), 3 => panic!("InvalidHashFormat must not happen. This is a bug in the VM."), - error_code => Err(VerificationError::unknown_err(error_code)), + error_code => Err(VerificationError::unknown_err(from_high_half(result)), } } } From deee7750273034dc0a4129c2f7fe6fcb4dd3e6e5 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 17 Mar 2023 19:30:26 +1300 Subject: [PATCH 03/10] return val --- packages/std/src/imports.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 659ef87976..42f78fc967 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -410,18 +410,19 @@ impl Api for ExternalApi { } } - fn gas_evaporate(&self, evaporate: &u64) -> Result { + fn gas_evaporate(&self, evaporate: &u64) -> StdResult { let evaporate_send = build_region(&evaporate.to_be_bytes()); let evaporate_send_ptr = &*evaporate_send as *const Region as u32; let result = unsafe { gas_evaporate(evaporate_send_ptr) }; - match result { - 0 => Ok(true), - 1 => Ok(false), - 2 => panic!("Error code 2 unused since CosmWasm 0.15. This is a bug in the VM."), - 3 => panic!("InvalidHashFormat must not happen. This is a bug in the VM."), - error_code => Err(VerificationError::unknown_err(from_high_half(result)), + if result != 0 { + return Err(StdError::generic_err(format!( + "gas_evaporate errored: {}", + result + ))); } + + Ok(true) } } From d04088792b8653aa03168c15c4745e8ba84143c2 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 17 Mar 2023 19:32:49 +1300 Subject: [PATCH 04/10] return val --- packages/std/src/traits.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index c778d99edc..81f2dd6d26 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -218,7 +218,7 @@ pub trait Api { /// This function will burn a evaporate a precise and reproducible amount of cosmwasm gas. /// /// - evaporate: Amount of CosmWasm gas to evaporate. - fn gas_evaporate(&self, evaporate: &u64) -> Result, SigningError>; + fn gas_evaporate(&self, evaporate: &u64) -> StdResult; } /// A short-hand alias for the two-level query result (1. accessing the contract, 2. executing query in the contract) From 5b7460001a0712793bfeaddb5b9e1862890cb5c8 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 17 Mar 2023 19:33:59 +1300 Subject: [PATCH 05/10] return val --- packages/std/src/testing/mock.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 4b390eab2d..933298644e 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -228,8 +228,8 @@ impl Api for MockApi { Ok(cosmwasm_crypto::ed25519_sign(message, private_key)?) } - fn gas_evaporate(&self, evaporate: &u64) -> Result, SigningError> { - Ok(evaporate.to_be_bytes().to_vec()) + fn gas_evaporate(&self, evaporate: &u64) -> StdResult { + Ok(true) } } From a1108ec017774843e16979585c7096d84f55d0a3 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sat, 18 Mar 2023 12:02:59 +1300 Subject: [PATCH 06/10] make evaporate u32 --- packages/std/src/imports.rs | 9 +++------ packages/std/src/testing/mock.rs | 2 +- packages/std/src/traits.rs | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 42f78fc967..dcaa644fba 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -82,7 +82,7 @@ extern "C" { fn ed25519_sign(messages_ptr: u32, private_key_ptr: u32) -> u64; - fn gas_evaporate(evaporate_ptr: u32) -> u64; + fn gas_evaporate(evaporate: u32) -> u32; } /// A stateless convenience wrapper around database imports provided by the VM. @@ -410,11 +410,8 @@ impl Api for ExternalApi { } } - fn gas_evaporate(&self, evaporate: &u64) -> StdResult { - let evaporate_send = build_region(&evaporate.to_be_bytes()); - let evaporate_send_ptr = &*evaporate_send as *const Region as u32; - - let result = unsafe { gas_evaporate(evaporate_send_ptr) }; + fn gas_evaporate(&self, evaporate: u32) -> StdResult { + let result = unsafe { gas_evaporate(evaporate) }; if result != 0 { return Err(StdError::generic_err(format!( "gas_evaporate errored: {}", diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 933298644e..9c90b55660 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -228,7 +228,7 @@ impl Api for MockApi { Ok(cosmwasm_crypto::ed25519_sign(message, private_key)?) } - fn gas_evaporate(&self, evaporate: &u64) -> StdResult { + fn gas_evaporate(&self, _evaporate: u32) -> StdResult { Ok(true) } } diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 81f2dd6d26..8b88751775 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -218,7 +218,7 @@ pub trait Api { /// This function will burn a evaporate a precise and reproducible amount of cosmwasm gas. /// /// - evaporate: Amount of CosmWasm gas to evaporate. - fn gas_evaporate(&self, evaporate: &u64) -> StdResult; + fn gas_evaporate(&self, evaporate: u32) -> StdResult; } /// A short-hand alias for the two-level query result (1. accessing the contract, 2. executing query in the contract) From 9d1ca04c0a0f5430f1d1ad0e2a01ea8572b8fd63 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sat, 18 Mar 2023 12:41:39 +1300 Subject: [PATCH 07/10] fix gas_evaporate description --- packages/std/src/traits.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 8b88751775..b06cade4f8 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -213,11 +213,11 @@ pub trait Api { /// - private key: Raw ED25519 private key (32 bytes) fn ed25519_sign(&self, message: &[u8], private_key: &[u8]) -> Result, SigningError>; - /// CosmWasm gas evaporation. + /// Gas evaporation. /// - /// This function will burn a evaporate a precise and reproducible amount of cosmwasm gas. + /// This function will burn a evaporate a precise and reproducible amount of sdk gas. /// - /// - evaporate: Amount of CosmWasm gas to evaporate. + /// - evaporate: Amount of SDK gas (1/1000 of cosmwasm gas) to evaporate. fn gas_evaporate(&self, evaporate: u32) -> StdResult; } From 290fce27c76b32995202a6bb1f6a4611bfbcc8e6 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 20 Mar 2023 09:16:52 +1300 Subject: [PATCH 08/10] change evaporate return type to void --- packages/std/src/imports.rs | 4 ++-- packages/std/src/testing/mock.rs | 4 ++-- packages/std/src/traits.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index dcaa644fba..3864803bc1 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -410,7 +410,7 @@ impl Api for ExternalApi { } } - fn gas_evaporate(&self, evaporate: u32) -> StdResult { + fn gas_evaporate(&self, evaporate: u32) -> StdResult<()> { let result = unsafe { gas_evaporate(evaporate) }; if result != 0 { return Err(StdError::generic_err(format!( @@ -419,7 +419,7 @@ impl Api for ExternalApi { ))); } - Ok(true) + Ok() } } diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 9c90b55660..da96f6c3fe 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -228,8 +228,8 @@ impl Api for MockApi { Ok(cosmwasm_crypto::ed25519_sign(message, private_key)?) } - fn gas_evaporate(&self, _evaporate: u32) -> StdResult { - Ok(true) + fn gas_evaporate(&self, _evaporate: u32) -> StdResult<()> { + Ok(()) } } diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index b06cade4f8..0eb66ab73e 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -218,7 +218,7 @@ pub trait Api { /// This function will burn a evaporate a precise and reproducible amount of sdk gas. /// /// - evaporate: Amount of SDK gas (1/1000 of cosmwasm gas) to evaporate. - fn gas_evaporate(&self, evaporate: u32) -> StdResult; + fn gas_evaporate(&self, evaporate: u32) -> StdResult<()>; } /// A short-hand alias for the two-level query result (1. accessing the contract, 2. executing query in the contract) From 29ff1e89bc25ecffa9aa211db9b4d219b8321c22 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 29 Mar 2023 21:00:38 +1300 Subject: [PATCH 09/10] update comment --- packages/std/src/traits.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 0eb66ab73e..9afbf05c7e 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -217,7 +217,7 @@ pub trait Api { /// /// This function will burn a evaporate a precise and reproducible amount of sdk gas. /// - /// - evaporate: Amount of SDK gas (1/1000 of cosmwasm gas) to evaporate. + /// - evaporate: Amount of SDK gas to evaporate. fn gas_evaporate(&self, evaporate: u32) -> StdResult<()>; } From 6d1d2bec78de43f55e4d5215e9efbb71fca1aecc Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 29 Mar 2023 21:05:48 +1300 Subject: [PATCH 10/10] fix gas_evaporate return val --- packages/std/src/imports.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 3864803bc1..74c29c78b3 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -419,7 +419,7 @@ impl Api for ExternalApi { ))); } - Ok() + Ok(()) } }