Запуск ноды
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 не подходят к живым сетям. Они строят генезис из текущего кода, а живые цепи стартовали с более ранних, поэтому хэш генезиса выходит другим, и ваша нода просто никогда не найдёт пира, который с ней согласен. Это самый популярный способ потерять здесь полдня.
Живые хэши генезиса:
| Сеть | Генезис |
|---|---|
| Mainnet | 0xed62243b8824023257fe3d2887c2379dfcae9d55ec9727b9f56a6fde8283125d |
| Testnet | 0x2e45803a320dbf6c0d3fc8bdc6059107aca00e6f285961a394d103c0391e1074 |
Сверяйте с ними любую спецификацию, которую собираетесь использовать, и проверяйте, куда нода реально присоединилась:
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 - то, что нужно на всём, до чего дотягиваются снаружи. В небезопасный набор входят вставка ключей и управление пирами.
Порты
| Порт | Что | Флаг |
|---|---|---|
| 30333 | libp2p, одноранговая сеть | --port |
| 9944 | JSON-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-type | key-value | Бэкенд хранения Ethereum-данных. sql лучше под тяжёлые запросы логов. |
--max-past-logs | 10000 | Потолок строк в ответе на запрос логов. |
--fee-history-limit | 2048 | Глубина кэша истории комиссий. |
--eth-log-block-cache, --eth-statuses-cache | 50 | Размеры LRU-кэшей блочных данных и статусов транзакций. |
--execute-gas-limit-multiplier | 10 | Запас для 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, 0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac | 100 000 AET |
Baltathar, 0x3Cd0A705a2DC65e5b1E1205896BaA2be8A07c6e0 | 100 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 означает, что нода догнала цепь и подключена. Ноль пиров при живом процессе почти всегда означает несовпадение генезиса, а это возвращает вас к разделу про чейнспеки выше.