Установка и настройка полной ноды для TON Валидатора

cryptobro

New member
Сообщения
23
Реакции
7
Инструкция по настройке полной ноды для блокчейна TON в качестве валидатора


Обратите внимание, что валидатор должен быть запущен на выделенном высокопроизводительном сервере с высокой пропускной способностью сети, установленном в надежном центре обработки данных, и что вам потребуется большое количество Gram как ставки для вашего валидатора. Если ваш валидатор работает неправильно или недоступен в течение длительного периода времени, вы можете потерять часть или всю свою ставку, поэтому имеет смысл использовать высокопроизводительные надежные серверы.


0. Скачивание и компиляция

Основные инструкции такие же, как и для полной ноды TON Blockchain. Фактически, любая полная нода автоматически будет работать как валидатор, если обнаружит, что открытый ключ, соответствующий его секретному ключу, отображается как член текущего набора валидаторов для текущего выбранного экземпляра цепочки блоков TON. В частности, полная нода и средство проверки используют один и тот же механизм проверки двоичных файлов и управляются с помощью одной и той же консоли средства проверки.


1. Контроль смарт-контракта валидатора

Чтобы запустить Validator, вам понадобится полный узел, который уже запущен и работает (и полностью синхронизирован с текущим состоянием блокчейна), и кошелек в главной цепочке, содержащий большое количество Gram. Как правило, вам понадобится не менее 100000 Grams.

Каждый валидатор идентифицируется своим открытым ключом (Ed25519). Во время выборов валидатора валидатор (или, скорее, его открытый ключ) также связан со смарт-контрактом, находящимся в masterchain. Для простоты мы говорим, что валидатор «контролируется» этим умным договором (например, умным договором кошелька). Ставки принимаются от имени этого валидатора только в том случае, если они получены из соответствующего смарт-контракта, и только этот связанный смарт-контракт имеет право получить долю валидатора после его размораживания вместе с долей валидатора в бонусах (блокировка сборов за майнинг, транзакция и сборы за пересылку сообщений, взимаемые с пользователей блокчейна TON пулом валидаторов). Обычно бонусы распределяются пропорционально (действующим) ставкам валидаторов. С другой стороны, валидаторы с более высокими ставками выполняют большую работу (должны создавать и проверять блоки для большего количества цепей шарданов), поэтому важно не слишком жадничать.

Обратите внимание, что каждый валидатор (идентифицируемый его открытым ключом) может быть связан максимум с одним управляющим смарт-контрактом (находящимся в основной цепочке), но один и тот же управляющий смарт-контракт может быть связан с несколькими валидаторами. Таким образом, вы можете запускать несколько валидаторов (на разных физических серверах) и делать для них ставки из одного и того же умного контракта. Если один из этих валидаторов выйдет из строя и вы потеряете его ставку, по крайней мере, другие валидаторы продолжат работать и сохранят свои ставки и получат бонусы.


2. Создание контрольного смарт-контракта

Если у вас нет контролирующего смарт-контракта, вы можете просто создать кошелек в masterchain. Простой кошелек может быть создан с помощью скрипта new-wallet.fif, расположенного в подкаталоге crypto/smartcont дерева исходного кода. В дальнейшем мы предполагаем, что вы настроили переменную среды FIFTPATH для включения <source-root>/crypto/fift/lib: <source-root>/crypto/smartcont, и что ваш PATH содержит каталог с двоичным файлом Fift ( находится в <build-directory>/crypto/fift). Тогда вы можете просто запустить

$ fift -s new-wallet.fif -1 my_wallet_id

где «my_wallet_id» - это любой идентификатор, который вы хотите назначить вашему новому кошельку, а -1 - идентификатор рабочей цепочки для главной цепочки. Если вы не настроили FIFTPATH и PATH, вам придется запустить более длинную версию этой команды

$ crypto/fift -I <source-dir>/crypto/fift/lib: <source-dir>/crypto/smartcont -s new-wallet.fif -1 my_wallet_id

в вашем каталоге сборки.

После запуска этого скрипта отображается адрес нового смарт-контракта:
...
адрес нового кошелька = -1: af17db43f40b6aa24e7203a9f8c8652310c88c125062d1129fe883eaa1bd6763
(Сохранение адреса в файл my_wallet_id.addr)
Невосприимчивый адрес (для инициализации): 0f-vF9tD9Atqok5yA6n4yGUjEMiMElBi0RKf6IPqob1nYzqK
Адрес для пересылки (для последующего доступа): kf-vF9tD9Atqok5yA6n4yGUjEMiMElBi0RKf6IPqob1nY2dP
...
(Сохраненный запрос создания кошелька в файл my_wallet_id-query.boc)

Теперь my_wallet_id.pk - это новый файл, содержащий закрытый ключ для управления этим кошельком (вы должны хранить его в секрете), а my_wallet_id.addr - это (не очень секретный) файл, содержащий адрес этого кошелька. Как только это будет сделано, вы должны перевести некоторые (тестовые) граммы на не подлежащий возврату адрес вашего кошелька и запустить «sendfile my_wallet_id-query.boc» в клиенте Lite для завершения создания нового кошелька. Этот процесс более подробно объясняется в LiteClient-HOWTO.

Если вы запускаете валидатор в «основной сети», рекомендуется использовать более сложные смарт-контракты с кошельками, например, кошелек с несколькими подписями. Для «testnet» простого кошелька должно хватить.


3. Избиратель умный договор

Интеллектуальный контракт выборщика - это специальный смарт-контракт, заключенный в masterchain. Его полный адрес равен -1: xxx..xxx, где -1 - идентификатор рабочей цепочки (-1 соответствует главной цепочке), а xxx..xxx - шестнадцатеричное представление его 256-битного адреса внутри главной цепочки. Чтобы узнать этот адрес, вы должны прочитать параметр конфигурации # 1 из недавнего состояния блокчейна. Это легко сделать с помощью команды «getconfig 1» в Lite Client:

