проблема останова.
Она состоит в том, что для произвольной программы невозможно заранее сказать, сколько она будет выполняться, и остановится ли вообще или уйдёт в бесконечный цикл.
Поэтому, если разрешить просто выполнять произвольный код смарт-контрактов на блокчейне, то блокчейн неизбежно встанет колом, как только кому-нибудь придёт в голову бесконечный цикл в качестве смарт-контракта указать.
Как решить эту проблему? В Биткоине — ограничили операции, которые можно делать самрт-контрактам. Это называется не тьюринг-полный язык программирования. Он без циклов и по-моему даже без ветвлений, и в итоге кроме мультисига там ничего не получается сделать на нём в нынешнем виде.
Основное новшество Эфира было — "мы позволим вам выполнять произвольные программы на Тьюринг-полном языке программирования, а для избегания бесконечных циклов будем использовать механику газа."
Каждая операция EVM, как каждый километр пробегаемый машиной — потребляет фиксированное количество газа/бензина. Но сколько по факту этого бензина твоя машина сожрёт, никому толком заранее не ясно в общем случае, поэтому ты аливаешь какой-то "полный бак с запасом", и запас тебе потом возвращают. Если бак закончился, а машина никуда не приехала — ты всё равно потратил полный бак (а состояние маршрута/блокчейна — откатилось на начало "на эвакуаторе").
Вопрос: "почему ёмкость бака измеряется в литрах, а не в рублях?"
Ответ: Потому что желающих заправить полный бак сегодня и завтра — разное количество. Соответственно, стоимость литра бензина меняется; а значит и стоимость (в рублях) поездки из Москвы в Находку сегодня и через неделю может быть разная. Хотя в литрах там один и тот же маршрут по идее.
То же самое и с транзакциями в Эфириуме. Желающих выполнять транзакции на блокчейне — больше чем блокчейн успевает переварить. Соответственно, надо как-то отдавать приоритет тем, ком нужнее (и кто поэтому выставил цену побольше).
Теперь представим что у нас есть одна большая транзакция по 300 рублей, и много маленьких по 100.
Вопрос — сколько и каких надо взять в блок?
Ответ — неизвестно, зависит от того, насколько "маленькие" меньше "большой". Если вместо одной большой можно взять пять маленьких, то большую вообще не имеет смысл брать, пока маленькие не кончатся. Если только две маленьких за одну большую — то большая идёт первым номером.
Но мы не можем сравнивать "размеры" транзакций, не выполняя их все! А выполнять их всех чтобы только сравнить какую в блок взять (и потом по новой ещё один раз выполнять, уже "начисто") — никакой выполнялки не хватит.
Поэтому в Эфириуме используется модель с gasPrice+totalGas вместо постоянного Fee. В этой модели приоритет отдаётся тем контрактам, у которых gasPrice (за литр/километр/одну операцию) — выше.
И тогда майнеры точно знают, какой из контрактов им надо брать, чтобы максимизировать выгоду (потому что все всё равно не влезут).
Теперь можно смело новичкам кидать, сохранить бы где-нибудь
благодарствую, стало чутка понятнее!👍
Обсуждают сегодня