Skip to main content

Liteserver Node

info

Read about Full Node before this article

When an endpoint is activated in a full node, the node assumes the role of a Liteserver. This node type can field and respond to requests from Lite Clients, allowing for seamless interaction with the TON Blockchain.

Hardware requirements

Compared to a validator, a liteserver mode requires less resources. However, it is still recommended to use a powerful machine to run a liteserver.

  • at least 16 cores CPU
  • at least 128 GB RAM
  • at least 1TB GB NVMe SSD OR Provisioned 64+k IOPS storage
  • 1 Gbit/s network connectivity
  • 16 TB/month traffic on peak load
  • public IP address (fixed IP address)

Feel free to use cloud providers listed in the Recommended Providers section.

Hetzner and OVH are forbidden to run a validator, but you can use them to run a liteserver:

  • Hetzner: EX101, AX102
  • OVH: RISE-4

Installation of liteserver

If you don't have mytonctrl, install it with -m liteserver flag:

wget https://raw.githubusercontent.com/ton-blockchain/mytonctrl/master/scripts/install.sh
sudo bash ./install.sh -m liteserver
  • -d - mytonctrl will download a dump of the latest blockchain state. This will reduce synchronization time by several times.
  • -c <path> - If you want to use not public liteservers for synchronization. (not required)
  • -i - Ignore minimum requirements, use it only if you want to check compilation process without real node usage.
  • -m - Mode, can be validator or liteserver.

To use testnet, -c flag should be provided with https://ton.org/testnet-global.config.json value.

Default -c flag value is https://ton-blockchain.github.io/global.config.json, which is default mainnet config.

If you already have mytonctrl installed, run:

user@system:~# mytonctrl
MyTonCtrl> enable_mode liteserver

Check the firewall settings

First, verify the Liteserver port specified in your /var/ton-work/db/config.json file. This port changes with each new installation of MyTonCtrl. It is located in the port field:

{
...
"liteservers": [
{
"ip": 1605600994,
"port": LITESERVER_PORT
...
}
]
}

If you are using a cloud provider, you need to open this port in the firewall settings. For example, if you are using AWS, you need to open the port in the security group.

Below is an example of opening a port in the bare metal server firewall.

Opening a port in the firewall

We will use the ufw utility (cheatsheet). You can use the one you prefer.

  1. Install ufw if it is not installed:
sudo apt update
sudo apt install ufw
  1. Allow ssh connections:
sudo ufw allow ssh
  1. Allow the port specified in the config.json file:
sudo ufw allow <port>
  1. Enable the firewall:
sudo ufw enable
  1. Check the firewall status:
sudo ufw status

This way, you can open the port in the firewall settings of your server.

Interaction with Liteserver (lite-client)

  1. Create an empty project on your machine and paste config.json in the project directory. This config can be obtained by following command:
installer clcf # in mytonctrl

It will create /usr/bin/ton/local.config.json on your machine where mytonctrl is installed. Check mytonctrl documentation for more.

  1. Install libraries.
npm i --save ton-core ton-lite-
  1. Initialize a and request masterchain info to ensure the liteserver is running.

Change project type to module in your package.json file:

{
"type": "module"
}

Create index.js file with the following content:

import { LiteSingleEngine } from 'ton-lite-/dist/engines/single.js'
import { LiteRoundRobinEngine } from 'ton-lite-/dist/engines/roundRobin.js'
import { Lite } from 'ton-lite-/dist/.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 = new Lite({ engine });
const master = await .getMasterchainInfo()
console.log('master', master)

}

main()

  1. Now you can interact with your own liteserver.

See also