Pull to refresh
0

Как я писал свою криптовалюту

Reading time 15 min
Views 44K
3 года назад у меня появилась мысль создать свою криптовалюту. От биткоина решил взять идею с нодами и блокчеином.


Я решил сделать привязку каждой ноды к человеку. Каждый, кто хочет стать майнером, должен заснять на видео своё лицо и сделать фото. При проверке сранивается фото и видео, чтобы убедиться, что лицо одно и то же. Видео нужно только потому, что подделать его практически невозможно, в отличие от фото.
На фото нужно нанести точки в определенные части лица, чтобы при поиске по БД сравнивать пропорции.
Проверяют это всё майнеры, которые ранее уже прошли такую проверку. В итоге нужно набрать 10 положительных голосов и менее 10 отрицательных в течение суток.
Всё это происходит путем рассылки транзакций и блоков между нодами, никаких центральных серверов нет. Все фото/видео находятся в паблике.

Если подкупить 10 майнеров, чтобы они проголосовали за Вас, то это не будет гарантией, что Вы станете майнером, т.к. остается шанс поймать 10 минусов.

Также предусмотрен запасной вариант, когда клоны уже проникли в DC-сеть. В этом случае на них кто-то должен отправить транзакцию с жалобой (ParseData->abuses()). Тогда админ, т.е. я, получает право отправить транзакцию, которая переведет данного майнера в ряды простых пользователей.
Всего админу доступно 11 типов транзакций, все они обрабатываются методами из ParseData:
admin_1block — Обработка самого первого блока.
admin_add_currency — Добавление новой валюты. Сейчас там не все нац валюты, а только основные.
admin_answer — Ответ на баг-репорт.
admin_ban_miners — Перевод майнеров из майнеров в юзеры, если на него была жалоба. При этом всё, что успело найманиться остается в распоряжении пользователя.
admin_message — Короткое сообщение, которое показывается в интерфейсе.
admin_blog — На будущее, вдруг нужно будет сообщить что-то, что не влезет в короткое сообщение.
admin_new_version — Заливка новой версии.
admin_new_version_alert — Выдает алерт в интерфейсе, что нужно обновиться.
admin_spots — Всё для поиска клонов — наборы точек, совместимость версий точек, из каких точек составляем отрезки, допустимые расхождения.
admin_unban_miners — Перевод разжалованного майнера обратно в майнеры.
admin_variables — Переменные, в БД таблица variables. Потом планирую сделать константами.

Я сразу перечислил все возможности админа, чтобы ни у кого не возникало вопроса — а может ли админ заблокировать аккаунт с деньгами? Нет, не может, максимум, что разрешено админу, — это понижение привилегий у аккаунта без затрагивания находящихся на аккаунте средств (admin_ban_miners).

Обозначения


Само слово miner (в переводе шахтер) наверное не очень подходит для обозначения пользователя с повышенными привилегиями. Но исторически сложилось, что у меня везде используется miner.

Порядок генерации блоков


Все ноды делятся на уровни в зависимости от текущего хэша заголовка (node_id,block_id,prev_head_hash).
Нод, который находится на 0-м уровне, определяется методом testblock->get_block_generator_miner_id()
Если, например, сейчас на 0-м уровне нод ID 12689, то на 1-м уровне будут ноды 12690-12691, на 2-м — 12692-126995 и т.д.
Если нод на 0-м уровне не смог сгенерировать блок, то в работу включаются ноды 1-го уровня, если и они не смогли, то 2-го и т.д.
Т.е. злоумышленник не сможет сделать так, чтобы блок генерировали именно его ноды.

Генерация монет


Теперь у нас есть ноды, за каждой из которых закреплен один живой человек. Можно было бы просто раздать по X монет каждому майнеру. Но мне почему-то эта идея сразу не понравилась, как потом выяснилось, не зря. Вот пример того, что могло бы произойти — habrahabr.ru/post/217111 и далее — coinmarketcap.com/aur_90.html.
Еще у меня из головы не выходила мысль о том, что если Dcoin станет популярен, то с ним могут начать бороться власти путем введения санкций против бирж. Нужен был механизм, который позволял бы существовать Dcoin без бирж, банков и прочих посредников.
Да, кстати, Dcoin — это сокращенно от Democratic Coin, оно же — DC.

