Bandwidth на VIZ

19.11.2018 10:13:09

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

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

В случае VIZ мы сделаем попытку посчитать эту самую пропускную способность. Так как в этом случае, хоть транзакции и бесплатные, но всему есть свои лимит и свои ограничения. И этот лимит упирается в так называемый bandwidth он же газ. И выражать его будем а килобайтах. Любая наша транзакция trx (будь то апвот, пост или перевод монет) занимает место в памяти и это место удобнее считать в килобайтах kB.

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

"max_virtual_bandwidth": "2631334021596621482"

На данный момент размер общей полосы равен очень большому числу 2631334021596621482. Поэтому сразу делим это число на миллион 100000. Или вызываем get_config и находим строчку

"CHAIN_BANDWIDTH_PRECISION": 1000000

Вот на это число нам и нужно поделить max_virtual... получаем 2631334021596.621482
Это число отражает общую полосу выраженную в байтах. Для того чтобы перевести в килобайты нужно просто поделить на 1024.

2631334021596.621482 / 1024 = 2569662130 kB

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

"max_virtual_bandwidth": "3027695749596621482",

Главное сейчас для нас то, что мы научились переводить большое число во вменяемые для понимания килобайты.


Далее переходим к аккаунту, который планирует что-то сделать. И перед тем чтобы что-то сделать блокчейн проверят, а доступно ли ему те самые килобайты, который он планирует использовать. В коде на си++ это место располагается здесь

Наш следующий шаг - найти сколько аккаунт уже потратил байтиков за свою активность. Вызываем и находим строчку

"average_bandwidth": "8263576827"

И тем же путем переводим ее в kB

8263576827 / 1000000 / 1024 = 8.07 kB

То есть я потратил чуть больше 8 килобайт. Но... блокчейн сохранил это действие со времен моего последнего действия на блокчейне

"last_bandwidth_update": "2018-11-18T23:14:06"

и с учетом текущего времени

"time": "2018-11-19T09:16:36"

оно должно быть меньше так как газ восстанавливает. И восстанавливается полностью за неделю. (смотрим в get_config)

"CHAIN_BANDWIDTH_AVERAGE_WINDOW_SECONDS": 604800

7 х 24 х 60 х 60 = 604800 сек

Рассчитываем delta берем текущее время блокчейна и вычитаем время последнего действия. В моем случае получилось 9 часов 52 минуты и 30 секунд

9 x 24 x 60 + 52 x 60 + 30 = 16110 сек

И находим долю восстановленного газа.

(604800 - 16110) / 604800 = 0.973363095

Умножаем на average

8.07 kB x 0.973363095 = 7.855 kB

Вот так считается сколько у меня израсходовано газа на текущий момент и с каждой минутой это значение все меньше и меньше.


"max_virtual_bandwidth": "3899691551196621482",

Уже общая полоса подросла, а мы имеем всего два числа. Это сколько все есть газа для всех и сколько я уже потратил. Осталось выяснить а сколько мне можно еще потратить! И тут начинается дихотомия, ибо мне нужно узнать а сколько на моем аккаунте SHARES. Сейчас там

"vesting_shares": "1035.875493 SHARES"

И сравниваем с

"CONSENSUS_BANDWIDTH_RESERVE_BELOW": 500000000

Делим на 1000000 (CHAIN_BANDWIDTH_PRECISION) и получаем 500 SHARES текущий порог переключения. Что значит порог переключения? А то, что аккаунты с акциями больше 500 и равном считаются по одной формуле, а аккаунты с менее 500 - по другой. У меня больше, значит разберем первую формулу.

Небольшой ликбез по визу. Для того, чтобы аккаунты с небольшой долей в акциях и даже с нулями могли бы хоть что-то делать им отсыпает каждый богач по 10% своих полос пропускания. Другими словами мне с 1000 SHARES доступна только 90% от моей доли сети. 10% настраивается и выставляется делегатами, так же как и минимальный порог переключения. Поэтому на визе делегаты без ХФ способны резко менять экономику и быстро реагировать к примеру на спам сети закручивая гайки для одних ситуаций и наоброт.

Итак... находим

"CONSENSUS_BANDWIDTH_RESERVE_PERCENT": 1000

и делим его на

"CHAIN_100_PERCENT": 10000

Получаем, что делегаты выставили щедрые 10% (0.1), а это значит, что мне доступно только 90% (0.9) от своей доли в акциях

1035.875493 SHARES х 0.9 = 932.288 SHARES

Всего акций

"total_vesting_shares": "23307931.695674 SHARES"

Так что я беру свои 90% акций делю на total и умножаю на общую полосу, которую мы рассчитали в kB

(932.288 / 23307931.695674) x 2569662130 kB = 102783.2585 kB

Это то, что доступно мне в целом и из этого числа нужно вычесть то, что уже потратил... жалкие 7.5 kB. Небольшой комментарий занимает у нас около 0.3 kB так что 340 тыс комментариев вполне могу оставить примерно за час непрерывной работы. А если растянуть на неделю, то просто делим на 7.


А теперь представим, что у меня 0 SHARES на аккаунте и рассмотрим вторую формулу подсчета. Тогда тем у кого менбше порогового лимита доступно 10% (CONSENSUS_BANDWIDTH_RESERVE_PERCENT) от всей сети.

2569662130 kB x 0.1 = 256966213 kB

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

"bandwidth_reserve_candidates": 61

так что делим на всех

256966213 kB / 61 = 4212560 kB

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


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


2
13 наград
0 Ƶ
Отобразить форму комментирования
Комментарии

19.11.2018 15:56:27

Получается что можно не владея существенной долей заспамить весь блокчейн?

20.11.2018 18:17:33

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