| Поле | Откуда взять | Что должно совпасть |
|---|---|---|
| Сеть и 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 успешен |
- Поле
- Сеть и 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Закрепите runtime
Сохраните genesis hash, spec version и metadata, которыми кодировался call.
- 2Сохраните полный call
Храните SCALE bytes вместе с декодированным pallet, method и аргументами.
- 3Пересчитайте hash
Используйте CallHasher этой сети и сравните полный результат с записью announcement.
- 4Проверьте роли
real, delegate и call_hash должны совпасть одновременно; одного hash недостаточно.
Delay проверяют в блоках той среды, где хранится announcement
Запись announcement содержит момент объявления в терминах block number provider runtime. Исполнение через proxy_announced разрешено только после установленного delay. Delay задаёт минимальный возраст записи, а не срок её годности. Не переводите его в точное стеновое время по средней длительности блока: проверьте текущий блок и условие pallet непосредственно перед отправкой.
| Наблюдение | Решение | Проверка |
|---|---|---|
| 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 и целевой эффект |
- Наблюдение
- 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.
| Доказательство | Действие | Финальный контроль |
|---|---|---|
| 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 или доказано его отсутствие |
- Доказательство
- 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; перед любой новой подписью всё равно проверяйте полный вызов.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- Polkadot Wiki — Proxies Web3 Foundation · Проверено 30 августа 2026 г. в 16:16 GMT+5
- Polkadot runtime v2.3.2 Polkadot Fellows · Проверено 30 августа 2026 г. в 16:16 GMT+5
- Polkadot runtime v2.3.2 — proxy filters and config Polkadot Fellows · Проверено 30 августа 2026 г. в 16:16 GMT+5
- Polkadot SDK — pallet-proxy 48.0.0 source Parity Technologies · Проверено 30 августа 2026 г. в 16:16 GMT+5
