Как быть с асинхронной операцией из-за задержки блокчейна? Как блокчейн работает в условиях высокой параллелизма? как быть с взаимоисключающей переменной?
Сама цепочка блоков фактически является однопоточной: транзакции выполняются одна за другой, и состояние предыдущей транзакции было изменено, если на нее затем ссылается следующая транзакция. Так, например, если вы хотите назначить увеличивающийся идентификатор серии записей, вы можете быть уверены, что в конечном итоге каждый идентификатор будет назначен только одной записи.
Проблема в том, что когда вы отправляете транзакцию, вы не только не знаете заранее, в каком порядке она будет происходить относительно других транзакций, но и не знаете сразу после этого, потому что блок, который только что ее обработал, может быть осиротевшим и замененным блоком, который принимал транзакции в другом порядке. Таким образом, в нашем примере с идентификатором вы можете создать запись, отправив транзакцию из своего кода Javascript, увидеть, как она получает идентификатор, а затем вернуться позже и обнаружить, что идентификатор, который, как вы думали, был назначен вашей записи, теперь принадлежит другой записи.
В результате вещи, требующие строгого упорядочения, должны управляться внутри блокчейна, который всегда в конечном счете согласован сам с собой, и вы не можете предполагать немедленную согласованность по отношению к внешним системам.
В блокчейне нет параллелизма. Транзакции упорядочиваются узлом, создавшим блок, в соответствии с порядком, в котором этот узел получил транзакции.
Таким образом, в случае, который может показаться состоянием гонки, например, при обмене токенами, когда многие заказы могут быть размещены в течение времени блока и в соответствии со значениями состояния, такими как цена, указанная в предыдущем блоке, многие транзакции могут быть просто признаны недействительными, потому что эта цена корректируется в порядке поступления в пул TX.
Джим Грин
Тьяден Хесс
Нулик