# Пропускная способность

# Определение

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

# Описание

Большинство блокчейн проектов заставляют пользователей платить за каждую операцию. Это делает спам экномически невыгодным и, тем самым, ограничивает его. Но VIZ не заставляет пользователей платить. Он использует систему динамичного частичного резервирования. В этой модели блокчейн автоматически подбирает коэффициент резервирования при разной нагрузке. При очередном всплеске активности блокчейн резко понижает пропускную способность каждого аккаунта. А когда всплеск спадает, и в пропускном канале освобождается место, блокчейн медленно увеличивает пропускную способность каждого пользователя.

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

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

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

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

Возьмём пустую банку. Её объём – это размер зарезервированной пропускной способности. Заполним банку наполовину водой – столько занимает одна транзакция. Теперь наденем на банку крышку с маленьким отверстием. Перевернём банку. Через некоторое время из неё вытечет половина воды. Перевернём банку обратно и снимем крышку. Нальём ещё воды объёмом, равным половине объёма банки. У нас осталось свободного пространства в размере четверти от всего объема банки:

1 - (0,5 * 0,5 + 0,5) = 0,25

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

# Чем отличается частичное резервирование от полного

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

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

# Как рассчитывается пропускная способность в VIZ

Перед тем, как читать дальше, обратите внимание на следующую таблицу условных обозначений.

Условное обозначение Единица измерения Описание
Bnew байт Значение скользящего среднего для пропускной способности, которое будет затрачено на данную транзакцию
Bold байт Значение для скользящего среднего уже затраченной пропускной способности
N байт Размер новой транзакции
W секунды Количество секунд в неделе
T секунды Разница между временем, когда была отправлена последняя транзакция, и в данный момент
R процент(%) Процент выделенной пропускной способности для аккаунтов с малой долей в сети. Этот параметр устанавливают делегаты
C целое число Число активных аккаунтов (отправлявших бы одну транзакцию за 30 дней) с малой долей сети
Smax Shares Объём доли конкретного аккаунта
S Shares Объём доли конкретного аккаунта с учётом процента, выделенного для аккаунтов с малой долей сети.
M Shares Объём доли всех аккаунтов
G байт Максимальный размер блока. Этот параметр устанавливается делегатами
K целое число Коэффициент резервирования пропускной способности от 1 до 2000
L целое число Количество блоков, которое будет сгенерировано за неделю
E байт G * L * K – максимальная пропускная способность при данной нагрузке

Примечание: значение R устанавливают делегаты. Они же определяют, какой объём доли считать малым. Кроме того, делегаты могут запретить участникам с малым объёмом доли совершать транзакции.

Для каждого конкретного аккаунта устанавливается лимит пропускной способности (S / M) * Е, то есть пропорционально его доле в сети. Причем, S = Smax * (100% - R), если Smax считается нормальной, и S = M * R / C для аккаунтов с малой долей. Это значит, что часть пропускной способности отнимается от аккаунтов с достаточным стеком и распределяется среди аккаунтов с малой долей в сети. Если Bnew превысит зарезервированное значение, то аккаунт не сможет отправить новую транзакцию. В свою очередь, Bnew вычисляется по следующей формуле:

Bnew = MAX(0, (W - T) * Bold / W) + N.

Из формулы следует, что, чем больше времени прошло с последней транзакции, тем меньше будет Bnew, и, если последняя транзакция происходила семь дней назад, то MAX(0, (W - T) * Bold / W) = 0, а Bnew = N.

# Наценка на безграничные транзакции

Многие транзакции в VIZ ограничены в количестве информации, которую можно в них уместить. Например, при отправке перевода можно указать лишь количество токенов и заметку, размером не превышающую 2 Кбайт. Но есть и другой тип транзакций - например, custom-транзакция. В ней основная информация может быть записана её отправителем в вольной форме. Размер данных в таких транзакциях почти не ограничен.

На такие безграничные транзакции система может делать наценку на некоторый множитель X(всё зависит от решения делегатов), тогда формула для Bnew будет иметь следующий вид:

Bnew = MAX(0, (W - T) * Bold / W) + N * X

# Как VIZ определяет коэффициент резервирования

Каждый раз, когда скользящее среднее размера блока больше, чем 25% от максимального размера блока G, блокчейн уменьшает К в два раза. Когда нагрузка спадает, блокчейн снова увеличивает K, прибавляя единицу каждую минуту. Снижение K в два раза гарантирует, что аккаунты, использовавшие меньше 50% от предыдущей зарезервированной пропускной способности, не будут задеты, если нагрузку не вызвали держатели очень большого стека.

Формула расчета нового значения среднего скользящего для размера блока:

Anew = (99 * Aold + Q) / 100

Условное обозначение Единица измерения Описание
Anew байт Новое значение скользящего среднего для размера блока
Aold байт Последнее значение скользящего среднего для размера блока
Q байт Размер нового блока

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