как выполнить смарт-контракт шаг за шагом?

У меня есть несколько проблем с пониманием этапа выполнения транзакции в смарт-контракте.

1-Когда пользователь отправляет транзакцию в смарт-контракт, этот смарт-контракт не выполняется немедленно, а объединяется в пул транзакций.

2- В какой-то момент времени для каждой EVM выбирается транзакция для выполнения кода в смарт-контракте построчно.

3-Если все EVMS найдут одинаковый результат, что произойдет после? В противном случае смарт-контракт отменил эту транзакцию.

что происходит после? ==> 4- майнер соберет все транзакции из пула транзакций и добавит их во вновь созданный блок, а затем начнется процесс майнинга между майнерами (исправьте меня, если я ошибаюсь, пожалуйста, в шагах)

5-наконец, блокчейн переходит в новое состояние.

*Как майнер проверяет, правильно ли эти транзакции выполняются EVM?

*Играет ли EVM роль только в первой части исполнения смарт-контракта?

*Кто изменит состояние при исполнении контракта? (сделка?)

Ответы (1)

Вы неправильно поняли шаги. Но близко!

Консенсус легко понять неправильно.

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

Мы получаем подсказку о том, как ее решить, из журналов транзакций, используемых базами данных. Если у вас есть воспроизводимый журнал со всеми входными данными в правильном порядке, то можно восстановить базу данных. Не важно иметь «состояние», если у вас есть входные данные, которые создали это состояние.

Есть неочевидная проблема, с которой нужно справиться. Учитывая физику, все узлы не могут узнать обо всех транзакциях одновременно или даже в одном и том же порядке. (Возможно) никогда не будет возможно сделать все так же быстро или быстрее, чем все остальное.

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

Итак, как упорядочить транзакции?

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

Нигде ничего не происходит, пока узлы не получат новости о транзакциях, включенных в блоки. Транзакции в блоках хорошо упорядочены. Сами блоки хорошо упорядочены. Итак, цепочка блоков — это упорядоченный набор всех произошедших транзакций .

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

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

У майнеров есть нетривиальная привилегия. Работая вместе, они могут подвергать цензуре транзакции. Они могут играть с временными метками и порядком транзакций, если в этом есть корыстная выгода. Это может быть важно при разработке контракта, когда существуют такие факторы, как «крайний срок».

В любом случае консенсус определяет порядок транзакций. Узлы сами определяют состояние.

Надеюсь, поможет.

PS В майнинге происходит гораздо больше, но я хотел бы сосредоточиться на вашем вопросе.

Не могли бы вы объяснить это предложение: каждый полный узел, а не только майнеры, полностью обрабатывает транзакции . как обрабатывает транзакции?? Но из того, что я прочитал и по этой ссылке: [ссылка]( ethereum.stackexchange.com/questions/16990/… ) Смарт-контракт выполняется внутри EVM, . Результаты выполнения должны быть точно такими же, чтобы добавить транзакции в блокчейн. Мне нужна помощь, чтобы лучше понять сэра.
Также говорится, что Each node of the network, not only miners execute the smart contracts.EVM находится в каждом узле, и узлы образуют рой. Это может помочь увидеть его: bitrates.com/guides/ethereum/…
Чтобы исправить то, что я сказал в начале и из того, что я понял, когда майнер получает транзакцию, он запускает транзакцию на EVM и включает результат транзакции в блок для майнинга. Затем блок в конечном итоге добывается и добавляется в блокчейн (если майнер успешно добывает этот блок). Наконец, все копируют новый блок и проверяют его, запустив EVM (транзакция, которая отправляется в сеть, выполняется много раз всеми, кто запускает ее в EVM для проверки транзакции. Я получил тот же результат, чтобы проверить все, думаю, все в порядке) поправьте меня, если я ошибаюсь, пожалуйста
Это почти правильно, но я думаю, что есть путаница. Простите меня, если я ошибаюсь. Это: and includes result of transaction in block to mine- полностью искажено. Это не «включает в себя результат». Он включает в себя транзакцию... точнее, он включает в себя входные данные (от Алисы, Бобу, сумму, данные... подпись), а не результат. Этого нет в блоке "майнить". Работа шахтера заключается в том, чтобы «добывать». Майнер включает входные данные транзакции в транзакцию, которая «была добыта». Да, майнер запускает транзакцию. Это связано с тем, что все узлы выполняют транзакцию, а «все узлы» включают майнер.
Транзакция была включена в блок, блок был передан всем. Транзакцию запускают все, включая майнера. Майнер первым узнал, что транзакция включена в блок, поэтому первым ее запустил. Никого не волнует, что, по мнению майнера, делает транзакция. Они сами запустят его, чтобы выяснить.
Да, сэр, я имею в виду транзакцию. но где майнер включает входные данные транзакции? Я не понимаю этого: `майнер включает входные данные транзакции в транзакцию, которая «была добыта». `т.е. не в блоке? Итак, где и затем запустить транзакцию. что ты имеешь в виду all nodes run the transaction and "all nodes" includes the miner ?
Мне нужен этот ответ, сэр, чтобы понять.
@RobHitchens Это старый вопрос, но я надеюсь, что вы ответите. Я думаю, вы ошибаетесь, когда говорите, что это and includes result of the transaction in block to mineнеправильно. На самом деле, при вычислении транзакции результаты сохраняются в Receipt Trie майнера/валидатора, корень которого включен в заголовок блока, который собирает текущий валидатор/майнер, а это означает, что результат транзакции действительно в некотором смысле «включен» в блок (в данном случае блок майнера/валидатора принимается). Возможно, я вас неправильно понял, но буду признателен за ответ!
Возможно, не очень четко сформулировано. Есть корень меркла, который действительно вытекает из результата транзакции, но он очень убыточен. Вы не можете определить, что x=4 в определенном контракте только с корнем Меркла. Но вы не можете сгенерировать корень Меркла, не зная , что x=4, поэтому вы запускаете транзакцию, чтобы выяснить это.
@RobHitchens Спасибо, отлично, тогда мы действительно согласны с тем же! Возможно, вы хотели бы взглянуть на мой другой вопрос ( ethereum.stackexchange.com/questions/136406/… ). Я думаю, что он довольно технический, и у меня проблемы с поиском ответов на него.