运行全节点
要安装和管理您自己的节点,请使用TON基金会开发的MyTonCtrl开源工具。大多数TON节点都通过MyTonCtrl进行了可靠和测试。
MyTonCtrl是一个控制台应用程序,它是fift、lite-client和validator-engine-console的方便包装器。它专门开发用于简化在Linux操作系统上的钱包、域和验证者管理任务。
我们正在积极寻求关于安装过程的反馈。如果您有任何问题或建议,请联系我们。
必要条件
我们强烈建议使用支持的操作系统安装MyTonCtrl:
- Ubuntu 20.04
- Ubuntu 22.04
- Debian 11
请使用具有sudo权限的非root用户来安装和运行MyTonCtrl。
硬件要求
这些要求适用于带验证者的全节点。如果您想运行没有验证者的全节点(例如liteserver),您可以使用较低配置的机器。
- 16核CPU
- 64 GB RAM
- 1TB NVME SSD 或者 预置64+k IOPS存储
- 1 Gbit/s 网络连接
- 固定公网IP地址
- 高峰期每月16TB流量
您需要一台具有固定IP地址和高带宽网络连接的机器来运行TON区块链全节点。
通常,您需要在数据中心使用至少1 Gbit/s的连接的功能强大的服务器,以可靠地适应高峰负载(预计平均负载约为100 Mbit/s)。
推荐供应商
TON基金会推荐以下供应商运行验证者:
AWS
- 实例类型: m5.4xlarge
- CPU: 16 vCPUs
- RAM: 64 GB
- 存储: 1 TB NVMe SSD
- 网络: 高达10 Gbps
- 公网IP: 关联一个弹性IP以获得固定IP地址。
- 流量: 每月16 TB
GCP (谷歌云平台)
- 机器类型: n2-standard-16
- CPU: 16 vCPUs
- RAM: 64 GB
- 存储: 1 TB NVMe SSD持久性磁盘
- 网络: 16 Gbps
- 公网IP: 预留一个静态外部IP地址。
- 流量: 每月16 TB
阿里巴巴云
- 实例类型: ecs.g6.4xlarge
- CPU: 16 vCPUs
- RAM: 64 GB
- 存储: 1 TB NVMe SSD磁盘
- 网络: 高达10 Gbps
- 公网IP: 绑定一个弹性IP以获得固定IP地址。
- 流量: 每月16 TB
腾讯云
- 实例类型: M5.4XLARGE
- CPU: 16 vCPUs
- RAM: 64 GB
- 存储: 1 TB NVMe SSD云磁盘
- 网络: 高达10 Gbps
- 公网IP: 关联一个弹性IP以获得固定IP地址。
- 流量: 每月16 TB
Vultr
- 实例类型: - 裸金属 Intel E-2388G
- CPU: `8 - 核心 / 16 线程` 
- RAM: - 128 GB
- 存储: - 1.92TB NVMe SSD
- 网络: - 10 Gbps
- 公网IP: - 实例包含固定IP地址。
- 流量: - 每月16 TB
DigitalOcean
- 实例类型: 通用型高级 Intel
- CPU: 16 vCPUs
- RAM: 64 GB
- 存储: 1TB NVMe SSD
- 网络: 10 Gbps
- 公网IP: 实例包含固定IP地址。
- 流量: 每月16 TB
Latitude
- 实例类型: c3.medium.x86
- CPU: 16 核心 / 32 线程
- RAM: 128 GB
- 存储: 1.9TB NVMe SSD
- 网络: 10 Gbps
- 公网IP: 实例包含固定IP地址。
- 流量: 每月16 TB
注意: 价格、配置和可用性可能会有所变化。在做出任何决定之前,建议始终检查相应云提供商的官方文档和定价页面。
如何运行节点?(视频)
请查看此视频逐步教程,以快速开始:
逐步指导
必要条件
- 以具有sudo权限的非root用户身份登录您的服务器。 
- 如果您没有非root用户,请以root身份登录并创建一个: 
sudo adduser <username>
- 将您的用户添加到sudo组:
sudo usermod -aG sudo <username>
- 切换到您的非root用户:
su - <username>
安装MyTonCtrl
从具有sudo权限的非root用户帐户下载并运行安装脚本。选择您的Linux发行版:
- Ubuntu
- Debian
wget https://raw.githubusercontent.com/ton-blockchain/mytonctrl/master/scripts/install.sh
sudo bash install.sh -m full -d
wget https://raw.githubusercontent.com/ton-blockchain/mytonctrl/master/scripts/install.sh
su root -c 'bash install.sh -m full -d'
- -m full- 全节点安装模式。
- -d- mytonctrl 将下载最新区块链状态的转储。 这将减少同步时间数倍。
- -c <path>- 如果您想使用非公共liteservers进行同步。(不是必需的)
运行mytonctrl
- 从第1步中用于安装的本地用户账户运行MyTonCtrl控制台: - sudo mytonctrl
- 使用 - status命令检查MyTonCtrl状态:- status
以下状态应该显示:
- mytoncore状态:应为绿色。
- 本地验证者状态:也应为绿色。
- 本地验证者未同步:最初显示一个大数字。一旦新创建的验证者与其他验证者连接,数字将在250k左右。随着同步的进行,这个数字会减少。当它降至20以下时,验证者已同步。
status命令输出的示例:

