расчет комиссии

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

Почему существуют комиссии

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

Почему расчет комиссии — сложная проблема

Как пользователь узнает, какой размер комиссии подходящий? На этот вопрос сложно ответить по нескольким причинам:

  • Предложение [места] непредсказуемо. Если рассматривать длительный отрезок времени, то можно сказать что предложение [места] предсказуемо. Это примерно 2 Мб пространства каждые 10 минут (или, если быть более точным, блок весом 4Мб каждые 10 минут). Но, из-за распределения Пуассона, в течение более коротких периодов времени обнаружение блоков является неравномерным и непредсказуемым. Один из ста блоков обнаруживается в течение 7 секунд после предыдущего блока, а чтобы найти другой из ста потребуется более 45 минут. Это означает, что может произойти «удачная» генерация, когда несколько блоков обнаруживаются в течении нескольких минут, и все транзакции с высокой комиссией выведены из мемпула. С другой стороны, может быть не обнаружен ни один блок за полчаса или более, и в этом случае мемпул будет медленно заполняться транзакциями с более высокой комиссией.
  • Спрос также непредсказуем. Мы определенно видим цикличность в потоке транзакций — в выходные дни обычно тише, чем в будние дни, поэтому мемпул пуст, а комиссии ниже. Однако, как и предложение, спрос непредсказуем в краткосрочной перспективе. Например, даже в выходные дни спрос стремительно растет во время быстрых изменений цены биткоина.
  • У разных пользователей разные требования. Как и на любом рынке, у каждого участника есть свои причины для желания «купить» пространство блока. У меня может быть действительно срочная транзакция, которая должна быть подтверждена в ближайшие полчаса, или, может быть, мне нужно закрыть истекающий смарт-контракт в течение следующих 6 часов, или, возможно, мне нужно создать временную метку для чего-то, и я могу подождать длительное время пока она будет подтверждена на следующей неделе. Модель единого размера комиссии не способна учитывать все эти различные варианты использования.

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

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

Оценка комиссии на основе текущего мемпула

Простой алгоритм оценки комиссии — посмотреть на ваш мемпул и установить комиссию за транзакцию на уровне, который позволит транзакции попасть в список транзакций, формирующих первые 2 МБ — с максимальной оплатой. Это позволило бы ожидать, что такая стратегия приведет к тому, что ваша транзакция будет подтверждена в ближайшем же блоке. К сожалению, всё не так просто, по ряду причин:

  • Совсем недавние транзакции могут не попасть в следующий блок. Майнеры уже работают над следующим блоком на момент отправки транзакции. В зависимости от того, как они обновляют блок во время работы над ним, они могут не включать вашу транзакцию;
  • Независимо от времени отправки транзакции в мемпул, ожидаемое время, которое должно пройти до следующего блока, составляет 10 минут. Это фундаментальное (и часто неправильно понимаемое) свойство распределения Пуассона, которое следует за открытием блока. Если вы поместите свою транзакцию в память через 8 минут после предыдущего блока, ожидаемое время, которое вам нужно будет ждать, — это не 2 минуты — это еще 10 минут. Поэтому вы не просто конкурируете с теми, которые сейчас находятся в мемпуле, вы конкурируете с теми, которые появятся в мемпуле в течение следующих (вероятно) 10 минут;
  • Оценка по снимку мемпула, не учитывает тот факт, что в будущем произойдут «удачные» генерации блоков и медленные генерации блоков. Это может дать вам некоторую информацию о том, какая оплата потребуется, чтобы ваша транзакция была включена в следующий блок или во второй по счёту блок, но не может рассказать вам ничего о том, какая оплата потребуется, если вы хотите, чтобы ваша транзакция включилась в следующие 100 или 200 блоков.
  • Нет такой вещи, как единый мемпул. У каждого узла в его мемпуле будут разные транзакции, в зависимости от таких факторов, как, например, долго ли он работает, от того, к каким другим узлам он подключен, от его локальных политик и т. д. То, что вы видите в своем мемпуле, может не соответствовать тому, что видят майнеры в своих.

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

Оценка комиссии на основе исторических блоков

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

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

Оценка комиссии, основанная на истории пула

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

Как Bitcoin Core оценивает комиссии (до v0.15)

Примечание 1: оценка комиссий в Биткоин Core довольно сложна. Эта статья даёт только обзор концепций алгоритма оценки комиссии и делает несколько упрощений. Для получения дополнительной информации см. Подробное описание алгоритма оценки комиссий Алекса Моркоса (Alex Morcos) или, чтобы узнать все подробности, посмотрите сам код.

Примечание 2: В этой статье описывается алгоритм оценки комиссий от Bitcoin Core v0.14. В v0.15 есть ряд изменений, о которых я расскажу в следующей статье.

Концепты: группы и цели

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

Ставки комиссий в биткоин-транзакциях колеблются в пределах почти непрерывного диапазона от 1 сатоши на байт до нескольких сотен сатоши за байт и даже выше для некоторых экстремальных отклонений (см. визуализацию Йохен Хоенике (Jochen Hoenicke) для представления о том, как выглядит текущий пул).

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

Bitcoin Core оценивает очень большой диапазон ставок, поэтому самая низкая группа начинается с 1s/B и продолжается до 1,1 s/B (на 10% выше). Следующая группа составляет от 1,1 s/B до 1,21 s/B (на 10% выше 1,1). Следующая — от 1,21 до значения на 10% выше и т. д. Эти интервалы экспоненциально расширены до 10000 s/B. Последняя группа — это всё, что на уровне 9400 s/B и выше. По обменному курсу $4200 это составит примерно $88 для транзакции среднего размера (225 байт).

