From 46808318bae845497b24796881946b6bd5386559 Mon Sep 17 00:00:00 2001 From: Gorelyshev Sergey <49919055+SeHor05@users.noreply.github.com> Date: Fri, 11 Oct 2024 18:16:08 +0300 Subject: [PATCH] dapp_id -> optional (#40) * dapp_id -> optional * update changelog --- CHANGELOG.md | 5 +++ Cargo.lock | 40 ++++++++++++------------ Cargo.toml | 2 +- tvm_block/src/accounts.rs | 30 +++++++++--------- tvm_block_json/src/serialize.rs | 6 +++- tvm_cli/src/account.rs | 5 ++- tvm_cli/src/call.rs | 9 ++---- tvm_cli/src/debug.rs | 2 +- tvm_cli/src/helpers.rs | 3 +- tvm_cli/src/test.rs | 3 +- tvm_client/src/abi/encode_account.rs | 3 +- tvm_client/src/tvm/run_message.rs | 8 +---- tvm_executor/src/ordinary_transaction.rs | 12 ++----- tvm_executor/src/transaction_executor.rs | 15 +++++---- 14 files changed, 70 insertions(+), 73 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 174ffaa8..ed03a86c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ All notable changes to this project will be documented in this file. +## [2.2.11] – 2024-10-08 + +### Fixed +- Update Dapp_id field in AccountStuff into Option. + ## [2.2.10] – 2024-10-08 ### Fixed diff --git a/Cargo.lock b/Cargo.lock index 1f5ba4f2..43ad333a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -188,7 +188,7 @@ checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "api_derive" -version = "2.2.10" +version = "2.2.11" dependencies = [ "api_info", "proc-macro2", @@ -199,7 +199,7 @@ dependencies = [ [[package]] name = "api_info" -version = "2.2.10" +version = "2.2.11" dependencies = [ "serde", "serde_derive", @@ -208,7 +208,7 @@ dependencies = [ [[package]] name = "api_test" -version = "2.2.10" +version = "2.2.11" dependencies = [ "api_derive", "api_info", @@ -3868,7 +3868,7 @@ dependencies = [ [[package]] name = "tvm_abi" -version = "2.2.10" +version = "2.2.11" dependencies = [ "anyhow", "chrono", @@ -3885,7 +3885,7 @@ dependencies = [ [[package]] name = "tvm_api" -version = "2.2.10" +version = "2.2.11" dependencies = [ "anyhow", "byteorder", @@ -3906,7 +3906,7 @@ dependencies = [ [[package]] name = "tvm_assembler" -version = "2.2.10" +version = "2.2.11" dependencies = [ "anyhow", "clap 4.5.19", @@ -3923,7 +3923,7 @@ dependencies = [ [[package]] name = "tvm_block" -version = "2.2.10" +version = "2.2.11" dependencies = [ "anyhow", "base64 0.21.7", @@ -3944,7 +3944,7 @@ dependencies = [ [[package]] name = "tvm_block_json" -version = "2.2.10" +version = "2.2.11" dependencies = [ "anyhow", "failure", @@ -3966,7 +3966,7 @@ dependencies = [ [[package]] name = "tvm_cli" -version = "2.2.10" +version = "2.2.11" dependencies = [ "anyhow", "assert_cmd", @@ -4008,7 +4008,7 @@ dependencies = [ [[package]] name = "tvm_client" -version = "2.2.10" +version = "2.2.11" dependencies = [ "aes", "anyhow", @@ -4077,7 +4077,7 @@ dependencies = [ [[package]] name = "tvm_client_processing" -version = "2.2.10" +version = "2.2.11" dependencies = [ "api_derive", "api_info", @@ -4097,7 +4097,7 @@ dependencies = [ [[package]] name = "tvm_common" -version = "2.2.10" +version = "2.2.11" dependencies = [ "external-ip", "failure", @@ -4110,7 +4110,7 @@ dependencies = [ [[package]] name = "tvm_debugger" -version = "2.2.10" +version = "2.2.11" dependencies = [ "anyhow", "base64 0.21.7", @@ -4127,7 +4127,7 @@ dependencies = [ [[package]] name = "tvm_executor" -version = "2.2.10" +version = "2.2.11" dependencies = [ "anyhow", "failure", @@ -4141,7 +4141,7 @@ dependencies = [ [[package]] name = "tvm_sdk" -version = "2.2.10" +version = "2.2.11" dependencies = [ "anyhow", "api_derive", @@ -4166,7 +4166,7 @@ dependencies = [ [[package]] name = "tvm_struct" -version = "2.2.10" +version = "2.2.11" dependencies = [ "failure", "hex-literal", @@ -4177,7 +4177,7 @@ dependencies = [ [[package]] name = "tvm_tl_codegen" -version = "2.2.10" +version = "2.2.11" dependencies = [ "crc 1.8.1", "failure", @@ -4191,7 +4191,7 @@ dependencies = [ [[package]] name = "tvm_types" -version = "2.2.10" +version = "2.2.11" dependencies = [ "aes-ctr", "anyhow", @@ -4222,7 +4222,7 @@ dependencies = [ [[package]] name = "tvm_vm" -version = "2.2.10" +version = "2.2.11" dependencies = [ "anyhow", "criterion", @@ -4327,7 +4327,7 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "update_trusted_blocks" -version = "2.2.10" +version = "2.2.11" dependencies = [ "bincode", "serde", diff --git a/Cargo.toml b/Cargo.toml index feb1e88b..2003cb41 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ members = [ "tvm_vm", ] [workspace.package] -version = "2.2.10" +version = "2.2.11" rust-version = "1.76.0" authors = ["TVM Labs "] diff --git a/tvm_block/src/accounts.rs b/tvm_block/src/accounts.rs index 88cafb7c..ade1ea17 100644 --- a/tvm_block/src/accounts.rs +++ b/tvm_block/src/accounts.rs @@ -543,7 +543,7 @@ impl fmt::Display for AccountState { #[derive(Debug, Clone, Default)] pub struct AccountStuff { addr: MsgAddressInt, - dapp_id: UInt256, + dapp_id: Option, storage_stat: StorageInfo, storage: AccountStorage, } @@ -578,7 +578,7 @@ impl Serializable for AccountStuff { fn write_to(&self, builder: &mut BuilderData) -> Result<()> { let mut builder_stuff = BuilderData::new(); self.addr.write_to(&mut builder_stuff)?; - self.dapp_id.write_to(&mut builder_stuff)?; + self.dapp_id.write_maybe_to(&mut builder_stuff)?; let mut builder_stuff2 = BuilderData::new(); self.storage_stat.write_to(&mut builder_stuff2)?; self.storage.write_to(&mut builder_stuff2)?; @@ -626,7 +626,7 @@ impl Account { pub fn active_by_init_code_hash( addr: MsgAddressInt, - dapp_id: UInt256, + dapp_id: Option, balance: CurrencyCollection, last_paid: u32, state_init: StateInit, @@ -650,7 +650,7 @@ impl Account { /// create unintialized account, only with address and balance pub fn with_address_and_ballance( addr: &MsgAddressInt, - dapp_id: UInt256, + dapp_id: Option, balance: &CurrencyCollection, ) -> Self { Account::with_stuff(AccountStuff { @@ -662,7 +662,7 @@ impl Account { } /// Create unintialize account with zero balance - pub const fn with_address(addr: MsgAddressInt, dapp_id: UInt256) -> Self { + pub const fn with_address(addr: MsgAddressInt, dapp_id: Option) -> Self { Account::with_stuff(AccountStuff { addr, dapp_id, @@ -675,7 +675,7 @@ impl Account { pub fn from_message_by_init_code_hash( msg: &Message, init_code_hash: bool, - dapp_id: UInt256, + dapp_id: Option, ) -> Option { let hdr = msg.int_header()?; if hdr.value().grams.is_zero() { @@ -730,7 +730,7 @@ impl Account { /// create frozen account - for test purposes pub fn frozen( addr: MsgAddressInt, - dapp_id: UInt256, + dapp_id: Option, last_trans_lt: u64, last_paid: u32, state_hash: UInt256, @@ -747,7 +747,6 @@ impl Account { /// create uninit account - for test purposes pub fn uninit( addr: MsgAddressInt, - dapp_id: UInt256, last_trans_lt: u64, last_paid: u32, balance: CurrencyCollection, @@ -764,6 +763,7 @@ impl Account { last_paid, due_payment: None, }; + let dapp_id = None; let stuff = AccountStuff { addr, dapp_id, storage_stat, storage }; Account::with_stuff(stuff) } @@ -771,7 +771,7 @@ impl Account { // constructor only same tests pub fn with_storage( addr: &MsgAddressInt, - dapp_id: UInt256, + dapp_id: Option, storage_stat: &StorageInfo, storage: &AccountStorage, ) -> Self { @@ -847,7 +847,7 @@ impl Account { self.stuff().map(|s| &s.addr) } - pub fn get_dapp_id(&self) -> Option<&UInt256> { + pub fn get_dapp_id(&self) -> Option<&Option> { self.stuff().map(|s| &s.dapp_id) } @@ -1125,7 +1125,7 @@ impl Account { let mut builder_stuff = BuilderData::new(); builder.append_bit_one()?; stuff.addr.write_to(&mut builder_stuff)?; - stuff.dapp_id.write_to(&mut builder_stuff)?; + stuff.dapp_id.write_maybe_to(&mut builder_stuff)?; builder.checked_append_reference(builder_stuff.into_cell().unwrap()).unwrap(); let mut builder_stuff2 = BuilderData::new(); stuff.storage_stat.write_to(&mut builder_stuff2)?; @@ -1143,7 +1143,7 @@ impl Account { let builder = slice.reference(0).unwrap(); let mut slice_builder = SliceData::load_cell(builder).unwrap(); let addr = Deserializable::construct_from(&mut slice_builder)?; - let dapp_id = UInt256::construct_from(&mut slice_builder)?; + let dapp_id = UInt256::read_maybe_from(&mut slice_builder)?; let builder2 = slice.reference(1).unwrap(); slice_builder = SliceData::load_cell(builder2).unwrap(); let storage_stat = Deserializable::construct_from(&mut slice_builder)?; @@ -1158,7 +1158,7 @@ impl Account { let builder = slice.reference(0).unwrap(); let mut slice_builder = SliceData::load_cell(builder).unwrap(); let addr = Deserializable::construct_from(&mut slice_builder)?; - let dapp_id = UInt256::construct_from(&mut slice_builder)?; + let dapp_id = UInt256::read_maybe_from(&mut slice_builder)?; let builder2 = slice.reference(1).unwrap(); slice_builder = SliceData::load_cell(builder2).unwrap(); let storage_stat = Deserializable::construct_from(&mut slice_builder)?; @@ -1180,7 +1180,7 @@ impl Account { } } - pub fn set_dapp_id(&mut self, dapp_id: UInt256) { + pub fn set_dapp_id(&mut self, dapp_id: Option) { if let Some(s) = self.stuff_mut() { s.dapp_id = dapp_id; } @@ -1422,7 +1422,7 @@ pub fn generate_test_account_by_init_code_hash(init_code_hash: bool) -> Account let acc_st = AccountStorage::active_by_init_code_hash(0, balance, stinit, init_code_hash); let addr = MsgAddressInt::with_standart(Some(anc), 0, acc_id).unwrap(); - let mut account = Account::with_storage(&addr, UInt256::new(), &st_info, &acc_st); + let mut account = Account::with_storage(&addr, None, &st_info, &acc_st); account.update_storage_stat().unwrap(); account } diff --git a/tvm_block_json/src/serialize.rs b/tvm_block_json/src/serialize.rs index dbf980ef..fac949db 100644 --- a/tvm_block_json/src/serialize.rs +++ b/tvm_block_json/src/serialize.rs @@ -2080,7 +2080,11 @@ pub fn db_serialize_account_ex( serialize_field(&mut map, "workchain_id", addr.get_workchain_id()); } if let Some(dapp_id) = set.account.get_dapp_id() { - serialize_field(&mut map, "dapp_id", dapp_id.as_hex_string()); + if let Some(dapp_id_in) = dapp_id { + serialize_field(&mut map, "dapp_id", dapp_id_in.as_hex_string()); + } else { + serialize_field(&mut map, "dapp_id", "None".to_string()); + } } serialize_field(&mut map, "boc", base64_encode(&set.boc)); if let Some(boc1) = set.boc1.as_ref() { diff --git a/tvm_cli/src/account.rs b/tvm_cli/src/account.rs index 69cdba66..3db3e321 100644 --- a/tvm_cli/src/account.rs +++ b/tvm_cli/src/account.rs @@ -197,7 +197,10 @@ pub async fn get_account( .map_err(|e| format!("failed to load account from the boc: {}", e))?; let dapp_id = account .get_dapp_id() - .map(|id| id.to_hex_string()) + .map(|id| match id { + Some(data) => data.to_hex_string(), + None => "None".to_string(), + }) .unwrap_or("None".to_string()); let ecc_balance = account .balance() diff --git a/tvm_cli/src/call.rs b/tvm_cli/src/call.rs index a87eb805..29a34932 100644 --- a/tvm_cli/src/call.rs +++ b/tvm_cli/src/call.rs @@ -31,7 +31,6 @@ use tvm_client::tvm::run_executor; use tvm_client::tvm::AccountForExecutor; use tvm_client::tvm::ParamsOfRunExecutor; use tvm_types::base64_encode; -use tvm_types::UInt256; use crate::config::Config; use crate::convert; @@ -135,11 +134,9 @@ pub async fn emulate_locally( let addr = tvm_block::MsgAddressInt::from_str(addr) .map_err(|e| format!("couldn't decode address: {}", e))?; state = base64_encode( - &tvm_types::write_boc( - &Account::with_address(addr, UInt256::new()).serialize().map_err(|e| { - format!("couldn't create dummy account for deploy emulation: {}", e) - })?, - ) + &tvm_types::write_boc(&Account::with_address(addr, None).serialize().map_err( + |e| format!("couldn't create dummy account for deploy emulation: {}", e), + )?) .map_err(|e| format!("failed to serialize account cell: {}", e))?, ); } else { diff --git a/tvm_cli/src/debug.rs b/tvm_cli/src/debug.rs index f2ae73d0..fcca4602 100644 --- a/tvm_cli/src/debug.rs +++ b/tvm_cli/src/debug.rs @@ -974,7 +974,7 @@ async fn debug_deploy_command(matches: &ArgMatches<'_>, config: &Config) -> Resu let addr = MsgAddressInt::with_standart(None, wc as i8, address).map_err(|e| format!("{}", e))?; let balance = CurrencyCollection::with_grams(initial_balance); - Account::with_address_and_ballance(&addr, UInt256::new(), &balance) + Account::with_address_and_ballance(&addr, None, &balance) } else { let account = query_account_field(ton_client.clone(), &address, "boc").await?; Account::construct_from_base64(&account) diff --git a/tvm_cli/src/helpers.rs b/tvm_cli/src/helpers.rs index e4e08a5a..438134cc 100644 --- a/tvm_cli/src/helpers.rs +++ b/tvm_cli/src/helpers.rs @@ -45,7 +45,6 @@ use tvm_client::ClientContext; use tvm_executor::BlockchainConfig; use tvm_types::base64_decode; use tvm_types::base64_encode; -use tvm_types::UInt256; use url::Url; use crate::call::parse_params; @@ -587,7 +586,7 @@ pub fn construct_account_from_tvc( .map_err(|e| format!("Failed to set address: {}", e))?, _ => MsgAddressInt::default(), }, - UInt256::new(), + None, match balance { Some(balance) => CurrencyCollection::with_grams(balance), _ => CurrencyCollection::default(), diff --git a/tvm_cli/src/test.rs b/tvm_cli/src/test.rs index ae65ddb4..60d9c6a4 100644 --- a/tvm_cli/src/test.rs +++ b/tvm_cli/src/test.rs @@ -37,7 +37,6 @@ use tvm_types::read_single_root_boc; use tvm_types::write_boc; use tvm_types::BuilderData; use tvm_types::SliceData; -use tvm_types::UInt256; use crate::config::Config; use crate::crypto::load_keypair; @@ -283,7 +282,7 @@ async fn test_deploy(matches: &ArgMatches<'_>, config: &Config) -> Result<(), St balance.parse().map_err(|e| format!("Failed to parse initial balance: {e}"))?; let balance = CurrencyCollection::with_grams(balance); - account = Account::with_address_and_ballance(addr, UInt256::new(), &balance); + account = Account::with_address_and_ballance(addr, None, &balance); } else { let src_address = "-1:0000000000000000000000000000000000000000000000000000000000000000"; let msg_params = ParamsOfEncodeInternalMessage { diff --git a/tvm_client/src/abi/encode_account.rs b/tvm_client/src/abi/encode_account.rs index 953e905a..5a2c9107 100644 --- a/tvm_client/src/abi/encode_account.rs +++ b/tvm_client/src/abi/encode_account.rs @@ -3,7 +3,6 @@ use std::sync::Arc; use tvm_block::Account; use tvm_block::CurrencyCollection; use tvm_block::MsgAddressInt; -use tvm_types::UInt256; use crate::abi::Error; use crate::boc::internal::serialize_object_to_boc; @@ -49,7 +48,7 @@ pub fn encode_account( )?; let id = state_init.cell.repr_hash(); let address = MsgAddressInt::with_standart(None, 0, id.clone().into()).unwrap(); - let mut account = Account::with_address(address, UInt256::new()); + let mut account = Account::with_address(address, None); account.set_balance(CurrencyCollection::from(params.balance.unwrap_or(100000000000))); account .try_activate_by_init_code_hash(&state_init.object, false) diff --git a/tvm_client/src/tvm/run_message.rs b/tvm_client/src/tvm/run_message.rs index 883b9942..8a546b2d 100644 --- a/tvm_client/src/tvm/run_message.rs +++ b/tvm_client/src/tvm/run_message.rs @@ -84,13 +84,7 @@ impl AccountForExecutor { } AccountForExecutor::Uninit => { let last_paid = (context.env.now_ms() / 1000) as u32; - let account = Account::uninit( - address, - UInt256::new(), - 0, - last_paid, - UNLIMITED_BALANCE.into(), - ); + let account = Account::uninit(address, 0, last_paid, UNLIMITED_BALANCE.into()); let account = serialize_object_to_cell(&account, "account")?; Ok((account, None)) } diff --git a/tvm_executor/src/ordinary_transaction.rs b/tvm_executor/src/ordinary_transaction.rs index ec9e7c09..4f049798 100644 --- a/tvm_executor/src/ordinary_transaction.rs +++ b/tvm_executor/src/ordinary_transaction.rs @@ -37,7 +37,6 @@ use tvm_types::fail; use tvm_types::HashmapType; use tvm_types::Result; use tvm_types::SliceData; -use tvm_types::UInt256; use tvm_vm::boolean; use tvm_vm::int; use tvm_vm::stack::integer::IntegerData; @@ -128,7 +127,7 @@ impl TransactionExecutor for OrdinaryTransactionExecutor { let gas_config = self.config().get_gas_config(false); log::debug!(target: "executor", "src_dapp_id = {:?}, address = {:?}, available_credit {:?}", params.src_dapp_id, in_msg.int_header(), params.available_credit); if let Some(h) = in_msg.int_header() { - if params.src_dapp_id != account.get_dapp_id().cloned() + if Some(params.src_dapp_id.clone()) != account.get_dapp_id().cloned() && !(in_msg.have_state_init() && (account.is_none() || account @@ -441,13 +440,8 @@ impl TransactionExecutor for OrdinaryTransactionExecutor { log::debug!(target: "executor", "restore balance {} => {}", acc_balance.grams, original_acc_balance.grams); acc_balance = original_acc_balance; } else if account.is_none() && !acc_balance.is_zero()? { - *account = Account::uninit( - account_address.clone(), - UInt256::new(), - 0, - last_paid, - acc_balance.clone(), - ); + *account = + Account::uninit(account_address.clone(), 0, last_paid, acc_balance.clone()); } } if (account.status() == AccountStatus::AccStateUninit) && acc_balance.is_zero()? { diff --git a/tvm_executor/src/transaction_executor.rs b/tvm_executor/src/transaction_executor.rs index c93a14be..c867bd9b 100644 --- a/tvm_executor/src/transaction_executor.rs +++ b/tvm_executor/src/transaction_executor.rs @@ -217,12 +217,12 @@ pub trait TransactionExecutor { if let Some(message) = in_msg { if message.int_header().is_some() { if let Some(dapp_id) = src_dapp_id.clone() { - account.set_dapp_id(dapp_id.clone()); + account.set_dapp_id(Some(dapp_id.clone())); } } else { - account.set_dapp_id( + account.set_dapp_id(Some( account.get_id().unwrap().get_bytestring(0).as_slice().into(), - ); + )); } } } @@ -902,7 +902,10 @@ pub trait TransactionExecutor { return Ok(ActionPhaseResult::new(phase, vec![], copyleft_reward)); } } - let src_dapp_id = acc.get_dapp_id().cloned(); + let src_dapp_id = match acc.get_dapp_id().cloned() { + Some(dapp_id) => dapp_id, + None => None, + }; for (i, mode, mut out_msg) in out_msgs0.into_iter() { if let Some(header) = out_msg.int_header_mut() { header.set_src_dapp_id(src_dapp_id.clone()); @@ -1820,7 +1823,7 @@ fn account_from_message( if check_libraries(init, disable_set_lib, text, msg) { return Account::active_by_init_code_hash( hdr.dst.clone(), - UInt256::new(), + None, msg_remaining_balance.clone(), 0, init.clone(), @@ -1846,7 +1849,7 @@ fn account_from_message( ); None } else { - Some(Account::uninit(hdr.dst.clone(), UInt256::new(), 0, 0, msg_remaining_balance.clone())) + Some(Account::uninit(hdr.dst.clone(), 0, 0, msg_remaining_balance.clone())) } }