等到Local validator out of sync变为少于20秒。
成为验证者
查看钱包列表
使用wl命令在MyTonCtrl控制台中查看可用钱包的列表:
wl
在安装mytonctrl期间,将创建validator_wallet_001钱包:

激活钱包
- 向钱包发送必要数量的coins并激活它。
最近(在2023年底),大致数字为最低质押代币约340K TON,最高约1M TON。
查看tonscan.com以了解所需coins数量。
阅读更多关于如何计算最大和最小质押代币。
- 使用vas命令显示转账历史:
vas
- 使用aw命令激活钱包
aw [wallet name]

您的验证者现已准备就绪
mytoncore 将自动加入选举。它将钱包余额分为两部分,并使用它们作为质押代币参加选举。您也可以手动设置质押代币大小:
set stake 50000
set stake 50000 — 这将质押代币大小设置为50k coins。如果质押代币被接受并且我们的节点成为验证者,那么质押代币只能在第二次选举中提取(根据选民的规则)。

启用Liteserver模式
在全节点中激活端点时,节点将承担Liteserver的角色。这种节点类型可以处理并响应来自轻客户端的请求,允许与TON区块链无缝互动。
硬件要求
与验证者相比,liteserver模式需要较少的资源。然而,仍建议使用功能强大的机器运行liteserver。
- 至少16核CPU
- 至少64 GB RAM
- 至少1TB GB NVMe SSD 或者 预置32+k IOPS存储
- 1 Gbit/s网络连接
- 高峰期每月16 TB流量
- 固定公网IP地址
推荐供应商
请随意使用推荐供应商部分中列出的云提供商。
Hetzner和OVH被禁止运行验证者,但您可以使用它们运行liteserver:
- Hetzner:EX101, AX102
- OVH:RISE-4
安装liteserver
- 完成前面的步骤以安装MyTonCtrl。 
- 创建配置文件 
MyTonCtrl> installer
MyTonInstaller> clcf
本地配置文件已创建:/usr/bin/ton/local.config.json
- 这个文件将帮助您连接到您的liteserver。将位于指定路径的配置文件复制到您的目录以保存它。
cp /usr/bin/ton/local.config.json ~/config.json
- 在您的本地机器上创建一个空的config.json文件。
- 将控制台中的内容复制到您本地机器的config.json文件。
cat ~/config.json
检查防火墙设置
首先,验证您config.json文件中指定的Liteserver端口。这个端口会随着每次新安装MyTonCtrl而改变。它位于port字段:
{
  ...
  "liteservers": [
    {
      "ip": 1605600994,
      "port": LITESERVER_PORT
      ...
    }
  ]
}
如果您使用的是云提供商,您需要在防火墙设置中打开此端口。例如,如果您使用的是AWS,您需要在安全组中打开端口。
以下是在裸机服务器防火墙中打开端口的示例。
在防火墙中打开端口
我们将使用ufw实用程序(速查表)。您可以使用您喜欢的一个。
- 如果未安装ufw,请安装:
sudo apt update
sudo apt install ufw
- 允许ssh连接:
sudo ufw allow ssh
- 允许config.json文件中指定的端口:
sudo ufw allow <port>
- 检查防火墙状态。运行此命令后,您可以通过检查UFW状态来验证规则是否已成功添加:
sudo ufw status
- 启用防火墙:
sudo ufw enable
这样,您就可以在服务器的防火墙设置中打开端口。
与Liteserver互动
- 在您的机器上创建一个空项目,并将 - config.js粘贴到项目目录中。
- 安装库。 
- JavaScript
- Python
- Golang
npm i --save ton-core ton-lite-client
pip install pytonlib
go get github.com/xssnick/tonutils-go
go get github.com/xssnick/tonutils-go/liteclient
go get github.com/xssnick/tonutils-go/ton
- 初始化客户端并请求主链信息以确保liteserver正在运行。
- JavaScript
- Python
- Golang
  将项目类型更改为module在您的package.json文件:
