В процессе обсуждения этой темы, иногда появляются интересные мысли, которые приводят к улучшению первоначальной идеи или её дополнению. Поэтому все самые свежие дополнения и улучшения, будут появляться здесь и иметь самую актуальную версию.
Также в процессе разработки этого алгоритма, я на определенном этапе пришел к выводу о его неработоспособности, но в дальнейшем нашел решение.
Именно с места, где я и нашел решение, я и предлагаю Вам обсуждать данный алгоритм.
В общем придумал, как мне кажется довольно необычный алгоритм консенсуса, который является POS, но работает, как POW.
Я его назвал POSm (Proof of similarity, доказательство сходства).
Я уже в других своих постах высказывался о мысли, что в алгоритмах POS и POW над безопасностью не работает вся сеть, там само доказательство находиться состязательным методом или кто выиграл или кто нашел первым нужный хеш. Я же ставлю цель чтобы работала вся сеть и именно этот алгоритм это и будет делать.
Начну сразу с примера, как он работает. Пусть у нас есть хеш предыдущего блока (как получается этот хеш я рассказу ниже, а сейчас примем, что он просто есть).
И так есть хеш:
3D8293BD4DA72B5437F9B4810B991870145AD443686CF2DDD7B6C16E4F3A4655
В этом консенсусе может учавствовать любой адрес, на котором есть хоть какая-то сумма денег.
Пусть у нас находятся следующие адреса, содержащие любое количество денег на них:
3D8293BD4DA72B5437F9B481E85605A82F82AE07D25F57818AEF65E2243AB5D1
3D8293BD4DA72B54B2284D6B0F3C1368A74D57B1A5A390C8E84540751FB5E51C
3D8293BD4DAA1E21366E4638ED6CC90C8F2702E340B1D9AD0E7FAA0D17BE5D9
3D82936A648A463A27D20E28B1674B68A7CAB351FFCE01A88A00F84A84824505
3D989C378E86086DC3FD6E528D4ED4D7B31B68E6DF3C5D787451E935DECA3020
3082B0DCBF7B2BA5CB6BC4CAABE6A157B1FA3B862FC21C33DB51CEA53B176E06
Все эти хеши у которых есть совпадения, называются майнинговыми хешами. И так вы видите, что у этих адресов есть совпадения с нашим хешем. Для первого адреса совпадение равно 24, для второго 16, для третьего 11, для четвертого 6, для пятого 2 и для шестого 1.
Каждый адрес из реестра стейкинга при наличии хотя бы одного совпадения может из мемпула взять некоторое количество транзакций и создать подблок текущего блока, либо присоединить транзакции к уже существующей группе подблоков от других майнинговых хешей и также создать новый блок.
У каждого блока есть сумма числа совпадений. Условно, если блок создал только первый адрес с 24 совпадениями, то сумма числа совпадений всего блока будет только 24. Если же к этому блоку добавил свои транзакции второй адрес с 16 совпадений, то сумма числа совпадений увеличивается до 40. В реальности же используется шестнадцатеричная сумма, в дальнейшем Вы увидите почему и как это работает.
Структура блока и его лимиты.В самом блоке мы вводим лимиты на количество майнинговых хешей. Их может быть только до 16 каждого порядка.
Как пример, в блоке могут быть максимально:
- 16 майнинговых хешей с 1 совпадением.
- 16 майнинговых хешей с 2 совпадением.
- 16 майнинговых хешей с 3 совпадением.
...
- 16 майнинговых хешей с 64 совпадением (64 это количество всех символом в хэше sha3_256).
Таким образом в блок может поместиться теоретический максимум 16*64=1024 майнинговых хеша (каждый такой хеш можно считать отдельным майнером, который имеет право смайнить свой подблок). Однако это не достижимый максимум, сейчас у биткоина может быть до 20 совпадений за 10 минут.
Это если хотите упорядочивание.
И так представьте у нас в сети есть всего 100000 хешей. Пусть на них всех расположена какая-то сумма денег, дающая право майнить. Для создания текущего блока сейчас актуальны только 6.25% (это 1/16) майнинг-хеша (данное число варьируется возле этого значения) от всего этого количества.
Всего 100000 хешей.
Из них для создания идеального текущего блока задействовано:
- Количество майнеров 5865 по 1 совпадений.- Количество майнеров 338 по 2 совпадений.
- Количество майнеров 24 по 3 совпадений.
- Количество майнеров 2 по 4 совпадений.Общее количество задействованных майнеров равно 6229, что составляет 6.22% от общего количества хешей.
Общая сумма совпадений для данного идеального блока равна 6621.
И так посмотрите внимательно, на то, что я выделил жирным.
Там, где у нас будет 4 совпадения с хешем, то таких майнеров будет всего 2. У них нет конкуренции вообще, так как теоретический максимум в блоке это 16, а здесь всего 2. Таким образом подблоки от данных майнеров будут во всех версиях форков текущего блока.
А теперь обратите внимание на количество майнеров только с 1 совпадением, их там 5865. В блок может максимально влезть только 16. Значит начнется плодиться огромное количество форков.
Как же бороться с этим огромным количеством форков.
А очень просто, надо считать шестнадцатеричную сумму всего блока и там, где эта сумма больше, тот блок и приоритетнее.
Чтобы не считать и не пугать Вас вычислениями, я просто приведу простой пример, для 2 условных блоков с одинаковыми двумя и тремя совпадениями, но разными совпадениями по одному хешу.
Блок1:
1 хеш с 3 совпадениями
1 хеш с 2 совпадениями
074171aa91173bc50bed9e83d8712b6d1615ec99f5bc4cea7e551dcb698594c3
0fb21e4d8afd3cf7459de7e419025d69990759f33d38dbe6f009c260b6b40fc9
Блок2:
1 хеш с 3 совпадениями
1 хеш с 2 совпадениями
0a65290fea13aba62e02f7612ae83dfca6dd0f8884c53a50c10ea6b0f75d157a
0f397cafea91906cf8d74cad84feb2a5d36cb3edef6f202de7356f298144aaf1
И так Вы видите 2 блока и нам надо понять, какой блок приоритетнее. Для этого нам надо уметь вычислять приоритеты именно для одиночных хешей в данном случае, так как отличии идет только по ним.
Тут мы применим следующую хитрость. Мы превратим их в дробные шестнадцатеричные числа, а целое число будет определяться по количеству совпадений, в данном случае у нас у всех этих хешей только 1 совпадение, поэтому получим следующие шестнадцатеричные дробные числа.
Блок1:
0.74171aa91173bc50bed9e83d8712b6d1615ec99f5bc4cea7e551dcb698594c3
0.fb21e4d8afd3cf7459de7e419025d69990759f33d38dbe6f009c260b6b40fc9
Блок2:
0.a65290fea13aba62e02f7612ae83dfca6dd0f8884c53a50c10ea6b0f75d157a
0.f397cafea91906cf8d74cad84feb2a5d36cb3edef6f202de7356f298144aaf1
Видите мы у всех хешей первый символ, сделали целым числом (в нашем случае это ноль), а остальное вынесли в дробную часть.
Теперь нам надо сложить получившиеся шестнадцатеричные числа внутри Блока1 и Блока2 и сравнить их между собой. Для этого используем
Калькулятор.
Сложение для Блока1:
0.74171aa91173bc50bed9e83d8712b6d1615ec99f5bc4cea7e551dcb698594c3 + 0.fb21e4d8afd3cf7459de7e419025d69990759f33d38dbe6f009c260b6b40fc9 = 1.6F38FF81C1478BC518B8667F17388D6AF1D468D32F528D16E5EE02C2039A48C
Сложение для Блока2:
0.a65290fea13aba62e02f7612ae83dfca6dd0f8884c53a50c10ea6b0f75d157a + 0.f397cafea91906cf8d74cad84feb2a5d36cb3edef6f202de7356f298144aaf1 = 1.99EA5BFD4A53C1326DA440EAFE6F0A27A49C37674345A7EA84415DA78A1C06B
И так если посмотреть, то получилось, что у Блока2 сумма вышла больше, чем у Блока1. Значит, теперь все ноды при выборе текущего блока будут отдавать приоритет версии Блока2, а Блок1 станет не актуальным.
Именно таким способом, находя уже всю шестнадцатеричную сумму текущего блока и можно выявить блок с максимальной суммой, среди огромного количества форков текущего блока.
Формирование меток времени у блока.
Метки времени определяются от подблока майнера-лидера, то есть того подблока хеш которого имеет на текущий момент максимальное количество совпадений.
Так вот его время не должно быть раньше времени предыдущего блока, а время предыдущего блока определяется временем последнего самого позднего подблока в том блоке.
И так, время первого подблока текущего создаваемого блока имеет диапазон не раньше времени предыдущего блока и не позже, чем текущее время.
Теперь время следующего присоединяемого подблока будет в диапазоне не раньше времени первого подблока этого блока и не позже, чем текущее время.
И так все присоединяемые блоки, где будет диапазон не раньше последнего подблока и не позже текущего.
Каждый майнер, что присоединяет свой подблок и формирует текущий блок, считает, что его подблок последний, а потому всему текущему блоку присваивает и время своего подблока.
Виды майнинга.Теперь давайте разберем сам майнинг, он здесь 2-х видов: пассивный и активный.
Пассивный майнинг. Тут всё просто, не надо прикладывать каких либо усилий и наращивать мощность вычислений, как в POW, чтобы пытаться перезаписать хеш предыдущего блока и получить преимущество в построении текущего блока. Такой майнинг доступен всем участникам, ведь достаточно лишь одного совпадения хеша предыдущего блока с вашим адресом, на котором есть минимальная сумма для майнига и вы можете создавать свой подблок отдельно или добавляя к уже другим подблокам, участвуя в построении текущего блока.
Теперь про активный майнинг. Основная суть активного майнинга это вставить свой подблок в конец блока и тем самым создать конечную версию текущего блока или сразу своим подблоком создать блок. В обоих этих случаях речь идет о контроле хеша создаваемого блока. Этот контроль нужен для того, чтобы на вновь создаваемом блоке уже иметь преимущество по совпадению у своего майнинг хеша. Скажем благодаря вычислениям по подбору хеша, Вы подобрали хеш блока таким образом, что при строительстве следующего блока имеете уже хеш скажем с 15-20 совпадениями и к нему начинают присоединяться другие майнящие хеши.
Активный майнинг делится на 2 вида: синергетический и эгоистичный.
Активный синергетический майнинг - Вы просто присоединяете свой подблок к концу предыдущего блока или заменяете последнего майнера с одним совпадением. Главное, что основную часть майнеров вы не убираете из предыдущего блока и даете им заработать.
Активный эгоистичный майнинг - это когда вы полностью пересчитываете предыдущий блок только на свой подблок с ещё большим числом совпадений, чтобы только ваш подблок создавал предыдущий блок, забирал полностью награду себе и получал в текущем блоке свой подблок уже с преимуществом. Данный вид майнинга будет наиболее сложным по вычислениям, так как надо просчитать предыдущий блок и получить большее число совпадений, а также успеть в текущем блоке получить свой подблок с наибольшим числом совпадений, чтобы тем самым совершить форк последних двух блоков: предыдущего и текущего.
Регулирование минимальной суммы блока для его создания.Минимальная сумма блока для его создания, это аналог сложности в POW. Только сеть будет строить текущий блок из подблоков, пока сумма всего этого блока не станет равной или больше определенного числа (минимальная сумма блока). Как только минимальная сумма блока станет равна или больше заданному значению, то сеть начнет строить следующий блок.
В процессе размышления пришел к выводу, что это число вообще можно сделать минимальным, хоть 1.
Оно будет работать следующим образом. Вначале набирается статистика из 10 и более блоков и анализируется среднее время создания каждого блока.
Теперь на каждом новом созданном блоке, исходя из расчета среднего времени создания блока будет делаться следующие:
- Если среднее время создания блока меньше 3 минут, то минимальная сумма блока увеличивается на 10%.
- Если среднее время создания блока больше 3 минут, то минимальная сумма блока уменьшается на 10%.
Теперь сама сеть сможет полностью регулировать и адаптироваться под изменяющиеся условия сети.
А теперь давайте посмотрим, как мой алгоритм соответствует схожести в работе с алгоритмом POW:
- Сложность. В нашем случае это минимальная сумма, которую должен набрать текущий блок, чтобы можно было строить следующий блок. Данная сумма, как и в POW адаптивна и пересчитывается на каждом блоке, где при высокой скорости она на каждом блоке увеличивается на 10%, а при медленной скорости, наоборот уменьшается на 10%.
- Выбор цеопочки блоков с максимальной сложностью у POW, а у меня же это выбор цепочки блоков с максимальной суммой блоков.
Таким образом соблюдая данные принципы, я могу утверждать, что мне удалось создать POS, как алгоритм, который работает и также надежен, как и POW.