ConfigParam (1) = (elector_addr: xA4C2C7C05B093D470DE2316DBA089FA0DD775FD9B1EBFC9DC9D04B498D3A2DDA)
{х} A4C2C7C05B093D470DE2316DBA089FA0DD775FD9B1EBFC9DC9D04B498D3A2DDA

В этом случае полный адрес избирателя равен -1: A4C2C7C05B093D470DE2316DBA089FA0DD775FD9B1EBFC9DC9D04B498D3A2DDA

Мы предполагаем, что вы знакомы с Lite Client и знаете, как его запустить и как получить глобальный файл конфигурации для него. Обратите внимание, что указанную выше команду можно запустить в пакетном режиме с помощью параметра командной строки '-c' в клиенте Lite:

$ lite-client -C <global-config-file> -c 'getconfig 1'
...
ConfigParam(1) = ( elector_addr:xA4C2C7C05B093D470DE2316DBA089FA0DD775FD9B1EBFC9DC9D04B498D3A2DDA)
x{A4C2C7C05B093D470DE2316DBA089FA0DD775FD9B1EBFC9DC9D04B498D3A2DDA}

$

Интеллектуальный контракт избирателя используется для нескольких вещей. Самое главное, что вы можете участвовать в выборах валидатора или собирать незамерзающие ставки и бонусы, отправляя сообщения от контролирующего умного договора вашего валидатора к умному договору избирателя. Вы также можете узнать о текущих выборах валидаторов и их участниках, используя так называемые «методы получения» смарт-контракта с избирателями.

А именно, работает
runmethod -1:A4C2C7C05B093D470DE2316DBA089FA0DD775FD9B1EBFC9DC9D04B498D3A2DDA active_election_id
...
arguments: [ 86535 ]
result: [ 1567633899 ]

(или lite-client -C <global-config> -c "runmethod -1: <elector-addr> active_election_id" в пакетном режиме) вернет идентификатор активных в настоящий момент выборов (ненулевое целое число, обычно unixtime из начало срока службы избираемой группы валидаторов) или 0, если в настоящее время выборы не активны. В этом примере идентификатор активных выборов - 1567633899.

Вы также можете восстановить список всех активных участников (пары 256-битных открытых ключей валидатора и их соответствующие ставки, выраженные в нанограммах), запустив метод "member_list" вместо "active_election_id".


4. Создание открытого ключа валидатора и адреса ADNL

Чтобы участвовать в выборах валидатора, вам нужно знать идентификатор выборов (полученный с помощью get-метода "active_elections_id" смарт-контракта с избирателем), а также открытый ключ вашего валидатора. Открытый ключ создается при запуске validator-engine-console (как описано в FullNode-HOWTO) и выполнении следующих команд:

$ validator-engine-console ...
...
conn ready
created new key BCA335626726CF2E522D287B27E4FAFFF82D1D98615957DB8E224CB397B2EB67
exportpub BCA335626726CF2E522D287B27E4FAFFF82D1D98615957DB8E224CB397B2EB67
got public key: xrQTSIQEsqZkWnoADMiBnyBFRUUweXTvzRQFqb5nHd5xmeE6
addpermkey BCA335626726CF2E522D287B27E4FAFFF82D1D98615957DB8E224CB397B2EB67 1567633899 1567733900
success

Теперь полный узел (механизм проверки) сгенерировал новую пару ключей, экспортировал представление открытого ключа в Base64 (xrQT ... E6) и зарегистрировал его в качестве постоянного ключа для подписывания блоков, начиная с unixtime 1567633899 (равного выбора идентификатор) до 1567733900 (соответствует предыдущему номеру плюс срок действия выбранного валидатора, доступного в параметре конфигурации # 15, который можно узнать, введя «getconfig 15» в клиенте Lite, плюс запас прочности в случае выборы на самом деле состоятся позже чем предполагалось).

Вам также необходимо определить временный ключ, который будет использоваться валидатором для участия в сетевом согласованном протоколе. Самый простой способ (достаточный для целей тестирования) - установить этот ключ равным постоянному ключу (подпись блока):

addtempkey BCA335626726CF2E522D287B27E4FAFFF82D1D98615957DB8E224CB397B2EB67 BCA335626726CF2E522D287B27E4FAFFF82D1D98615957DB8E224CB397B2EB67 1567733900
success

Также рекомендуется создать выделенный адрес ADNL, который будет использоваться исключительно в целях проверки:

created new key C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C
addadnl C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C 0
success
addvalidatoraddr BCA335626726CF2E522D287B27E4FAFFF82D1D98615957DB8E224CB397B2EB67 C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C 1567733900
success

Теперь C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C - это новый адрес ADNL, который будет использоваться полным узлом для запуска в качестве валидатора с открытым ключом BCA ... B67, со временем истечения, равным 156779.


5. Создание запроса на участие в выборах

Специальный скрипт validator-elect-req.fif (находится в <source-dir>/crypto/smartcont) используется для создания сообщения, которое должно быть подписано валидатором для участия в выборах. Он запускается следующим образом:

$ fift -s validator-elect-req.fif <wallet-addr> <elect-utime> <max-factor> <adnl-addr> [<savefile>]

Например,

$ fift -s validator-elect-req.fif kf-vF9tD9Atqok5yA6n4yGUjEMiMElBi0RKf6IPqob1nY2dP 1567633899 2.7 C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C

или, если вы создали управляющий кошелек с помощью new-wallet.fif, вы можете использовать @ my_wallet_id.addr вместо копирования адреса кошелька kf-vF ... dP:

---------------------------------------
$ fift -s validator-elect-req.fif @my_wallet_id.addr 1567633899 2.7 C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C

Создание запроса на участие в выборах валидатора во время 1567633899 от смарт-контракта Uf + vF9tD9Atqok5yA6n4yGUjEMiMElBi0RKf6IPqob1nY4EA = -1: af17db43f40b6aa24e7203a9f8c8652310c88c125062d1129fe883eaa1bd6763 с максимальным коэффициентом доли относительно минимальной доли 176947/65536 и валидатор ADNL адреса c5c2b94529405fb07d1ddfb4c42bfb07727e7ba07006b2db569fbf23060b9e5c
654C50745D7031EB0002B333AF17DB43F40B6AA24E7203A9F8C8652310C88C125062D1129FE883EAA1BD6763C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C
ZUxQdF1wMesAArMzrxfbQ_QLaqJOcgOp-MhlIxDIjBJQYtESn-iD6qG9Z2PFwrlFKUBfsH0d37TEK_sHcn57oHAGsttWn78jBgueXA ==
---------------------------------------

Здесь <max-factor> = 2.7 - максимально допустимое соотношение вашей ставки по отношению к минимальной доле валидатора в избранной группе валидаторов. Таким образом, вы можете быть уверены, что ваша ставка будет не более чем в 2,7 раза меньше наименьшей ставки, поэтому рабочая нагрузка вашего валидатора будет не более чем в 2,7 раза меньше минимальной. Если ваша ставка слишком велика по отношению к ставкам других валидаторов, она будет обрезана до этого значения (в 2,7 раза меньше минимальной ставки), а остаток будет возвращен вам (т. Е. В контролирующий смарт-контракт вашего валидатора). ) сразу после выборов.