import { LiteSingleEngine } from 'ton-lite-client/dist/engines/single.js'
import { LiteRoundRobinEngine } from 'ton-lite-client/dist/engines/roundRobin.js'
import { LiteClient } from 'ton-lite-client/dist/client.js'
import config from './config.json' assert {type: 'json'};
function intToIP(int ) {
    var part1 = int & 255;
    var part2 = ((int >> 8) & 255);
    var part3 = ((int >> 16) & 255);
    var part4 = ((int >> 24) & 255);
    return part4 + "." + part3 + "." + part2 + "." + part1;
}
let server = config.liteservers[0];
async function main() {
    const engines = [];
    engines.push(new LiteSingleEngine({
        host: `tcp://${intToIP(server.ip)}:${server.port}`,
        publicKey: Buffer.from(server.id.key, 'base64'),
    }));
    const engine = new LiteRoundRobinEngine(engines);
    const client = new LiteClient({ engine });
    const master = await client.getMasterchainInfo()
    console.log('master', master)
}
main()
  import asyncio
  from pytonlib import TonlibClient
  from pathlib import Path
  import json
  async def get_client() -> TonlibClient:
  with open('config.json', 'r') as f:
  config = json.loads(f.read())
  keystore_dir = '/tmp/ton_keystore'
  Path(keystore_dir).mkdir(parents=True, exist_ok=True)
  client = TonlibClient(ls_index=0, config=config, keystore=keystore_dir, tonlib_timeout=10)
  await client.init()
  return client
  async def test_client():
  client = await get_client()
  print(await client.get_masterchain_info())
  await client.close()
  if __name__ == '__main__':
  asyncio.run(test_client())
package main
import (
    "context"
    "encoding/json"
    "io/ioutil"
    "log"
    "github.com/xssnick/tonutils-go/liteclient"
    "github.com/xssnick/tonutils-go/ton"
)
func main() {
    client := liteclient.NewConnectionPool()
    content, err := ioutil.ReadFile("./config.json")
    if err != nil {
        log.Fatal("Error when opening file: ", err)
    }
    config := liteclient.GlobalConfig{}
    err = json.Unmarshal(content, &config)
    if err != nil {
        log.Fatal("Error during Unmarshal(): ", err)
    }
    err = client.AddConnectionsFromConfig(context.Background(), &config)
    if err != nil {
        log.Fatalln("connection err: ", err.Error())
        return
    }
    // initialize ton API lite connection wrapper
    api := ton.NewAPIClient(client)
    master, err := api.GetMasterchainInfo(context.Background())
    if err != nil {
        log.Fatalln("get masterchain info err: ", err.Error())
        return
    }
    log.Println(master)
}
- 现在您可以与您自己的liteserver互动。
参阅
小贴士和技巧
可用命令列表
- 您可以使用help获取可用命令列表:

