Найти тему
Навеяло ...

Распределение адресов биткоина. В чем подвох?

Оглавление
Пространство биткоин
Пространство биткоин

Занявшись игрой в бесплатную лотерею по поиску бесхозных кошельков и, наблюдая за процессом генерации ключей, навеяло мне попробовать поймать красивые по написанию адреса. Благо встроенная в WINDOWS утилита FINDSTR шустро с этим справляется с миллионами строк.

Забил я, значит, для прикола пару команд в батник:

findstr /c:" 1BTC" adr.txt >>1btc.txt
findstr /c:" 1RUS" adr.txt >>1btc.txt

И ...

Результат меня нехило озадачил.

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

На выходе же, после парсинга нескольких миллионов сгенерированных адресов, я получил такую картину:

фрагмент скриншота результата
фрагмент скриншота результата

На каждые 20-30 найденных адресов начинающихся с "1BTC" приходится всего пара адресов "1RUS". Это соотношение появлялось много раз в разных выборках, и практически не зависит от количества - хоть миллион проверишь, хоть миллиард.

Сие показалось мне сильно странным, и я было подумал, что дело в некачественном генераторе. Я попробовал другие в интернете - результат тот же.

И тогда я решил выяснить полное распределение, так сказать, по алфавиту.

С помощью встроенной в ту же винду утилиты FIND я пропарсил свежесгенерированный миллион адресов по каждому из 58 символов, используемых в base58 от 1 до z.

find /C adr.txt " 11" >> Letter.txt
find /C adr.txt " 12" >> Letter.txt
...
find /C adr.txt " 1y" >> Letter.txt
find /C adr.txt " 1z" >> Letter.txt

команда просто подсчитывает количество совпадающих вхождений в массиве.

Итог потрясающий ...

начало адреса : количество

  • 11 : 3810
  • 12 : 43322
  • 13 : 42678
  • 14 : 42911
  • 15 : 43154
  • 16 : 43271
  • 17 : 43671
  • 18 : 43378
  • 19 : 43612
  • 1A : 43758
  • 1B : 43428
  • 1C : 43946
  • 1D : 43641
  • 1E : 43469
  • 1F : 43664
  • 1G : 43508
  • 1H : 43278
  • 1J : 43281
  • 1K : 43695
  • 1L : 43728
  • 1M : 43569
  • 1N : 43404
  • 1P : 43297
  • 1Q : 15240
  • 1R : 712
  • 1S : 736
  • 1T : 756
  • 1U : 751
  • 1V : 746
  • 1W : 746
  • 1X : 782
  • 1Y : 733
  • 1Z : 739
  • 1a : 768
  • 1b : 770
  • 1c : 776
  • 1d : 729
  • 1e : 694
  • 1f : 671
  • 1g : 719
  • 1h : 737
  • 1i : 789
  • 1j : 760
  • 1k : 717
  • 1m : 762
  • 1n : 774
  • 1o : 757
  • 1p : 707
  • 1q : 758
  • 1r : 723
  • 1s : 760
  • 1t : 741
  • 1u : 772
  • 1v : 772
  • 1w : 720
  • 1x : 737
  • 1y : 730
  • 1z : 743

Оказалось ...

Никакого равномерного распределения НЕТ!!!

Если бы оно было, то каждому символу после первой единицы (я исследовал только генераторы адресов Legacy) отводилась бы доля примерно в 100/58=1,724%

А здесь адреса, начинающиеся с 11 занимают лишь 0,38%, адреса с 1A по 1P приблизительно по 4,3%, с 1r по 1z и вовсе лишь по 0,07%. И лишь 1Q занимает 1,5%, что самое близкое значение к тому равномерному 1,7%.

Не поверил. Пропарсил ещё миллион, два, пять, двадцать - то же самое ...

ЧТО ЭТО?!?!?

Распределение адресов Legacy (еще нагляднее графически)
Распределение адресов Legacy (еще нагляднее графически)

Коллизия генераторов ключей?

Чтобы выяснить это, я решил проверить на ту же "вшивость" распределение уже существующих в блокчейне биткоина адресов Legacy.

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

Результат тот же!!!

Выходит, неравномерность распределения заложена изначально в алгоритм ещё видимо Сатоши Накамото или теми, кто за этим именем скрывается.

Зачем? Почему? Какова математика всего этого?

Расскажите в комментах, кто в курсе.