Теперь вы получаете двоичную строку в шестнадцатеричной (654C ... 9E5C) и форме base64 для подписи валидатором. Это можно сделать в validator-engine-console:

sign BCA335626726CF2E522D287B27E4FAFFF82D1D98615957DB8E224CB397B2EB67 654C50745D7031EB0002B333AF17DB43F40B6AA24E7203A9F8C8652310C88C125062D1129FE883EAA1BD6763C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C
got signature ovf9cmr2J/speJEtMU+tZm6zH/GBEyZCPpaukqL3mmNH9Wipyoys63VFh0yR386bARHKMPpfKAYBYslOjdSjCQ

Здесь BCA ... B67 - идентификатор подписывающего ключа нашего валидатора, а 654 ... E5C - сообщение, сгенерированное validator-elect-req.fif. Подпись ovf9 ... jCQ (это представление Base64 64-байтовой подписи Ed25519).

Теперь вам нужно запустить другой скрипт validator-elect-signature.fif, для которого также требуется открытый ключ и подпись валидатора:

------------------------------------
$ fift -s validator-elect-signed.fif @my_wallet_id.addr 1567633899 2.7 C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C xrQTSIQEsqZkWnoADMiBnyBFRUUweXTvzRQFqb5nHd5xmeE6 ovf9cmr2J/speJEtMU+tZm6zH/GBEyZCPpaukqL3mmNH9Wipyoys63VFh0yR386bARHKMPpfKAYBYslOjdSjCQ==
Creating a request to participate in validator elections at time 1567633899 from smart contract Uf+vF9tD9Atqok5yA6n4yGUjEMiMElBi0RKf6IPqob1nY4EA = -1:af17db43f40b6aa24e7203a9f8c8652310c88c125062d1129fe883eaa1bd6763 with maximal stake factor with respect to the minimal stake 176947/65536 and validator ADNL address c5c2b94529405fb07d1ddfb4c42bfb07727e7ba07006b2db569fbf23060b9e5c
String to sign is: 654C50745D7031EB0002B333AF17DB43F40B6AA24E7203A9F8C8652310C88C125062D1129FE883EAA1BD6763C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C
Provided a valid Ed25519 signature A2F7FD726AF627FB2978912D314FAD666EB31FF1811326423E96AE92A2F79A6347F568A9CA8CACEB7545874C91DFCE9B0111CA30FA5F28060162C94E8DD4A309 with validator public key 8404B2A6645A7A000CC8819F20454545307974EFCD1405A9BE671DDE7199E13A
query_id set to 1567632790

Message body is x{4E73744B000000005D702D968404B2A6645A7A000CC8819F20454545307974EFCD1405A9BE671DDE7199E13A5D7031EB0002B333C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C}
x{A2F7FD726AF627FB2978912D314FAD666EB31FF1811326423E96AE92A2F79A6347F568A9CA8CACEB7545874C91DFCE9B0111CA30FA5F28060162C94E8DD4A309}

Saved to file validator-query.boc
-----------------------

В качестве альтернативы, если вы запускаете консоль validator-engine-console на том же компьютере, что и ваш кошелек, вы можете пропустить вышеуказанные шаги и вместо этого использовать «createelectionbid» для создания файла с внешним сообщением, которое будет отправлено клиентом lite. Чтобы эта команда работала, вы должны запустить средство проверки с параметром командной строки -f <fift-dir>, где <fift-dir> - это каталог, содержащий копии всех необходимых исходных файлов Fift (например, Fift.fif). , TonUtil.fif, validator-elect-req.fif и validator-elect-signature.fif), хотя эти файлы обычно находятся в разных исходных каталогах (<source-dir>/crypto/fift/lib и <source-dir>/crypto/smartcont).

Теперь у вас есть тело сообщения, содержащее ваш запрос об участии в выборах. Вы должны отправить его из контролирующего смарт-контракта, указав в качестве значения ставку (плюс один дополнительный грамм для отправки подтверждения). Если вы используете умный контракт простого кошелька, это можно сделать с помощью аргумента командной строки -B для wallet.fif:

