mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
updated vm
- updated func/fift - additional checks in block validator - docs - tunnel prototype in ADNL
This commit is contained in:
parent
ba76f1404e
commit
54c7a4dcc3
50 changed files with 972 additions and 300 deletions
|
@ -20,6 +20,7 @@
|
|||
#include "block/block.h"
|
||||
#include "block/block-auto.h"
|
||||
#include "block/block-parse.h"
|
||||
#include "block/mc-config.h"
|
||||
#include "ton/ton-shard.h"
|
||||
#include "common/bigexp.h"
|
||||
#include "common/util.h"
|
||||
|
@ -1602,33 +1603,46 @@ bool check_one_config_param(Ref<vm::CellSlice> cs_ref, td::ConstBitPtr key, td::
|
|||
|
||||
const int mandatory_config_params[] = {18, 20, 21, 22, 23, 24, 25, 28, 34};
|
||||
|
||||
bool valid_config_data(Ref<vm::Cell> cell, const td::BitArray<256>& addr, bool catch_errors, bool relax_par0) {
|
||||
bool valid_config_data(Ref<vm::Cell> cell, const td::BitArray<256>& addr, bool catch_errors, bool relax_par0,
|
||||
Ref<vm::Cell> old_mparams) {
|
||||
using namespace std::placeholders;
|
||||
if (cell.is_null()) {
|
||||
return false;
|
||||
}
|
||||
if (!catch_errors) {
|
||||
vm::Dictionary dict{std::move(cell), 32};
|
||||
for (int x : mandatory_config_params) {
|
||||
if (!dict.int_key_exists(x)) {
|
||||
LOG(ERROR) << "mandatory configuration parameter #" << x << " is missing";
|
||||
return false;
|
||||
}
|
||||
if (catch_errors) {
|
||||
try {
|
||||
return valid_config_data(std::move(cell), addr, false, relax_par0, std::move(old_mparams));
|
||||
} catch (vm::VmError&) {
|
||||
return false;
|
||||
}
|
||||
return dict.check_for_each(std::bind(check_one_config_param, _1, _2, addr.cbits(), relax_par0));
|
||||
}
|
||||
try {
|
||||
vm::Dictionary dict{std::move(cell), 32};
|
||||
for (int x : mandatory_config_params) {
|
||||
if (!dict.int_key_exists(x)) {
|
||||
LOG(ERROR) << "mandatory configuration parameter #" << x << " is missing";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return dict.check_for_each(std::bind(check_one_config_param, _1, _2, addr.cbits(), relax_par0));
|
||||
} catch (vm::VmError&) {
|
||||
vm::Dictionary dict{std::move(cell), 32};
|
||||
if (!dict.check_for_each(std::bind(check_one_config_param, _1, _2, addr.cbits(), relax_par0))) {
|
||||
return false;
|
||||
}
|
||||
for (int x : mandatory_config_params) {
|
||||
if (!dict.int_key_exists(x)) {
|
||||
LOG(ERROR) << "mandatory configuration parameter #" << x << " is missing";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return config_params_present(dict, dict.lookup_ref(td::BitArray<32>{9})) &&
|
||||
config_params_present(dict, std::move(old_mparams));
|
||||
}
|
||||
|
||||
bool config_params_present(vm::Dictionary& dict, Ref<vm::Cell> param_dict_root) {
|
||||
auto res = block::Config::unpack_param_dict(std::move(param_dict_root));
|
||||
if (res.is_error()) {
|
||||
return false;
|
||||
}
|
||||
for (int x : res.move_as_ok()) {
|
||||
if (!dict.int_key_exists(x)) {
|
||||
LOG(ERROR) << "configuration parameter #" << x
|
||||
<< " (declared as mandatory in configuration parameter #9) is missing";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool add_extra_currency(Ref<vm::Cell> extra1, Ref<vm::Cell> extra2, Ref<vm::Cell>& res) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue