Как работает система учета Ethereum ETH и предотвращает двойные траты?

В Биткойне система учета BTC основана на UTXO (неизрасходованных выходах транзакций), что предотвращает многократное расходование одного и того же BTC. Я слышал, что у Эфириума более простая система баланса счетов, но я не знаю подробностей. Как работает баланс счета Ethereum?

Если у меня есть сообщение, отправляющее 1 ETH от Алисы Бобу, что мешает использовать одно и то же сообщение более одного раза? Существует ли система порядковых номеров (например, TCP)?

Если Алиса сначала подписывает сообщение, отправляющее 1 ETH от Алисы Бобу, а затем подписывает сообщение, отправляющее 1 ETH от Алисы Чарли, может ли второе сообщение быть подтверждено раньше первого?

Ответы (3)

Каждая учетная запись имеет глобальный доступ , что предотвращает повторные атакиnonce в той же цепочке и двойные траты. Это порядковый номер, который проверяют майнеры, потому что блок, который имеет транзакцию с неправильным одноразовым номером, является недопустимым блоком (другие майнеры не будут строить поверх него). ( Не защищает от атак с повторным воспроизведением с перекрестной цепочкой.)noncenonce

Второе сообщение (с более высоким одноразовым номером) не может быть подтверждено до первого.

См. это для дополнительных деталей, таких как:

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

транзакция действительна, если на счете-отправителе достаточно остатка для ее оплаты, и в этом случае счет-отправитель дебетуется, а счет-получатель зачисляется на сумму

Итак, как бы это работало, если бы я создал два узла и скопировал хранилище ключей на оба узла, а затем выполнил две конкурирующие транзакции? Я предполагаю, что один из них «выиграет», но это не может быть определено одноразовым номером, потому что они будут идентичными.
Я не уверен, какая часть нуждается в разъяснении. Тот, кто выиграет, запишет в блокчейн: скажем, в nonce N ваш платеж всего вашего эфира Алисе. Любая другая транзакция с nonce N будет отклонена. В nonce N+1, если вы попытаетесь заплатить Бобу весь свой эфир, это будет недействительной транзакцией, поскольку баланс вашей учетной записи теперь равен 0. Та, которая выиграет в N, определяется той транзакцией, которую выбрал майнер: майнер примет только первая транзакция, которую он видит, имеет nonce N. Один майнер может выбрать ваш tx для Алисы, а другой майнер может выбрать tx для Боба: только один из них выиграет и добудет блок.
На узле AI есть учетная запись x с одноразовым номером n. На узле BI есть учетная запись x в nonce n, т.е. я скопировал хранилище ключей. В тот же момент времени я выполняю вызов контракта C на узле A, чтобы выплатить все средства Алисе, и на узле B, чтобы выплатить все средства Бобу. Оба узла выполняют код локально, анализируют глобальное хранилище и видят, что я могу заплатить обоим, но поскольку текущий блок еще не добыт, ни один узел еще не может знать о другом выполнении. Когда дело доходит до майнинга блока, должен быть включен только один, но одноразовый номер еще не увеличивается, потому что они оба конкурируют за один и тот же блок.
... поэтому я спрашиваю, как это будет решено?
Это решается другими майнерами, которые выбирают, расширять ли блокчейн, представленный узлом A, или тот, который представлен узлом B. Если других майнеров нет, у вас будет 2 цепочки, например, запуск нескольких частных блокчейнов или тестовых сетей.
Я думаю, что этот вопрос заслуживает тестового примера, потому что ваш ответ предполагает, что и узел A, и узел B являются узлами майнинга, и что они успешно добыли свою собственную транзакцию, вызвавшую форк. На самом деле оба узла могут ничего не майнить (они могут даже не быть майнинговыми узлами), что будет означать, что до тех пор, пока блок не будет добыт, обе транзакции будут циркулировать по сети, и обе могут в конечном итоге быть добыты в один и тот же блок.
Один момент, о котором следует помнить, думая о предотвращении двойных расходов, заключается в том, что эфириум — это децентрализованная сеть, и (довольно часто) у вас будут части сети, которые имеют представление о блокчейне, которое конфликтует с другими частями. Если узел A транслирует свои txn в Китае, а узел B — в Бразилии, то разные майнеры будут принимать сообщения A и отклонять сообщения B, и наоборот. В конце концов, один майнер добудет блок и получит в нем ОДИН ИЗ A или B txn. Если бы у него было и то, и другое, он был бы недействителен, никакие другие узлы не приняли бы его, и майнер потратил бы электроэнергию впустую на добычу недопустимого блока.

Я не даю здесь ответа, но я развиваю небольшую дискуссию с @eth, которая имеет отношение к вопросу ОП, и я хотел поделиться тем, что узнал, благодаря @eth и немного почитав.

У меня было неправильное понимание того, что все узлы выполняют код, когда транзакция вызывает этот код, и поэтому предполагалось, что результат выполнения кода затем передается в сеть, собирается и преобразуется в блок.

Этот процесс транзакции, передачи, сбора и майнинга для подтверждения — это то, как работает блокчейн Биткойн, но это не то, как работает блокчейн Эфириума, и это причина, по которой я неправильно понял, почему двойные траты невозможны в блокчейне Эфириума. Механизм не сразу очевиден, поэтому я хотел объяснить его.

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

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

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

Я надеюсь, что это поможет другим понять, почему это работает.

Это звучит как ответ для меня... Вопрос в том, какой механизм предотвращает двойные траты. Ответ заключается в том, что майнер сам решает, какие транзакции включать в блок, а учетные записи имеют глобально доступный одноразовый номер.
+1 за этот ответ. (Исходный вопрос явно не спрашивал о двойных тратах, и я попытался сделать вопрос более ясным. Но тогда я не расширил ответ, поэтому спасибо за объяснение.)
@TjadenHess Спасибо за ваше точное объяснение: использовал «глобально доступный одноразовый номер», чтобы улучшить другой ответ.

Я думаю, что немного опоздал на это, но на этот вопрос уже был дан ответ в следующем вопросе.

Что такое одноразовый номер в Ethereum? Как это предотвращает двойные расходы?

Взглянуть.

нет, ты очень опоздал.