Паспорт delayed proxy-вызова
ПолеОткуда взятьЧто должно совпасть
Сеть и runtime metadataТекущий endpoint и runtime versionДекодирование относится к нужной сети
real / delegateProxy storage и extrinsicРоли не переставлены местами
proxy_type / delayProxyDefinitionТип допускает call, delay уже выдержан
call bytes / call_hashСохранённый SCALE call и AnnouncementsHash вычислен из тех же байтов
ProxyExecuted.resultСобытие включённой extrinsicВнутренний dispatch успешен
Паспорт delayed proxy-вызова
Поле
Сеть и runtime metadata
Откуда взять
Текущий endpoint и runtime version
Что должно совпасть
Декодирование относится к нужной сети
Поле
real / delegate
Откуда взять
Proxy storage и extrinsic
Что должно совпасть
Роли не переставлены местами
Поле
proxy_type / delay
Откуда взять
ProxyDefinition
Что должно совпасть
Тип допускает call, delay уже выдержан
Поле
call bytes / call_hash
Откуда взять
Сохранённый SCALE call и Announcements
Что должно совпасть
Hash вычислен из тех же байтов
Поле
ProxyExecuted.result
Откуда взять
Событие включённой extrinsic
Что должно совпасть
Внутренний dispatch успешен

Proxy — это отношение real и delegate, а не второй владелец

Real account делегирует delegate право отправлять ограниченные вызовы через pallet_proxy. Proxy type задаёт фильтр допустимых runtime calls, а delay добавляет период между announcement и proxy_announced. Названия типов и их фильтры определяет конкретный runtime: нельзя переносить список разрешений с другой сети или старой версии metadata.

Сначала прочитайте Proxy storage для real account и найдите запись с точным delegate. Зафиксируйте proxy_type и delay из этой записи. Если отношение удалено, тип не допускает целевой call или роли не совпадают, исполнение останавливают до новой авторизации.

force_proxy_type — не уровень, который можно безопасно «повысить». Это необязательный точный селектор типа. Если у одной пары real/delegate несколько ProxyDefinition, не оставляйте выбор неявным: сопоставьте нужный фильтр и передайте ровно этот тип. Внешнюю extrinsic может подать отдельный signed relayer; его аккаунт не заменяет delegate в проверяемой proxy relationship.

Announcement связывается с байтами call, а не с человеческим описанием

announce принимает real и call_hash. Hash должен быть получен из точного SCALE-кодированного runtime call тем hasher, который задаёт текущая конфигурация pallet. Похожее название метода, те же видимые параметры или JSON из другого runtime не доказывают совпадение байтов.

Как восстановить доказуемую связь

  1. 1
    Закрепите runtime

    Сохраните genesis hash, spec version и metadata, которыми кодировался call.

  2. 2
    Сохраните полный call

    Храните SCALE bytes вместе с декодированным pallet, method и аргументами.

  3. 3
    Пересчитайте hash

    Используйте CallHasher этой сети и сравните полный результат с записью announcement.

  4. 4
    Проверьте роли

    real, delegate и call_hash должны совпасть одновременно; одного hash недостаточно.

Delay проверяют в блоках той среды, где хранится announcement

Запись announcement содержит момент объявления в терминах block number provider runtime. Исполнение через proxy_announced разрешено только после установленного delay. Delay задаёт минимальный возраст записи, а не срок её годности. Не переводите его в точное стеновое время по средней длительности блока: проверьте текущий блок и условие pallet непосредственно перед отправкой.

Решение перед proxy_announced
НаблюдениеРешениеПроверка
Announcement отсутствуетНе отправлять proxy_announcedПроверить real, delegate, hash и историю событий
Hash расходитсяНе подменять call; создать отдельное корректное намерениеНовые bytes и hash сохранены вместе
Delay ещё не прошёлЖдать нужного block numberУсловие delay выполняется в актуальном состоянии
Proxy type блокирует callНе повышать force_proxy_type вслепуюCall входит в реальный runtime filter
Все поля совпалиОтправить точный полный call через proxy_announcedПоявился ProxyExecuted и целевой эффект
Решение перед proxy_announced
Наблюдение
Announcement отсутствует
Решение
Не отправлять proxy_announced
Проверка
Проверить real, delegate, hash и историю событий
Наблюдение
Hash расходится
Решение
Не подменять call; создать отдельное корректное намерение
Проверка
Новые bytes и hash сохранены вместе
Наблюдение
Delay ещё не прошёл
Решение
Ждать нужного block number
Проверка
Условие delay выполняется в актуальном состоянии
Наблюдение
Proxy type блокирует call
Решение
Не повышать force_proxy_type вслепую
Проверка
Call входит в реальный runtime filter
Наблюдение
Все поля совпали
Решение
Отправить точный полный call через proxy_announced
Проверка
Появился ProxyExecuted и целевой эффект