--------------------------------------------
$ fift -s wallet.fif my_wallet_id -1:A4C2C7C05B093D470DE2316DBA089FA0DD775FD9B1EBFC9DC9D04B498D3A2DDA 1 100001. -B validator-query.boc
Source wallet address = -1:af17db43f40b6aa24e7203a9f8c8652310c88c125062d1129fe883eaa1bd6763
kf-vF9tD9Atqok5yA6n4yGUjEMiMElBi0RKf6IPqob1nY2dP
Loading private key from file my_wallet_id.pk
Transferring GR$100001. to account kf-kwsfAWwk9Rw3iMW26CJ-g3Xdf2bHr_J3J0EtJjTot2lHQ = -1:a4c2c7c05b093d470de2316dba089fa0dd775fd9b1ebfc9dc9d04b498d3a2dda seqno=0x1 bounce=-1
Body of transfer message is x{4E73744B000000005D702D968404B2A6645A7A000CC8819F20454545307974EFCD1405A9BE671DDE7199E13A5D7031EB0002B333C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C}
x{A2F7FD726AF627FB2978912D314FAD666EB31FF1811326423E96AE92A2F79A6347F568A9CA8CACEB7545874C91DFCE9B0111CA30FA5F28060162C94E8DD4A309}

signing message: x{0000000101}
x{627FD26163E02D849EA386F118B6DD044FD06EBBAFECD8F5FE4EE4E825A4C69D16ED32D79A60A8500000000000000000000000000001}
x{4E73744B000000005D702D968404B2A6645A7A000CC8819F20454545307974EFCD1405A9BE671DDE7199E13A5D7031EB0002B333C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C}
x{A2F7FD726AF627FB2978912D314FAD666EB31FF1811326423E96AE92A2F79A6347F568A9CA8CACEB7545874C91DFCE9B0111CA30FA5F28060162C94E8DD4A309}

resulting external message: x{89FF5E2FB687E816D5449CE40753F190CA4621911824A0C5A2253FD107D5437ACEC6049CF8B8EA035B0446E232DB8C1DFEA97738076162B2E053513310D2A3A66A2A6C16294189F8D60A9E33D1E74518721B126A47DA3A813812959BD0BD607923B010000000080C_}
x{627FD26163E02D849EA386F118B6DD044FD06EBBAFECD8F5FE4EE4E825A4C69D16ED32D79A60A8500000000000000000000000000001}
x{4E73744B000000005D702D968404B2A6645A7A000CC8819F20454545307974EFCD1405A9BE671DDE7199E13A5D7031EB0002B333C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C}
x{A2F7FD726AF627FB2978912D314FAD666EB31FF1811326423E96AE92A2F79A6347F568A9CA8CACEB7545874C91DFCE9B0111CA30FA5F28060162C94E8DD4A309}

B5EE9C7241040401000000013D0001CF89FF5E2FB687E816D5449CE40753F190CA4621911824A0C5A2253FD107D5437ACEC6049CF8B8EA035B0446E232DB8C1DFEA97738076162B2E053513310D2A3A66A2A6C16294189F8D60A9E33D1E74518721B126A47DA3A813812959BD0BD607923B010000000080C01016C627FD26163E02D849EA386F118B6DD044FD06EBBAFECD8F5FE4EE4E825A4C69D16ED32D79A60A85000000000000000000000000000010201A84E73744B000000005D702D968404B2A6645A7A000CC8819F20454545307974EFCD1405A9BE671DDE7199E13A5D7031EB0002B333C5C2B94529405FB07D1DDFB4C42BFB07727E7BA07006B2DB569FBF23060B9E5C030080A2F7FD726AF627FB2978912D314FAD666EB31FF1811326423E96AE92A2F79A6347F568A9CA8CACEB7545874C91DFCE9B0111CA30FA5F28060162C94E8DD4A309062A7721
(Saved to file wallet-query.boc)
----------------------------------

Теперь вам просто нужно отправить wallet-query.boc из Lite-клиента (а не из консоли Validator):

или вы можете использовать LiteClient в пакетном режиме
$ lite-client -C <config-file> -c "sendfile wallet-query.boc"

Это внешнее сообщение, подписанное вашим закрытым ключом (который контролирует ваш кошелек), которое инструктирует ваш смарт-контракт на кошелек отправлять внутреннее сообщение на смарт-контракт с избирателем с заданной полезной нагрузкой (содержащей ставку валидатора и подписанную его ключом) и передавать указанное количество грамм. Когда смарт-контракт выборщика получает это внутреннее сообщение, он регистрирует вашу ставку (с ставкой, равной указанной сумме в граммах минус один) и отправляет вам (т. е. Смарт-контракт с кошельком) подтверждение (несет 1 грамм назад) или сообщение об отклонении с кодом ошибки (переносит почти всю первоначальную сумму ставки за вычетом сборов за обработку).

Вы можете проверить, была ли принята ваша ставка, запустив get-method "member_list" смарт-контракта с избирателями.


6. Восстановление ставок и бонусов

Если ваша ставка принята лишь частично (из-за максимального коэффициента) во время выборов или после того, как ваша ставка не заморожена (это происходит через некоторое время после истечения срока действия группы валидаторов, в которую был избран ваш валидатор), вы можете Вы хотите получить обратно всю или часть своей ставки вместе с любой долей бонусов, причитающихся вашему валидатору. Интеллектуальный контракт с избирателем не отправляет вам ставку и бонусы (т. е. Контролирующий смарт-контракт) в сообщении. Вместо этого он зачисляет сумму, которая будет возвращена вам, в специальной таблице, которую можно проверить с помощью метода get «compute_returned_stake» (который ожидает адрес управляющего смарт-контракта в качестве аргумента):

$ lite-client -C ton-lite-client-test1.config.json -rc 'runmethod -1:A4C2C7C05B093D470DE2316DBA089FA0DD775FD9B1EBFC9DC9D04B498D3A2DDA compute_returned_stake 0xaf17db43f40b6aa24e7203a9f8c8652310c88c125062d1129fe883eaa1bd6763'
arguments: [ 79196899299028790296381692623119733846152089453039582491866112477478757689187 130944 ]
result: [ 0 ]

Если результат равен нулю, ничего не из-за вас. В противном случае вы увидите часть или всю свою ставку, возможно, с некоторыми бонусами. В этом случае вы можете создать запрос на восстановление доли, используя recovery-deal.fif:

-----------------------------
$ fift -s recover-stake.fif
query_id for stake recovery message is set to 1567634299

Message body is x{47657424000000005D70337B}

Saved to file recover-query.boc
-----------------------------

Опять же, вы должны отправить recovery-query.boc в качестве полезной нагрузки сообщения из контролирующего смарт-контракта (т. е. Вашего кошелька) в смарт-контракт выборщика:

$ fift -s wallet.fif my_wallet_id <dest-addr> <my-wallet-seqno> <gram-amount> -B recover-query.boc

Например,

$ fift -s wallet.fif my_wallet_id -1:A4C2C7C05B093D470DE2316DBA089FA0DD775FD9B1EBFC9DC9D04B498D3A2DDA 2 1. -B recover-query.boc
...
(Saved to file wallet-query.boc)

Обратите внимание, что это сообщение имеет небольшую стоимость (один грамм) только для оплаты пересылки и обработки сообщения. Если вы укажете значение, равное нулю, сообщение не будет обработано интеллектуальным контрактом о выборах (сообщение с точно нулевым значением практически бесполезно в контексте цепочки блоков TON).

Как только wallet-query.boc будет готов, вы можете отправить его из Lite Client:

$ liteclient -C <config> -c 'sendfile wallet-query.boc'

Если вы все сделали правильно (в частности, указали правильный seqno вашего кошелька вместо «2» в приведенном выше примере), вы получите сообщение из смарт-контракта для избирателей, содержащее изменение от небольшого значения, которое вы отправили с вашим запросом (1. Грамм в этом примере) плюс восстановленная часть вашей ставки и бонусы.


7. Участие в следующих выборах

Обратите внимание, что даже до истечения срока действия группы валидаторов, в которую входит ваш избранный валидатор, будут объявлены новые выборы в следующую группу валидаторов. Возможно, вы захотите принять в них участие. Для этого вы можете использовать тот же валидатор, но вы должны сгенерировать новый ключ валидатора и новый адрес ADNL. Вам также нужно будет сделать новую ставку до того, как ваша предыдущая ставка будет возвращена (поскольку ваша предыдущая ставка будет разморажена и возвращена только через некоторое время после того, как станет активной следующая группа валидаторов), поэтому нет смысла ставить больше половины ставки ваших грамм.
 

romeo

New member
Сообщения
6
Реакции
1
Посоветуйте конфигурацию сервера для ноды валидатора, какой разбег цен? нужен ли антидос?
 

Legion Leonhart

New member
Сообщения
12
Реакции
4
Посоветуйте конфигурацию сервера для ноды валидатора, какой разбег цен? нужен ли антидос?
Typically you'll need a sufficiently powerful server in a datacenter with good network connectivity, using at least a 1 Gbit/s connection to reliably accommodate peak loads (the average load is expected to be approximately 100 Mbit/s). We recommend a dual-processor server with at least eight cores in each processor, at least 256 MiB RAM, at least 8 TB of conventional HDD storage and at least 512 GB of faster SSD storage.

Единственное что меня смущает в этом описании 256МБ оперативки... может они имели в виду 256МБ на каждое ядро процессора? Или я что-то неправильно понял?
 

Legion Leonhart

New member
Сообщения
12
Реакции
4
Никто скрипт ещё не сваял для участия в выборах валидаторов?
 

F_F

Moderator
Команда форума
Сообщения
18
Реакции
17
Инструкция по настройке полной ноды для блокчейна TON в качестве валидатора
Мой опыт по вышеупомянутой инструкции, original. Поправьте меня где я не прав.

0. Скачивание и компиляция
На данном этапе мы имеем полную скомпилированную с исходников ноду, которая готова работать как валидатор. В моем случае исходники были скопированы в папку /home/ton/ton/, а скомпилировано в /home/ton/build/

1. Контроль смарт-контракта валидатора
Из этого пункта запоминаем, что каждый валидатор идентифицируется открытым ключом валидатора (обозначим его переменной openkey). И что в реальной сети нам понадобится минимум 100 000 грамм. В тестовой же сети будет достаточно 10 000 грамм. Данное значение можно посмотреть вызовом командой getconfig 17 в liteclient'е. Нас интересует параметр min_stake который выражен в нанограммах (10^-9). Пример вывода команды на момент написания поста:
Код:
> getconfig 17

ConfigParam(17) = (
  min_stake:(nanograms
    amount:(var_uint len:6 value:10000000000000))
  max_stake:(nanograms
    amount:(var_uint len:7 value:10000000000000000))
  min_total_stake:(nanograms
    amount:(var_uint len:7 value:500000000000000)) max_stake_factor:655360)

x{609184E72A00072386F26FC10000701C6BF52634000000A0000}

2. Создание контрольного смарт-контракта
Так как я не настраивал переменную среды мне придется вводить полные команды. Все дальнейшие действия произвожу в директории /home/ton/tmpdir/. Нам нужно создать простой кошелек и переводим туда 10 005 грамм (5 грамм на запас). Имя нашего кошелька будет validator_wallet_001, запомним его под переменной my_wallet_id. Создаем кошелек:
Bash:
/home/ton/build/crypto/fift -I /home/ton/ton/crypto/fift/lib:/home/ton/ton/crypto/smartcont -s new-wallet.fif -1 validator_wallet_001

3. Избиратель умный договор
Тут мы запоминаем полный адрес интеллектуального контракта выборщика (обозначим его переменной full_elector_addr). Часть этого адреса можно узнать из liteclient'а командой getconfig 1. В нашем случае он равен -1:3333333333333333333333333333333333333333333333333333333333333333 Пример вывода команды:
Код:
> getconfig 1

ConfigParam(1) = ( elector_addr:x3333333333333333333333333333333333333333333333333333333333333333)
x{3333333333333333333333333333333333333333333333333333333333333333}

Так же в этом пункте нам нужно узнать идут ли сейчас выборы валидаторов или нет. Для этого в liteclient'е мы выполняем команду runmethod <full_elector_addr> active_election_id. Из вывода команды мы запоминаем результат (result). Он нам понадобится для дальнейших расчетов. В нашем примере он равен 1579879030 (обозначим его переменной start_work_time). Пример вывода команды:
Код:
> runmethod -1:3333333333333333333333333333333333333333333333333333333333333333 active_election_id

arguments:  [ 86535 ]
result:  [ 1579879030 ]

4. Создание открытого ключа валидатора и адреса ADNL
Для дальнейшей работы нам понадобится переменная validators_elected_for, который можно узнать из liteclient'а командой getconfig 15. Вывод команды:
Код:
> getconfig 15

ConfigParam(15) = ( validators_elected_for:65536 elections_start_before:32768 elections_end_before:8192 stake_held_for:32768)
x{00010000000080000000200000008000}

В данном пункте нам нужно создать key, openkey и ADNL адрес нашего валидатора (обозначим его переменной adnl_addr)
В консоли управления валидатором создаем ключ key командой newkey. Вывод команды:
Код:
> newkey

created new key 1D8364EE54AFDA46D0824A9846629D0ACE18AC0883ECC6CD02184FE5F1ED8C01

Далее получаем из него открытый ключ openkey командой exportpub <key>. Вывод команды:
Код:
> exportpub 1D8364EE54AFDA46D0824A9846629D0ACE18AC0883ECC6CD02184FE5F1ED8C01

got public key: xrQTSLFhIqVDU8tMIWkLJDKFiGIOUUmLad/W85klWOWEjju7

И добавляем его к себе в базу (fix me) командой addpermkey <key> <start_work_time> <end_work_time>, где end_work_time равен start_work_time + validators_elected_for + 1 (где +1 это запас). В нашем случае он равен 1579944567. Получаем сообщение что все прошло успешно:
Код:
> addpermkey 1D8364EE54AFDA46D0824A9846629D0ACE18AC0883ECC6CD02184FE5F1ED8C01 1579879030 1579944567

success

Так же нам необходим временный ключ, который будет использоваться валидатором для участия в сетевом согласованном протоколе. Создаем его командой addtempkey <key> <key> <end_work_time>. Вывод команды:
Код:
> addtempkey 1D8364EE54AFDA46D0824A9846629D0ACE18AC0883ECC6CD02184FE5F1ED8C01 1D8364EE54AFDA46D0824A9846629D0ACE18AC0883ECC6CD02184FE5F1ED8C01 1579944567

success

Далее создадим adnl_addr. Для этого снова создаем новый ключ командой newkey, в нашем случае он равен 15C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C . Добавляем его к себе в базу как ADNL адрес командой addadnl <adnl_addr> 0 и привязываем его к нашему валидатору командой addvalidatoraddr <key> <adnl_addr> <end_work_time>. Вывод команды:
Код:
> newkey

created new key 15C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C

> addadnl 15C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C 0

success

> addvalidatoraddr 1D8364EE54AFDA46D0824A9846629D0ACE18AC0883ECC6CD02184FE5F1ED8C01 15C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C 1579944567
success

5. Создание запроса на участие в выборах
Создаем запрос на участие командой /home/ton/build/crypto/fift -I /home/ton/ton/crypto/fift/lib:/home/ton/ton/crypto/smartcont -s validator-elect-req.fif @<wallet_name>.addr <start_work_time> <max_rate> <adnl_addr>, где max_rate - некое число, которое равно 2.7 и больше о нем я ничего не понял. Из выхода команды запоминаем переменную qwe1, которая имеет значение 654C50745E2B0A760002B333D73A9C3582264C0F3849A21748BC4E0B03686513D3B5454C6A6D0AAC35E186E515C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C. Вывод команды:
Bash:
/home/ton/build/crypto/fift -I /home/ton/ton/crypto/fift/lib:/home/ton/ton/crypto/smartcont -s validator-elect-req.fif @validator_wallet_001.addr 1579879030 2.7 15C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C

Creating a request to participate in validator elections at time 1579879030 from smart contract Uf/XOpw1giZMDzhJohdIvE4LA2hlE9O1RUxqbQqsNeGG5TST = -1:d73a9c3582264c0f3849a21748bc4e0b03686513d3b5454c6a6d0aac35e186e5  with maximal stake factor with respect to the minimal stake 176947/65536 and validator ADNL address 15c0ab7cb4c679ba630111cc697f304530b69c4c18bf14e3e759bf009762379c
654C50745E2B0A760002B333D73A9C3582264C0F3849A21748BC4E0B03686513D3B5454C6A6D0AAC35E186E515C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C
ZUxQdF4rCnYAArMz1zqcNYImTA84SaIXSLxOCwNoZRPTtUVMam0KrDXhhuUVwKt8tMZ5umMBEcxpfzBFMLacTBi_FOPnWb8Al2I3nA==
Saved to file validator-to-sign.bin

Подписываем валидатор (fix me) командой sign <key> <qwe1>. Отсюда запомним переменную qwe2 которая равна r8y63Gk+7dfT8DyQ1neFgZNe9b+Pe3s/QcMFBQvS3uM2Sybl+Kuklj76MSrSAFTiudOdwTOq1iZMbCp8LbqLDw==. Вывод команды:
Код:
> sign 1D8364EE54AFDA46D0824A9846629D0ACE18AC0883ECC6CD02184FE5F1ED8C01 654C50745E2B0A760002B333D73A9C3582264C0F3849A21748BC4E0B03686513D3B5454C6A6D0AAC35E186E515C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C

got signature r8y63Gk+7dfT8DyQ1neFgZNe9b+Pe3s/QcMFBQvS3uM2Sybl+Kuklj76MSrSAFTiudOdwTOq1iZMbCp8LbqLDw==

Дальше нужно запустить скрипт validator-elect-signature.fif командой /home/ton/build/crypto/fift -I /home/ton/ton/crypto/fift/lib:/home/ton/ton/crypto/smartcont -s validator-elect-signed.fif @<my_wallet_id>.addr <start_work_time> <max_rate> <adnl_addr> <openkey> <qwe2>. Отсюда запоминаем переменную pubkey, которая равна B16122A54353CB4C21690B24328588620E51498B69DFD6F3992558E5848E3BBB. Вывод команды:
Bash:
/home/ton/build/crypto/fift -I /home/ton/ton/crypto/fift/lib:/home/ton/ton/crypto/smartcont -s validator-elect-signed.fif @validator_wallet_001.addr 1579879030 2.7 15C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C xrQTSLFhIqVDU8tMIWkLJDKFiGIOUUmLad/W85klWOWEjju7 r8y63Gk+7dfT8DyQ1neFgZNe9b+Pe3s/QcMFBQvS3uM2Sybl+Kuklj76MSrSAFTiudOdwTOq1iZMbCp8LbqLDw==

Creating a request to participate in validator elections at time 1579879030 from smart contract Uf/XOpw1giZMDzhJohdIvE4LA2hlE9O1RUxqbQqsNeGG5TST = -1:d73a9c3582264c0f3849a21748bc4e0b03686513d3b5454c6a6d0aac35e186e5  with maximal stake factor with respect to the minimal stake 176947/65536 and validator ADNL address 15c0ab7cb4c679ba630111cc697f304530b69c4c18bf14e3e759bf009762379c
String to sign is: 654C50745E2B0A760002B333D73A9C3582264C0F3849A21748BC4E0B03686513D3B5454C6A6D0AAC35E186E515C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C
Provided a valid Ed25519 signature AFCCBADC693EEDD7D3F03C90D6778581935EF5BF8F7B7B3F41C305050BD2DEE3364B26E5F8ABA4963EFA312AD20054E2B9D39DC133AAD6264C6C2A7C2DBA8B0F with validator public key B16122A54353CB4C21690B24328588620E51498B69DFD6F3992558E5848E3BBB
query_id set to 1579854976

Message body is x{4E73744B000000005E2AAC80B16122A54353CB4C21690B24328588620E51498B69DFD6F3992558E5848E3BBB5E2B0A760002B33315C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C}
x{AFCCBADC693EEDD7D3F03C90D6778581935EF5BF8F7B7B3F41C305050BD2DEE3364B26E5F8ABA4963EFA312AD20054E2B9D39DC133AAD6264C6C2A7C2DBA8B0F}

Saved to file validator-query.boc

Теперь у нас есть тело сообщения, содержащее наш запрос об участии в выборах (в файле validator-query.boc). Мы должны отправить его из контролирующего смарт-контракта, указав в качестве значения ставку (плюс один дополнительный грамм для отправки подтверждения). Запустим скрипт wallet.fif командой /home/ton/build/crypto/fift -I /home/ton/ton/crypto/fift/lib:/home/ton/ton/crypto/smartcont -s wallet.fif <my_wallet_id> -B validator-query.boc -- <full_elector_addr> 1 <gram>, где gram = 20001 (из за нашей маленькой суммы и крупной у других валидаторов нас могут не включить в список следующих валидаторов). Вывод команды:
Bash:
/home/ton/build/crypto/fift -I /home/ton/ton/crypto/fift/lib:/home/ton/ton/crypto/smartcont -s wallet.fif validator_wallet_001 -B validator-query.boc -- -1:3333333333333333333333333333333333333333333333333333333333333333 1 10001

Source wallet address = -1:d73a9c3582264c0f3849a21748bc4e0b03686513d3b5454c6a6d0aac35e186e5
kf_XOpw1giZMDzhJohdIvE4LA2hlE9O1RUxqbQqsNeGG5dLc
Loading private key from file validator_wallet_001.pk
Transferring GR$10001. to account kf8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM_BP = -1:3333333333333333333333333333333333333333333333333333333333333333 seqno=0x1 bounce=-1
Body of transfer message is x{4E73744B000000005E2AAC80B16122A54353CB4C21690B24328588620E51498B69DFD6F3992558E5848E3BBB5E2B0A760002B33315C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C}
x{AFCCBADC693EEDD7D3F03C90D6778581935EF5BF8F7B7B3F41C305050BD2DEE3364B26E5F8ABA4963EFA312AD20054E2B9D39DC133AAD6264C6C2A7C2DBA8B0F}

signing message: x{0000000103}
x{627F9999999999999999999999999999999999999999999999999999999999999999B048C4506B500000000000000000000000000001}
  x{4E73744B000000005E2AAC80B16122A54353CB4C21690B24328588620E51498B69DFD6F3992558E5848E3BBB5E2B0A760002B33315C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C}
   x{AFCCBADC693EEDD7D3F03C90D6778581935EF5BF8F7B7B3F41C305050BD2DEE3364B26E5F8ABA4963EFA312AD20054E2B9D39DC133AAD6264C6C2A7C2DBA8B0F}

resulting external message: x{89FFAE75386B044C981E7093442E91789C1606D0CA27A76A8A98D4DA15586BC30DCA05BA9391CC534F0A397BA3D76C2B8332695FCEACD20B9B1004812574EA176F7986ABCC680BF044A1F2208AF23CAC1BEEFDDF3BFF2E8086BC690EA27D0D42C61870000000081C_}
x{627F9999999999999999999999999999999999999999999999999999999999999999B048C4506B500000000000000000000000000001}
  x{4E73744B000000005E2AAC80B16122A54353CB4C21690B24328588620E51498B69DFD6F3992558E5848E3BBB5E2B0A760002B33315C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C}
   x{AFCCBADC693EEDD7D3F03C90D6778581935EF5BF8F7B7B3F41C305050BD2DEE3364B26E5F8ABA4963EFA312AD20054E2B9D39DC133AAD6264C6C2A7C2DBA8B0F}

B5EE9C724102040100013D0001CF89FFAE75386B044C981E7093442E91789C1606D0CA27A76A8A98D4DA15586BC30DCA05BA9391CC534F0A397BA3D76C2B8332695FCEACD20B9B1004812574EA176F7986ABCC680BF044A1F2208AF23CAC1BEEFDDF3BFF2E8086BC690EA27D0D42C61870000000081C01016C627F9999999999999999999999999999999999999999999999999999999999999999B048C4506B5000000000000000000000000000010201A84E73744B000000005E2AAC80B16122A54353CB4C21690B24328588620E51498B69DFD6F3992558E5848E3BBB5E2B0A760002B33315C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C030080AFCCBADC693EEDD7D3F03C90D6778581935EF5BF8F7B7B3F41C305050BD2DEE3364B26E5F8ABA4963EFA312AD20054E2B9D39DC133AAD6264C6C2A7C2DBA8B0F16196DE5
(Saved to file wallet-query.boc)

Теперь нам просто нужно отправить wallet-query.boc файл из liteclient'а командой sendfile wallet-query.boc . Вывод команды:
Код:
sendfile wallet-query.boc

[ 1][t 2][1579855484.831778049][lite-client.cpp:965][!testnode] sending query from file wallet-query.boc
[ 3][t 2][1579855484.889627218][lite-client.cpp:975][!query]    external message status is 1

6. Проверка что все прошло хорошо

После всех пунктов с нашего счета спишется 20 001 грамм (1 грамм уйдет на комиссию). Баланс можно проверить тут: https://api.ton.sh/getAddressInformation?address=-1:d73a9c3582264c0f3849a21748bc4e0b03686513d3b5454c6a6d0aac35e186e5, где d73a9c3582264c0f3849a21748bc4e0b03686513d3b5454c6a6d0aac35e186e5 - адрес нашего кошелька с именем validator_wallet_001, обозначим его переменной wallet_addr.
Так же мы появимся в списке тех, кто ставил ставки. В списке мы ищем свой pubkey и ставку, которую мы отправили. Данный список можно посмотреть тут в разделе "Participants stakes": https://tonmon.xyz
После окончания выборов ЕСЛИ мы прошли в следующий список валидаторов, то мы должны появиться в списке вывода команды getconfig 36. Мы можем не пройти выборы, если у нас слишком маленькая сумма.
Если мы не прошли, то нам будет доступен возврат нашей ставки. Так же она будет доступна (+ вознаграждение) после выполнения валидатором работы и + некоторое время. Сумму возврата можно узнать командой runmethod <full_elector_addr> compute_returned_stake 0x<wallet_addr>. Вывод команды (видим что наша ставка не принята и мы можем забрать 20 000 грамм):
Код:
> runmethod -1:3333333333333333333333333333333333333333333333333333333333333333 compute_returned_stake 0xd73a9c3582264c0f3849a21748bc4e0b03686513d3b5454c6a6d0aac35e186e5

arguments:  [ 97350817690173044911350318738337332420765534539367661042809890254463080433381 130944 ]
result:  [ 20000000000000 ]

Когда нас все же выберут нам какое то время будет доступна команда getconfig 36, который выводит валидаторов на следующую смену работы. После начала смены работы нам будет доступна команда getconfig 34. В выводах этих команды мы можем найти себя (ищем нам pubkey). Вывод команды:
Код:
> getconfig 34

ConfigParam(34) = (
  cur_validators:(validators_ext utime_since:1580337782 utime_until:1580403318 total:37 main:37 total_weight:1152921504606846963
    list:(hme_root
      root:(hm_edge
        label:(hml_same v:0 n:10)
        node:(hmn_fork
        ...
        ...
        ...
            right:(hm_edge
                label:(hml_same v:0 n:2)
                node:(hmn_leaf
                  value:(validator_addr
                    public_key:(ed25519_pubkey pubkey:xB16122A54353CB4C21690B24328588620E51498B69DFD6F3992558E) weight:22532866372277214 adnl_addr:x15C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C))))))))))
full_elector_addr = -1:3333333333333333333333333333333333333333333333333333333333333333
start_work_time = 1579879030
validators_elected_for = 65536
end_work_time = 1579944567

key = 1D8364EE54AFDA46D0824A9846629D0ACE18AC0883ECC6CD02184FE5F1ED8C01
openkey = xrQTSLFhIqVDU8tMIWkLJDKFiGIOUUmLad/W85klWOWEjju7
adnl_addr = 15C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C
pubkey = B16122A54353CB4C21690B24328588620E51498B69DFD6F3992558E

qwe1 = 654C50745E2B0A760002B333D73A9C3582264C0F3849A21748BC4E0B03686513D3B5454C6A6D0AAC35E186E515C0AB7CB4C679BA630111CC697F304530B69C4C18BF14E3E759BF009762379C
qwe2 = r8y63Gk+7dfT8DyQ1neFgZNe9b+Pe3s/QcMFBQvS3uM2Sybl+Kuklj76MSrSAFTiudOdwTOq1iZMbCp8LbqLDw==
 
Последнее редактирование:
Сверху