Криптовалюта — как её создавать?
Я уверен, все знают, что такое криптовалюта, и возможно вы даже знаете, с чем её едят, и сами пользовались. В 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. Там хранятся иконки для приложения. Вы можете заменить какие-нибудь иконки своими, главное – это такое же имя и разрешение.
Также автор оригинальной статьи предлагает воспользоваться специальной утилитой для конвертирования иконок.
На этом первая часть гайда закончена. Надеюсь, что вскоре появится и вторая. Постараюсь сделать это побыстрее.