Что произойдет, если уже обработанная транзакция снова будет отправлена ​​в сеть?

У меня есть скрипт, который автоматически отправляет транзакции с помощью вызова API JSON RPC eth_sendRawTransactionна узел, на котором включен RPC.

Мой вопрос: что произойдет, если я отправлю эти транзакции (кстати, их может быть много) несколько раз после того, как они уже были обработаны?

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

Логика предполагает, что мне не нужно будет отправлять транзакции несколько раз, потому что nonceи transaction hashявляются уникальными значениями, но я хочу быть в этом уверен. Кроме того, если повторная отправка уже обработанных транзакций не стоит денег, может ли это быть потенциальной DDoS-атакой для основной сети Ethereum? Например, повторно отправить все транзакции, которые блокчейн уже обработал?

Я имею в виду, что если бы майнеры могли это сделать, им не нужно было бы, чтобы вы выполняли «eth_sendRawTransaction». Они могли просто переоформить его сами и взять плату. Или, что более понятно, они могут написать свой собственный сценарий для eth_sendRawTransaction, используя те же данные, которые вы отправляете им при первом запуске eth_sendRawTransaction (поскольку два сценария, выполняющие одно и то же, дают одинаковый результат, независимо от того, ваш он или другой). майнеры копируют вас.).

Ответы (3)

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

Когда узел Ethereum получает транзакцию, он не сразу ретранслирует ее всем своим соединениям. Вы не сможете атаковать сеть DDoS, используя этот метод.

о, кстати, я только что сделал это в тестовой сети, и вы не можете снова отправить существующую транзакцию, вы получаете эту ошибку:nonce too low

Вот что вы получите, когда снова отправите транзакцию:

Error: nonce too low

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

Хм, «двойная трата» — это очень специфическая фраза в безопасности блокчейна, поэтому я бы не рекомендовал использовать ее здесь, поскольку она не имеет ничего общего с традиционным значением «атаки двойных трат» (т. е. иметь баланс в 5 долларов, покупать что-то). , а затем провести хард-форк, чтобы снова потратить свои 5 долларов). Возможно, было бы лучше сказать, что одноразовый номер предназначен для предотвращения «двойной отправки», когда ваша транзакция может быть повторно отправлена ​​​​кто-то, чтобы вы дважды отдали ему ETH.