как решить асинхронную проблему солидности

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

Ответы (2)

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

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

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

Как вы сказали, пример ID. Кажется, блокчейн не может быть асинхронным.
Блокчейн асинхронен по отношению к внешним процессам; нет никакой гарантии относительно того, когда и даже если транзакция будет обработана и в каком порядке она будет включена. Внутри он полностью синхронен. Выполнение каждой транзакции завершается до того, как будет выполнена любая другая транзакция.
а как насчет потоков майнинга? когда вы одновременно запускаете несколько потоков майнинга, как это влияет на состояние?

В блокчейне нет параллелизма. Транзакции упорядочиваются узлом, создавшим блок, в соответствии с порядком, в котором этот узел получил транзакции.

Таким образом, в случае, который может показаться состоянием гонки, например, при обмене токенами, когда многие заказы могут быть размещены в течение времени блока и в соответствии со значениями состояния, такими как цена, указанная в предыдущем блоке, многие транзакции могут быть просто признаны недействительными, потому что эта цена корректируется в порядке поступления в пул TX.

Транзакции могут быть упорядочены майнером в блоке любым удобным для него способом, не обязательно в том порядке, в котором они получены. Большинство майнеров упорядочат их по цене газа (если они используют ванильную реализацию Geth), но на самом деле реализация зависит от них. (См. ethereum.stackexchange.com/questions/6107/… )