Успешная extrinsic ещё не доказывает успех настоящего вызова

proxy_announced проверяет proxy relationship, delay и announcement, затем dispatch-ит полный call от имени real. Результат внутреннего dispatch записывается в событии ProxyExecuted. Поэтому внешний статус включения extrinsic нужно читать вместе с ProxyExecuted.result: Err означает, что целевое действие не выполнилось, даже если оболочка была включена в блок.

После Ok проверьте событие или состояние целевого pallet: баланс, identity, staking position, governance vote либо другой ожидаемый эффект. Финальность блока отвечает за устойчивость доказательства, а RPC должен отдавать тот же block hash и events.

Удаление нужно только для записи, которая действительно осталась

proxy_announced удаляет совпавшие созревшие записи до внутреннего dispatch, поэтому ProxyExecuted означает, что они израсходованы и при Ok, и при Err. Более молодая запись с теми же real и call_hash может остаться, если её delay ещё не прошёл. Если dispatch не состоялся или запись больше не нужна, прежний delegate может вызвать remove_announcement, а real account — reject_announcement.

Recovery после попытки
ДоказательствоДействиеФинальный контроль
ProxyExecuted Ok и effect виденНичего не повторятьСозревшие совпавшие записи удалены; target state совпадает
ProxyExecuted ErrРасшифровать DispatchError и исправить причинуСозревшие записи уже удалены; новое намерение имеет отдельные bytes/hash
Extrinsic не включенаНе считать announcement использованнымStorage и nonce/era проверены заново
Совпавшие announcements остались и больше не нужныПосле подсчёта записей вызвать remove_announcement от delegate либо reject_announcement от realВсе записи с этой парой real/call_hash удалены, deposit пересчитан
Неясно, был ли dispatchОстановить cleanup и восстановить block/eventsНайден ProxyExecuted или доказано его отсутствие
Recovery после попытки
Доказательство
ProxyExecuted Ok и effect виден
Действие
Ничего не повторять
Финальный контроль
Созревшие совпавшие записи удалены; target state совпадает
Доказательство
ProxyExecuted Err
Действие
Расшифровать DispatchError и исправить причину
Финальный контроль
Созревшие записи уже удалены; новое намерение имеет отдельные bytes/hash
Доказательство
Extrinsic не включена
Действие
Не считать announcement использованным
Финальный контроль
Storage и nonce/era проверены заново
Доказательство
Совпавшие announcements остались и больше не нужны
Действие
После подсчёта записей вызвать remove_announcement от delegate либо reject_announcement от real
Финальный контроль
Все записи с этой парой real/call_hash удалены, deposit пересчитан
Доказательство
Неясно, был ли dispatch
Действие
Остановить cleanup и восстановить block/events
Финальный контроль
Найден ProxyExecuted или доказано его отсутствие

Стоп-сигналы перед dispatch или cleanup

  • live specVersion отличается от версии metadata, которой декодирован и закодирован call;
  • сохранено только человекочитаемое описание, а исходных SCALE bytes нет;
  • для real/delegate есть несколько ProxyDefinition, но force_proxy_type оставлен неявным;
  • в storage несколько записей с одинаковыми real и call_hash, а удаление считают точечным по одной высоте;
  • в блоке нет ProxyExecuted, но внешний успех extrinsic уже называют успехом целевого вызова.

Call hash здесь относится к proxy announcement. Он не является multisig call hash и не использует multisig Timepoint. Сравнение с отдельным multisig-процессом помогает не искать approve_as_multi там, где нужны ProxyDefinition и Announcements; перед любой новой подписью всё равно проверяйте полный вызов.

Источники

Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.

  1. Polkadot Wiki — Proxies Web3 Foundation · Проверено 30 августа 2026 г. в 16:16 GMT+5
  2. Polkadot runtime v2.3.2 Polkadot Fellows · Проверено 30 августа 2026 г. в 16:16 GMT+5
  3. Polkadot runtime v2.3.2 — proxy filters and config Polkadot Fellows · Проверено 30 августа 2026 г. в 16:16 GMT+5
  4. Polkadot SDK — pallet-proxy 48.0.0 source Parity Technologies · Проверено 30 августа 2026 г. в 16:16 GMT+5
Материал носит информационный характер и не является индивидуальной рекомендацией. Криптоактивы связаны с риском волатильности, технических сбоев, хищения и полной потери средств.