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

Справочник цепи

Здесь собрано то, что можно вызвать и что можно прочитать в цепи AETRON с установленной пальетой AetronPoI. Это рабочий справочник по вызовам, которые нужны участнику, а не полный список: пальета выставляет больше сотни экстринзиков, и большинство из них - переключатели управления или внутренние шаги финализации, которых обычный участник не касается.

Как читать этот справочник​

Индексы вызовов - устойчивые идентификаторы внутри пальеты AetronPoI. Они относятся только к рантайму, где пальета установлена, и приведённые значения сняты с живых метаданных мейннета, где пальета стоит под индексом 29. В рантайме без AetronPoI этих вызовов нет вообще, а индекс пальеты между версиями рантайма может переехать, поэтому всегда резолвьте пальету и вызов по имени через метаданные цепи, а не зашивайте числа. Обе публичные сети и их RPC-эндпоинты перечислены в статье Сети и эндпоинты.

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

Плата за регистрацию и за создание задачи делится 90/5/5 между пулом рециркуляции, казной и пулом валидаторов. Плата именно списывается, а не блокируется, поэтому при роспуске Нейронета она не возвращается.

Нейронеты и задачи​

create_neuronet (0)​

Создаёт Нейронет вместе с его первой задачей. Подписывается будущим владельцем. Вызов проверяет конфигурацию задачи, списывает текущую стоимость регистрации, пишет запись Нейронета и инициализирует состояние расчёта эмиссии снимком текущего аккумулятора, чтобы новый Нейронет не мог претендовать на историческую эмиссию.

Цена идёт по кривой EMA, а не по фиксированному прайсу: база в рантайме - 1000 AET для публичного Нейронета и 5000 AET для конфиденциального, каждая успешная регистрация толкает текущую цену вверх, а дальше она спадает обратно к базе. У вызывающего должно быть достаточно средств на цену плюс экзистенциальный депозит, потому что списание не должно убивать аккаунт.

Необязательный аргумент initial_stake делегирует стейк новому Нейронету в той же транзакции. Без него Нейронет стартует с нулевым общим стейком, и до появления права на эмиссию ему нужен delegate_stake.

Пока цепь находится в launch-фазе, этот вызов дополнительно сверяет подписывающий холодный ключ с белым списком в цепи и иначе падает с NotInLaunchAllowlist. Тот же гейт стоит на transfer_neuronet_ownership и burned_register. Сегодня на мейннете фаза включена, на тестнете выключена.

add_task (3)​

Добавляет ещё одну задачу существующему Нейронету. Только владелец. Требует, чтобы идентификатор задачи был свободен, а Нейронет не превышал MaxTasksPerNeuronet, который рантайм ставит в 64. Списывает TaskCreationCost, ровно 10 AET в рантайме, с тем же делением 90/5/5. Конфигурация задачи валидируется по тем же правилам, что и при создании, поэтому идентичность модели, уровень проверки и параметры исполнения обязаны быть согласованы между собой. Что означают эти поля, разобрано в Конфигурации задачи.

Смежные вызовы владельца: dissolve_neuronet (1), remove_task (4), update_task_weight (5), decrease_owner_fee (6, комиссию можно только снижать), set_bootstrap_peers (7), set_gateway_url_hint (8) и transfer_neuronet_ownership (134).

Майнеры​

burned_register (10)​

Регистрирует майнера в конкретной задаче сжиганием AET. Подписывается холодным ключом, который платит и берёт на себя ответственность, а переданный аргументом горячий ключ становится рабочей личностью. Вызов проверяет, что Нейронет и задача существуют, что горячий ключ ещё нигде не зарегистрирован, что число активных майнеров ниже MaxActiveMiners (в рантайме 100000) и что заявленная аттестация Pulse укладывается и в минимум задачи, и в потолок заявленного класса железа. Объявленный эндпоинт - ограниченное значение не длиннее 128 байт.

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

Стоимость сжигания тоже идёт по EMA с базой 0,1 AET в рантайме. Когда включено принуждение залога, холодный ключ дополнительно резервирует RequiredMinerBond, в рантайме это 1 AET, до списания сжигаемой суммы.

Последний аргумент - hotkey_proof: Option<[u8; 64]>, подпись sr25519, сделанная САМИМ горячим ключом над blake2_256("AETRON-PoI:hotkey-registration:v1" || coldkey || hotkey || neuronet_id || task_id). Она доказывает, что вызывающий действительно управляет тем горячим ключом, который регистрирует, и это не даёт занять чужой ключ. Обязательность управляется флагом хранилища RequireHotkeyProof, и сети сейчас расходятся: на тестнете он включён, на мейннете выключен. Отправка None в тестнет падает с HotkeyProofRequired, поэтому при написании клиента считайте доказательство обязательным.

deregister_miner (12)​

Убирает майнера из задачи. Подписывается холодным ключом. Вызов чистит запись майнера, активный реестр, членство в задаче, объявленный объём VRAM и депозит за идентичность, а также уменьшает счётчик активных майнеров. Сожжённое при регистрации не возвращается.

Аргумент hotkey необязательный. Один холодный ключ вправе держать несколько горячих в одной задаче, например у оператора с несколькими картами, а без явного указания рантайм снимет первое совпадение при переборе хранилища, то есть произвольное. Указывайте горячий ключ, если в задаче их не ровно один.

Смежные вызовы майнера: swap_hotkey (14) для ротации рабочего ключа с сохранением членства и репутации, set_miner_encryption_key (15) для публикации ключа X25519 под запечатанные промпты и deposit_bond (117) с withdraw_bond (118) для залога под риском.

Работа и проверка​

submit_artifact (40)​

Исполняющий майнер коммитит доказательство одного задания. Подписывается горячим ключом, который обязан принадлежать зарегистрированному майнеру, привязанному к Нейронету и задаче. Вызов принуждает сразу несколько вещей: подпись артефакта обязана быть валидной над канонической полезной нагрузкой там, где подписи требуются, хэш вывода не должен быть уже заявлен по этому заданию, а nonce должен быть неиспользованным для этого майнера. Оба правила существуют, чтобы майнер не мог переиграть более ранний ответ.

Когда включено обязательство по назначению заданий, артефакт принимается только против назначения, которое владелец опубликовал заранее, с совпадением и назначенного горячего ключа, и канонического хэша входа. На первой сдаче по заданию рантайм замораживает сид отбора проверяющих, требование по VRAM и дайджест пула кандидатов, поэтому переформировать кворум после начала пересчёта уже нельзя.

submit_aggregated_batch (41)​

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

submit_validation (44)​

Назначенный проверяющий сообщает сигналы, которые он замерил при пересчёте задания. Подписывается горячим ключом проверяющего. Вердикт проверяющий не отправляет: он отправляет замеренные сигналы, а вердикт рантайм выводит из них детерминированным целочисленным гейтом. Это лишает ленивого или сговорившегося проверяющего возможности просто объявить нужный исход.

Вердикты копятся в кворум из KQuorumK проверяющих, которых рантайм задаёт как 20, с порогом KQuorumT в 10 для вердикта о мошенничестве. Используйте submit_validation_revealed (90), если проверяющий сначала сделал слепой коммит через submit_verdict_commit (80): этот вариант привязывает раскрытие к коммиту и блокирует копирование чужого результата. finalize_job_quorum (52) закрывает задание, когда голоса собраны.

Стейкинг​

delegate_stake (60)​

Резервирует AET на счету стейкера и засчитывает его Нейронету. Нейронет должен существовать, а сумма - брать MinStakerDelegation, который рантайм ставит в 1 AET. Стейк начинает участвовать в наградах только со следующей полной эпохи, что снимает возможность зайти прямо перед выплатой.

request_unstake (61)​

Ставит вывод в очередь. Стейк сразу выходит из общей суммы Нейронета и возвращается в свободный баланс после UnstakeCooldown, то есть 50400 блоков или примерно 7 дней. Когда включена фрикция вывода, крупные или повторные выходы попадают под ExtendedUnstakeCooldown в 216000 блоков, примерно 30 дней. Частичные суммы разрешены.

move_stake (62)​

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

Хранилище, которое стоит читать​

Всё перечисленное живёт под пальетой AetronPoI.

ЭлементКлючЧто хранит
NeuronetsNeuronetIdВладельца, конфигурацию первой задачи, статус, сумму блокировки, блок активности
TasksNeuronetId, TaskIdПолную конфигурацию каждой задачи
NeuronetOwnerNeuronetIdТекущий аккаунт владельца
Minersгорячий ключЗапись майнера: холодный ключ, эндпоинт, класс GPU, оценку Pulse, репутацию
MinerHotkeyToNeuronetгорячий ключЕдинственную пару (NeuronetId, TaskId), которую обслуживает ключ
ActiveMinerRegistryNeuronetId, горячий ключЖивой реестр, из которого набираются кандидаты в проверяющие
Stakeстейкер, NeuronetIdДелегированную сумму
TotalNeuronetStakeNeuronetIdСумму стейка, из которой считаются активация и мощность
StakeActivationстейкер, NeuronetIdМомент, с которого стейк участвует в наградах
PendingUnstakeстейкер, NeuronetIdПоставленный в очередь вывод и блок его разблокировки
ArtifactRegistryJobIdЗакоммиченную запись артефакта по заданию
JobExecutorJobIdГорячий ключ, который выполнил задание
JobVerdictQuorumJobIdНакопленные голоса проверяющих
JobFinalizedJobIdИтоговый вердикт после закрытия кворума
AggregatedBatchesNeuronetId, эпохаКорень пачки владельца и число запросов за эпоху
CurrentEpochзначениеСчётчик текущей эпохи
TotalPoiIssuanceзначениеAET, выпущенный через Proof of Intelligence, основа халвинга
EmissionPausedзначениеИдёт ли эмиссия

Эпохи Нейронета двигаются по темпу, который по умолчанию равен 7200 блокам и меняется для каждого Нейронета через set_neuronet_tempo (132).

Вызовы управления​

Большая часть пальеты состоит из sudo-вызовов, включающих и выключающих принуждение: отбор проверяющих, принуждение залога, вердикты по допуску, штрафы за удержание, челленджи свидетелей, принуждение Pulse-челленджа и параметры стоимости регистрации. Они существуют, чтобы слои проверки можно было калибровать и включать по одному, а не все разом. Здесь они упомянуты для полноты, потому что объясняют, почему один и тот же вызов проходит на одной цепи и ведёт себя иначе на другой. Обычным аккаунтам они недоступны.

Куда идти дальше​