Транзакция откатывается и перезапускается позже?

Несколько часов назад я тестировал свое децентрализованное приложение на ropsten, и произошло нечто странное.

Я отправил транзакцию (A) в блокчейн, она была добыта, и мой сервер синхронизировал ее. Затем через 30 минут я отправил еще одну транзакцию (B) и вызвал ту же функцию. B был успешно добыт, а A снова был добыт в том же блоке, что и B. Нет никаких следов транзакции A, которую я отправил 30 минут назад, как будто она была откатана. Как будто он был заминирован, затем восстановлен, а затем повторно заминирован через 30 минут.

Что случилось? Мое децентрализованное приложение использует синхронизацию в реальном времени, и это сломало бы игру. Спасибо за вашу помощь.

Ответы (2)

Теоретически могло произойти разветвление эфемерной цепи, а затем ее реорганизация.

Это происходит, когда часть сети принимает блок, содержащий вашу транзакцию, как канонический, только для того, чтобы обнаружить, что другая большая часть сети приняла другую версию того же блока как каноническую.

Затем версия блока, содержащая вашу транзакцию, помечается как недействительная, и ваша транзакция возвращается в пул транзакций. Если в пуле есть другие сделки с более высокой ценой, то вашей транзакции придется ждать своего места на рынке.

Мое децентрализованное приложение использует синхронизацию в реальном времени, и это сломало бы игру.

Я не уверен, как вы определяете «живую синхронизацию», но есть пара вещей, о которых стоит подумать.

Во-первых, ваша транзакция может или не может быть добыта в блок за разумное время, которое вы считаете разумным, в зависимости от нагрузки на сеть и текущего состояния рынка цен на газ. Если ваша транзакция имеет слишком низкую цену, то вероятность того, что она будет своевременно включена в блок, меньше.

Во-вторых, стоит дождаться определенного количества подтверждений, прежде чем считать блок, содержащий вашу транзакцию, действительным. (В этом предыдущем ответе рекомендуется 12. Я не уверен, что это число все еще является стандартной практикой.)

(Вот статья о реорганизации цепочки с точки зрения разработки Dapp. Внешняя ссылка.)

Под живой синхронизацией я имею в виду, что я синхронизирую каждое событие в централизованной базе данных, чтобы воссоздать состояние блокчейна и иметь возможность запрашивать данные. Было бы неприемлемо отменить событие после того, как оно было синхронизировано в моей базе данных. Даст ли ожидание 12 подтверждений 100% окончательность? Спасибо
Хорошо, понял. В настоящее время в Ethereum нет жесткой финализации, даже с 12 подтверждениями. Имея достаточную вычислительную мощность, пользователь-противник может перемайнить цепочку произвольной длины по своему усмотрению, выбирая, какие транзакции отменить. Однако это маловероятно, учитывая требуемую мощность хеширования. Во всех смыслах и целях 12 подтверждений считаются вероятностно «безопасными».
(Добавим, что более сильные гарантии окончательности вступят в силу, как только Ethereum перейдет к доказательству доли. Мой комментарий выше относится к текущей модели консенсуса доказательства работы.)

Это нормально в случае реорганизации сети. Блоки можно откатить, если появятся новые блоки с дополнительной работой (в основном, если ваша цепочка находится в блоке N, и кто-то транслирует блок N+1 с другим блоком N в качестве его родителя, цепочка реорганизуется и удаляет блок N, который вы видели ранее).

Когда это происходит, все транзакции в откатанных блоках возвращаются в txpool. Более того, поскольку построение шаблона блока имеет тенденцию выбирать аналогичные транзакции на основе использования газа и цены, многие из неподтвержденных транзакций будут перенесены в блоки, которые теперь являются частью цепочки, в результате чего лишь небольшая часть транзакций вернется обратно в пул транзакций.

Затем эти транзакции могут быть преобразованы в будущий блок, с чем вы, похоже, уже сталкивались.

Обратите внимание, что даже во всей этой реорганизации транзакция A всегда будет перед транзакцией B, поскольку порядок одноразовых номеров по-прежнему соблюдается.

По этой же причине биржи и другие сервисы ждут нескольких подтверждений, прежде чем зачислять на учетную запись пользователя результаты транзакции. В основной сети вы вряд ли увидите реорганизацию, охватывающую 30 минут, но это, безусловно, возможно. Однако тестовые сети, как правило, менее надежны.