Инвентаризация начинается со всех ключей аккаунта
NEAR account может одновременно иметь несколько публичных ключей с разными permissions. Подключение dApp в интерфейсе не доказывает, что соответствующий FunctionCall key удалён, а выход с сайта не меняет on-chain state. Запросите список через RPC `query` с `request_type: view_access_key_list`, нужным `account_id` и `finality: final`; сохраните block hash/height ответа и полный массив keys.
| Поле | Точная трактовка | Стоп-сигнал |
|---|---|---|
| public_key | Идентификатор конкретного on-chain права | Сокращённый ключ или только название dApp |
| permission: FullAccess | Может подписывать любые действия аккаунта, включая AddKey/DeleteKey | Неизвестный FullAccess нельзя считать обычной dApp-сессией |
| FunctionCall.receiver_id | Единственный receiver transaction для этого ключа | Похожее имя контракта или другая сеть |
| method_names | Пустой массив разрешает любой method указанного receiver; непустой — только перечисленные | UI говорит read-only, а массив пуст |
| обычный FunctionCall, allowance: null | Protocol `None`: нет лимита обычного allowance | Интерфейс показывает небольшой лимит, RPC — null |
| allowance: числовая строка | Оставшийся budget в yoctoNEAR; `"0"` остаётся числом, а не доказанным None | Клиент называет numeric zero unlimited без сериализационного доказательства |
| GasKeyFunctionCall | Отдельные balance и num_nonces; allowance не является gas-key бюджетом | Клиент показывает gas key как обычный FunctionCall |
| nonce | Последний использованный nonce этого ключа | Старый экспорт не описывает final state |
- Поле
- public_key
- Точная трактовка
- Идентификатор конкретного on-chain права
- Стоп-сигнал
- Сокращённый ключ или только название dApp
- Поле
- permission: FullAccess
- Точная трактовка
- Может подписывать любые действия аккаунта, включая AddKey/DeleteKey
- Стоп-сигнал
- Неизвестный FullAccess нельзя считать обычной dApp-сессией
- Поле
- FunctionCall.receiver_id
- Точная трактовка
- Единственный receiver transaction для этого ключа
- Стоп-сигнал
- Похожее имя контракта или другая сеть
- Поле
- method_names
- Точная трактовка
- Пустой массив разрешает любой method указанного receiver; непустой — только перечисленные
- Стоп-сигнал
- UI говорит read-only, а массив пуст
- Поле
- обычный FunctionCall, allowance: null
- Точная трактовка
- Protocol `None`: нет лимита обычного allowance
- Стоп-сигнал
- Интерфейс показывает небольшой лимит, RPC — null
- Поле
- allowance: числовая строка
- Точная трактовка
- Оставшийся budget в yoctoNEAR; `"0"` остаётся числом, а не доказанным None
- Стоп-сигнал
- Клиент называет numeric zero unlimited без сериализационного доказательства
- Поле
- GasKeyFunctionCall
- Точная трактовка
- Отдельные balance и num_nonces; allowance не является gas-key бюджетом
- Стоп-сигнал
- Клиент показывает gas key как обычный FunctionCall
- Поле
- nonce
- Точная трактовка
- Последний использованный nonce этого ключа
- Стоп-сигнал
- Старый экспорт не описывает final state
Проверяйте высоту и источник RPC так же, как при любой блокчейн-диагностике. Материал о том, как работает RPC, помогает отделить final state от lagging или ошибочно выбранной сети.
Receiver и methods ограничивают действие, allowance — расходы
Обычный FunctionCall key подписывает transaction с ровно одним FunctionCall, нулевым attached deposit, receiver, совпадающим с permission, и допустимым method name. Он не может напрямую выполнить Transfer, DeleteKey или добавить новый ключ. Но разрешённый method способен менять состояние и вызывать другие contracts из кода receiver, поэтому название метода и поведение точной версии контракта остаются частью риска.
Удаление подписывает FullAccess, а результат доказывает новый RPC state
Runbook точечного DeleteKey
- 1Зафиксировать исходный final state
Сохраните account ID, network, RPC, final block, удаляемый public key и полный список остальных keys. Не работайте по одной строке из кошелька.
- 2Доказать surviving recovery path
Проверьте, что вы контролируете другой FullAccess key либо документированный contract-based путь, который действительно может добавить ключ. Другой FunctionCall key сам по себе не подписывает DeleteKey и AddKey.
- 3Для gas key вывести предоплаченный остаток
Зафиксируйте balance и num_nonces, затем авторизованным путём выполните `WithdrawFromGasKey` и дождитесь final state. DeleteKey сожжёт оставшийся balance и завершится ошибкой, если он больше 1 NEAR.
- 4Сформировать один exact DeleteKey
Receiver transaction должен быть сам account, а payload — удаляемый полный public key. Подписывайте доверенным FullAccess через официальный wallet/CLI; не вставляйте private key или seed в сайт.
- 5Дождаться final результата
Сохраните transaction hash и итог исполнения с финализированными receipts. Успешная подпись или optimistic UI ещё не доказывают удаление.
- 6Повторить полный inventory
Новый `view_access_key_list` на `final` должен не содержать удалённый ключ и по-прежнему показывать ожидаемый recovery key. Отдельно проверьте, не осталось ли других ключей того же dApp.
Перед подписью DeleteKey прочитайте, что именно подписывает кошелёк. Если интерфейс предлагает несколько actions, другой receiver или добавление нового ключа в том же bundle, остановитесь и разберите exact transaction.
Последний ключ — граница между отзывом и блокировкой
| Состояние | Риск | Безопасное действие |
|---|---|---|
| Есть неизвестный FullAccess | Полный контроль остаётся у другого ключа | Не ограничиваться удалением dApp key; инвентаризировать происхождение и срочно ротировать контроль |
| Остаются только FunctionCall keys | Аккаунт не сможет обычным способом управлять keys или переводить NEAR | Не удалять текущий recovery key; сначала восстановить доказанный FullAccess path |
| Обычный allowance = null | Ключ не имеет обычного allowance ceiling | Оценить receiver/methods и необходимость DeleteKey |
| allowance = "0" | Нельзя автоматически назвать unlimited; ключ может быть исчерпан | Привязать к raw RPC и текущему nearcore, не к UI-ярлыку |
| Gas key хранит balance | DeleteKey сжигает остаток; свыше 1 NEAR удаление отклоняется | Сначала WithdrawFromGasKey и final-проверка balance |
| DeleteKey success, ключ всё ещё виден | RPC lag, другая сеть или не тот public key | Сверить final block и независимый endpoint; не повторять вслепую |
| Удалены все keys у contract account | Внешняя подпись больше невозможна | Считать account locked; recovery существует только если его реально реализует contract |
- Состояние
- Есть неизвестный FullAccess
- Риск
- Полный контроль остаётся у другого ключа
- Безопасное действие
- Не ограничиваться удалением dApp key; инвентаризировать происхождение и срочно ротировать контроль
- Состояние
- Остаются только FunctionCall keys
- Риск
- Аккаунт не сможет обычным способом управлять keys или переводить NEAR
- Безопасное действие
- Не удалять текущий recovery key; сначала восстановить доказанный FullAccess path
- Состояние
- Обычный allowance = null
- Риск
- Ключ не имеет обычного allowance ceiling
- Безопасное действие
- Оценить receiver/methods и необходимость DeleteKey
- Состояние
- allowance = "0"
- Риск
- Нельзя автоматически назвать unlimited; ключ может быть исчерпан
- Безопасное действие
- Привязать к raw RPC и текущему nearcore, не к UI-ярлыку
- Состояние
- Gas key хранит balance
- Риск
- DeleteKey сжигает остаток; свыше 1 NEAR удаление отклоняется
- Безопасное действие
- Сначала WithdrawFromGasKey и final-проверка balance
- Состояние
- DeleteKey success, ключ всё ещё виден
- Риск
- RPC lag, другая сеть или не тот public key
- Безопасное действие
- Сверить final block и независимый endpoint; не повторять вслепую
- Состояние
- Удалены все keys у contract account
- Риск
- Внешняя подпись больше невозможна
- Безопасное действие
- Считать account locked; recovery существует только если его реально реализует contract
Программируемое восстановление не появляется автоматически. Как и у smart account, оно существует только в точной реализации: наличие contract code не доказывает, что контракт умеет добавить ключ после блокировки.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- NEAR Docs — Access Keys NEAR · Проверено 24 августа 2026 г. в 09:36 GMT+5
- NEAR Docs — API Libraries / Keys NEAR · Проверено 24 августа 2026 г. в 09:36 GMT+5
- nearcore 2.13.3 — AccessKey and FunctionCallPermission NEAR nearcore · Проверено 24 августа 2026 г. в 09:36 GMT+5
- nearcore 2.13.3 — FunctionCall allowance verifier NEAR nearcore · Проверено 24 августа 2026 г. в 09:36 GMT+5
- NEAR Nomicon — Function access keys in meta transactions NEAR · Проверено 24 августа 2026 г. в 09:36 GMT+5
- NEP-611 — Pending Transaction Queue and Gas Keys NEAR Protocol Specifications · Проверено 24 августа 2026 г. в 09:36 GMT+5
