Сначала разделите запрошенный 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. 1
    Сохраните исходное сообщение

    Запишите CID, From, To, Nonce, Value, Method, Params, GasLimit, GasFeeCap и GasPremium. Не ограничивайтесь карточкой со статусом.

  2. 2
    Проверьте точное совпадение

    Выполните поиск исходного CID без разрешения замены. Если квитанция найдена, сравните `MsgLookup.Message` с запросом и переходите к ExitCode.

  3. 3
    Разрешите поиск замены

    Если точного результата нет, повторите поиск с `allowReplaced: true` и достаточной глубиной. Сохраните возвращённый CID, набор блоков и квитанцию.

  4. 4
    Сверьте полезное действие

    Сопоставьте From, nonce, To, Value, Method и Params исходного и найденного сообщения. Отличие действия требует отдельного разбора до зачёта платежа или вызова.

  5. 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` одного сервера ещё не доказывает отсутствие сообщения в цепочке.

Источники

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

  1. Lotus Docs — Manage the message pool Filecoin Project · Проверено 28 августа 2026 г. в 03:52 GMT+5
  2. Filecoin Docs — State JSON-RPC methods Filecoin Foundation · Проверено 28 августа 2026 г. в 03:52 GMT+5
  3. Lotus API — StateSearchMsg signature Filecoin Project · Проверено 28 августа 2026 г. в 03:52 GMT+5
  4. Lotus source pinned at ecc2f390c784 Filecoin Project · Проверено 28 августа 2026 г. в 03:52 GMT+5
Материал носит информационный характер и не является индивидуальной рекомендацией. Криптоактивы связаны с риском волатильности, технических сбоев, хищения и полной потери средств.