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

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

Входы, выходы изменений и выходы платежей

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

Алиса, клиентка, отведала приятный обед в пабе Bob’s, и официант Чарли представил ей счет на 10 долларов. Алиса платит Бобу двадцатидолларовым счетом и получает 10 долларов сдачи.

Биткойн-транзакции работают в основном так же. Чтобы не усложнять примеры, представим, что один биткойн равен одному доллару. Алиса получает счет на 10 BTC и начинает транзакцию, добавляя 20 BTC из своего кошелька. Затем она добавляет два выхода: выход в 10 BTC, который отправляется Бобу, и еще один выход в 10 BTC, который возвращает сдачу в ее собственный кошелек.

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

А вот размеры каждой части транзакции:

  • Контейнер (белый): 10 байт.
  • Ввод (розовый): 148 байт.
  • Верните вывод Алисе (зеленый): 34 байта
  • Вывод платежа Бобу (синий): 34 байта
  • Всего: 226 байт

Но подождите, Алиса чуть не забыла дать Чарли чаевые за его отличную службу. Что касается наличных денег, Алиса совершает вторую транзакцию, беря 10 долларов, которые она получила в обмен, обменивает их на деньги небольшого достоинства и оставляет на столе 15% чаевых в размере 1,50 доллара, оставляя остальные 8,50 долларов сдачи себе.

В Биткойне Алиса также создает вторую транзакцию, чтобы заплатить Чарли чаевые. Поскольку каждая обычная транзакция с одним платежом в биткойнах состоит в точности из тех же частей, что и транзакция, проиллюстрированная выше, вторая транзакция требует добавления еще 226 байтов в цепочку блоков, что в сумме составляет 452 байта.

Более эффективный способ

Алиса могла бы повысить свою эффективность, объединив эти два отдельных платежа в одну транзакцию. Что касается наличных денег, это похоже на то, как Алиса оплачивает свой первоначальный счет, передав Чарли 20 долларов физическими деньгами и приказывая ему заплатить и Бобу, и себе, вернув только 8,50 долларов сдачи, оставив остальное (1,50 доллара или 15%) в качестве чаевых. .

В биткойнах Алиса добавляет к своей транзакции дополнительный вывод (показанный ниже желтым цветом), который платит Бобу его чаевые в размере 1,5 BTC:

Вот размеры нового пакетного платежа:

  • Контейнер (белый): 10 байт.
  • Ввод (розовый): 148 байт.
  • Изменить вывод (зеленый): 34 байта
  • Вывод платежа Бобу (синий): 34 байта
  • Вывод платежа Чарли (желтый): 34 байта
  • Всего: 260 байт

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

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

Мы складываем байты, используемые контейнером, вводом и изменением вывода (10 + 148 + 34). Затем для каждого дополнительного платежа мы добавляем к транзакции 34 байта (x * 34). Наконец, мы делим общее количество байтов на количество платежей (x), чтобы получить количество байтов, используемых для одного платежа. Вот результат построения нашей функции:

Мы видим, что объединение 10 платежей вместе составляет около 25% байтового размера 10 платежей, выполненных по отдельности, что позволяет сэкономить около 75%. Чуть больше можно сэкономить по мере увеличения количества платежей за транзакцию.

Потенциальные проблемы

Несколько месяцев назад биржа биткойнов Kraken увеличила комиссию за снятие средств до 0,0025 BTC (около 7 долларов США в то время); после ряда жалоб клиентов они ввели пакетирование платежей и снизили комиссию до 0,001 BTC (около 2,80 доллара на тот момент).

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

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

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

Использование пакетной обработки транзакций самостоятельно

Для тех, кто часто тратит деньги, таких как обмен, пакетирование платежей может немедленно принести большие дивиденды в виде сэкономленных комиссий за транзакции (или более счастливых клиентов, если экономия будет передана). Это особенно актуально для предприятий, которые уже используют Bitcoin Core или другие полные узлы с аналогичным API. Вместо отправки платежей с помощью RPC `sendtoaddress` вот так:

sendtoaddress 1FjdYJTkdmA2KYvGqRX3G3WJeTFABgUJsJ 1.23
sendtoaddress 194hTHKyJchh6dV8a5Ce5Jd1ENEaxMyKUK 4.56

Вы осуществляете пакетные платежи с помощью RPC sendmany следующим образом:

sendmany ‘’ ‘{« 1FjdYJTkdmA2KYvGqRX3G3WJeTFABgUJsJ »: 1.23,« 194hTHKyJchh6dV8a5Ce5Jd1ENEaxMyKUK »: 4.56}’

Для плательщиков с меньшей периодичностью первый шаг пакетной обработки платежей - это ожидание, пока у вас не будет нескольких разных платежей, которые вы хотите отправить одновременно. Например, вы хотите продлить домен на Gandi.net, купить подарочную карту Amazon.com на Gyft.com и оплатить ежемесячный счет за VPN на PrivateInternetAccess.com. Откройте Bitcoin Core, перейдите на экран отправки и введите адрес и сумму для первого продавца (в нашем примере - Ганди). Затем нажмите кнопку «Добавить получателя»:

Новое введите адрес и сумму для второго продавца, снова нажмите кнопку «Добавить получателя» и введите адрес и сумму для третьего продавца:

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

Реально, сколько места мы могли бы сэкономить?

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

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

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

  • Фактический общий размер всех транзакций: 997 883 байта.
  • Гипотетический размер, если все связанные транзакции в этом блоке были объединены в пакет: 907 839 байт.
  • Сохранено байт: 90 044
  • Экономия в процентах: 9%

На момент написания средняя ставка комиссии за последние 144 блока (один день) составляла 236 сатоши за базовый байт, а цена биткойнов составляла 4550 долларов США, поэтому, если каждый из 144 блоков в среднем за день сэкономил 90 000 байтов, расчетная Доступная экономия составит около 30,58 BTC или 140 000 долларов США в день.

Хотите получать отобранные технические новости о биткойнах? Подпишитесь на информационный бюллетень Bitcoin Tech Talk!