mirror of
				https://github.com/ton-blockchain/ton
				synced 2025-03-09 15:40:10 +00:00 
			
		
		
		
	- updated tonlib - updated validator - updated documentation - first version of http over rldp proxy
		
			
				
	
	
		
			220 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			220 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
    This file is part of TON Blockchain Library.
 | 
						|
 | 
						|
    TON Blockchain Library is free software: you can redistribute it and/or modify
 | 
						|
    it under the terms of the GNU Lesser General Public License as published by
 | 
						|
    the Free Software Foundation, either version 2 of the License, or
 | 
						|
    (at your option) any later version.
 | 
						|
 | 
						|
    TON Blockchain Library is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
    GNU Lesser General Public License for more details.
 | 
						|
 | 
						|
    You should have received a copy of the GNU Lesser General Public License
 | 
						|
    along with TON Blockchain Library.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
 | 
						|
    Copyright 2017-2020 Telegram Systems LLP
 | 
						|
*/
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include "adnl/adnl.h"
 | 
						|
#include "adnl/adnl-message.h"
 | 
						|
 | 
						|
namespace ton {
 | 
						|
 | 
						|
namespace adnl {
 | 
						|
 | 
						|
/*
 | 
						|
  from:flags.0?PublicKey 
 | 
						|
  from_short:flags.1?adnl.id.short
 | 
						|
  message:flags.2?adnl.Message 
 | 
						|
  messages:flags.3?(vector adnl.Message)
 | 
						|
  address:flags.4?adnl.addressList 
 | 
						|
  priority_address:flags.5?adnl.addressList
 | 
						|
  seqno:flags.6?long 
 | 
						|
  confirm_seqno:flags.7?long 
 | 
						|
  recv_addr_list_version:flags.8?int
 | 
						|
  recv_priority_addr_list_version:flags.9?int
 | 
						|
  reinit_date:flags.10?int 
 | 
						|
  dst_reinit_date:flags.10?int
 | 
						|
  signature:flags.11?bytes 
 | 
						|
  */
 | 
						|
 | 
						|
// total packet length:
 | 
						|
//   for full packet:
 | 
						|
//     32 (dst) + 64 (encryption overhead) + 4 (magic) + 36 (pubkey) + 4 + M (sum of messages) +
 | 
						|
//              + A1 + A2 + 8 + 8 + 4 + 4 + 4 + 4 + 68 (signature) + 16 (r1) + 16 (r2) =
 | 
						|
//              = 272 + M + A1 + A2
 | 
						|
//   for channel:
 | 
						|
//     32 (channel id) + 32 (encryption overhead) + 4 (magic) + 4 + M (sum of messages) +
 | 
						|
//              + A1 + A2 + 8 + 8 + 4 + 4 + 16(r1) + 16(r2) = 128 + M + A1 + A2
 | 
						|
 | 
						|
class AdnlPacket {
 | 
						|
 private:
 | 
						|
  enum Flags : td::uint32 {
 | 
						|
    f_from = 0x1,
 | 
						|
    f_from_short = 0x2,
 | 
						|
    f_one_message = 0x4,
 | 
						|
    f_mult_messages = 0x8,
 | 
						|
    f_address = 0x10,
 | 
						|
    f_priority_address = 0x20,
 | 
						|
    f_seqno = 0x40,
 | 
						|
    f_confirm_seqno = 0x80,
 | 
						|
    f_recv_addr_version = 0x100,
 | 
						|
    f_recv_priority_addr_version = 0x200,
 | 
						|
    f_reinit_date = 0x400,
 | 
						|
    f_signature = 0x800,
 | 
						|
    f_priority = 0x1000,
 | 
						|
    f_all = 0x1fff
 | 
						|
  };
 | 
						|
 | 
						|
 public:
 | 
						|
  AdnlPacket() {
 | 
						|
  }
 | 
						|
  static td::Result<AdnlPacket> create(tl_object_ptr<ton_api::adnl_packetContents> packet);
 | 
						|
  tl_object_ptr<ton_api::adnl_packetContents> tl() const;
 | 
						|
  td::BufferSlice to_sign() const;
 | 
						|
 | 
						|
  td::Status run_basic_checks() const;
 | 
						|
 | 
						|
  auto flags() const {
 | 
						|
    return flags_;
 | 
						|
  }
 | 
						|
  bool priority() const {
 | 
						|
    return flags_ & f_priority;
 | 
						|
  }
 | 
						|
  bool inited_from_short() const {
 | 
						|
    return flags_ & (Flags::f_from | Flags::f_from_short);
 | 
						|
  }
 | 
						|
  bool inited_from() const {
 | 
						|
    return flags_ & Flags::f_from;
 | 
						|
  }
 | 
						|
  auto from() const {
 | 
						|
    return from_;
 | 
						|
  }
 | 
						|
  auto from_short() const {
 | 
						|
    return from_short_;
 | 
						|
  }
 | 
						|
  const auto &messages() const {
 | 
						|
    return messages_;
 | 
						|
  }
 | 
						|
  auto &messages() {
 | 
						|
    return messages_;
 | 
						|
  }
 | 
						|
  bool inited_addr_list() const {
 | 
						|
    return flags_ & Flags::f_address;
 | 
						|
  }
 | 
						|
  auto addr_list() const {
 | 
						|
    return addr_;
 | 
						|
  }
 | 
						|
  auto priority_addr_list() const {
 | 
						|
    return priority_addr_;
 | 
						|
  }
 | 
						|
  auto seqno() const {
 | 
						|
    return seqno_;
 | 
						|
  }
 | 
						|
  auto confirm_seqno() const {
 | 
						|
    return confirm_seqno_;
 | 
						|
  }
 | 
						|
  auto recv_addr_list_version() const {
 | 
						|
    return recv_addr_list_version_;
 | 
						|
  }
 | 
						|
  auto recv_priority_addr_list_version() const {
 | 
						|
    return recv_priority_addr_list_version_;
 | 
						|
  }
 | 
						|
  auto reinit_date() const {
 | 
						|
    return reinit_date_;
 | 
						|
  }
 | 
						|
  auto dst_reinit_date() const {
 | 
						|
    return dst_reinit_date_;
 | 
						|
  }
 | 
						|
  auto signature() const {
 | 
						|
    return signature_.clone();
 | 
						|
  }
 | 
						|
  auto remote_addr() const {
 | 
						|
    return remote_addr_;
 | 
						|
  }
 | 
						|
 | 
						|
  void init_random();
 | 
						|
 | 
						|
  void set_signature(td::BufferSlice signature) {
 | 
						|
    signature_ = std::move(signature);
 | 
						|
    flags_ |= Flags::f_signature;
 | 
						|
  }
 | 
						|
  void set_source(AdnlNodeIdFull src) {
 | 
						|
    from_ = src;
 | 
						|
    from_short_ = src.compute_short_id();
 | 
						|
    flags_ = (flags_ | Flags::f_from) & ~Flags::f_from_short;
 | 
						|
  }
 | 
						|
  void set_source(AdnlNodeIdShort src) {
 | 
						|
    if (!(flags_ & Flags::f_from)) {
 | 
						|
      from_short_ = src;
 | 
						|
      flags_ |= Flags::f_from_short;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  void add_message(AdnlMessage message) {
 | 
						|
    messages_.push_back(std::move(message));
 | 
						|
    if (messages_.size() == 1) {
 | 
						|
      flags_ = (flags_ | Flags::f_one_message) & ~Flags::f_mult_messages;
 | 
						|
    } else {
 | 
						|
      flags_ = (flags_ | Flags::f_mult_messages) & ~Flags::f_one_message;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  void set_addr_list(AdnlAddressList addr_list) {
 | 
						|
    addr_ = std::move(addr_list);
 | 
						|
    flags_ |= Flags::f_address;
 | 
						|
  }
 | 
						|
  void set_priority_addr_list(AdnlAddressList addr_list) {
 | 
						|
    priority_addr_ = std::move(addr_list);
 | 
						|
    flags_ |= Flags::f_priority_address;
 | 
						|
  }
 | 
						|
  void set_seqno(td::uint64 seqno) {
 | 
						|
    seqno_ = seqno;
 | 
						|
    flags_ |= Flags::f_seqno;
 | 
						|
  }
 | 
						|
  void set_confirm_seqno(td::uint64 seqno) {
 | 
						|
    confirm_seqno_ = seqno;
 | 
						|
    flags_ |= Flags::f_confirm_seqno;
 | 
						|
  }
 | 
						|
  void set_received_addr_list_version(td::int32 version) {
 | 
						|
    recv_addr_list_version_ = version;
 | 
						|
    flags_ |= Flags::f_recv_addr_version;
 | 
						|
  }
 | 
						|
  void set_received_priority_addr_list_version(td::int32 version) {
 | 
						|
    recv_priority_addr_list_version_ = version;
 | 
						|
    flags_ |= Flags::f_recv_priority_addr_version;
 | 
						|
  }
 | 
						|
  void set_reinit_date(td::int32 date, td::int32 dst_reinit_date) {
 | 
						|
    reinit_date_ = date;
 | 
						|
    dst_reinit_date_ = dst_reinit_date;
 | 
						|
    flags_ |= Flags::f_reinit_date;
 | 
						|
  }
 | 
						|
 | 
						|
  void set_remote_addr(td::IPAddress addr) {
 | 
						|
    remote_addr_ = addr;
 | 
						|
  }
 | 
						|
 | 
						|
 private:
 | 
						|
  td::BufferSlice rand1_;
 | 
						|
  td::uint32 flags_{0};
 | 
						|
  AdnlNodeIdFull from_;
 | 
						|
  AdnlNodeIdShort from_short_;
 | 
						|
  AdnlMessageList messages_;
 | 
						|
  AdnlAddressList addr_;
 | 
						|
  AdnlAddressList priority_addr_;
 | 
						|
  td::uint64 seqno_{0};
 | 
						|
  td::uint64 confirm_seqno_{0};
 | 
						|
  td::int32 recv_addr_list_version_{0};
 | 
						|
  td::int32 recv_priority_addr_list_version_{0};
 | 
						|
  td::int32 reinit_date_{0};
 | 
						|
  td::int32 dst_reinit_date_{0};
 | 
						|
  td::BufferSlice signature_;
 | 
						|
  td::BufferSlice rand2_;
 | 
						|
 | 
						|
  td::IPAddress remote_addr_;
 | 
						|
};
 | 
						|
 | 
						|
}  // namespace adnl
 | 
						|
 | 
						|
}  // namespace ton
 |