Как майнеры отбирают транзакции?

Развертывание выполнения транзакций ограничено тем, block gas limitчто изменяется динамически. Если блок соответствует только одной транзакции, то лимит газа на транзакцию теоретически такой же, как лимит газа блока. По состоянию на 2020 год этот предел составляет около 10 миллионов. Также существует минимальная базовая стоимость каждой транзакции в размере 21 000 газа.


введите описание изображения здесь


Из ответа на этот вопрос Как транзакции хранятся в блоке? @ Ричард Хоррокс:

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

[В] Следовательно, порядок транзакций определяется майнерами, но как определяются транзакции, которые должны быть включены в блоки?

Насколько я знаю, майнеры выбирают самые прибыльные сделки на основе gasPrice * gasLimit. Использование очень высокого лимита газа каким-то образом замедляет выполнение ваших транзакций? @iamdefinitelyahuman:

Обоснование: майнеры стремятся максимизировать свою прибыль в каждом блоке. Вызовы eth_estimateGasмогут быть вычислительно тяжелыми, поэтому майнеры обычно не определяют фактическое количество газа, которое будет потреблять каждый tx. Вместо этого они рассчитывают gasPrice * gasLimitкаждую данную транзакцию и на основе этого определяют наиболее рентабельный набор транзакций для майнинга.


=> Например, я отправляю транзакцию с очень высокой gasPriceсуммой 10 000 000 gasLimit. Он выбирается и добавляется в блок. Поскольку он потребляет весь gasLimitблок, никакая другая транзакция не включается.

Впоследствии, во время выполнения, моя транзакция израсходовала только 21 000 газа, а оставшаяся часть была возвращена мне. На блоке еще осталось 9 979 000 газа для потребления. Может ли майнер динамически добавлять больше транзакций после завершения выполнения выбранных транзакций?

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

=> Есть ли общий алгоритм для майнеров, чтобы решить, какие транзакции должны быть включены в блок? Скажем, генерируются ли все комбинации отложенных транзакций, чтобы выбрать наиболее выгодную с помощью перебора или жадного алгоритма? Поскольку время очень важно для решения головоломки в первую очередь, решение о включении транзакций в блок может потребовать дополнительного времени.

Ответы (1)

как решаются транзакции, которые должны быть включены в блоки?

Короткий ответ

Как хотят.

Он не детерминирован и не ограничен протоколом.

транзакция с очень высокой gasPrice, которая имеет лимит в 10 000 000 gasLimit.

Работа только с gasLimit будет очень неэффективным майнером из-за примера, который вы привели. При выполнении транзакции использовалось очень небольшое количество газа, поэтому выплачивалась очень небольшая комиссия.

С точки зрения майнера, нет никакой разницы между «фактической» стоимостью и оценочной стоимостью. Это связано с тем, что майнер действительно определяет канонический порядок транзакций. В случае, если это немного загадочно:

  1. Транзакции могут иметь несколько непредсказуемую стоимость из-за неизвестных предварительных условий (при майнинге) и условной логики (например, зацикливаться больше раз == больше газа). Таким образом, отправители часто дополняют gasLimit достаточным количеством газа, чтобы покрыть наихудший случай, зная, что они все равно получат возмещение.
  2. Майнер упаковывает ожидающие транзакции в предложенный блок в определенном порядке, чтобы он мог отрепетировать транзакцию и точно узнать, сколько она будет стоить в этом контексте, поэтому сожженный газ — это лучшее число, и они, вероятно, должны использовать его .

Может ли майнер динамически добавлять больше транзакций после завершения выполнения выбранных транзакций

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

интуитивно

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

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

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

Блок — это одномерное пространство, поэтому нам не нужно беспокоиться о форме дополнительного пространства. Итак, просто продолжайте заполнять самое высокое значение gasPrice (любого размера/любого расхода газа) во все доступное пространство и продолжайте работать до тех пор, пока не закончится gasLimit для использования.

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

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

Как разработчику или пользователю dApp, обычно достаточно понимать, что приоритеты транзакций приблизительно расставлены по gasPrice, крупные транзакции могут занять некоторое время из-за большого куска блока, в котором они нуждаются, и майнерам разрешено делать все, что они хотят, в рамках ограничений протокола. ,главный блок gasLimit.

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

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

Насколько я понимаю, если выбрана транзакция с очень высоким gasPriceзначением 10 000 000 , которая потребляет только 21 000 газа, позже новые транзакции будут добавлены из ожидающих транзакций в оставшуюся сумму gasLimit. И это происходит рекурсивно (поскольку произошел процесс возврата gasLimitдля вновь выбранных транзакций) до тех пор, пока количество потребленного газа для подобранных транзакций не приблизится к 10 000 000 (текущий gasLimit).
Вы подняли хороший вопрос о тонкости. Плата взимается за потребление/использование, поэтому майнер получает стимул на основе того, что будет сожжено. Если не ошибаюсь, блок gasLimit выглядит как подача газа. Большинство кошельков предостерегают от подачи газа сверх лимита, потому что он не будет принят. Потребуются некоторые эксперименты, чтобы подтвердить, что это действительно запрещено в случае, если txn может работать ниже предела. хм
Если поставляемый газ ограничивает упаковку, как я думаю, это означает отсутствие стимула для обработки транзакции, которая занимает много «пространства» с избыточным поставкой газа. Майнер будет оценивать, сколько газа на самом деле сожжено, поскольку он пытается упаковать в блок как можно больше энергии * цена сжигания. Ваша транзакция на 10 миллионов газа, которая не сжигает много, заполнит блок бесполезным газом, заплатив при этом небольшую комиссию.
«подумайте о том, чтобы покопаться в исходном коде популярных майнеров». Они с открытым исходным кодом? Вы знаете какой-нибудь?
Гет есть. Другие сделали бы хороший новый вопрос ;-)