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