Skip to content

TEP: 2 - TON 地址

  • TEP: 2
  • 标题: TON 地址
  • 状态: 活跃
  • 类型: 核心
  • 作者: -
  • 创建日期: 07.09.2019
  • 替代: -
  • 被替代: -

摘要

本文档描述了 TON 地址及其表示形式。

规范

智能合约地址

TON 网络中的智能合约地址由两部分组成:

(a) 工作链 ID(一个有符号的 32 位整数)

(b) 工作链内部的地址(64-512 位,取决于工作链)。

目前,TON 区块链网络中只有主链(workchain_id=-1)和基本工作链(workchain_id=0)在运行。它们都有 256 位地址,因此在出现新的不同工作链之前,我们假设 workchain_id 为 0 或 -1,工作链内的地址正好是 256 位。

在上述条件下,智能合约地址可以表示为以下形式:

A) "原始"形式: <十进制的工作链 ID>:<64 个十六进制数字的地址>

B) "用户友好"形式,通过以下步骤生成:

  • 一个标签字节(0x11 表示“可反弹”地址,0x51 表示“不可反弹”;如果地址不应被主网软件接受,则加上 +0x80)
  • 一个包含有符号 8 位整数的字节,表示工作链 ID(0x00 表示基本工作链,0xff 表示主链)
  • 32 个字节包含工作链内的 256 位智能合约地址(大端序)
  • 2 个字节包含前 34 个字节的 CRC16-CCITT 校验和

在 B) 情况下,生成的 36 个字节然后使用 base64(即使用数字、大写和小写拉丁字母、'/' 和 '+')或 base64url(使用 '_' 和 '-' 代替 '/' 和 '+')编码,生成 48 个可打印的非空格字符。

例子:

“根 DNS”(驻留在主链中的一个特殊智能合约)地址为

-1:e56754f83426f69b09267bd876ac97c44821345b7e266bd956a7bfbfb98df35c

在“原始”形式中(注意可以使用大写拉丁字母 'A'..'F' 代替 'a'..'f')

以及

Ef_lZ1T4NCb2mwkme9h2rJfESCE0W34ma9lWp7-_uY3zXDvq(可反弹)

Uf_lZ1T4NCb2mwkme9h2rJfESCE0W34ma9lWp7-_uY3zXGYv(不可反弹)

在“用户友好”形式中(供用户友好客户端显示)。

注意,base64 和 base64url 形式都是有效的,必须被接受。

钱包应用

目前,TON 钱包处理地址的方式如下:

接收时:

  • 钱包显示用户地址为用户友好的可反弹或不可反弹形式(目前,大多数钱包应用显示可反弹形式)。

发送时:

  1. 钱包应用检查目标地址表示的有效性 - 其长度、有效字符、前缀和校验和。如果地址无效,则显示警报并且不执行发送操作。

  2. 如果地址有测试网标志,而钱包应用在主网网络中工作,则显示警报并且不执行发送操作。

  3. 钱包应用从地址中获取可反弹标志。

  4. 钱包应用检查目标地址 - 如果它有 unitialized 状态,钱包强制将发送消息的 bounce 字段设置为 false,忽略地址表示中的可反弹/不可反弹标志。

  5. 如果目标地址不是 unitialized,则钱包应用使用地址表示中的可反弹/不可反弹标志作为发送消息的 bounce 字段。

公钥

无处不在的 256 位 Ed25519 公钥可以表示为以下形式:

A) "原始"形式: <64 个十六进制数字的地址>

B) "用户友好"或 "装甲" 形式,通过以下步骤生成:

  • 一个标签字节 0x3E,表示这是一个公钥
  • 一个标签字节 0xE6,表示这是一个 Ed25519 公钥
  • 32 个字节包含 Ed25519 公钥的标准二进制表示
  • 2 个字节包含前 34 个字节的 CRC16-CCITT 校验和的大端表示。

生成的 36 字节序列按照标准方式转换为 48 字符的 base64 或 base64url 字符串。

例如,Ed25519 公钥 E39ECDA0A7B0C60A7107EC43967829DBE8BC356A49B9DFC6186B3EAC74B5477D(通常表示为 32 字节序列 0xE3, 0x9E, ..., 0x7D)的“装甲”表示为:

Pubjns2gp7DGCnEH7EOWeCnb6Lw1akm538YYaz6sdLVHfRB2

ADNL 地址

基于 256 位抽象地址的 ADNL 协议。

ADNL 地址可以表示为以下形式:

A) "原始"形式: <64 个十六进制数字的地址>

B) "用户友好"或 "装甲" 形式,通过以下步骤生成:

  • 一个标签字节 0x2d,表示这是一个 ADNL 地址
  • 32 个字节包含 256 位 ADNL 地址(大端序)
  • 2 个字节包含前 34 个字节的 CRC16-CCITT 校验和的大端表示。

生成的 35 字节序列按照标准方式转换为 55 字符的 base32 字符串。

例子:

例如,ADNL 地址 45061C1D4EC44A937D0318589E13C73D151D1CEF5D3C0E53AFBCF56A6C2FE2BD 的“装甲”表示为:

vcqmha5j3ceve35ammfrhqty46rkhi455otydstv66pk2tmf7rl25f3

缺点

  • 无法从地址中提取公钥,这对于某些任务(例如,向该地址发送加密消息)是必需的。因此,在为该地址部署智能合约之前,无法在链上获取公钥。

  • (UI)大多数操作系统不允许你通过双击选择地址,因为 base64 符号中的 '_', '-', '/', '+'。

理由和替代方案

  • 前缀(第一个字节)使你能够准确理解该地址或密钥的类型。

  • 地址中内置的校验和可以防止用户因输入错误而导致资金丢失。

  • 内置的测试网标志可以防止用户错误地尝试将真实币发送到测试网地址时导致资金丢失。

  • 与大多数其他区块链不同的地址形式使用户更容易识别 TON 地址。