Решение оказалось довольно простым. Нужно совместить раздачу монет с функцией обмена Dcoin на наличные. Для этого мне понадобилось скопировать основные валюты в Dcoin. Я просто прибавил букву D к 3-х буквенному коду валюты. Получилось DUSD, DEUR, DRUB и т.д.
Если майнер хочет купить, например, 1000 DUSD, то он отправляет в DC-сеть транзакцию, в которой указано, что он хочет купить 1000 DUSD за 1000 USD. Но желающих продать DUSD может не быть. Майнер должен быть готов ждать неопределенный срок, пока найдется продавец DUSD.

Теперь, у нас есть, например, 100к записей в нашей распределенной БД о том, что майнеры готовы купить DUSD на 100 млн. $. Осталось создать DUSD. Все, наверное, подумали о премайне. Но я не верю, что кто-то захочет заплатить мне $ за какие-то там DUSD, поэтому сразу нет. Да и вместо премайна было бы логичнее просто раздать монеты.

Я решил начислять на счет майнера DUSD за то, что майнер ждет, пока кто-то захочет продать ему DUSD.
Начисляются DUSD по следующей формуле:
nDUSD = bDUSD*((1+K)^T)-bDUSD
где nDUSD — новосозданные DUSD, bDUSD — сумма DUSD, которую майнер готов купить, K — коэффициент, про который напишу ниже, T — время в секундах.
Т.е. чем больше DUSD готов купить майнер и чем дольше он ждет, пока ему их кто-то продаст, тем больше новых DUSD создается и начисляется ему на счет.
В исходниках эта формула находится в методе ParseData->calc_profit(). calc_profit включает еще несколько параметров, но если начну описывать и их, то будет слишком занудно и длинно. Но если кому-то интересно, то напишу.

Коэффициент К


Это очень важный коэффициент, т.к. от него зависит эмиссия. Я долго думал, каким его сделать, к каким параметрам привязать. Ведь он не должен поддаваться накрутке. Самым демократичным вариантом оказался тот, где этот коэффициент определяют сами майнеры данной валюты путем голосования. Для удобства, в интерфейсной части коэффициент К отображается как %/год. Допустимые значения от 0 до 1000%/год. В исходниках ParseData->votes_complex(). Майнер может голосовать только за те валюты, которые были добавлены у него более чем $variables['min_hold_time_promise_amount'] секунд назад. Для защиты от атак клонов, чтобы они не смогли дестабилизировать сеть своими голосами.
Пересчет голосов и обновление коэффициентов делается каждые $variables['new_pct_period'] секунд. Сейчас там 2 недели.

Теперь у нас в распределенной БД есть не только обещания майнеров купить 100 млн. DUSD, но и их голоса за скорость эмиссии, т.е. за коэффициент К. И через какое-то время на счетах майнеров начнут появляться первые DUSD.

Получается, что обычный майнер должен просто указать, что он готов отдать 1000$ за 1000 DUSD, и если по результатам голосования будет выбрано, например, 900%/год, то через месяц у него будет +200 DUSD, а через год +9000 DUSD, которые эквивалентны 9000$.
Но я не рекомендую заигрываться с верхними пределами коэффициента. Про последствия будет написано ниже.

WOC


По аналогии с ru.wikipedia.org/wiki/Wocu я сделал WOC. Она начисляется каждому майнеру, её нельзя обменять на наличные у другого майнера. Её можно переводить с кошелька на кошелек. По идее, WOC должна заменить доллар на пьедестале мировой валюты.

Биржи


Если они будут — хорошо, но если их запретят — то не страшно. В крупных городах, я думаю, предпочтение майнеров будет отдаваться встроенному механизму обмена, ведь он переводит валюту Dcoin сразу в наличные деньги.

Географические и национальные ограничения


Возможно большинство майнеров будет против того, чтобы майнинг их национальной валюты происходил где-то за пределами их страны или валютного союза, либо захотят, чтобы майнеры находились только в крупных городах. По-этому при добавлении какой-либо валюты майнеру нужно будет записать видео, в котором он будет говорить на своем национальном языке, что-то вроде: «Я обещаю отдать 100 норвежских крон за 100 DNOK». Далее нужно будет указать страну и отметить точку на карте. И запрос должны будут утвердить 10 майнеров, у которых майнится Норвежская крона. Возможно майнеры DNOK введут правило, по которому новые майнеры DNOK должны будут снять видео на фоне какого-нибудь известного памятника в крупном городе Норвегии.

Инфляция


