Я где-то читал, что «состояние» обновляется только в конце каждого блока. Я также читал, что каждый блок содержит определенную последовательность транзакций и, таким образом, неявно «обновляет» состояние внутри блока. Это может быть семантикой, но я просто хочу быть уверенным в том, как обновляются переменные состояния: будет ли транзакция, которая изменяет состояние, делать это перед следующей транзакцией, независимо от того, находится ли она в том же блоке?
Для ясности: предположим, что переменная контракта Book
равна 10 ETH, чтобы пользователи могли делать ставки против этих 10 ETH. Каждый раз, когда транзакция ставит сумму X
, Book
она уменьшается на X
: Book = Book - X
. Ставки ограничены таким образом, что Book
>=0 всегда: require(Book - X >= 0)
в верхней части функции ставок. Если Боб поставит 6 ETH, а Алиса поставит 6 ETH, это, очевидно, будет противоречить моему требованию. Однако, если их транзакции находятся в одном блоке, будет ли вторая транзакция отклонена?
будет ли транзакция, которая изменяет состояние, сделать это перед следующей транзакцией, независимо от того, находится ли она в том же блоке?
Да
если их транзакции находятся в одном блоке, будет ли вторая транзакция отклонена?
Да
Важным моментом является то, что ни Алиса, ни Боб не знают, кто первый: майнер решает, какая транзакция будет первой.
См. также Каков порядок транзакций по умолчанию во время майнинга?
Эрик Фалькенштейн