У меня есть скрипт, который автоматически отправляет транзакции с помощью вызова API JSON RPC eth_sendRawTransaction
на узел, на котором включен RPC.
Мой вопрос: что произойдет, если я отправлю эти транзакции (кстати, их может быть много) несколько раз после того, как они уже были обработаны?
Допустим, в моем скрипте есть ошибка, или база данных, в которой я храню sent
статус транзакции, удалена, и каким-то образом я снова отправляю множество (уже обработанных и сохраненных в блокчейне) необработанных транзакций? Мне в основном интересно узнать, потеряю ли я деньги во второй раз, когда я отправлю эти транзакции? Могут ли майнеры обработать его и взять комиссию, сообщая об ошибке?
Логика предполагает, что мне не нужно будет отправлять транзакции несколько раз, потому что nonce
и transaction hash
являются уникальными значениями, но я хочу быть в этом уверен. Кроме того, если повторная отправка уже обработанных транзакций не стоит денег, может ли это быть потенциальной DDoS-атакой для основной сети Ethereum? Например, повторно отправить все транзакции, которые блокчейн уже обработал?
Для каждого адреса отправителя транзакция с определенным одноразовым номером может быть получена только один раз. Вы не потеряете деньги, но другие узлы могут отключиться от вас, потому что они могут подумать, что вы рассылаете спам.
Когда узел Ethereum получает транзакцию, он не сразу ретранслирует ее всем своим соединениям. Вы не сможете атаковать сеть DDoS, используя этот метод.
nonce too low
Вот что вы получите, когда снова отправите транзакцию:
Error: nonce too low
Всякий раз, когда вы совершаете транзакцию, nonce увеличивается на единицу. Так Эфириум защищает от двойных расходов. Если вы снова отправите свою транзакцию с тем же одноразовым номером. 1-й узел rpc проверит ваш одноразовый номер, если он уже используется, узел просто отменит вашу транзакцию и наверно передаст ее подключенным узлам.
Николас Пипитоне