MyTetra Share
Делитесь знаниями!
Криптовалюта — как её создавать?
Время создания: 11.07.2017 08:12
Текстовые метки: Криптография, Qt, C++
Раздел: Комп - Maining
Запись: Bunny-Hop/mytetrabase/master/base/149972115059uwvn0h9s/text.html на raw.githubusercontent.com

Криптовалюта — как её создавать? 


Я уверен, все знают, что такое криптовалюта, и возможно вы даже знаете, с чем её едят, и сами пользовались. В 2009 году благодаря Satoshi Nakamoto  была создана всем известная Bitcoin , благодаря которой её автор заработал приличное состояние.



Конечно, сразу же после появления успешной инновации на рынке появляются другие похожие продукты. Так и произошло, тут же как грибы начали появляться новые криптовалюты, какие-то просто копировали идею Bitcoin и были бесполезной альтернативой (с технической точки зрения), какие-то привносили что-то своё. Но как ни странно, ажиотаж криптовалюты не стих. До сих пор в сети Интернет появляются всё новые и новые ресурсы, которые предлагают купить/пользоваться их валютой.

И следует логичный вопрос: если первая криптовалюта появилась в 2008 году, то ведь давно уже в сети Интернет должны существовать ресурсы с гайдами, уроками и примерами создания таких вещей.

Действительно, такое есть, но, к сожалению, все уроки сводятся к: 
“Придумай, купи на сайте, внедри”или “Придумай, скачай, пользуйся с друзьями” и так далее. И никогда не рассматривается подробный процесс создания. В общем-то, данной статьёй я и хотел бы исправить настоящее положение вещей и всё-таки привнести в русскоговорящее комьюнити такую информацию и рассказать людям, как же всё-таки можно создать свою валюту.

Причин создания криптовалюты может быть море:
1. Например, у вас есть свой игровой сервер, и, вы хотите таким образом создать реальную игровую валюту;
2. Вы действительно хотите на этом заработать;
3. Вас подогревает интерес и вы хотите просто знать нутро цифровой валюты;

Это первые причины, которые пришли мне в голову, если у вас есть и другие причины — пишите их в комментарии.

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

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

Итак, начнём:


Скачивание базового кода


“First things first”, как написано в оригинальной статье, мы должны подготовить окружение для разработки. Если найти на github-е  любую криптовалюту, то вы можете увидеть, какое огромное количество кода там храниться. Конечно же, мы не будем писать всё с нуля, не нужно изобретать велосипед, тем более мы и не сможем, пока сами хотя бы не попробуем сделать для него руль.

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

Установка библиотек и зависимостей


Далее, после того, как вы скачали весь базовый код, от которого мы будем отталкиваться, нужно удостовериться, есть ли на вашем компьютере все нужные библиотеки для его корректной работы:

Если у вас Linux (Ubuntu)

Об этом говорить мне проще всего, так как сам работаю на Ubuntu. Установить зависимости не составляет труда: 1. Открываете терминал нажатием Ctrl+Alt+T; 2. Вводите следующее:

sudo apt-get install build-essential libboost-all-dev libcurl4-openssl-dev libdb5.1-dev libdb5.1++-dev git qt-sdk libminiupnpc-dev

3. Жмёте Enter; 4. По ходу установки пакетов разрешаете установку и прочее-прочее.

Если у вас Mac OS


Если у вас Windows


Теперь, когда подготовка закончена, подойдём к самому главному — к редактированию кода.

Замена названия


Сейчас вы должны задуматься, как бы вы хотели, чтобы ваша криптовалюта называлась. Придумали? Отлично.
Базовый код, который вы скачали, является готовой, но ещё не скомпилированной криптовалютой, и эта криптовалюта называется FooCoin. Всё, что вам нужно сделать: это заменить везде в базовом коде названия FooCoin, Foo и т.д. на название вашей криптовалюты. Конечно, делать это вручную в 10 000 строках кода – дело долгое и бессмысленное.
Хорошо, что добрые люди давно облегчили нам задачу и сделали программы, которые позволяют массово заменять строки в файлах на другие.

Моя криптовалюта называется PuffCoin. Вот список тех слов, которые я буду заменять на свои:

Список слов для замены


Советую и вам составить подобный список. 

Для замены есть множество программ, я сейчас перечислю некоторые.

Для Linux есть 
Regexxer (бесплатно). Для Mac OS — TextWrangler  (её предлагает автор оригинальной статьи, бесплатно). Для Windows нашёл много, например: Search and Replace Actual Search & Replace HandyFile Find and Replace NHRPLC . Надеюсь, проблем с их использованием не будет.



Также стоит переименовать файл 
foocoin-qt.pro на ***coin-qt.pro, написав название нижним регистром.

Выбор и настройка сетевых портов


Отлично, теперь перейдём к самому важному и интересному — технической стороне кода. Надеюсь, что сейчас перед вами открыта папка с базовым кодом.

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

Вам нужно выбрать 4 порта: два для P2P и RPC, и два для тестовых P2P и RPC (testnet) соединений. Конечно, порты нужно выбрать такие, чтобы они точно не использовались каким-нибудь другим приложением. Для этого можете перейти по 
ссылке  и посмотреть, какие порты свободны. Лично я сделаю так же, как и автор оригинальной статьи, и для RPC выберу 55883 порт, для P2P выберу 55884 порт, а для testnet: RPC — 45883, P2P — 45884.

Для указания того, что нужно использовать именно эти порты, нужно заменить несколько строчек в некоторых файлах по примеру, приведённому ниже:

Файл 
src/bitcoinrpc.cpp: (RPC порт)

Строка 2893:

ip::tcp::endpoint endpoint(bindAddress, GetArg("-rpcport", 55883));



Строка 3169:

if (!d.connect(GetArg("-rpcconnect", "127.0.0.1"), GetArg("-rpcport", "55883")))




Файл 
src/init.cpp: (P2P порт + testnet P2P + RPC порт)

Строка 235:

" -port= " + _("Listen for connections on (default: 55884 or testnet: 45884)") + "\n" +



Строка 271:

" -rpcport= " + _("Listen for JSON-RPC connections on (default: 55883)") + "\n" +




Файл 
src/protocol.h: (testnet P2P + P2P порт)

Строка 22:

return testnet ? 45884 : 55884;



В следующей строке вы можете указать любой первоначальный адрес, по которому вы можете проверить дополнительные адреса. Если честно, то я не понял, для чего это, но у меня работало всё и без этого, так что это не обязательный параметр. Если кто может объяснить, то отпишитесь в комментариях. Заранее спасибо! 
Файл 
src/net.cpp:
Строка 1000:

{"some website name", "somewebsite.org or ip x.x.x.x"},



Настройка генерации валюты


Теперь перейдём к настройкам самой генерации вашей валюты. Каждая валюта генерируется в блоках, а в каждом блоке находится какое-то количество валюты.

В следующей строке вы можете изменить количество валюты, которое выдаётся за генерацию одного блока. Для этого вам просто нужно изменить:
Файл 
src/main.cpp:

Строка 831:

int64 nSubsidy = 1 * COIN;



Далее нужно задать, в какие же промежутки времени будут генерироваться блоки. Время измеряется в секундах
Файл 
src/main.cpp:

Строка 837:

static const int64 nTargetSpacing = 120; // PuffCoin: двухминутный блок



Далее, нужно указать промежуток, через который будет происходить “корректировка трудностей”. Опять же, я не понял, что это такое, и оставил так, как было.
Файл 
src/main.cpp:

Строка 836:

static const int64 nTargetTimespan = 1 * 24 * 60 * 60; // PuffCoin: 1 день



Далее изменим количество валюты, которое вообще может быть.
Файл 
src/main.h:

Строка 43:

static const int64 MAX_MONEY = 10000 * COIN; // максимальное количество в день



И количество блоков, максимально генерируемых за один день
Файл 
src/main.h:

Строка 550:

return dPriority > COIN * 720 / 250; // 720 блоков найдено в день.




Так как наша валюта является “крипто-”, значит, все транзакции происходят закрыто и только с использованием ключей. У каждого пользователя валюты есть публичный и приватный ключи. В коде у нас есть возможность самим установить, какой первый байт публичного ключа у нас будет. Это может быть символ или цифра. Выбрать цифру или символ можно из 
таблицы . Слева от символов “Character” стоят их числовые значения “Value”. Выберите символ и запомните его числовое значение. Так как моя криптовалюта называется PuffCoin, то я выбрал себе символ P, а его значение — 22.

Теперь нужно заменить на ваше значение следующую строку:
Файл 
src/base58.h:

Строка 280:

PUBKEY_ADDRESS = 22, //Укажите здесь первый байт публичного ключа



Замена иконок и изображений


На выходе у нас будет готовое GUI приложение для пользователя и консольное приложение, используемое как для сервера, так и для клиента.

Для GUI тоже есть ресурсы, которые находятся в папке src/qt/res. Там хранятся иконки для приложения. Вы можете заменить какие-нибудь иконки своими, главное – это такое же имя и разрешение.



Также автор оригинальной статьи предлагает воспользоваться специальной 
утилитой  для конвертирования иконок.

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

 
MyTetra Share v.0.59
Яндекс индекс цитирования