mirror of
				https://github.com/ton-blockchain/ton
				synced 2025-03-09 15:40:10 +00:00 
			
		
		
		
	Extended error notes for unacceptable external messages (#383)
* patch sendMessage * Verbose error message for "sendMessage" LS query * More verbose errors in external-message.cpp Co-authored-by: dungeon-master-666 <dungeon666master@protonmail.com> Co-authored-by: SpyCheese <mikle98@yandex.ru>
This commit is contained in:
		
							parent
							
								
									89b8717cf8
								
							
						
					
					
						commit
						ca00f0ed91
					
				
					 6 changed files with 86 additions and 29 deletions
				
			
		| 
						 | 
				
			
			@ -25,6 +25,41 @@
 | 
			
		|||
#include "ton/ton-shard.h"
 | 
			
		||||
#include "vm/vm.h"
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
class StringLoggerTail : public td::LogInterface {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit StringLoggerTail(size_t max_size = 256) : buf(max_size, '\0') {}
 | 
			
		||||
  void append(td::CSlice slice) override {
 | 
			
		||||
    if (slice.size() > buf.size()) {
 | 
			
		||||
      slice.remove_prefix(slice.size() - buf.size());
 | 
			
		||||
    }
 | 
			
		||||
    while (!slice.empty()) {
 | 
			
		||||
      size_t s = std::min(buf.size() - pos, slice.size());
 | 
			
		||||
      std::copy(slice.begin(), slice.begin() + s, buf.begin() + pos);
 | 
			
		||||
      pos += s;
 | 
			
		||||
      if (pos == buf.size()) {
 | 
			
		||||
        pos = 0;
 | 
			
		||||
        truncated = true;
 | 
			
		||||
      }
 | 
			
		||||
      slice.remove_prefix(s);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  std::string get_log() const {
 | 
			
		||||
    if (truncated) {
 | 
			
		||||
      std::string res = buf;
 | 
			
		||||
      std::rotate(res.begin(), res.begin() + pos, res.end());
 | 
			
		||||
      return res;
 | 
			
		||||
    } else {
 | 
			
		||||
      return buf.substr(0, pos);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 private:
 | 
			
		||||
  std::string buf;
 | 
			
		||||
  size_t pos = 0;
 | 
			
		||||
  bool truncated = false;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace block {
 | 
			
		||||
using td::Ref;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1001,7 +1036,14 @@ bool Transaction::prepare_compute_phase(const ComputePhaseConfig& cfg) {
 | 
			
		|||
  vm::GasLimits gas{(long long)cp.gas_limit, (long long)cp.gas_max, (long long)cp.gas_credit};
 | 
			
		||||
  LOG(DEBUG) << "creating VM";
 | 
			
		||||
 | 
			
		||||
  vm::VmState vm{new_code, std::move(stack), gas, 1, new_data, vm::VmLog(), compute_vm_libraries(cfg)};
 | 
			
		||||
  std::unique_ptr<StringLoggerTail> logger;
 | 
			
		||||
  auto vm_log = vm::VmLog();
 | 
			
		||||
  if (cfg.with_vm_log) {
 | 
			
		||||
    logger = std::make_unique<StringLoggerTail>();
 | 
			
		||||
    vm_log.log_interface = logger.get();
 | 
			
		||||
    vm_log.log_options = td::LogOptions(VERBOSITY_NAME(DEBUG), true, false);
 | 
			
		||||
  }
 | 
			
		||||
  vm::VmState vm{new_code, std::move(stack), gas, 1, new_data, vm_log, compute_vm_libraries(cfg)};
 | 
			
		||||
  vm.set_c7(prepare_vm_c7(cfg));  // tuple with SmartContractInfo
 | 
			
		||||
  // vm.incr_stack_trace(1);    // enable stack dump after each step
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1024,6 +1066,9 @@ bool Transaction::prepare_compute_phase(const ComputePhaseConfig& cfg) {
 | 
			
		|||
  LOG(INFO) << "steps: " << vm.get_steps_count() << " gas: used=" << gas.gas_consumed() << ", max=" << gas.gas_max
 | 
			
		||||
            << ", limit=" << gas.gas_limit << ", credit=" << gas.gas_credit;
 | 
			
		||||
  LOG(INFO) << "out_of_gas=" << cp.out_of_gas << ", accepted=" << cp.accepted << ", success=" << cp.success;
 | 
			
		||||
  if (logger != nullptr) {
 | 
			
		||||
    cp.vm_log = logger->get_log();
 | 
			
		||||
  }
 | 
			
		||||
  if (cp.success) {
 | 
			
		||||
    cp.new_data = vm.get_committed_state().c4;  // c4 -> persistent data
 | 
			
		||||
    cp.actions = vm.get_committed_state().c5;   // c5 -> action list
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue