Перейти к основному содержимому

Запуск ноды

aetron-node - это клиент блокчейна. Нода на Substrate с приделанным слоем Frontier, поэтому один процесс обслуживает и JSON-RPC Substrate, и JSON-RPC Ethereum. ИИ-работу она не считает: инференс и обучение живут на майнерах, а нода несёт только учёт и доказательства вокруг них.

Нужна ли она вам​

Большинству нет. Публичные точки входа отвечают на тот же RPC, и майнеру или шлюзу совершенно нормально смотреть на них.

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

Где взять бинарь​

Нода раздаётся готовым бинарём. Дерево исходников закрыто, поэтому собрать её самостоятельно нельзя, и всё описанное ниже исходит из того, что aetron-node у вас на машине уже есть.

Публичных загрузок пока нет. Релизы появятся на github.com/aetronai/aetron-node; до тех пор операторы получают бинарь напрямую от команды. Когда релиз появится, сверяйте контрольную сумму перед запуском, как с любым другим софтом ноды.

Требования​

Ноде, которая держится за головой цепи, рассчитывайте 4 ядра и быстрый NVMe. Архивной нужно заметно больше диска, чем обрезанной, и он продолжает расти, поэтому закладывайтесь на то, где цепь будет, а не где она сейчас.

Рантайм бинарь несёт с собой, поэтому ставить рядом ничего не требуется.

Чейнспеки: прочитайте до запуска​

Нода принимает --chain dev, --chain mainnet, --chain testnet или путь к JSON-файлу спецификации.

Встроенные спеки mainnet и testnet не подходят к живым сетям. Они строят генезис из текущего кода, а живые цепи стартовали с более ранних, поэтому хэш генезиса выходит другим, и ваша нода просто никогда не найдёт пира, который с ней согласен. Это самый популярный способ потерять здесь полдня.

Живые хэши генезиса:

СетьГенезис
Mainnet0xed62243b8824023257fe3d2887c2379dfcae9d55ec9727b9f56a6fde8283125d
Testnet0x2e45803a320dbf6c0d3fc8bdc6059107aca00e6f285961a394d103c0391e1074

Сверяйте с ними любую спецификацию, которую собираетесь использовать, и проверяйте, куда нода реально присоединилась:

curl -s https://entrypoint-mainnet.aetron.ai \
-H 'Content-Type: application/json' \
-d '{"id":1,"jsonrpc":"2.0","method":"chain_getBlockHash","params":[0]}'

То есть нода, которая должна следовать за публичной сетью, запускается из raw-файла спецификации, а не по встроенному имени. Исключение - --chain dev, и для одноразовой локальной цепи это ровно то, что нужно.

Запуск​

К тестнету:

aetron-node \
--base-path /data/testnet \
--chain /path/to/aetron-testnet-raw.json \
--name my-node \
--bootnodes /dns/test-bootnode.aetron.ai/tcp/30333/ws/p2p/12D3KooWAYVm16woffAsg4V9nVTKHKiSWh9FdGMS4UsJiPRzUQ2i

К мейннету - меняются спецификация и бутнода:

--bootnodes /dns/bootnode.aetron.ai/tcp/30333/ws/p2p/12D3KooWSZxgehdVfTqQCU19VAngesXFTX9bQwf83wkw16jehxcP

Обе бутноды говорят по WebSocket. Если нода за домашним подключением сидит с нулём пиров при верном генезисе, первым подозреваемым идёт именно транспорт; добавить рядом обычного TCP-пира - быстрый способ понять, дело в транспорте или в спецификации.

Чтобы выставить RPC не только на localhost:

--rpc-external --rpc-cors all --rpc-methods safe

--rpc-methods safe - то, что нужно на всём, до чего дотягиваются снаружи. В небезопасный набор входят вставка ключей и управление пирами.

Порты​

ПортЧтоФлаг
30333libp2p, одноранговая сеть--port
9944JSON-RPC, и Substrate, и Ethereum--rpc-port
9615Метрики Prometheus--prometheus-port

Вторая нода на том же хосте означает, что двигать надо все три. Продакшен-хост эксплорера так и сделан: мейннет на 30333/9944/9615, тестнет на 30334/9945/9616.

Обрезка и архивный режим​

В нынешнем CLI флага --pruning нет. Его разделили надвое:

--state-pruning archive --blocks-pruning archive

Без них нода держит недавнее окно состояния и выбрасывает остальное: годится, чтобы следовать за головой, и бесполезно для индексации истории. Индексатору, эксплореру и всему, что отвечает на вопросы о старых блоках, нужны оба значения в archive.

Слой Ethereum​

Ethereum RPC обслуживается тем же портом, что и Substrate RPC, поэтому для работы вызовов eth_* включать ничего не надо. Идентификаторы сетей и разница в знаках описаны в статье Совместимость с EVM.

У слоя Frontier свои флаги, и значения по умолчанию разумные:

ФлагПо умолчаниюЧто делает
--frontier-backend-typekey-valueБэкенд хранения Ethereum-данных. sql лучше под тяжёлые запросы логов.
--max-past-logs10000Потолок строк в ответе на запрос логов.
--fee-history-limit2048Глубина кэша истории комиссий.
--eth-log-block-cache, --eth-statuses-cache50Размеры LRU-кэшей блочных данных и статусов транзакций.
--execute-gas-limit-multiplier10Запас для eth_call и eth_estimateGas относительно лимита газа блока.
--enable-dev-signerвыключенПозволяет ноде держать ключи и подписывать транзакции. Только для разработки.

--enable-dev-signer на публичной ноде отдаёт подпись транзакций самой ноде. Не включайте.

Подкоманды​

ПодкомандаЧто делает
keyГенерация и просмотр ключей, вставка их в хранилище
build-specСборка чейнспека, с --raw для пригодной к раскатке формы
export-blocks, import-blocksВыгрузка и загрузка блочных данных
export-stateДамп состояния на блоке в спецификацию
check-blockПовторная проверка одного блока
revertОткат цепи на N блоков назад
purge-chainУдаление базы данных для базового пути
chain-infoПечать метаданных базы

build-spec --chain <источник> --raw - то, чем raw-спека делается из работающей конфигурации, и это штатный способ передать совпадающую спецификацию другим операторам.

Локальная dev-цепь​

Своя цепь, ничем не обязанная публичным сетям:

aetron-node --dev --base-path /tmp/aetron-dev

--dev даёт одноузловую цепь, которая сама производит блоки. Единственный авторитет Aura - Alice, поэтому больше ничего запускать не нужно, цепь едет сама.

У кого что​

Sudo - это Alice. Любой привилегированный вызов на dev-цепи, а их в этом рантайме много, подписывается Alice: снять паузу с эмиссии, переключить флаги принуждения, задать белый список launch-фазы, зарегистрировать схему. В Polkadot.js Apps это Developer → Sudo с выбранной Alice.

Генезис наполняет восемь аккаунтов:

АккаунтБаланс
Alice, Bob, Charlieпо 1 000 000 AET
Dave, Eve, Ferdieпо 100 000 AET
Alith, 0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac100 000 AET
Baltathar, 0x3Cd0A705a2DC65e5b1E1205896BaA2be8A07c6e0100 000 AET

Первые шесть - стандартные dev-аккаунты Substrate, выведенные из сидов //Alice ... //Ferdie. Последние два - их аналоги в формате Ethereum, наполненные, чтобы стороне EVM было чем платить с первого блока.

Ещё один аккаунт можно наполнить прямо в генезисе, не трогая спецификацию, и это удобный способ выдать баланс своему кошельку:

AET_DEFAULT_TOKEN_WALLET=5Dt... aetron-node --dev --base-path /tmp/aetron-dev

Корректный адрес SS58 получит 1 000 000 AET. Некорректный будет отвергнут с сообщением в stderr, поэтому, если баланс не появился, смотрите лог.

Очевидное предупреждение​

Все эти ключи публичны. //Alice лежит в каждом учебнике по Substrate, приватные ключи Alith и Baltathar известны ровно так же. Они существуют, чтобы локальная цепь заводилась за тридцать секунд, и не стоят ничего нигде больше. Не пополняйте dev-аккаунты в публичной сети и не переиспользуйте эти сиды для настоящих ключей.

Ещё два практических замечания. Dev-цепь на --tmp пропадает при заполнении диска, поэтому дайте ей настоящий базовый путь, если рассчитываете, что она переживёт перезапуск. И у неё собственный генезис, поэтому майнеру или шлюзу, нацеленным на неё, нужны network = "local" и своя конфигурация, а не публичные значения по умолчанию.

Валидаторы​

Блоки производит Aura, финальность даёт GRANDPA. У ноды есть переходный флаг --initial-consensus, и значение по умолчанию правильное, если вам не сказали иного.

Набор валидаторов сейчас закрыт: базовая цепь работает в permissioned-режиме, пока раскатывается протокол проверки, а переход к набору по стейку описан в статье Управление сетью. Держать полную ноду может кто угодно, производить блоки нет.

Проверка, что всё работает​

curl -s http://127.0.0.1:9944 \
-H 'Content-Type: application/json' \
-d '{"id":1,"jsonrpc":"2.0","method":"system_health","params":[]}'

isSyncing: false при ненулевом peers означает, что нода догнала цепь и подключена. Ноль пиров при живом процессе почти всегда означает несовпадение генезиса, а это возвращает вас к разделу про чейнспеки выше.