Получается что можно не владея существенной долей заспамить весь блокчейн?
Bandwidth на VIZ
Пропускная способность аккаунтов на визе организовано немного специфично и имеет ярко выраженные отличия от блокчейнов стимита и голоса.
Небольшой ликбез, графеновские блокчейны имеют бесплатные транзакции, тогда как биткойн, эфир и другие наоборот... там за каждое действие необходимо платить. Это два совершенно разных подхода к организации, преимущества и недостатки есть и там, и там.
В случае 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 мегабайт. Хотя по исходным рассчетам был еще запас. Скорее всего виз чувствителен к записям в блок и реагирует на уменьшение общей полосы пропускания, когда записывается в блок подряд более чем половина от максимального возможного. А я тогда не следил за общей полосой от слова совсем. Поэтому можно еще через неделю провести два эксперимента. В одном происходит транзакции по мнимуму, чтобы не влиять на общую полосу, в другом забивать все блоки максимально.