Сначала разделите запрошенный CID и CID исполненного сообщения
Сначала разделите CID структуры `Message` и CID оболочки `SignedMessage`. Поля GasPremium, GasFeeCap и GasLimit входят в `Message`, поэтому изменение любого из них меняет его CID. Для secp256k1 Lotus вычисляет CID из подписанной оболочки, а для BLS метод `SignedMessage.Cid()` возвращает CID самого `Message`. Значит, одна лишь замена BLS-подписи не меняет этот CID. Старый CID остаётся уликой исходного кандидата, а `MsgLookup.Message` указывает CID сообщения, квитанцию которого нашёл узел.
Зафиксируйте сеть, адрес отправителя, nonce, старый CID и новый CID из истории кошелька или Lotus. Обычная проверка перевода помогает не смешать сеть и адрес, но для замены решающей парой будут отправитель и nonce. В отличие от Ethereum, порог и поля замены здесь задаёт Filecoin/Lotus, поэтому процент из инструкции для EVM переносить нельзя.
| Поле или результат | Что доказывает | Чего не доказывает |
|---|---|---|
| Отправитель + nonce совпадают | Сообщения претендуют на одно место в очереди отправителя | Что у них одинаковое действие |
| CID `Message` различаются | Поля хотя бы одной структуры `Message` не идентичны | Какой кандидат исполнился |
| Меняется только BLS-подпись | CID `Message` остаётся прежним | Что такая подпись действительна |
| To, Value, Method и Params совпадают | Замена сохранила полезное действие | Успешность исполнения |
| `MsgLookup.Message` | Какой CID связан с найденной квитанцией | Что `ExitCode` равен нулю |
| Квитанция и `ExitCode` | Чем завершилось исполненное сообщение | Что интерфейс сервиса уже зачёл результат |
- Поле или результат
- Отправитель + nonce совпадают
- Что доказывает
- Сообщения претендуют на одно место в очереди отправителя
- Чего не доказывает
- Что у них одинаковое действие
- Поле или результат
- CID `Message` различаются
- Что доказывает
- Поля хотя бы одной структуры `Message` не идентичны
- Чего не доказывает
- Какой кандидат исполнился
- Поле или результат
- Меняется только BLS-подпись
- Что доказывает
- CID `Message` остаётся прежним
- Чего не доказывает
- Что такая подпись действительна
- Поле или результат
- To, Value, Method и Params совпадают
- Что доказывает
- Замена сохранила полезное действие
- Чего не доказывает
- Успешность исполнения
- Поле или результат
- `MsgLookup.Message`
- Что доказывает
- Какой CID связан с найденной квитанцией
- Чего не доказывает
- Что `ExitCode` равен нулю
- Поле или результат
- Квитанция и `ExitCode`
- Что доказывает
- Чем завершилось исполненное сообщение
- Чего не доказывает
- Что интерфейс сервиса уже зачёл результат
Поиск с учётом замены может вернуть другой CID
`StateSearchMsg` ищет исполненное сообщение в истории. Если клиент передаёт `allowReplaced: true`, узел может вернуть `MsgLookup` для совместимой замены, а поле `Message` в ответе будет отличаться от запрошенного CID. Это штатный ответ, а не доказательство двойного исполнения. Для строгого поиска исходного CID используют `allowReplaced: false`; отсутствие результата ещё не исключает исполненную замену.
Диагностика без повторной отправки
- 1Сохраните исходное сообщение
Запишите CID, From, To, Nonce, Value, Method, Params, GasLimit, GasFeeCap и GasPremium. Не ограничивайтесь карточкой со статусом.
- 2Проверьте точное совпадение
Выполните поиск исходного CID без разрешения замены. Если квитанция найдена, сравните `MsgLookup.Message` с запросом и переходите к ExitCode.
- 3Разрешите поиск замены
Если точного результата нет, повторите поиск с `allowReplaced: true` и достаточной глубиной. Сохраните возвращённый CID, набор блоков и квитанцию.
- 4Сверьте полезное действие
Сопоставьте From, nonce, To, Value, Method и Params исходного и найденного сообщения. Отличие действия требует отдельного разбора до зачёта платежа или вызова.
- 5Докажите итог
Прочитайте ExitCode, Return и GasUsed, затем проверьте ожидаемое изменение состояния в более позднем каноническом наборе блоков.
ExitCode относится к исполненному кандидату
Нулевой ExitCode означает успешное завершение сообщения, чей CID указан в `MsgLookup.Message`. Ненулевой код означает, что кандидат попал в цепочку, но завершился ошибкой. Комиссия и изменение nonce при этом могут сохраниться, поэтому ещё одна отправка не исправляет причину автоматически. Актор — программный объект Filecoin; полный смысл кода проверяют по нему и версии сети, отделяя замену от ошибки исполнения.
После успешной квитанции перечитайте объект, который должно было изменить сообщение: баланс, состояние актора, сделку или запись приложения. Число подтверждений и возможность реорганизации относятся к набору блоков результата, а не к старому CID. Сервису передают CID фактически исполненного сообщения и доказательство нужного состояния.
| Наблюдение | Вывод | Безопасное следующее действие |
|---|---|---|
| Точный CID имеет квитанцию | Исполнился исходный кандидат | Проверить ExitCode и ожидаемое состояние |
| Точный CID не найден, замена найдена | Исполнился другой CID совместимого сообщения | Сверить действие, затем ExitCode |
| Оба запроса возвращают один CID замены | Это одна найденная квитанция, а не два исполнения | Не отправлять действие повторно |
| Квитанция есть, `ExitCode` ненулевой | Сообщение включено, исполнение неуспешно | Разобрать актор, метод и `Return`; не повышать `GasPremium` вслепую |
| Ничего не найдено на выбранной глубине | Доказательств исполнения пока нет | Проверить синхронизированный или архивный Lotus и обоснованно увеличить глубину |
- Наблюдение
- Точный CID имеет квитанцию
- Вывод
- Исполнился исходный кандидат
- Безопасное следующее действие
- Проверить ExitCode и ожидаемое состояние
- Наблюдение
- Точный CID не найден, замена найдена
- Вывод
- Исполнился другой CID совместимого сообщения
- Безопасное следующее действие
- Сверить действие, затем ExitCode
- Наблюдение
- Оба запроса возвращают один CID замены
- Вывод
- Это одна найденная квитанция, а не два исполнения
- Безопасное следующее действие
- Не отправлять действие повторно
- Наблюдение
- Квитанция есть, `ExitCode` ненулевой
- Вывод
- Сообщение включено, исполнение неуспешно
- Безопасное следующее действие
- Разобрать актор, метод и `Return`; не повышать `GasPremium` вслепую
- Наблюдение
- Ничего не найдено на выбранной глубине
- Вывод
- Доказательств исполнения пока нет
- Безопасное следующее действие
- Проверить синхронизированный или архивный Lotus и обоснованно увеличить глубину
Когда диагностику надо остановить
- кошелёк показывает только статус без CID, отправителя и nonce;
- предлагаемая замена меняет To, Value, Method или Params без объяснения;
- старый и новый CID проверяют в разных сетях либо на несинхронизированных узлах;
- успех объявляют по включению в набор блоков, не прочитав ExitCode и состояние;
- сервис просит повторить платёж, хотя поиск с учётом замены уже нашёл успешный CID;
- для просмотра сообщения или квитанции запрашивают seed-фразу, приватный ключ или файл кошелька.
Если два доверенных Lotus-узла расходятся, сравните их высоту и канонический набор блоков. Архивный узел нужен, когда сообщение вышло за глубину поиска или публичный RPC не хранит нужную историю. Устройство RPC объясняет, почему `not found` одного сервера ещё не доказывает отсутствие сообщения в цепочке.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- Lotus Docs — Manage the message pool Filecoin Project · Проверено 28 августа 2026 г. в 03:52 GMT+5
- Filecoin Docs — State JSON-RPC methods Filecoin Foundation · Проверено 28 августа 2026 г. в 03:52 GMT+5
- Lotus API — StateSearchMsg signature Filecoin Project · Проверено 28 августа 2026 г. в 03:52 GMT+5
- Lotus source pinned at ecc2f390c784 Filecoin Project · Проверено 28 августа 2026 г. в 03:52 GMT+5
