Это руководство содержит инструкции о том, как собрать и настроить узел валидатора в блокчейне TON. Приведенные ниже инструкции и сценарии были проверены в Ubuntu 18.04.
Конфигурация | CPU (ядра) | RAM (GiB) | Диск (GiB) | Сеть (Гбит/с) |
---|---|---|---|---|
Минимальная | 8 | 16 | 1000 | 1 |
Рекомендуемая | 16 | 32 | 1000 | 1 |
Внесите изменения (если требуется) в net.ton.dev/scripts/env.sh
$ cd net.ton.dev/scripts/
$ . ./env.sh
Соберите ноду:
$ ./build.sh
Запустите инициализацию ноды:
$ ./setup.sh
Обратите внимание: Все обращения к утилите TONOS-CLI должны выполняться из папки scripts
.
Multisig-кошелек (или просто кошелек) используется валидатором для отправки специальных голосующих запросов смарт-контракту Elector'а («Выборщика»).
Пусть N
будет общим кол-вом кошельков кастодианов и K
— количеством минимальных подтверждений, необходимых
для выполнения транзакции кошелька.
- Прочтите TONOS-CLI документацию
(раздел Deploying Multisignature Wallet to TON blockchain) и сгенерируйте мнемонические (seed) фразы и публичные ключи
для
N - 1
кастодианов. - Сгенерируйте адрес кошелька и ключ для
N-го
кастодиана:
$ ./msig_genaddr.sh
Этот скрипт создает 2 файла: $(hostname -s).addr
и msig.keys.json
в директории ~/ton-keys/
.
Когда будете осуществлять деплой кошелька, вам потребуется публичный ключ из файла msig.keys.json
в качестве публичного ключа N-го
кастодиана.
Выполняйте этот шаг, когда сеть запущена. Запустите ноду:
$ ./run.sh
Дождитесь, пока нода произведет синхронизацию с мастерчейном. В зависимости от пропускной способности сети, этот шаг может занять значительное время (до нескольких часов).
Вы можете использовать следующий скрипт для проверки состояния синхронизации ноды:
$ ./check_node_sync_status.sh
Пример вывода скрипта:
connecting to [127.0.0.1:3030]
local key: FB0A67F8992DB0EF51860D45E89951275A4D6EB6A381BBF99023292982F97247
remote key: 2AD4363BE4BCCEFEF667CB919B199C4710278B8E2B0D972E18D1E5A17B62A99D
conn ready
unixtime 1588443685
masterchainblock (-1,8000000000000000,989):85316E413BD4FFBE76AF7BCDC2A75C27B2BA3AE45381D0CE7B5684949447DF07:6D975F062203F2A2F913FC528387036F47B27AB156B76E4127C186E32A6ED9C3
masterchainblocktime 1588443683
gcmasterchainblock (-1,8000000000000000,0):3D009F42614CBA3537A41596BFD6E598756C83332668990C914D67A3B137D37D:40D1F2B2588A6A00D8AB05C8C1E944E42B172B5C111867B70DBC41009EE10C55
keymasterchainblock (-1,8000000000000000,669):712CBAF305CB9AF1CD3745FDDB8E184796D8A21E7C559A42EB6B68D8B2F2FF89:3B03B9075B20BD1E6111492C41756F337FF649C6C89B9F87D446FAC47DCFD2BB
knownkeymasterchainblock (-1,8000000000000000,669):712CBAF305CB9AF1CD3745FDDB8E184796D8A21E7C559A42EB6B68D8B2F2FF89:3B03B9075B20BD1E6111492C41756F337FF649C6C89B9F87D446FAC47DCFD2BB
rotatemasterchainblock (-1,8000000000000000,918):4DD1DF6361F4B406DCC948B99E0D1ADD6988AC8F824F2E1B263CFED2AD46742E:12A8599C16C5EF1B09713F7EC91E2F765E97545F046FE6871DCD0C82E0377036
stateserializermasterchainseqno 984
shardclientmasterchainseqno 988
INFO: TIME_DIFF = -2
Если параметр TIME_DIFF
равен нескольким секундам, процесс синхронинзации завершен.
Обратите внимание: Все обращения к утилите TONOS-CLI должны выполняться из папки scripts
.
Соберите со всех кастодианов их публичные ключи и осуществите деплой,
используя TONOS-CLI
(раздел Deploying Multisignature Wallet to TON blockchain).
Используйте значение K
как reqConfirms
параметр деплоя.
Убедитесь, что кошелек был развернут по адресу, сохраненному в файле $(hostname -s).addr
.
Укажите величину <STAKE>
(ставку) в токенах. Эта количество токенов будет отправляться с помощью кошелька в смарт-контракт
Выборщика (Elector) в каждом цикле проверки.
Запустите скрипт валидатора (периодически, т.е. каждые 10 минут):
$ ./validator_msig.sh <STAKE> | tee -a ./validator.log 2>&1
Скрипт запускается каждую минуту.
- Выполняет первоначальная проверку для мастерчейна.
- Проверяет время запуска.
- Получает адрес контракта Выборщика и считывает
election_id
из контракта Выборщика. - Если
election_id
== 0 (что означает, что в данный момент не идут выборы валидаторов):- Скрипт запрашивает размер стейка валидатора, который может быть возвращен Выборщиком (с помощью запуска get-метода
Выборщика
compute_returned_stake
). Возвращаемое значение не будет нулевым, если валидатор выиграл предыдущие выборы и был валидатором; - Если значение != 0, скрипт отправляет новую транзакцию из кошелька контракту Выборщика с 1 токеном и
recover-stake
payload'ом; - Если запрос к кошельку успешный, скрипт извлекает
transactionId
и печатает его в терминал, а затем выходит. Остальные кастодианы должны подтвердить эту транзакцию, используя данный идентификатор.
- Скрипт запрашивает размер стейка валидатора, который может быть возвращен Выборщиком (с помощью запуска get-метода
Выборщика
- Если
election_id
!= 0 (это означает, что пришло время участвовать в выборах):- Проверяет, если файл
stop-election
существует, выходит; - Проверяет, если файл
active-election-id
существует, читает из него значениеactive_election_id
и сравнивает его сelection_id
. Если они равны, выходит (это означает, что валидатор уже отправил свою ставку к Выборщику в рамках текущих выборов); - Вызывает
validator-engine-console
для генерации нового ключа валидатора и adnl-адреса; - Читает конфигурационный параметр
config param 15
, чтобы получить тайм-ауты выборов; - Запускает fift-скрипт
validator-elect-req.fif
для генерации неподписанного запроса на выборы валидатора; - Вызывает
validator-engine-console
для подписи запроса на выборы с заново сгенерированной парой ключей валидатора; - Отправляет новую транзакцию из кошелька к контракту Выборщика со
$stake
количеством токенов иprocess_new_stake
payload'ом; - Если запрос к кошельку успешный, скрипт извлекает
transactionId
и выводит его в терминал; - Кастодианы должны подтвердить транзакцию, используя этот идентификатор. Когда кошелек накапливает необходимое количество подтверждений, он отправляет запрос на выборы валидатора Выборщику.
- Проверяет, если файл