1
0
Fork 0
mirror of https://github.com/ton-blockchain/ton synced 2025-03-09 15:40:10 +00:00

Add debug enabled flag to transaction and TVM emulator (#662)

* Add debug enabled flag to transaction and TVM emulator

* Set debug_enabled false in Emulator constructor
This commit is contained in:
krigga 2023-04-02 17:28:18 +03:00 committed by GitHub
parent eabcb6a8e9
commit f51eb2d747
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 64 additions and 7 deletions

View file

@ -12,6 +12,7 @@ struct TransactionEmulationParams {
uint64_t lt;
td::optional<std::string> rand_seed_hex;
bool ignore_chksig;
bool debug_enabled;
};
td::Result<TransactionEmulationParams> decode_transaction_emulation_params(const char* json) {
@ -37,6 +38,9 @@ td::Result<TransactionEmulationParams> decode_transaction_emulation_params(const
TRY_RESULT(ignore_chksig, td::get_json_object_bool_field(obj, "ignore_chksig", false));
params.ignore_chksig = ignore_chksig;
TRY_RESULT(debug_enabled, td::get_json_object_bool_field(obj, "debug_enabled", false));
params.debug_enabled = debug_enabled;
return params;
}
@ -51,6 +55,7 @@ struct GetMethodParams {
std::string rand_seed_hex;
int64_t gas_limit;
int method_id;
bool debug_enabled;
};
td::Result<GetMethodParams> decode_get_method_params(const char* json) {
@ -95,6 +100,9 @@ td::Result<GetMethodParams> decode_get_method_params(const char* json) {
TRY_RESULT(method_id, td::get_json_object_int_field(obj, "method_id", false));
params.method_id = method_id;
TRY_RESULT(debug_enabled, td::get_json_object_bool_field(obj, "debug_enabled", false));
params.debug_enabled = debug_enabled;
return params;
}
@ -123,6 +131,7 @@ const char *emulate(const char *config, const char* libs, int verbosity, const c
!transaction_emulator_set_lt(em, decoded_params.lt) ||
!transaction_emulator_set_unixtime(em, decoded_params.utime) ||
!transaction_emulator_set_ignore_chksig(em, decoded_params.ignore_chksig) ||
!transaction_emulator_set_debug_enabled(em, decoded_params.debug_enabled) ||
!rand_seed_set) {
transaction_emulator_destroy(em);
return strdup(R"({"fail":true,"message":"Can't set params"})");
@ -163,7 +172,8 @@ const char *run_get_method(const char *params, const char* stack, const char* co
if ((decoded_params.libs && !tvm_emulator_set_libraries(tvm, decoded_params.libs.value().c_str())) ||
!tvm_emulator_set_c7(tvm, decoded_params.address.c_str(), decoded_params.unixtime,
decoded_params.balance, decoded_params.rand_seed_hex.c_str(), config) ||
(decoded_params.gas_limit > 0 && !tvm_emulator_set_gas_limit(tvm, decoded_params.gas_limit))) {
(decoded_params.gas_limit > 0 && !tvm_emulator_set_gas_limit(tvm, decoded_params.gas_limit)) ||
!tvm_emulator_set_debug_enabled(tvm, decoded_params.debug_enabled)) {
tvm_emulator_destroy(tvm);
return strdup(R"({"fail":true,"message":"Can't set params"})");
}

View file

@ -249,6 +249,14 @@ bool transaction_emulator_set_libs(void *transaction_emulator, const char* shard
return true;
}
bool transaction_emulator_set_debug_enabled(void *transaction_emulator, bool debug_enabled) {
auto emulator = static_cast<emulator::TransactionEmulator *>(transaction_emulator);
emulator->set_debug_enabled(debug_enabled);
return true;
}
void transaction_emulator_destroy(void *transaction_emulator) {
delete static_cast<emulator::TransactionEmulator *>(transaction_emulator);
}
@ -337,6 +345,12 @@ bool tvm_emulator_set_gas_limit(void *tvm_emulator, int64_t gas_limit) {
return true;
}
bool tvm_emulator_set_debug_enabled(void *tvm_emulator, bool debug_enabled) {
auto emulator = static_cast<emulator::TvmEmulator *>(tvm_emulator);
emulator->set_debug_enabled(debug_enabled);
return true;
}
const char *tvm_emulator_run_get_method(void *tvm_emulator, int method_id, const char *stack_boc) {
auto stack_cell = boc_b64_to_cell(stack_boc);
if (stack_cell.is_error()) {

View file

@ -64,6 +64,14 @@ EMULATOR_EXPORT bool transaction_emulator_set_config(void *transaction_emulator,
*/
EMULATOR_EXPORT bool transaction_emulator_set_libs(void *transaction_emulator, const char* libs_boc);
/**
* @brief Enable or disable TVM debug primitives
* @param transaction_emulator Pointer to TransactionEmulator object
* @param debug_enabled Whether debug primitives should be enabled or not
* @return true in case of success, false in case of error
*/
EMULATOR_EXPORT bool transaction_emulator_set_debug_enabled(void *transaction_emulator, bool debug_enabled);
/**
* @brief Emulate transaction
* @param transaction_emulator Pointer to TransactionEmulator object
@ -134,6 +142,14 @@ EMULATOR_EXPORT bool tvm_emulator_set_c7(void *tvm_emulator, const char *address
*/
EMULATOR_EXPORT bool tvm_emulator_set_gas_limit(void *tvm_emulator, int64_t gas_limit);
/**
* @brief Enable or disable TVM debug primitives
* @param tvm_emulator Pointer to TVM emulator
* @param debug_enabled Whether debug primitives should be enabled or not
* @return true in case of success, false in case of error
*/
EMULATOR_EXPORT bool tvm_emulator_set_debug_enabled(void *tvm_emulator, bool debug_enabled);
/**
* @brief Run get method
* @param tvm_emulator Pointer to TVM emulator

View file

@ -5,6 +5,7 @@ _transaction_emulator_set_rand_seed
_transaction_emulator_set_ignore_chksig
_transaction_emulator_set_config
_transaction_emulator_set_libs
_transaction_emulator_set_debug_enabled
_transaction_emulator_emulate_transaction
_transaction_emulator_destroy
_emulator_set_verbosity_level
@ -12,6 +13,7 @@ _tvm_emulator_create
_tvm_emulator_set_libraries
_tvm_emulator_set_c7
_tvm_emulator_set_gas_limit
_tvm_emulator_set_debug_enabled
_tvm_emulator_run_get_method
_tvm_emulator_send_external_message
_tvm_emulator_send_internal_message

View file

@ -34,7 +34,7 @@ td::Result<std::unique_ptr<TransactionEmulator::EmulationResult>> TransactionEmu
return fetch_res.move_as_error_prefix("cannot fetch config params ");
}
vm::init_op_cp0();
vm::init_op_cp0(debug_enabled_);
if (!lt) {
lt = lt_;
@ -257,4 +257,8 @@ void TransactionEmulator::set_libs(vm::Dictionary &&libs) {
libraries_ = std::forward<vm::Dictionary>(libs);
}
void TransactionEmulator::set_debug_enabled(bool debug_enabled) {
debug_enabled_ = debug_enabled;
}
} // namespace emulator

View file

@ -16,11 +16,12 @@ class TransactionEmulator {
ton::LogicalTime lt_;
td::BitArray<256> rand_seed_;
bool ignore_chksig_;
bool debug_enabled_;
public:
TransactionEmulator(block::Config&& config, int vm_log_verbosity = 0) :
config_(std::move(config)), libraries_(256), vm_log_verbosity_(vm_log_verbosity),
unixtime_(0), lt_(0), rand_seed_(td::BitArray<256>::zero()), ignore_chksig_(false) {
unixtime_(0), lt_(0), rand_seed_(td::BitArray<256>::zero()), ignore_chksig_(false), debug_enabled_(false) {
}
struct EmulationResult {
@ -70,6 +71,7 @@ public:
void set_ignore_chksig(bool ignore_chksig);
void set_config(block::Config &&config);
void set_libs(vm::Dictionary &&libs);
void set_debug_enabled(bool debug_enabled);
private:
bool check_state_update(const block::Account& account, const block::gen::Transaction::Record& trans);

View file

@ -31,6 +31,10 @@ public:
args_.set_config(config);
}
void set_debug_enabled(bool debug_enabled) {
args_.set_debug_enabled(debug_enabled);
}
Answer run_get_method(int method_id, td::Ref<vm::Stack> stack) {
return smc_.run_get_method(args_.set_stack(stack).set_method_id(method_id));
}