Я не знаю, как поведут себя майнеры и за какой коэффициент они будут голосовать. Но не исключен такой сценарий, когда, например, DUSD будет создано больше, чем нужно рынку. Если DUSD будет торговаться на биржах, то курс упадет ниже 1:1, т.е. за 1 DUSD будут давать, например, 0.9 USD. В этом случае майнеры должны проявить сознательность и уменьшить общую массу DUSD. Путем того же голосования. Например, >50% проголосуют за уменьшение на 10% и в БД вместо 100 млн. DUSD у всех станет 90 млн. DUSD (ParseData->reduction()), что, скорее всего, вернет курс на 1:1.
Также майнеры могут проголосовать за изменение максимальной обещанной суммы и за количество валют, которые могут майниться вместе (ParseData->votes_complex()).

upd. Если общий объем обещанных сумм станет меньше объема созданных монет какой-либо валюты, тогда запустится автоматическое сокращение объема монет проблемной валюты на 10%.

Простые пользователи


Кроме майнеров есть еще простые пользователи. Для них не нужно ни фото, ни видео, они полностью анонимны. Они могут только принимать и отправлять монеты Dcoin. Держать свою ноду пользователю не нужно. Он может просто отправлять свои транзакции на любую ноду в DC-Сети.
Майнеры могут проголосовать за то, чтобы монеты простых пользователей росли на их кошельках. Например, на 30%/год. Т.е. простой пользователь может купить на бирже какое-то кол-во DUSD, например 10к, и через год у него будет 13к DUSD. Я не знаю, нужна ли такая фича, если не нужна, то майнеры могут просто держать % для пользователей равным нулю, и ничего расти не будет.

Новые пользователи


С этим тоже пришлось помучиться. Ведь если дать возможность слать транзакции с регистрацией новых пользователей всем подряд, то кто-то возьмет да сгенерирует 1млрд транзакций и захламит всю DC-сеть. Вначале сделал с инвайтами, но выяснилась проблема — транзакцию с регистрацией, в которой указан инвайт, можно перехватить и использовать инвайт самому. Поэтому транзакцию с регистрацией нового пользователя может отправлять только майнер и не более $variables['limit_new_user'] за $variables['limit_new_user_period'] секунд. Сейчас там 2 за месяц.

Защита от хищения праймари ключа


К аккаунту можно прикрепить до 3-х праймари ключей. Это значит, что для принятия DC-сетью любой Вашей транзакции будет требоваться 3 подписи. Один ключ Вы можете хранить у себя, два других, например, на каких-нибудь сторонних сервисах, которые будут подписывать Ваши транзакции только если Вы введете смс-код.

Пара слов о процессе разработки


То, что уйдет 3 года, я не представлял даже в самом страшном сне. Я думал управиться за несколько месяцев. По этой же причине писал на том языке, который знал на более-менее приемлемом уровне. Если бы вернуться в прошлое на 3 года, то, наверное, использовал бы C++.
Первые 2 с половиной года работал по вечерам и выходным, что жутко раздражало, но полгода назад избавился от работы, которая мешала, и стал уделять всё время Dcoin. Последние 3 месяца по 10-16 часов в сутки искал и исправлял баги. Думал, максимум месяц — и багов не будет, а нет — 3 ушло.
Очень много тонкостей работы Dcoin я не описал, т.к. иначе получится слишком длинная статья, которую будет сложно читать. В Dcoin 41 тип транзакций, методы, которые их обрабатывают, находятся в классе ParseData. Пишите вопросы, всё поясню.
Комментарии в исходниках сожержат множество ошибок и опечаток, потом обязательно подчищу. Код написан, скорее всего, не очень грамотно, но главное, что всё работает.

Установка


При установке требуется приватный ключ. Его можно взять либо тут, либо у какого-нибудь майнера.
Установка простая и занимает около 2-3 минут. Чтобы акканут не занял кто-то другой, нужно сразу сменить ключ.
Можно использовать пока только на 32-х битных ОС. Нужно переписать пару функций, в частности pow, и будет совместимо и с 64-х битными.
На тестах использовал простые ВПС с 512 ОЗУ и 700Mhz CPU, на первое время таких мощностей будет вполне достаточно.
Нужен apache или nginx, PHP >5.2.4, Mysql >5.0.
Если будете ставить на win, то лучше используйте nginx, я тестировал с winginx.

upd
По просьбам в комментариях написал описание установки:
Для win
1. Устанавливаем winginx.com/ru/download
2. Создаем проект в Winginx Workbench
3. Скачиваем github.com/c-darwin/dcoin/archive/master.zip
4. Распаковываем в директорию сайта
5. Создаем БД в pma: localhost:81/
6. Заходим на localhost/dcoin-master/index.php
7. php_path, скорее всего, будет такой — C:\Winginx\php5\php.exe
8. Следуем инструкции по установке

Чтобы проапгрейдить аккаунт до майнерского нужно будет открыть 80-й порт для входящих соединений.

Для nix
1. Если не установлены, то устанавливаем nginx, PHP >5.2.4, Mysql >5.0, создаем БД
2. Скачиваем github.com/c-darwin/dcoin/archive/master.zip
3. Распаковываем в директорию сайта
4. Заходим по ip_сервер/dcoin-master/index.php
5. Следуем инструкции по установке

Чтобы проапгрейдить аккаунт до майнерского нужно будет открыть 80-й порт для входящих соединений.

upd1
Было крупное обновление исходников — теперь есть автоматическое уменьшение объема Dcoin.

upd2

Развернутые ответы на вопросы, заданные в комментариях


Подделка видео


А что если взять да сгенерировать в каком-нибудь софте видео-ролики, затем зарегать 100500 майнерких аккаунтов, уничтожив Dcoin на корню? Или нанять гримеров, которые будут создавать тысячи новых лиц в сутки?
За небольшие деньги такое возможно только в научной фантастике. Чтобы не быть голословным, я буду приводить пруф-линки.

Компьютерная подделка


Минимальная цена создания одного такого видео будет от 2000$, хотя некоторые специалисты утверждают, что для достижения более-менее приемлемого уровня реалистичности нужно от 1 млн$ за каждый ролик. Пруф

Профессиональный грим


Если взять, например, одного человека и 50 раз его загримировать и разгримировать?
Звучит довольно просто, но на деле такое удовольствие обойдется от 100k$ до 285k$ за 50 гримов. Пруф
В студии Петра Горшенина, где мне озвучили сумму в 285k$, процесс описали вот так:
«Нужно снять форму с человека, отлить модель его лица. Потом изготовить модели частей лица столько, сколько будет разных деталей, примерно 5(отдельно лоб, нос, подбородок и две скулы). Далее на них делаются скульптуры изменений из пластилина. Потом с этого опять снимаются формы, в которых будут отливаться сами детали из силикона. И все это 50 раз за исключением первого снятия формы с человека.»

Про возможность возникновения «ферм»



Скорее всего, рано или поздно, возникнут «Фермы», где ушлые дельцы будут платить по 10-20$ за полную регистрацию аккаунта с добавленной обещанной суммой и оффлайн проверкой. Но если такие хитрецы появятся, значит прибыль, которую они будут получать с каждого такого аккаунта, будет не менее нескольких сотен долларов. Если кто-то отправит на такой серый аккаунт запрос на обмен Dcoin на указанную там обещанную сумму, то владельцу такой фермы будет совершенно не выгодно получить заморозку роста монет по его обещанным суммам. Ведь полученные Dcoin можно без проблем продать на бирже. И ему придется отдать обещанную сумму в обмен на такое же кол-во Dcoin. Т.е. такая ферма, по сути не будет отличаться от группы простых майнеров, единственное, что все сливки будет получать один человек.
Но больших объемов у таких ферм не будет. Т.к. при выявлении первой такой схемы будет добавлено правило записи первого ролика, в котором будет говориться, что нужно на камеру показать лист бумаги, на котором написано «с правилами на сайте democratic-coin.com согласен». Большинство из любопытства зайдут на сайт, чтобы узнать, с чем таким они согласны. А на сайте будет написано, что продавать аккаунт за 10-20$ крайне не выгодно, гораздо выгоднее этот аккаунт использовать самому.

А что если поехать в глухую провинцию Индии, где у 85% населения нет интернета, и снимать там людей в студии?
Опять же, получится ферма, которая не будет оказывать серьезного негатива, т.к. владельцу фермы будет невыгодно игнорировать запросы на его обещанные суммы.
Но не спалить такую ферму будет гораздо сложнее, т.к. пройти оффлайн проверку и затеряться в крупном городе не получится, а значит придется притворяться жителем каких-то мелких городов, где еще не набралось 25 майнеров. А все такие города будут тщательно проверяться админом. Останется найти схожие элементы на видео и отправить запросы с просьбой снять новое видео.

Само существование ферм предполагает, что Dcoin уже развился и каждый майнерский аккаунт является источником постоянной прибыли. А владельцы таких ферм получают сверхприбыли, пользуясь неосведомленностью обывателей. Этот факт не сможет долго оставаться незамеченным и рано или поздно попадет в СМИ. И все эти неосведомленные очень быстро станут осведомлены, что выгоднее самому стать майнером, тем более, для этого к тому времени, возможно, не нужен будет даже компьютер, достаточно один раз зарегистрироваться в каком-нибудь интернет-кафе и дальше использовать мобильный телефон как у 37coins.

Песочница для новых майнеров


Просто так взять и заполонить DС-сеть ботами-майнерами невозможно, потому что новый майнер может зарегистрировать новых юзеров не раньше, чем через один месяц. И в месяц можно регистрировать не более 2-х юзеров. Голосование и обмен на наличные новым майнерам также становятся доступны только через месяц.

Сутки на проверку


А что если где-то достать 10 аккаунтов и ставить по 10 плюсиков своим ботам?
Из этого ничего не получится. Т.к. голосование не может быть завершено ранее, чем через 24 часа от появления транзакции в DC-сети. И если за это время претендент соберет 10 минусов, то майнером он не станет. А чтобы у всех майнеров была мотивация проверять других майнеров, существуют баллы, недобор которых приводит к снижению % роста обещанных сумм.

Офф-лайн проверка


(В процессе внедрения)
Если в радиусе 25км от пользователя, который хочет стать майнером, есть минимум 25 других майнеров, то из них будет выбран 1 псевдо-случайный.
Код
/**
 * @param int $user_id - user_id претендента на майнера.
 * @param int $size - кол-во элементов в массиве майнеров, которые находятся в пределах 25км.
 * @return int
 */
function get_checking_miner_id ($user_id, $size) {
  $hi = $user_id / 127773;
  $lo = $user_id % 127773;
  $x = 16807 * $lo - 2836 * $hi;
  if ($x <= 0)
     $x += 0x7fffffff;
  $key = ( ($user_id = $x) % ($size + 1));
  return $key;
}

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

За это он получит 1000 баллов. Также он может отправить транзакцию, в которой отказывается делать проверку. Если прошло 2 суток или была отправлена транзакция с отказом, претендент получает право отправить новый запрос следующему случайному майнеру.
Если в радиусе 25км менее 25 майнеров, то проверка происходит без личной встречи. В радиусе 50,100,500,1000,10000,100000км ищется 25 майнеров, выбирается псевдо-случайный, ему шлется запрос. Он должен по скайпу позвонить претенденту, посмотреть на него через камеру, сделать фото, выложить на свою ноду, отправить транзакцию в DC-Сеть.
После того, как транзакция с фото отправлена, претендент получает право отправить в DC-сеть транзакцию, в которой укажет ссылку на свое видео, хэши своих фото, точки на фото. Далее идет проверка майнерами и голосование.

Таким образом «ферма» не сможет затеряться в толпе в крупном городе, а все майнеры, которые будут появляться в местах, где еще нет 25-и других майнеров, будут дополнительно проверяться админом.

Про баллы


Чтобы получать майнерский %, нужно каждый месяц набирать кол-во баллов, не менее, чем:
Сумма баллов всех майнеров за месяц / кол-во майнеров * Коэффициент.
Коэффициент в данный момент равен 0.3
Если баллов меньше, то в следующем месяце будет юзерский процент.

Отправка данных в DC-сеть и проверка нодами


После успешного прохождения оффлайн проверки, пользователь, который хочет стать майнером, заливает на свою ноду 2 фото, отмечает на них точки, указывает url к видео и отправляет в DC-сеть транзакцию. В этой же транзакции указаны хэши от фото.
Ноды получают эту транзакцию в одном из блоков и если находят себя среди тех, кто должен скачать эти фото к себе, то автоматически качают их.
Ноды, которые должны сохранить фото у себя, определяются вот таким алгоритмом:
Код
/**
 * @param int $block_id номер блока, в котором транзакция была принята.
 * @param int $max_miner_id - максимальный id майнера на момент, когда тр-я попала в блок.
 * @param int $miners_keepers - сколько нодов должны сохранить фото у себя. сейчас это 10.
 * @return array
 */
function get_miners_keepers ($block_id, $max_miner_id, $miners_keepers) {
  for ($i=0; $i < $miners_keepers; $i++) {
    $hi = $block_id / 127773;
    $lo = $block_id % 127773;
    $x = 16807 * $lo - 2836 * $hi;
    if ($x <= 0)
        $x += 0x7fffffff;
    $miner_id = ( ($block_id = $x) % ($max_miner_id + 1));
    $miner_id = ($miner_id==0)?1:$miner_id;
    $array[] = $miner_id;
  }
  return $array;
}

Т.е. сделать так, чтобы фото сохранили какие-то конкретные ноды, невозможно.
Каждая нода, которая сохранила фото у себя, сравнивает их хэши с хэшами, указанными в транзакции. Если они сходятся, то отправляет в DC-сеть транзакцию, в которой сообщает о том, что проверка пройдена. Если >=50% нодов подтвердили, что успешно скачали к себе фото, то начинается проверка майнерами. Проверка нодами происходит в автоматическом режиме, без участия майнера.

Проверка майнерами


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

На данном примере видно, что у претендента был найден точный клон
Если фото не отображено, то нужно нажать на кнопку «перезагрузить», тогда это фото загрузится с другой ноды. Если ни с одной из 10-и нод фото невозможно загрузить, то есть вероятность, что наш претендент на майнера просто заддосил 10 нодов, где лежит фото от его предыдущего аккаунта. Поэтому нужно отказывать такому майнеру. За выполнение задания по проверке претендента в майнеры начисляется 50 баллов

Будут ли майнеры ответственно относиться к выполнению заданий?


Если у Вас прямо сейчас есть какое-то кол-во btc, то любой негатив в СМИ в сторону bitcoin будет Вам неприятен, т.к. этот негатив может повлиять на курс btc, а следовательно, и на кол-во благ, которые Вы могли бы купить на свои btc. При этом, когда у Вас не было btc, то отношение к новостям о bitcoin у Вас было более нейтральным. Верно?
Представьте, что у Вас куплено Dcoin на какую-то сумму или у Вас добавлена обещанная сумма, которая приносит постоянную прибыль. Только в этом случае судьба Dcoin будет Вам действительно небезразлична. И если от Вас будет зависеть, пройдут ли в DC-сеть чьи-то клоны, которые смогут получить незаслуженные монеты, то отнесетесь ли Вы ответственно к процедуре их проверки? При этом, запрещать всех подряд нельзя, ведь Dcoin должен проникать в широкие массы, чтобы Ваши монеты можно было без проблем обменять на фиат.

Поиск клонов изнутри



Нам понадобится один отрезок на каждой из 2-х фото, с которым будем сравнивать все остальные отрезки.
Сейчас это расстояние между глаз на фото анфас и расстояние от глаза до края уха на фото в профиль.

В таблице spots_compatibility хранится:
1. Текущая версия.
2. Точки, которые наносятся на 2 фото примера.
3. С какими версиями совместимо.
4. Какие точки с какими будем соединять для получения отрезков.
5. Допустимые расхождения при поиске клонов.

В таблице faces хранится:
1. f1,f2...f20 — соотношения отрезков на лице анфас к расстоянию между глаз.
2. p1,p2...p20 — соотношения отрезков на лице в профиль к расстоянию от глаза до края уха.
3. Версия spots_compatibility, которая была на тот момент.

Если будет найден более эффективный набор точек для поиска клонов, то данные в таблице spots_compatibility обновляются и в таблицу faces будут заносится отрезки на основе нового набора точек.

В первом шаге проверки претендента на майнера мы убедились, что точки на фото нанесены верно, а значит отрезки будут получены тоже верные. Остается просто сделать запрос в базу данных, где будет идти сравнение с f1,f2...f20 и с p1,p2...p20 с учетом допустимых расхождений из spots_compatibility. В итоге получаем id майнеров, которые похожи на претендента.
Тесты:
i7-2600k / centos i386 / стандартные настройки mysql и php
Записей Время в секундах
1 млн 0,12
3 млн 0,39
5 млн 0,8

Проверка админом


Возможно, из-за неидеальных значений в spots_compatibility, клоны смогут проскакивать. По-этому у админа есть возможность разжаловать уже прошедших проверку майнеров в пользователи (собственно для этого и нужен админ в Dcoin), но не более 1000 за день. В результате этого перевода, средства на аккаунте майнера никуда не денутся, просто будут расти с юзерским %, а обещанные суммы перестанут приносить новые монеты.

Выборы админа


Если действия админа будут не устраивать большинство, то майнеры могут проголосовать за передачу функций админа любому пользователю. Если наберется более 50% голосов, то все функции админа полностью перейдут к выбранному пользователю.
Tags:
Hubs:
+43
Comments 74
Comments Comments 74

Articles

Information

Website
dcoin.club
Registered
Founded
Employees
1 employee (me only)
Location
Россия