Предположим, смарт-контракт используется для добавления картофеля. Каждый раз, когда человек получает новую картофелину, он отправляет транзакцию в смарт-контракт, которая добавляет 1 к общему количеству картофелин.
Предположим, в одном блоке человек случайно отправляет две транзакции, чтобы добавить к счету картошки, когда он хотел отправить только одну. Учитывая, что они обрабатываются в одном и том же блоке, есть ли способ гарантировать, что только один из них добавляется к общему количеству картофеля?
Как вы можете указать майнерам включать только одну транзакцию определенного типа для каждого адреса в каждом блоке?
Очевидным способом является использование сопоставления для отслеживания учетных записей, отправивших транзакцию:
contract C {
mapping (address => bool) sentTx;
uint public globalCount;
function potato() {
if (!sentTx[msg.sender]) {
globalCount++;
sentTx[msg.sender] = true;
}
}
}
Это работает, потому что хранилище контрактов обновляется после каждой транзакции.
Как вы можете указать майнерам включать только одну транзакцию определенного типа для каждого адреса в каждом блоке?
Майнеры в основном имеют полный контроль (в зависимости от программного обеспечения для майнинга, которое они используют) и решают, какие транзакции включать в блок и в каком порядке. Протокол налагает на майнеров несколько правил: если транзакция действительна и блок действителен, майнеры могут делать все, что хотят: майнерам не нужно исключать или включать какие-либо конкретные транзакции.
Ник Каррауэй
эт
Ник Каррауэй
эт