Второе понятие — это количество блоков между входом транзакции в мемпул и включением её в блок. Мы будем называть это целью (поскольку мы будем использовать это при вычислении того, сколько нужно заплатить, чтобы быть включенным в целевое число блоков). В v0.14 Bitcoin Core отслеживает цели с 1 до 25 блоков.

Отслеживание

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

A. количестве транзакций, которые вошли в мемпул с каждой корзины ставок комиссий; и

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

Затем, для любой пары «группа-цель» Bitcoin Core может найти вероятность того, что транзакция с этой ставкой комиссии была бы включена в это целевое количество блоков путем деления Б на A.

Реагирование на изменение ставки вознаграждения

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

По этой причине Bitcoin Core использует экспоненциально взвешенное скользящее среднее или, проще говоря, мы уделяем больше внимания последним блокам, чем старым блокам. Каждый раз, когда Bitcoin Core получает блок, он умножает свои счётчики для старых блоков на коэффициент распада 0,998 (приравнивается к периоду полураспада 346 блоков). Это означает, что, поскольку блок отходит в прошлое, он все меньше и меньше учитывается в нашем алгоритме оценки комиссии. Блок созданный 2,4 дня назад несет примерно половину веса самого последнего блока. Блок созданный 4,8 дней назад несет около четверти веса, а блок от 7,2 дня назад несет примерно одну восьмую веса и так далее.

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

estimateSmartFee(): удобный интерфейс

Чтобы создать удобный интерфейс, нам нужно знать, какой вопрос задает пользователь. Пользователи Биткоина почти никогда не спрашивают:

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

Вместо этого они хотят знать:

Я хочу, чтобы моя транзакция была подтверждена в Y блоках. Сколько я должен заплатить, чтобы это произошло?

Вводится функция estimateSmartFee(), которая предназначена как раз для этого. estimateSmartFee() работает следующим образом:

  1. Пользователь предоставляет целевое количество блоков, за которые он хочет подтвердить транзакцию;
  2. Для этого целевого номера просмотреть самую большую группу (всё что выше 9 400 s/B) и убедиться, что за эту плату вероятность подтверждения в этом количестве транзакций составляет не менее 95%. (если менее — то у нас действительно проблемы. Это говорит о том, что даже если заплатить астрономическую комиссию в размере 9 400 s/B, вероятно, этого будет недостаточно. Помните, что это около $88 за транзакцию нормального размера по ценам на дату написания оригинальной статьи);
  3. Посмотреть на следующую наивысшую группу комиссий (примерно 8 600-9 400 s/B) и убедиться, что за эту плату вероятность подтверждения в этом количестве блоков составляет не менее 95%;
  4. Продолжать работать вниз по группам, пока не найдется та, где вероятность подтверждения будет меньше 95%
  5. Взять предыдущую группу (самую низкую группу, которая имеет вероятность включения не менее 95%) и рассчитать среднюю комиссию за все транзакции в этой группе.

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

Мы используем высокий порог в 95%, потому что хотим, чтобы оценщик комиссий мог сказать нам, что транзакция с определенной ставкой почти наверняка была бы включена в целевые блоки. Оценщик комиссий не имеет полного представления о том, почему транзакции были включены в блок (например, могут быть платежи майнеру по внешнему каналу, чтобы получить определенный класс транзакций, подтвержденных быстрее, чем другие транзакции с такими же или более низкими ставками вознаграждения), поэтому мы установили высокий процент (но не 100%), чтобы обеспечить высокую уверенность в своей оценке.

Функция estimateSmartFee() используется estimatesmartfeesendtoaddress и sendmany RPC и при отправке транзакции в графическом интерфейсе.

Выводы

Оценка комиссий является сложной задачей. Оценщик комиссий, в основном, пытается ответить на вопрос о будущем, основываясь на неполной картине прошлого. Неясно, насколько хорошо мы можем измерить успешность различных алгоритмов оценки комиссий, отчасти потому, что у разных пользователей очень разные требования к системе. Кроме того, рынок комиссий в Биткоине постоянно меняется, и алгоритм оценки комиссии, успешный в сегодняшней биткоин-среде, может оказаться неудачным в случае серьёзных системных изменений (например, появления другой монеты, которая будет майниться с использованием SHA-256, запуска СегВит, изменения общего спроса в мире или переполнения мемпула и др.). Bitcoin Core предоставляет алгоритм оценки комиссий, который подходит для большого числа пользователей в самых разных условиях рынка комиссий. Другие кошельки могут применять различные подходы к оценке вознаграждения, которые могут быть более успешными для определенных пользователей в определенных обстоятельствах.

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

Более сложный алгоритм может быть более перспективным. Однако, чем сложнее алгоритм, тем сложнее описать его работу и результаты, и тем труднее доказать, что алгоритм защищен от манипуляций. Бывают случаи, когда оценка комиссий Bitcoin Core работает недостаточно хорошо, особенно когда происходят очень быстрые изменения на рынке комиссий. Оценка комиссий в Bitcoin Core v0.15 основываются на той же структуре, что и алгоритм v0.14, но несёт множество улучшений, которые призваны сделать её более надёжной в случае изменения обстоятельств и резко отклоняющихся событий. Я опишу эти изменения в следующей статье.