Расскажу вам как сделать свой форк на основе Dash в системе windows.
Нам для этого понадобится, система Windows 7 , виртуальная машина ( я использовал VMware) , клиент github под windows (я использовал https://desktop.github.com/ ), текстовый редактор Notepad++, SHH клиент Putty, Образ debian x64 Installing Debian via the Internet , любой редактор иконок, http://kjur.github.io/jsrsasign/sample-ecdsa.html проверка и генератор паблик и приват ключей, http://www.unixtimestamp.com/ конвертер даты в тайм штамп в формате unix , notepad++ https://notepad-plus-plus.org/ .
1 Качаем ,устанавливаем все необходимое.
2 Создаем виртуальною машину под debian .
2.1 Жмем создать новая виртуальная машина
2.2 Выбираем выборочный тип конфигурации, далее.
2.3 Выбираем версию виртуальной машины ( я выбрал 12), далее.
2.4 Выбираем я установлю операционною систему позже, далее.
2.5 Выбираем Linux , Debian 8.x 64-bit, далее.
2.6 Выбираем название виртуальной машины и где будет находится её файл конфигурации, далее.
2.7 Выбираем количество процессор и ядер для виртуальной машины ,далее.
2.8 Выбираем количество доступной памяти для виртуальной машины, далее

2.9 Выбираем тип сети – NAT, далее.

2.10 Выбираем тип контролера диска LSI Logic, далее

2.11 Выбираем тип диска SCSI, далее

2.12 Выбираем создать виртуальный диск, далее.

2.13 Выбираем количество памяти которое будет выделено под диск, далее.

2.14 Выбираем место куда сохранить наш диск, далее

2.15 Жмем готов , и идем заварить чай/кофе пока наш виртуальный диск конфигурируется.

2.16 Жмем изменить настройки, и выбираем наш файл образа Debian, ставил галку подключить при включение виртуальной машины, жмем (ОК) и включаем нашу виртуальною машину.

2.17 Выбираем Install,ентер.
2.18 Выбираем язык , ентер.
2.19 Выбираем страну , ентер.
2.20 Выбираем язык клавиатуры, ентер и дожидаемся загрузки компонентов .
2.21 Даем системе имя, ентер.
2.22 Domin name оставляем пустым, ентер.
2.23 Устанавливаем root пароль, ентер.
2.24 Полное имя пользователя , пишем что угодно ,ентер.
2.25 Аккаунт пользователя пишем debian, ентер.
2.26 Устанавливаем пароль пользователя, ентер.
2.27 Выбираем зону времени, ентер.
2.28 Делаем разметку диска, выбираем Guided - Use the entire disk, ентер.
2.29 Ентер.
2.28 Выбираем All files in one partition, ентер.
2.29 Выбираем Finish partitioning and write changes to disk, ентер.
2.30 Выбираем Yes , ентер.
2.31 Выбираем зеркало репозитория , ентер .
2.32 Можем оставить пустым ,ентер, и ждем немного.
2.33 Ентер.
2.34 Выбираем только SSH server и Standard System Utilitits (Снимать и делать выбор пробелом!) , все остальное нам не нужно , снимаем выбор, енетр и
Ждем …
2.35 Выбираем Yes , ентер.
2.36 Выбираем /dev/sda, ентер.
2.37 Ентер.
3. Конфигурируем порт форвард для подключения по SSH.
3.1 Заходим в VMware > Правка > редактор виртуальной сети.
3.2 Жмем в открывшимся окне изменить параметры .
3.3 Выбираем сеть NAT и жмем параметры DHCP и ставим как у меня , что бы ip не менялся после каждой перезагрузки.
3.4 Заходим в наше окно виртуальной машины и логинимся под нашим пользователем.
3.5 Пишем в терминал su , вводим пароль, пишем ifconfig и узнаем наш ip адреес.
3.6 Записываем наш ип адресс что в данном случае 192.168.200.129, и переходим в редактор виртуальной сети. Там выбираем параметры NAT, жмем добавить и прописываем порты и наш ip адресс. Далее жмем (ОК) в обоих окнах.
3.7 Подключаемся к нашему SSH, и видим что все работает .
- Регистрируемся на
https://github.com и форкаем репозиторий dash GitHub - dashpay/dash: Dash - Reinventing Cryptocurrency
5 Настраиваем Debian как сервер компиляции.
5.1 Переходим в наш терминал и пишем su и пароль от него .
Далее делаем
apt-get update, apt-get upgrade
и пишем
apt-get install git ruby sudo apt-cacher-ng qemu-utils debootstrap lxc python-cheetah parted kpartx bridge-utils python-dev python-pip python2.7-dev libssl-dev
жмем ентер.
5.2 Даем права sudo права пользователю debian и конфигурируем LXC
adduser debian sudo echo “%sudo ALL=NOPASSWD: /usr/bin/lxc-start” > /etc/sudoers.d/gitian-lxc echo “cgroup /sys/fs/cgroup cgroup defaults 0 0” >> /etc/fstab echo ‘#!/bin/sh -e’ > /etc/rc.local echo ‘brctl addbr br0’ >> /etc/rc.local echo ‘ifconfig br0 10.0.3.2/24 up’ >> /etc/rc.local echo ‘exit 0’ >> /etc/rc.local # make sure that USE_LXC is always set when logging in as debian, # and configure LXC IP addresses echo ‘export USE_LXC=1’ >> /home/debian/.profile echo ‘export GITIAN_HOST_IP=10.0.3.2’ >> /home/debian/.profile echo ‘export LXC_GUEST_IP=10.0.3.5’ >> /home/debian/.profile reboot (перезагружаемся)
5.3 подключаемся по SSH входим по пользователем Debian.
5.4 Качаем и устанавливаем python-vm-builder
wget http://archive.ubuntu.com/ubuntu/pool/universe/v/vm-builder/vm-builder_0.12.4+bzr489.orig.tar.gz
Проверяем контрольною суму
echo “ec12e0070a007989561bfee5862c89a32c301992dd2771c4d5078ef1b3014f03 vm-builder_0.12.4+bzr489.orig.tar.gz” | sha256sum -c # (verification – must return OK)
Распаковываем.
tar -zxvf vm-builder_0.12.4+bzr489.orig.tar.gz
Переходим в папку которою распаковали
cd vm-builder-0.12.4+bzr489
Устанавливаем
sudo python setup.py install
Возвращаемся в предыдущую директорию
cd …
5.5 Клонируем репозитории gitianи наш.
Gitian
git clone https://github.com/devrandom/gitian-builder.git
Mycointest
git clone https://github.com/mycointest/dash
6 сборка gitian builder и самого коина.
Переходим в директорию gitian исходников
cd gitian-builder
Cобираем исходники
bin/make-base-vm --lxc --arch amd64 --suite precise
Возврат
cd …
Пробуем собрать наш коин.
Переходим в директорию исходников коина.
cd ~debian/dash
Обновляем
git pull
Переходим в папку компилятора
cd ~debian/gitian-builder
Качаем зависимости,процесс не быстрый , ждем
make -C …/dash/depends download SOURCES_PATH=pwd
/cache/common
Собираем
/bin/gbuild --commit dash=v0.12.0.x …/dash/contrib/gitian-descriptors/gitian-win.yml
Открываем параллельно 2 сесии SSH , переходим в них в
cd gitian-builder
Дожидаемся создания соответсвующих логов в основной консоли
Пишым
tail -f var/install.log tail -f var/build.log
и смотрим сборку
В первый раз процесс достаточно долгий так как будет происходит компиляция и настройка всех зависимостей…
В конце получаем такой результат
Подключаемся по ftp к нашему дебиан по sftp://127.0.0.1 , пользователь debian ,пароль от пользователя, порт 22222 на котором у нас SSH.
Переходим сюда
/home/debian/gitian-builder/build/out
6 Чего мы в общем то и ждали , сам процесс создания форка
6.1 Подготовимся Заходим сюда https://github.com/lhartikk/GenesisH0 и устанавливаем генератор Genesis блока
Конструктор алгоритма скрипт на питоне.
sudo pip install scrypt construct
Модуль для монеток x11
git clone https://github.com/lhartikk/xcoin-hash
Переходим к исходнику модуля
cd xcoin-hash
Собираем
sudo python setup.py install
Сам генератор генесис блока
git clone https://github.com/lhartikk/GenesisH0
Переходим к нему
cd GenesisH0
Проверяем работает ли
python genesis.py -a X11 -z “Wired 09/Jan/2014 The Grand Experiment Goes Live: Overstock.com Is Now Accepting Bitcoins” -t 1317972665 -p “040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3eb4b10f4d4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9” -n 28917698 -t 1390095618 -v 5000000000
Если имеем такое на выходе,значит все хорошо.
Примечание для работы генератора нам требуются
apt-get install python-dev python-pip python2.7-dev libssl-dev
Нам их ставить больше не требуется , так как мы установили их в самом начале.
7 Редактирование исходников ( я буду описывать все по порядку с 1 по последний )
Первое что мы делаем переименовываем наш репозиторий на название нашем будущий монетки , я буду использовать имя owncoin.
Жмем Setting и пишем наше название, жмем rename.
Переходим назад и смотрим что все успешно переименовалось.
Теперь открываем наш github клиент для windows и входим в него пользователем github.
Далее клонируем репозиторий к нам на диск.
Жмем View branch
И видим такое
Переходим в нашу папку с исходниками и будем массово заменять адреса репозиториев сохраненные в файлах на наш.
Делаем как на картинке заменяем github.com/dashpay/dash на github.com/mycointest/owncoin в папке D:\owncoin во всех файлах.
Далее переходим в наш клиент github и видим такое, Пишем что либо в Summary и Description и жмем Comit to master
И видим что все успешно загрузилось на наш репозиторий.
По History как вы уже поняли мы можем отслеживать вносимые изменения.
Теперь мы переименуем DASHPAY Dashpay dashpay на MYTESTCOIN Mycointest mycointest
И DASH ,Dash, dash на OWNCOIN Owncoin owncoin
Важно при массовом переименовании поставить галочку учитывать регистр ,а также сначала жать найти все , и беглым взглядом искать найденные файлы с крякозяблами , в них не в коем случае нельзя нечего переименовывать.
Потому мы их находим при поиске и делаем бекапы. И после процесса переименования мы их возвращаем на свои места. В обязательном порядке начинайте с Dashpay вариаций.
Начнем …
Dashpay на Mycointest
Как мы видим мы наши всего 1 результат. Жмем заменить во всех файлах.
dashpay на mycointest
Как мы можем заметить тут результатов побольше уже ,но нечего критично тут нету, так что смело жмем заменить во всех файлах.
Теперь перейдем к замене DASH ,Dash, dash на OWNCOIN Owncoin owncoin
DASH на OWNCOIN
Пройдя беглым взглядом по всему списку , мы также не обнаруживаем тут нечего критического и жмем заменить во всех файлах.
Dash на Owncoin
А вот тут наш поджидает сюрприз в виде файлов с крякозяблами. Мы должны пройтись по всему списку найдя все файлы и скопировать их куда то для последующего возвращения на место.
В моем случае это файлы
D:\owncoin\owncoin.git\objects\pack\pack-86e81c3d9a98b214df607081954f37e571a09fd6.pack D:\owncoin\owncoin\contrib\gitian-downloader\luke-jr-key.pgp D:\owncoin\owncoin\contrib\macdeploy\background.psd
По этому я просто копирую эти файлы в укромное место ,и жму заменить после возвращая эти файлы на свои места.
dash на owncoin
Опять как и в прошлом примере имеем 3 файла с крякозяблами
В моем случае это файлы
D:\owncoin\owncoin.git\index D:\owncoin\owncoin.git\objects\pack\pack-86e81c3d9a98b214df607081954f37e571a09fd6.pack D:\owncoin\owncoin\contrib\gitian-downloader\luke-jr-key.pgp
Поступаем также , копируем в укромное место , жмем заменить в файлах.
Теперь открываем папку с нашими исходниками в проводнике , и через поиск ищем все со словами dash (папки с названиями dashpay можно проигнорировать)
И прямо в проводники руками заменяем всё dash на owncoin
Важное проводник почемуто находит не все , потому идем потом в папку
D:\key\owncoin\src\qt\res\icons
Изменяем названия в файлах в которых есть dash на owncoin ( заменяем в файлах только часть dash!)
Теперь переходим в наш клиент github , и загрузим на него изменённые файлы . Как это делать я рассказывал выше.
Теперь приступаем к настройке исходников
Первое что мы сделаем сгенерируем свои уникальные паблик и приват ключи
Для этого мы идем в консоль на наш дебиан
И генерируем их командой ( нам понадобится 5 ключей )
openssl ecparam -genkey -name secp256r1 -out k.pem
-out название файла ключа я буду их называть
mainalert.pem testnetalert.pem main.pem mainspork.pem testnetspork.pem
openssl ecparam -genkey -name secp256r1 -out mainalert.pem
Теперь получаем вывод нашего ключа командой
openssl ec -in k.pem -noout –text
у меня выглядит так
openssl ec -in mainalert.pem -noout -text
копируем содержимое с командной строки, и помещаем в текстовик.
И выравниваем в 1 срочку
Теперь делаем так
openssl ec -in mainalert.pem -text > mainalert.hex
Проделываем так для каждого файла.
Теперь делаем вывод ключа в hex, и сохраняем их в отдельный текстовый файл
Тоже для всех , этой командой
cat mainalert.hex
Вот так они выглядят в моей текстовом документе их 5.
В результате я имею такой набор приват паблик и приват ключей , теперь лезем по FTP на наш дебиан и копируем все файлы ключей к себе на будущие.
Теперь проверим валидность наших ключей
Идем на
http://kjur.github.io/jsrsasign/sample-ecdsa.html
Жмем sing message
Далее жмем verify it, и если на выходе получаем такое то ключи валидные.
Проделываем такое с каждым ключом.
Далее приступаем к генерации генезис блоков
Идем в нашу консоль на дебиан
Переходим в
cd GenesisH0
Берем наш main паблик ключ в моем случае это
0436b2d4b1a72bcad8a8f9b8d12048014bcbbb21df91d84ed172cbcfe8aa6f0e9da5e995fa3b8c63da129c247b73cdd55bac80abc2b67adfbf88381a9889e64177
Придумываем уникально фразу которая будет у нас pszTimestamp
В моем случае это
“I create my owncoin 07/12/2015 for test , End its work for me. I hope this guide help you”
Идем на
и timestamp на будущий старт , я сделал примерно на 5 часов от текущего времени , так как примерно столько еще я потрачу на это гайд
я получил 1449579900
И формулируем такой запрос
python genesis.py -a X11 -z “I create my owncoin 07/12/2015 for test , End its work for me. I hope this guide help you” -t 1449579900 -p “0436b2d4b1a72bcad8a8f9b8d12048014bcbbb21df91d84ed172cbcfe8aa6f0e9da5e995fa3b8c63da129c247b73cdd55bac80abc2b67adfbf88381a9889e64177”
Вставляем в консоль , и ждем нахождения генезис блока.
Результат копируем в текстовик.
Это мы создали генезис блок для основной сети , а теперь мы создадим для тест нета и регтестнета генезис блоки!
Что бы это сделать мы просто к –t прибавим в конце 1 и 2
Это у нас будет для тестнета
python genesis.py -a X11 -z “I create my owncoin 07/12/2015 for test , End its work for me. I hope this guide help you” -t 1449579901 -p “0436b2d4b1a72bcad8a8f9b8d12048014bcbbb21df91d84ed172cbcfe8aa6f0e9da5e995fa3b8c63da129c247b73cdd55bac80abc2b67adfbf88381a9889e64177”
Как мы можем заметить мы получили совсем другой генезис блок но с тем же pszTimestamp и паблик ключом
А это для рег теста , только тут мы еще добавим параметр –b 0x207fffff и -n 2
python genesis.py -a X11 -z “I create my owncoin 07/12/2015 for test , End its work for me. I hope this guide help you” -t 1449579901 -p “0436b2d4b1a72bcad8a8f9b8d12048014bcbbb21df91d84ed172cbcfe8aa6f0e9da5e995fa3b8c63da129c247b73cdd55bac80abc2b67adfbf88381a9889e64177” -b 0x207fffff –n 2
Объясню зачем мы делаем это для тестовых параметров , так как мы заменили pszTimestamp и merkle hash на свой уникальный , если мы не заменим в тест и рег тест генезис блоки то после компиляции клиента мы получим error. Иза связи их генезис блоков с pszTimestamp и merkle hash.
В результате я получил такое в своем текстовике.
Ну а теперь когда у нас все есть , мы можем приступить к редактированию исходников
Начнем с файла
chainparams.cpp
Первое что мы делаем , редактируем чек поинты
static Checkpoints::MapCheckpoints mapCheckpoints = boost::assign::map_list_of ( 1500, uint256(“0x000000aaf0300f59f49bc3e970bad15c11f961fe2347accffff19d96ec9778e3”)) ( 4991, uint256(“0x000000003b01809551952460744d5dbb8fcbd6cbae3c220267bf7fa43f837367”)) ( 9918, uint256(“0x00000000213e229f332c0ffbe34defdaa9e74de87f2d8d1f01af8d121c3c170b”)) ( 16912, uint256(“0x00000000075c0d10371d55a60634da70f197548dbbfa4123e12abfcbc5738af9”)) ( 23912, uint256(“0x0000000000335eac6703f3b1732ec8b2f89c3ba3a7889e5767b090556bb9a276”)) ( 35457, uint256(“0x0000000000b0ae211be59b048df14820475ad0dd53b9ff83b010f71a77342d9f”)) ( 45479, uint256(“0x000000000063d411655d590590e16960f15ceea4257122ac430c6fbe39fbf02d”)) ( 55895, uint256(“0x0000000000ae4c53a43639a4ca027282f69da9c67ba951768a20415b6439a2d7”)) ( 68899, uint256(“0x0000000000194ab4d3d9eeb1f2f792f21bb39ff767cb547fe977640f969d77b7”)) ( 74619, uint256(“0x000000000011d28f38f05d01650a502cc3f4d0e793fbc26e2a2ca71f07dc3842”)) ( 75095, uint256(“0x0000000000193d12f6ad352a9996ee58ef8bdc4946818a5fec5ce99c11b87f0d”)) ( 88805, uint256(“0x00000000001392f1652e9bf45cd8bc79dc60fe935277cd11538565b4a94fa85f”)) ( 107996, uint256(“0x00000000000a23840ac16115407488267aa3da2b9bc843e301185b7d17e4dc40”)) ( 137993, uint256(“0x00000000000cf69ce152b1bffdeddc59188d7a80879210d6e5c9503011929c3c”)) ( 167996, uint256(“0x000000000009486020a80f7f2cc065342b0c2fb59af5e090cd813dba68ab0fed”)) ( 207992, uint256(“0x00000000000d85c22be098f74576ef00b7aa00c05777e966aff68a270f1e01a5”)) ( 312645, uint256(“0x0000000000059dcb71ad35a9e40526c44e7aae6c99169a9e7017b7d84b1c2daf”)) ; static const Checkpoints::CCheckpointData data = { &mapCheckpoints, 1423563332, // * UNIX timestamp of last checkpoint block 853742, // * total number of transactions between genesis and last checkpoint // (the tx=… number in the SetBestChain debug.log lines) 2800 // * estimated number of transactions per day after checkpoint }; static Checkpoints::MapCheckpoints mapCheckpointsTestnet = boost::assign::map_list_of ( 261, uint256(“00000c26026d0815a7e2ce4fa270775f61403c040647ff2c3091f99e894a4618”)) ( 77900, uint256(“00000007e5ec67e2a626c07b7d66673c3dd8df0aed5018ca984b99fba2b71024”)) ( 82313, uint256(“000000156a313af1d69fe855609175b276996235e8f4f7da41b10e4a7a750a19”)) ; static const Checkpoints::CCheckpointData dataTestnet = { &mapCheckpointsTestnet, 1405699509, 201, 500 }; static Checkpoints::MapCheckpoints mapCheckpointsRegtest = boost::assign::map_list_of ( 0, uint256(“0x000008ca1832a4baf228eb1553c03d3a2c8e02399550dd6ea8d65cec3ef23d2e”)) ; static const Checkpoints::CCheckpointData dataRegtest = { &mapCheckpointsRegtest, 0, 0, 0 };
убираем лишние и ставим нулевые блоки , и взамен них наши генесис блоки
в моем случае это
Main 00000205a2b36c89d27547db95cdf4a3038662dd26cf21af8b9c8978a64b06a2 Testnet 00000416024caa7a7900f9a73c120660773ca4019d0671ee5d5bb528acbaa633 Regtest 17a08f326f61be14e0502edeb93d46013596a0bf1d8ddd9d5909f37dab7305a4
Ну и тайм штамп и количество транзакций между генезис блоком и последним у нас будет ноль . Последний пункт не трогаем.
Как у меня теперь это выглядит
static Checkpoints::MapCheckpoints mapCheckpoints = boost::assign::map_list_of ( 0, uint256(“0x00000205a2b36c89d27547db95cdf4a3038662dd26cf21af8b9c8978a64b06a2”)) ; static const Checkpoints::CCheckpointData data = { &mapCheckpoints, 1449579900, // * UNIX timestamp of last checkpoint block 0, // * total number of transactions between genesis and last checkpoint // (the tx=… number in the SetBestChain debug.log lines) 2800 // * estimated number of transactions per day after checkpoint }; static Checkpoints::MapCheckpoints mapCheckpointsTestnet = boost::assign::map_list_of ( 0, uint256(“00000416024caa7a7900f9a73c120660773ca4019d0671ee5d5bb528acbaa633”)) ; static const Checkpoints::CCheckpointData dataTestnet = { &mapCheckpointsTestnet, 1449579901, 0, 500 }; static Checkpoints::MapCheckpoints mapCheckpointsRegtest = boost::assign::map_list_of ( 0, uint256(“0x17a08f326f61be14e0502edeb93d46013596a0bf1d8ddd9d5909f37dab7305a4”)) ; static const Checkpoints::CCheckpointData dataRegtest = { &mapCheckpointsRegtest, 0, 0, 0 };
Дальше заменяем генезис блоки и AlertPubKey
main
Тут мы вписуем совершенно рандомные валидные hex символы я возьму 0x1c 0xbd 0xcb 0x4f
pchMessageStart[0] = 0xbf; pchMessageStart[1] = 0x0c; pchMessageStart[2] = 0x6b; pchMessageStart[3] = 0xbd; Сюда мы вписываем папблик ключ что генерировали ранее – тот что maimalert 04f4ef416b8597cbadde2216eb0d4fc5137075a3fa3442b71b4ea97efca14e885aa75911b7ef3e6353281d2515a375e8a510455214031df1ac46e443e1ea9a9647 vAlertPubKey = ParseHex(“048240a8748a80a286b270ba126705ced4f2ce5a7847b3610ea3c06513150dade2a8512ed5ea86320824683fc0818f0ac019214973e677acd1244f6d0571fc5103”); Это наш порт для связа сети , мы его будет изменять на свой я буду использовать для замены 9887 nDefaultPort = 9999; это мы не трогаем bnProofOfWorkLimit = ~uint256(0) >> 20; // Owncoin starting difficulty is 1 / 2^12 Это момент когда уменьшится награда в 2 раза за майнинг. nSubsidyHalvingInterval = 210000; начало роста сложности nEnforceBlockUpgradeMajority = 750; nRejectBlockOutdatedMajority = 950; nToCheckBlockUpgradeMajority = 1000; Майниг клиента сколько ядер процессора будет задействовано , 0= по все. nMinerThreads = 0; Пересчет сложости раз в сутки. nTargetTimespan = 24 * 60 * 60; // Owncoin: 1 day Время на генерацию блока nTargetSpacing = 2.5 * 60; // Owncoin: 2.5 minutes /** * Build the genesis block. Note that the output of the genesis coinbase cannot * be spent as it did not originally exist in the database. * * CBlock(hash=00000ffd590b14, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=e0028e, nTime=1390095618, nBits=1e0ffff0, nNonce=28917698, vtx=1) * CTransaction(hash=e0028e, ver=1, vin.size=1, vout.size=1, nLockTime=0) * CTxIn(COutPoint(000000, -1), coinbase 04ffff001d01044c5957697265642030392f4a616e2f3230313420546865204772616e64204578706572696d656e7420476f6573204c6976653a204f76657273746f636b2e636f6d204973204e6f7720416363657074696e6720426974636f696e73) * CTxOut(nValue=50.00000000, scriptPubKey=0xA9037BAC7050C479B121CF) * vMerkleTree: e0028e */
pszTimestamp как мы помним мы его создавали в самом начале “I create my owncoin 07/12/2015 for test , End its work for me. I hope this guide help you”
const char* pszTimestamp = “Wired 09/Jan/2014 The Grand Experiment Goes Live: Overstock.com Is Now Accepting Bitcoins”; CMutableTransaction txNew; txNew.vin.resize(1); txNew.vout.resize(1); Это мы не трогаем txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); Награда за блок ( поправьте если ошибаюсь) txNew.vout[0].nValue = 50 * COIN; Паблик ключи генезис блока у нас это 0436b2d4b1a72bcad8a8f9b8d12048014bcbbb21df91d84ed172cbcfe8aa6f0e9da5e995fa3b8c63da129c247b73cdd55bac80abc2b67adfbf88381a9889e64177 txNew.vout[0].scriptPubKey = CScript() << ParseHex(“040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3eb4b10f4d4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9”) << OP_CHECKSIG; genesis.vtx.push_back(txNew); genesis.hashPrevBlock = 0; genesis.hashMerkleRoot = genesis.BuildMerkleTree(); genesis.nVersion = 1; Временна метка по unix системе у нас это 1449579900 genesis.nTime = 1390095618; Nbits у нас это 0x1e0ffff0 genesis.nBits = 0x1e0ffff0; nonce у нас он 2087222 genesis.nNonce = 28917698; Это сам генезис блок hashGenesisBlock = genesis.GetHash(); assert(hashGenesisBlock == uint256(“0x00000ffd590b1485b3caadc19b22e6379c733355108f107a430458cdf3407ab6”)); Его Merkleroot хеш assert(genesis.hashMerkleRoot == uint256(“0xe0028eb9648db56b1ac77cf090b99048a8007e2bb64b68f092c03c7f56a662c7”)); ДНС сиды, их мы будем убирать путем замены на vSeeds.clear(); vSeeds.push_back(CDNSSeedData(“darkcoin.io”, “dnsseed.darkcoin.io”)); vSeeds.push_back(CDNSSeedData(“darkcoin.qa”, “dnsseed.darkcoin.qa”)); vSeeds.push_back(CDNSSeedData(“masternode.io”, “dnsseed.masternode.io”)); vSeeds.push_back(CDNSSeedData(“mycointest.io”, “dnsseed.mycointest.io”)); Это отвечает за адрес я его не менял .
base58Prefixes[PUBKEY_ADDRESS] = list_of( 76); // Owncoin addresses start with 'X' base58Prefixes[SCRIPT_ADDRESS] = list_of( 16); // Owncoin script addresses start with '7' base58Prefixes[SECRET_KEY] = list_of(204); // Owncoin private keys start with '7' or 'X' base58Prefixes[EXT_PUBLIC_KEY] = list_of(0x02)(0xFE)(0x52)(0xF8); // Owncoin BIP32 pubkeys start with 'drkv' base58Prefixes[EXT_SECRET_KEY] = list_of(0x02)(0xFE)(0x52)(0xCC); // Owncoin BIP32 prvkeys start with 'drkp' base58Prefixes[EXT_COIN_TYPE] = list_of(0x80000005); // Owncoin BIP44 coin type is '5' convertSeed6(vFixedSeeds, pnSeed6_main, ARRAYLEN(pnSeed6_main)); fRequireRPCPassword = true; fMiningRequiresPeers = true; fAllowMinDifficultyBlocks = false; fDefaultConsistencyChecks = false; fRequireStandard = true; fMineBlocksOnDemand = false; fSkipProofOfWorkCheck = false; fTestnetToBeDeprecatedFieldRPC = false; nPoolMaxTransactions = 3;
Достаточно спорная часть , я думаю вполне возможно просто вставить ключ и после импортировать себе приват кей в кошелек для работы спорка , но могу ошибаться поправьте кто знает . Принципе и без этого все работает. Ставим сюда mainspork 04594d9bcfd432ed21603c81dc6a2cbdc58ded77217ecd91c0420737f60a1948871a66bb84bff26e0f5dd447ee931b5213bca0d9de686c49f6f03545a03fd79b75 strSporkKey = "04549ac134f694c0243f503e8c8a9a986f5de6610049c40b07816809b0d1d06a21b07be27b9bb555931773f62ba6cf35a25fd52f694d4e1106ccd237a7bb899fdd"; strMasternodePaymentsPubKey = "04549ac134f694c0243f503e8c8a9a986f5de6610049c40b07816809b0d1d06a21b07be27b9bb555931773f62ba6cf35a25fd52f694d4e1106ccd237a7bb899fdd";
strDarksendPoolDummyAddress = “Xq19GqFvajRrEdDHYRKGYjTsQfpV5jyipF”; Ставим что ставили в генезис блок или делаем отдельный на будущею дату. nStartMasternodePayments = 1403728576; //Wed, 25 Jun 2014 20:36:16 GMT
как это выглядит после редактирования.
class CMainParams : public CChainParams { public: CMainParams() { networkID = CBaseChainParams::MAIN; strNetworkID = "main"; /** * The message start string is designed to be unlikely to occur in normal data. * The characters are rarely used upper ASCII, not valid as UTF-8, and produce * a large 4-byte int at any alignment. */ pchMessageStart[0] = 0x1c; pchMessageStart[1] = 0xbd; pchMessageStart[2] = 0xcb; pchMessageStart[3] = 0x4f; vAlertPubKey = ParseHex("04f4ef416b8597cbadde2216eb0d4fc5137075a3fa3442b71b4ea97efca14e885aa75911b7ef3e6353281d2515a375e8a510455214031df1ac46e443e1ea9a9647"); nDefaultPort = 9887; bnProofOfWorkLimit = ~uint256(0) >> 20; // Owncoin starting difficulty is 1 / 2^12 nSubsidyHalvingInterval = 210000; nEnforceBlockUpgradeMajority = 750; nRejectBlockOutdatedMajority = 950; nToCheckBlockUpgradeMajority = 1000; nMinerThreads = 0; nTargetTimespan = 24 * 60 * 60; // Owncoin: 1 day nTargetSpacing = 2.5 * 60; // Owncoin: 2.5 minutes /** * Build the genesis block. Note that the output of the genesis coinbase cannot * be spent as it did not originally exist in the database. * * CBlock(hash=00000ffd590b14, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=e0028e, nTime=1390095618, nBits=1e0ffff0, nNonce=28917698, vtx=1) * CTransaction(hash=e0028e, ver=1, vin.size=1, vout.size=1, nLockTime=0) * CTxIn(COutPoint(000000, -1), coinbase 04ffff001d01044c5957697265642030392f4a616e2f3230313420546865204772616e64204578706572696d656e7420476f6573204c6976653a204f76657273746f636b2e636f6d204973204e6f7720416363657074696e6720426974636f696e73) * CTxOut(nValue=50.00000000, scriptPubKey=0xA9037BAC7050C479B121CF) * vMerkleTree: e0028e */ const char* pszTimestamp = "I create my owncoin 07/12/2015 for test , End its work for me. I hope this guide help you"; CMutableTransaction txNew; txNew.vin.resize(1); txNew.vout.resize(1); txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); txNew.vout[0].nValue = 50 * COIN; txNew.vout[0].scriptPubKey = CScript() << ParseHex("0436b2d4b1a72bcad8a8f9b8d12048014bcbbb21df91d84ed172cbcfe8aa6f0e9da5e995fa3b8c63da129c247b73cdd55bac80abc2b67adfbf88381a9889e64177") << OP_CHECKSIG; genesis.vtx.push_back(txNew); genesis.hashPrevBlock = 0; genesis.hashMerkleRoot = genesis.BuildMerkleTree(); genesis.nVersion = 1; genesis.nTime = 1449579900; genesis.nBits = 0x1e0ffff0; genesis.nNonce = 2087222; hashGenesisBlock = genesis.GetHash(); assert(hashGenesisBlock == uint256("0x00000205a2b36c89d27547db95cdf4a3038662dd26cf21af8b9c8978a64b06a2")); assert(genesis.hashMerkleRoot == uint256("0xb7ba7a0616705a327d39f6bf791c7db48abe4c79a11b62c6d690816eddc4d730")); vSeeds.clear(); base58Prefixes[PUBKEY_ADDRESS] = list_of( 76); // Owncoin addresses start with 'X' base58Prefixes[SCRIPT_ADDRESS] = list_of( 16); // Owncoin script addresses start with '7' base58Prefixes[SECRET_KEY] = list_of(204); // Owncoin private keys start with '7' or 'X' base58Prefixes[EXT_PUBLIC_KEY] = list_of(0x02)(0xFE)(0x52)(0xF8); // Owncoin BIP32 pubkeys start with 'drkv' base58Prefixes[EXT_SECRET_KEY] = list_of(0x02)(0xFE)(0x52)(0xCC); // Owncoin BIP32 prvkeys start with 'drkp' base58Prefixes[EXT_COIN_TYPE] = list_of(0x80000005); // Owncoin BIP44 coin type is '5' convertSeed6(vFixedSeeds, pnSeed6_main, ARRAYLEN(pnSeed6_main)); fRequireRPCPassword = true; fMiningRequiresPeers = true; fAllowMinDifficultyBlocks = false; fDefaultConsistencyChecks = false; fRequireStandard = true; fMineBlocksOnDemand = false; fSkipProofOfWorkCheck = false; fTestnetToBeDeprecatedFieldRPC = false; nPoolMaxTransactions = 3; strSporkKey = "04594d9bcfd432ed21603c81dc6a2cbdc58ded77217ecd91c0420737f60a1948871a66bb84bff26e0f5dd447ee931b5213bca0d9de686c49f6f03545a03fd79b75"; strMasternodePaymentsPubKey = "04594d9bcfd432ed21603c81dc6a2cbdc58ded77217ecd91c0420737f60a1948871a66bb84bff26e0f5dd447ee931b5213bca0d9de686c49f6f03545a03fd79b75"; strDarksendPoolDummyAddress = "Xq19GqFvajRrEdDHYRKGYjTsQfpV5jyipF"; nStartMasternodePayments = 1449579900; //Wed, 25 Jun 2014 20:36:16 GMT
Проделываем тоже самое что testnet заполняя только те поля что доступны , чистим сиды. В регтест обязательно
bits: 0x207fffff
Также не забываем заменить везде порты я заменял в 4 позициях
main 9999 на 9887 testnet 19999 на 19887 regtest 19994 на 19883 Unite=test 18445 на 18334
И сохраняем наш исходник , и приступаем к редактированию следующего.
activemasternode.cpp
Тут мы изменям порты 9999 на 9887
вот в этих местах
LogPrintf("CActiveMasternode::ManageStatus() - Checking inbound connection to '%s'\n", service.ToString()); if(Params().NetworkID() == CBaseChainParams::MAIN) { if(service.GetPort() != 9999) { notCapableReason = strprintf("Invalid port: %u - only 9999 is supported on mainnet.", service.GetPort()); LogPrintf("CActiveMasternode::ManageStatus() - not capable: %s\n", notCapableReason); return; } } else if(service.GetPort() == 9999) { notCapableReason = strprintf("Invalid port: %u - 9999 is only supported on mainnet.", service.GetPort()); LogPrintf("CActiveMasternode::ManageStatus() - not capable: %s\n", notCapableReason); return; } if(!ConnectNode((CAddress)service, NULL, true)){ notCapableReason = "Could not connect to " + service.ToString(); LogPrintf("CActiveMasternode::ManageStatus() - not capable: %s\n", notCapableReason); return; }
и
CService service = CService(strService); if(Params().NetworkID() == CBaseChainParams::MAIN) { if(service.GetPort() != 9999) { errorMessage = strprintf("Invalid port %u for masternode %s - only 9999 is supported on mainnet.", service.GetPort(), strService); LogPrintf("CActiveMasternode::Register() - %s\n", errorMessage); return false; } } else if(service.GetPort() == 9999) { errorMessage = strprintf("Invalid port %u for masternode %s - 9999 is only supported on mainnet.", service.GetPort(), strService); LogPrintf("CActiveMasternode::Register() - %s\n", errorMessage); return false; }
Тут заменяем порты
chainparamsbase.cpp
* Main network */ class CBaseMainParams : public CBaseChainParams { public: CBaseMainParams() { networkID = CBaseChainParams::MAIN; nRPCPort = 9998; } }; static CBaseMainParams mainParams; /** * Testnet (v3) */ class CBaseTestNetParams : public CBaseMainParams { public: CBaseTestNetParams() { networkID = CBaseChainParams::TESTNET; nRPCPort = 19998; strDataDir = "testnet3"; } };
Я заменил 9998 на 9886 ,19998 на 19886
Тут мы прописываем вшитые fixed seeds
chainparamsseeds.h
// ***TODO*** fix generate-seeds.py and REGENERATE static SeedSpec6 pnSeed6_main[] = { {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb3,0x2b,0x80,0xef}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x7f,0x6a,0xeb}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x9d,0xfa,0x0a}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x63,0x23}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3d,0xd2,0x36}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0xf5,0x05,0x84}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa2,0x42,0x0a}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x6d,0xb2,0xc3}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0x80,0xa9,0x5e}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x0b,0x8d,0xe5}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x3b,0x15,0x3a}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x69,0x76,0x0f}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x21,0x7e,0xdd}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0x17,0x83}, 9999}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3d,0xd1,0x25}, 9999} }; static SeedSpec6 pnSeed6_test[] = { // {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x99,0xcb,0x26,0x31,0xba,0x48,0x51,0x31,0x39,0x0d}, 18333}, // {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x44,0xf4,0xf4,0xf0,0xbf,0xf7,0x7e,0x6d,0xc4,0xe8}, 18333} }; #endif // BITCOIN_CHAINPARAMSSEEDS_H
Получить их легко, идем на IP(IPv4/IPv6) Address to Hex Converter
пишем там свой ip адресс как пример использовал 127.0.0.1 и получил 0x7F000001
Теперь превратим его в нужный формат , берем просто убираем 0x c 0x7F000001
И делаем так 7F 00 00 01
Теперь заменяем после 0xff 0xff, не забываем про порт.
Результат
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7f,0x00,0x00,0x01}, 9887},
Как у меня все выглядит после редактирования.
Тут мы изменяем версию клиента , я сделаю 1.0.0.1
clientversion.h
//! These need to be macros, as clientversion.cpp's and owncoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 0 #define CLIENT_VERSION_MINOR 12 #define CLIENT_VERSION_REVISION 0 #define CLIENT_VERSION_BUILD 55
Результат
//! These need to be macros, as clientversion.cpp's and owncoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 #define CLIENT_VERSION_REVISION 0 #define CLIENT_VERSION_BUILD 1
Тут заменяем порты
chainparamsbase.cpp
* Main network */ class CBaseMainParams : public CBaseChainParams { public: CBaseMainParams() { networkID = CBaseChainParams::MAIN; nRPCPort = 9998; } }; static CBaseMainParams mainParams; /** * Testnet (v3) */ class CBaseTestNetParams : public CBaseMainParams { public: CBaseTestNetParams() { networkID = CBaseChainParams::TESTNET; nRPCPort = 19998; strDataDir = "testnet3"; } };
Я заменил 9998 на 9886 ,19998 на 19886
Управление сложностью майнига и наградами мастер нодам.
main.cpp
Я здесь оставил все как есть ,вы же можете попробовать поэкспериментировать , и можете дополнить мою статью в теме разъяснениями под данным пунктам.
Тут мы заменяем порты с 9999 на 9887
masternode.cpp
if(Params().NetworkID() == CBaseChainParams::MAIN) { if(addr.GetPort() != 9999) return false; } else if(addr.GetPort() == 9999) return false;
И снова порты 9999 на 9887
masternodeconfig.cpp
if(Params().NetworkID() == CBaseChainParams::MAIN) { if(CService(ip).GetPort() != 9999) { strErr = _("Invalid port detected in masternode.conf") + "\n" + strprintf(_("Line: %d"), linenumber) + "\n\"" + line + "\"" + "\n" + _("(must be 9999 for mainnet)"); streamConfig.close(); return false; } } else if(CService(ip).GetPort() == 9999) { strErr = _("Invalid port detected in masternode.conf") + "\n" + strprintf(_("Line: %d"), linenumber) + "\n\"" + line + "\"" + "\n" + _("(9999 could be used only on mainnet)"); streamConfig.close(); return false; }
Заменяем порты с 9999 на 9887
masternodeman.cpp
if(Params().NetworkID() == CBaseChainParams::MAIN){ if(addr.GetPort() != 9999) return; } else if(addr.GetPort() == 9999) return;
Сохраняем все исходники и идем по этим путям отрываем эти документы и редактируем порты
D:\owncoin\owncoin\contrib\linearize\linearize-hashes.py
if 'host' not in settings: settings['host'] = '127.0.0.1' if 'port' not in settings: settings['port'] = 9998 if 'min_height' not in settings: settings['min_height'] = 0 if 'max_height' not in settings: settings['max_height'] = 313000 if 'rpcuser' not in settings or 'rpcpassword' not in settings: print("Missing username and/or password in cfg file", file=stderr) sys.exit(1)
D:\owncoin\owncoin\contrib\spendfrom\spendfrom.py
testnet = config.get('testnet', '0') testnet = (int(testnet) > 0) # 0/1 in config file, convert to True/False if not 'rpcport' in config: config['rpcport'] = 19998 if testnet else 9998
D:\owncoin\owncoin\contrib\bitrpc\bitrpc.py
if rpcpass == "": access = ServiceProxy("http://127.0.0.1:9998") else: access = ServiceProxy("http://"+rpcuser+":"+rpcpass+"@127.0.0.1:9998") cmd = sys.argv[1].lower()
заменяем 9998 на 9886 и 19998 на 19886
Теперь идем в
D:\owncoin\owncoin\contrib\qos\tc.sh
# this filter sends the packages into the 1:11 class, and this class is limited to ${LIMIT} iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 9999 ! -d ${LOCALNET} -j MARK --set-mark 0x2 iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 9999 ! -d ${LOCALNET} -j MARK --set-mark 0x2
и заменяем тут порты 9999 на 9887
Теперь сюда
D:\owncoin\owncoin\src\test\netbase_tests.cpp
и тут заменяем
BOOST_CHECK(TestSplitHost("www.bitcoin.org", "www.bitcoin.org", -1)); BOOST_CHECK(TestSplitHost("[www.bitcoin.org]", "www.bitcoin.org", -1)); BOOST_CHECK(TestSplitHost("www.bitcoin.org:80", "www.bitcoin.org", 80)); BOOST_CHECK(TestSplitHost("[www.bitcoin.org]:80", "www.bitcoin.org", 80)); BOOST_CHECK(TestSplitHost("127.0.0.1", "127.0.0.1", -1)); BOOST_CHECK(TestSplitHost("127.0.0.1:9999", "127.0.0.1", 9999)); BOOST_CHECK(TestSplitHost("[127.0.0.1]", "127.0.0.1", -1)); BOOST_CHECK(TestSplitHost("[127.0.0.1]:9999", "127.0.0.1", 9999)); BOOST_CHECK(TestSplitHost("::ffff:127.0.0.1", "::ffff:127.0.0.1", -1)); BOOST_CHECK(TestSplitHost("[::ffff:127.0.0.1]:9999", "::ffff:127.0.0.1", 9999)); BOOST_CHECK(TestSplitHost("[::]:9999", "::", 9999)); BOOST_CHECK(TestSplitHost("::9999", "::9999", -1)); BOOST_CHECK(TestSplitHost(":9999", "", 9999)); BOOST_CHECK(TestSplitHost("[]:9999", "", 9999)); BOOST_CHECK(TestSplitHost("", "", -1));
И заменяем 9999 на 9887 потом в поиске ищем еще 9999 , нас бросает в низ документа, и делаем тоже самое.
BOOST_CHECK(TestParse("127.0.0.1", "127.0.0.1:65535")); BOOST_CHECK(TestParse("127.0.0.1:9999", "127.0.0.1:9999")); BOOST_CHECK(TestParse("::ffff:127.0.0.1", "127.0.0.1:65535")); BOOST_CHECK(TestParse("::", "[::]:65535")); BOOST_CHECK(TestParse("[::]:9999", "[::]:9999")); BOOST_CHECK(TestParse("[127.0.0.1]", "127.0.0.1:65535")); BOOST_CHECK(TestParse(":::", ""));
Теперь сюда
D:\owncoin\owncoin\contrib\seeds\makeseeds.py
И изменяем это
SUSPICIOUS_HOSTS = set([ "130.211.129.106", "178.63.107.226", "83.81.130.26", "88.198.17.7", "148.251.238.178", "176.9.46.6", "54.173.72.127", "54.174.10.182", "54.183.64.54", "54.194.231.211", "54.66.214.167", "54.66.220.137", "54.67.33.14", "54.77.251.214", "54.94.195.96", "54.94.200.247" ]) import re import sys import dns.resolver PATTERN_IPV4 = re.compile(r"^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})):9999$") PATTERN_AGENT = re.compile(r"^(\/Satoshi:0.8.6\/|\/Satoshi:0.9.(2|3)\/|\/Core:0.1(0|1|2).\d{1,2}.\d{1,2}\/)$")
На такое
SUSPICIOUS_HOSTS = set([ "127.0.0.1" - наш ип основной ноды ]) import re import sys import dns.resolver PATTERN_IPV4 = re.compile(r"^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})):9887$") тут изменяем порт PATTERN_AGENT = re.compile(r"^(\/Satoshi:0.8.6\/|\/Satoshi:0.9.(2|3)\/|\/Core:0.1(0|1|2).\d{1,2}.\d{1,2}\/)$")
Теперь идем в
D:\owncoin\owncoin\share\seeds
В обоих текстовых документах трем все типы и пишем свой.
Открываем
generate-seeds.py
И заменяем тут порты
with open(os.path.join(indir,'nodes_main.txt'),'r') as f: process_nodes(g, f, 'pnSeed6_main', 9999) g.write('\n') with open(os.path.join(indir,'nodes_test.txt'),'r') as f: process_nodes(g, f, 'pnSeed6_test', 19999) g.write('#endif // BITCOIN_CHAINPARAMSSEEDS_H\n')
Результат
with open(os.path.join(indir,'nodes_main.txt'),'r') as f: process_nodes(g, f, 'pnSeed6_main', 9887) g.write('\n') with open(os.path.join(indir,'nodes_test.txt'),'r') as f: process_nodes(g, f, 'pnSeed6_test', 19887) g.write('#endif // BITCOIN_CHAINPARAMSSEEDS_H\n')
Теперь идем сюда
D:\owncoin\owncoin\configure.ac
И ставим версию которою мы указали в исходном файле ,напомню я указывал 1.0.0.1
define(_CLIENT_VERSION_MAJOR, 0) define(_CLIENT_VERSION_MINOR, 12) define(_CLIENT_VERSION_REVISION, 0) define(_CLIENT_VERSION_BUILD, 55)
Стало так
define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_REVISION, 0) define(_CLIENT_VERSION_BUILD, 1)
Теперь переходим в
D:\owncoin\owncoin\contrib\gitian-descriptors
И в каждом файле изменяем
name: "owncoin-win-0.12" enable_cache: true
Получилось так
name: "owncoin-win-1.0.0.1" enable_cache: true
Не забываем все сохранить.
Теперь переходим в на клиент github и загружаем все изменения на репозиторий.
Идем на сайт
Жмем на releases
Далее жмем Draft a new release
В таге пишем номер версии в моем случае это 1.0.0.1
Жмем Publish release
Теперь переходим в нашу консоль на дибиан
Убеждаемся что мы в корневой директории пользователя дебиан.
И пишем туда
git clone GitHub - mycointest/owncoin: Owncoin - Reinventing Cryptocurrency
Ждем пока скачаются исходники.
Переходим в
cd gitian-builder
Потом
cd ~debian/owncoin
Пишем
git pull
Переходим
cd ~debian/gitian-builder
Снова качаем зависимости
make -C ../owncoin/depends download SOURCES_PATH=
pwd/cache/common
Собираем
./bin/gbuild --commit owncoin=v1.0.0.1 ../owncoin/contrib/gitian-descriptors/gitian-win.yml
Открываем параллельно 2 сесии SSH
Переходим в них в
cd gitian-builder
и смотри сборку с помощью
tail -f var/install.log tail -f var/build.log
Что бы открыть логи , надо сначала дождаться их создания!
Дожидаемся компиляции , берем клиент с ftp
Делаем 2 папку под дату , запускам 1 клиент
и
2 клиент с
-datadir=owncoin2 –listen=0 –gen=1
В конф файл не забываем прописать
addnode=127.0.0.1
Запускаем сначала тот что c –listen=1 а после уже тот что с 0, и наблюдаем генерацию монеток