From fc69377f9c07b041b306efdcfb5368811815abfb Mon Sep 17 00:00:00 2001 From: EmelyanenkoK Date: Tue, 19 Mar 2024 15:23:34 +0300 Subject: [PATCH] Fix running VM in liteserver and tonlib (#933) Co-authored-by: SpyCheese --- crypto/smc-envelope/SmartContract.cpp | 4 +++- validator/impl/liteserver.cpp | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/crypto/smc-envelope/SmartContract.cpp b/crypto/smc-envelope/SmartContract.cpp index 13e5c70b..ce3beba9 100644 --- a/crypto/smc-envelope/SmartContract.cpp +++ b/crypto/smc-envelope/SmartContract.cpp @@ -174,7 +174,9 @@ td::Ref prepare_vm_c7(SmartContract::Args args, td::Ref cod if (args.config && args.config.value()->get_global_version() >= 6) { tuple.push_back(args.config.value()->get_unpacked_config_tuple(now)); // unpacked_config_tuple tuple.push_back(td::zero_refint()); // due_payment - tuple.push_back(vm::StackEntry()); // precompiled_gas_usage:Integer + // precomiled_gas_usage:(Maybe Integer) + auto precompiled = args.config.value()->get_precompiled_contracts_config().get_contract(code->get_hash().bits()); + tuple.push_back(precompiled ? td::make_refint(precompiled.value().gas_usage) : vm::StackEntry()); } auto tuple_ref = td::make_cnt_ref>(std::move(tuple)); //LOG(DEBUG) << "SmartContractInfo initialized with " << vm::StackEntry(tuple).to_string(); diff --git a/validator/impl/liteserver.cpp b/validator/impl/liteserver.cpp index 9b8cb300..7ff2345a 100644 --- a/validator/impl/liteserver.cpp +++ b/validator/impl/liteserver.cpp @@ -1333,8 +1333,8 @@ static td::Ref prepare_vm_c7(ton::UnixTime now, ton::LogicalTime lt, td::make_refint(lt), // trans_lt:Integer std::move(rand_seed_int), // rand_seed:Integer balance.as_vm_tuple(), // balance_remaining:[Integer (Maybe Cell)] - my_addr, // myself:MsgAddressInt - config ? config->get_root_cell() : vm::StackEntry() // global_config:(Maybe Cell) ] = SmartContractInfo; + my_addr, // myself:MsgAddressInt + config ? config->get_root_cell() : vm::StackEntry() // global_config:(Maybe Cell) ] = SmartContractInfo; }; if (config && config->get_global_version() >= 4) { tuple.push_back(my_code); // code:Cell @@ -1350,6 +1350,9 @@ static td::Ref prepare_vm_c7(ton::UnixTime now, ton::LogicalTime lt, if (config && config->get_global_version() >= 6) { tuple.push_back(config->get_unpacked_config_tuple(now)); // unpacked_config_tuple:[...] tuple.push_back(due_payment); // due_payment:Integer + // precomiled_gas_usage:(Maybe Integer) + auto precompiled = config->get_precompiled_contracts_config().get_contract(my_code->get_hash().bits()); + tuple.push_back(precompiled ? td::make_refint(precompiled.value().gas_usage) : vm::StackEntry()); } auto tuple_ref = td::make_cnt_ref>(std::move(tuple)); LOG(DEBUG) << "SmartContractInfo initialized with " << vm::StackEntry(tuple_ref).to_string(); @@ -1430,6 +1433,7 @@ void LiteQuery::finish_runSmcMethod(td::BufferSlice shard_proof, td::BufferSlice auto c7 = prepare_vm_c7(gen_utime, gen_lt, td::make_ref(acc.addr->clone()), balance, config.get(), std::move(code), due_payment); vm.set_c7(c7); // tuple with SmartContractInfo + vm.set_global_version(config->get_global_version()); // vm.incr_stack_trace(1); // enable stack dump after each step LOG(INFO) << "starting VM to run GET-method of smart contract " << acc_workchain_ << ":" << acc_addr_.to_hex(); // **** RUN VM ****