检查日志
- 要检查mytoncrl日志,请打开本地用户的~/.local/share/mytoncore/mytoncore.log,或者Root的/usr/local/bin/mytoncore/mytoncore.log。

故障排除
本节包含有关运行节点的最常见问题的答案。
Error 651是什么意思?
[Error : 651 : no nodes]表示您的节点无法在TON区块链内找到另一个节点。
有时,这个过程可能需要长达24小时。但是,如果您已经连续几天收到此错误,这意味着您的节点无法通过当前网络连接进行同步。
您需要检查防火墙设置,包括任何NAT设置(如果存在)。
它应该允许在一个特定端口上的传入连接和从任何端口的传出连接。
验证者控制台未设置
如果您遇到 Validator console is not settings 错误,这表示您正在以一个非安装时使用的用户身份运行 MyTonCtrl。
以您安装它的用户(非root sudo用户)运行MyTonCtrl。
sudo mytonctrl
"block is not applied"是什么意思?
问: 有时我们对各种请求得到block is not applied或block is not ready的回应 - 这正常吗?
答: 这是正常的,通常这意味着您试图检索尚未到达您请求的节点的区块。
问: 如果比较频繁出现,是否意味着某处存在问题?
答: 不。您需要检查mytonctrl中的“Local validator out of sync”值。如果它少于60秒,那么一切正常。
但是您需要记住,节点不断同步。有时,您可能会试图接收尚未到达您请求的节点的区块。
您需要稍作延迟重复请求。
使用-d标志的同步问题
如果您在使用-d标志下载MyTonCtrl后遇到out of sync等于时间戳的问题,可能是转储没有正确安装(或已经过时)。
推荐的解决方案是再次使用新转储重新安装MyTonCtrl。
如果同步花费异常长的时间,可能是转储出现了问题。请联系我们寻求帮助。
请以您安装的用户身份运行mytonctrl。
命令<...>在3秒后超时的错误
此错误意味着本地节点尚未同步(out of sync小于20秒)并且正在使用公共节点。 公共节点不总是响应,并最终导致超时错误。
解决问题的办法是等待本地节点同步或多次执行相同命令。
Status命令未显示本地节点部分

如果节点状态中没有本地节点部分,通常意味着安装过程中出了问题,跳过了创建/分配验证者钱包的步骤。 还要检查是否指定了验证者钱包。
直接检查以下内容:
mytonctrl> get validatorWalletName
如果validatorWalletName为空,则执行以下操作:
mytonctrl> set validatorWalletName validator_wallet_001
在新服务器上转移验证者
将所有密钥和配置从旧节点转移到工作节点并启动它。如果新节点出现问题,原来的节点仍然保留着所有已设置的内容。
最好的方法(当暂时不验证的罚款很小时,可以不间断地进行):
- 在新服务器上使用 - mytonctrl进行干净的安装,并等待一切同步。
- 在两台机器上停止 - mytoncore和验证者- 服务,在源和新的上进行备份:
- 2.1 /usr/local/bin/mytoncore/...
- 2.2 /home/${user}/.local/share/mytoncore/...
- 2.3 /var/ton-work/db/config.json
- 2.4 /var/ton-work/db/config.json.backup
- 2.5 /var/ton-work/db/keyring
- 2.6 /var/ton-work/keys
- 从源头转移到新的(替换内容):
- 3.1 /usr/local/bin/mytoncore/...
- 3.2 /home/${user}/.local/share/mytoncore/...
- 3.3 /var/ton-work/db/config.json
- 3.4 /var/ton-work/db/keyring
- 3.5 /var/ton-work/keys
- 在 - /var/ton-work/db/config.json中编辑- addrs[0].ip为当前的IP地址,安装后可在备份- /ton-work/db/config.json.backup中看到
- 检查所有替换文件的权限 
- 在新的服务器上启动 - mytoncore和- validator服务,检查节点是否同步并验证
- 在新的服务器上进行备份: 
cp var/ton-work/db/config.json var/ton-work/db/config.json.backup