mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Patch getmethod for tvm upgrade (#714)
* Fix TVM version in emulator * Add prev_blocks_info to emulator-emscripten.cpp --------- Co-authored-by: SpyCheese <mikle98@yandex.ru>
This commit is contained in:
parent
6b941dcceb
commit
961d870ece
3 changed files with 29 additions and 8 deletions
|
@ -177,7 +177,9 @@ td::Ref<vm::Tuple> prepare_vm_c7(SmartContract::Args args, td::Ref<vm::Cell> cod
|
||||||
}
|
}
|
||||||
|
|
||||||
SmartContract::Answer run_smartcont(SmartContract::State state, td::Ref<vm::Stack> stack, td::Ref<vm::Tuple> c7,
|
SmartContract::Answer run_smartcont(SmartContract::State state, td::Ref<vm::Stack> stack, td::Ref<vm::Tuple> c7,
|
||||||
vm::GasLimits gas, bool ignore_chksig, td::Ref<vm::Cell> libraries, int vm_log_verbosity, bool debug_enabled) {
|
vm::GasLimits gas, bool ignore_chksig, td::Ref<vm::Cell> libraries,
|
||||||
|
int vm_log_verbosity, bool debug_enabled,
|
||||||
|
std::shared_ptr<const block::Config> config) {
|
||||||
auto gas_credit = gas.gas_credit;
|
auto gas_credit = gas.gas_credit;
|
||||||
vm::init_op_cp0(debug_enabled);
|
vm::init_op_cp0(debug_enabled);
|
||||||
vm::DictionaryBase::get_empty_dictionary();
|
vm::DictionaryBase::get_empty_dictionary();
|
||||||
|
@ -216,6 +218,13 @@ SmartContract::Answer run_smartcont(SmartContract::State state, td::Ref<vm::Stac
|
||||||
if (!libraries.is_null()) {
|
if (!libraries.is_null()) {
|
||||||
vm.register_library_collection(libraries);
|
vm.register_library_collection(libraries);
|
||||||
}
|
}
|
||||||
|
if (config) {
|
||||||
|
vm.set_global_version(config->get_global_version());
|
||||||
|
auto r_limits = config->get_size_limits_config();
|
||||||
|
if (r_limits.is_ok()) {
|
||||||
|
vm.set_max_data_depth(r_limits.ok().max_vm_data_depth);
|
||||||
|
}
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
res.code = ~vm.run();
|
res.code = ~vm.run();
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
@ -304,7 +313,8 @@ SmartContract::Answer SmartContract::run_method(Args args) {
|
||||||
args.stack.value().write().push_smallint(args.method_id.unwrap());
|
args.stack.value().write().push_smallint(args.method_id.unwrap());
|
||||||
auto res =
|
auto res =
|
||||||
run_smartcont(get_state(), args.stack.unwrap(), args.c7.unwrap(), args.limits.unwrap(), args.ignore_chksig,
|
run_smartcont(get_state(), args.stack.unwrap(), args.c7.unwrap(), args.limits.unwrap(), args.ignore_chksig,
|
||||||
args.libraries ? args.libraries.unwrap().get_root_cell() : td::Ref<vm::Cell>{}, args.vm_log_verbosity_level, args.debug_enabled);
|
args.libraries ? args.libraries.unwrap().get_root_cell() : td::Ref<vm::Cell>{},
|
||||||
|
args.vm_log_verbosity_level, args.debug_enabled, args.config ? args.config.value() : nullptr);
|
||||||
state_ = res.new_state;
|
state_ = res.new_state;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -322,7 +332,8 @@ SmartContract::Answer SmartContract::run_get_method(Args args) const {
|
||||||
CHECK(args.method_id);
|
CHECK(args.method_id);
|
||||||
args.stack.value().write().push_smallint(args.method_id.unwrap());
|
args.stack.value().write().push_smallint(args.method_id.unwrap());
|
||||||
return run_smartcont(get_state(), args.stack.unwrap(), args.c7.unwrap(), args.limits.unwrap(), args.ignore_chksig,
|
return run_smartcont(get_state(), args.stack.unwrap(), args.c7.unwrap(), args.limits.unwrap(), args.ignore_chksig,
|
||||||
args.libraries ? args.libraries.unwrap().get_root_cell() : td::Ref<vm::Cell>{}, args.vm_log_verbosity_level, args.debug_enabled);
|
args.libraries ? args.libraries.unwrap().get_root_cell() : td::Ref<vm::Cell>{},
|
||||||
|
args.vm_log_verbosity_level, args.debug_enabled, args.config ? args.config.value() : nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
SmartContract::Answer SmartContract::run_get_method(td::Slice method, Args args) const {
|
SmartContract::Answer SmartContract::run_get_method(td::Slice method, Args args) const {
|
||||||
|
|
|
@ -61,6 +61,7 @@ struct GetMethodParams {
|
||||||
std::string data;
|
std::string data;
|
||||||
int verbosity;
|
int verbosity;
|
||||||
td::optional<std::string> libs;
|
td::optional<std::string> libs;
|
||||||
|
td::optional<std::string> prev_blocks_info;
|
||||||
std::string address;
|
std::string address;
|
||||||
uint32_t unixtime;
|
uint32_t unixtime;
|
||||||
uint64_t balance;
|
uint64_t balance;
|
||||||
|
@ -91,6 +92,11 @@ td::Result<GetMethodParams> decode_get_method_params(const char* json) {
|
||||||
params.libs = libs;
|
params.libs = libs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TRY_RESULT(prev_blocks_info, td::get_json_object_string_field(obj, "prev_blocks_info", true));
|
||||||
|
if (prev_blocks_info.size() > 0) {
|
||||||
|
params.prev_blocks_info = prev_blocks_info;
|
||||||
|
}
|
||||||
|
|
||||||
TRY_RESULT(address, td::get_json_object_string_field(obj, "address", false));
|
TRY_RESULT(address, td::get_json_object_string_field(obj, "address", false));
|
||||||
params.address = address;
|
params.address = address;
|
||||||
|
|
||||||
|
@ -187,12 +193,14 @@ const char *run_get_method(const char *params, const char* stack, const char* co
|
||||||
auto tvm = tvm_emulator_create(decoded_params.code.c_str(), decoded_params.data.c_str(), decoded_params.verbosity);
|
auto tvm = tvm_emulator_create(decoded_params.code.c_str(), decoded_params.data.c_str(), decoded_params.verbosity);
|
||||||
|
|
||||||
if ((decoded_params.libs && !tvm_emulator_set_libraries(tvm, decoded_params.libs.value().c_str())) ||
|
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,
|
!tvm_emulator_set_c7(tvm, decoded_params.address.c_str(), decoded_params.unixtime, decoded_params.balance,
|
||||||
decoded_params.balance, decoded_params.rand_seed_hex.c_str(), config) ||
|
decoded_params.rand_seed_hex.c_str(), config) ||
|
||||||
|
(decoded_params.prev_blocks_info &&
|
||||||
|
!tvm_emulator_set_prev_blocks_info(tvm, decoded_params.prev_blocks_info.value().c_str())) ||
|
||||||
(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_set_debug_enabled(tvm, decoded_params.debug_enabled)) {
|
||||||
tvm_emulator_destroy(tvm);
|
tvm_emulator_destroy(tvm);
|
||||||
return strdup(R"({"fail":true,"message":"Can't set params"})");
|
return strdup(R"({"fail":true,"message":"Can't set params"})");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto res = tvm_emulator_run_get_method(tvm, decoded_params.method_id, stack);
|
auto res = tvm_emulator_run_get_method(tvm, decoded_params.method_id, stack);
|
||||||
|
|
|
@ -422,7 +422,9 @@ bool tvm_emulator_set_c7(void *tvm_emulator, const char *address, uint32_t unixt
|
||||||
LOG(ERROR) << "Can't deserialize config params boc: " << config_params_cell.move_as_error();
|
LOG(ERROR) << "Can't deserialize config params boc: " << config_params_cell.move_as_error();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
global_config = std::make_shared<block::Config>(config_params_cell.move_as_ok(), td::Bits256::zero(), block::Config::needWorkchainInfo | block::Config::needSpecialSmc);
|
global_config = std::make_shared<block::Config>(
|
||||||
|
config_params_cell.move_as_ok(), td::Bits256::zero(),
|
||||||
|
block::Config::needWorkchainInfo | block::Config::needSpecialSmc | block::Config::needCapabilities);
|
||||||
auto unpack_res = global_config->unpack();
|
auto unpack_res = global_config->unpack();
|
||||||
if (unpack_res.is_error()) {
|
if (unpack_res.is_error()) {
|
||||||
LOG(ERROR) << "Can't unpack config params";
|
LOG(ERROR) << "Can't unpack config params";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue