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

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

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

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

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

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

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

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

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

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

 

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

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

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

Загрузить код с github

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

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

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

 

Если у вас Mac OS

 

Если у вас Windows

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

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

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

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

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

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

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

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

image

Также стоит переименовать файл 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. Там хранятся иконки для приложения. Вы можете заменить какие-нибудь иконки своими, главное – это такое же имя и разрешение.

image

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

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