Контракты, получающие несколько идентичных транзакций

Предположим, смарт-контракт используется для добавления картофеля. Каждый раз, когда человек получает новую картофелину, он отправляет транзакцию в смарт-контракт, которая добавляет 1 к общему количеству картофелин.

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

Как вы можете указать майнерам включать только одну транзакцию определенного типа для каждого адреса в каждом блоке?

Ответы (1)

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

contract C {
  mapping (address => bool) sentTx;
  uint public globalCount;

  function potato() {
    if (!sentTx[msg.sender]) {
      globalCount++;
      sentTx[msg.sender] = true;
    }
  }
}

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

Как вы можете указать майнерам включать только одну транзакцию определенного типа для каждого адреса в каждом блоке?

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

«Хранилище контрактов обновляется после каждой транзакции». Итак, если один и тот же человек отправляет «добавить 1 к количеству картофеля» и отправляет другую транзакцию под названием «добавьте 1 к количеству яблок» с тем же входом, существует ли временная вилка 1 яблоко против 1 картофельных цепочек? Это заканчивается просто разветвлением через естественный PoW?
@nickcarraway Непонятно, о чем вы спрашиваете. Вы говорите о том же контракте выше или о контракте, который имеет другую переменную для appleCount?
В приведенном выше комментарии «ввод» относится к вводу транзакции (в основном монета). Таким образом, это может быть больше вопрос о блокчейнах в целом. Если вы отправляете эфир одному узлу, чтобы он выполнял одно действие, и одновременно вы отправляете тот же эфир другому узлу, чтобы он выполнял другое действие, это может привести к (временному) разветвлению блокчейна... Вот, конечно, почему вы ждете для подтверждений! (Я ответил на свой вопрос, я думаю)
@nickcarraway Понятно. «Вход», на который вы ссылаетесь, — это UTXO в этих типах блокчейнов, но модель в Ethereum отличается: у вас может быть много разных переменных для представления разных вещей, таких как счетчики и токены, а для нативного ETH есть свойство «баланс», которое все аккаунты есть.