ADNL UDP - 节点间通信
ADNL通过UDP用于节点和TON组件之间的通信。它是一个低层级协议,其他更高级的TON协议(如DHT和RLDP)都是在其基础上运行的。在这篇文章中,我们将了解ADNL通过UDP在节点之间进行基本通信的工作方式。
与ADNL通过TCP不同,在UDP实现中,握手以不同的形式发生,并且使用了通道的额外层,但其他原则相似: 基于我们的私钥和预先从配置或从其他网络节点收到的对方的公钥生成加密密钥。
在ADNL的UDP版本中,连接是在从对方接收初始数据的同时建立的,如果发起方发送了'创建通道'消息,通道的密钥将被计算,并将确认通道的创建。建立通道后,进一步的通信将继续在通道内进 行。
数据包结构和通信
首个数据包
让我们分析与DHT节点建立连接并获取其签名地址列表的初始化,以便了解协议的工作方式。
在全局配置中找到您喜欢的节点,在dht.nodes部分。例如:
{
  "@type": "dht.node",
  "id": {
    "@type": "pub.ed25519",
    "key": "fZnkoIAxrTd4xeBgVpZFRm5SvVvSx7eN3Vbe8c83YMk="
  },
  "addr_list": {
    "@type": "adnl.addressList",
    "addrs": [
      {
        "@type": "adnl.address.udp",
        "ip": 1091897261,
        "port": 15813
      }
    ],
    "version": 0,
    "reinit_date": 0,
    "priority": 0,
    "expire_at": 0
  },
  "version": -1,
  "signature": "cmaMrV/9wuaHOOyXYjoxBnckJktJqrQZ2i+YaY3ehIyiL3LkW81OQ91vm8zzsx1kwwadGZNzgq4hI4PCB/U5Dw=="
}
- 我们取其ED25519密钥fZnkoIAxrTd4xeBgVpZFRm5SvVvSx7eN3Vbe8c83YMk,并从base64解码。
- 取其IP地址1091897261,并使用服务或转换为小端字节,得到65.21.7.173。
- 与端口结合,得到65.21.7.173:15813并建立UDP连接。
我们想要打开一个通道与节点通信并获取一些信息,主要任务是接收其签名地址列表。为此,我们将生成2个消息,第一个是创建通道:
adnl.message.createChannel key:int256 date:int = adnl.Message
这里有两个参数 - key和date。作为date,我们将指定当前的unix时间戳。对于key,我们需要为通道专门生成一个新的ED25519私钥+公钥对,它们将用于初始化公共加密密钥。我们将在消息的key参数中使用生成的公钥,并暂时保存私钥。
序列化填充的TL结构,得到:
bbc373e6                                                         -- TL ID adnl.message.createChannel 
d59d8e3991be20b54dde8b78b3af18b379a62fa30e64af361c75452f6af019d7 -- key
555c8763                                                         -- date