Forking Qwertycoin

This is a guide on how to make your own Qwertycoin fork.

Creator's License

Before we begin, you will see a license at the beginning of every file. It is important not to remove or alter that license statement other than how we have it detailed here.

// Copyright (c) 2012-2017, The CryptoNote developers, The Bytecoin developers
// Copyright (c) 2016-2018, The Karbowanec developers
// Copyright (c) 2018-2019, The Qwertycoin Developers
// Copyright (c) 2019, Your Name Goes Here
//
// Please see the included LICENSE file for more information.

Steps

Change the Binary Names

src/CMakeLists.txt

// Daemon name (coin name + d at the end)
set_target_properties(QwertycoinTools_Daemon PROPERTIES OUTPUT_NAME "qwertycoind")
// Miner name
set_target_properties(QwertycoinTools_Miner PROPERTIES OUTPUT_NAME "miner")
// Service wallet name
set_target_properties(QwertycoinTools_PaymentGateService PROPERTIES OUTPUT_NAME "walletd")
// Wallet name
set_target_properties(QwertycoinTools_SimpleWallet PROPERTIES OUTPUT_NAME "simplewallet")

Change ASCII Art

lib/Global/Constants.h

This ASCII art will display on the binary programs. You can use this generator to create your ASCII art. Depending on the ASCII art you choose to use, you may need to provide a different version for Windows.

const std::string windowsAsciiArt =
"\n \n"
" _ _ \n"
" | | (_) \n"
" __ ___ _____ _ __| |_ _ _ ___ ___ _ _ __ \n"
" / _` \\ \\ /\\ / / _ \\ '__| __| | | |/ __/ _ \\| | '_\\ \n"
"| (_| |\\ V V / __/ | | |_| |_| | (_| (_) | | | | | \n"
" \\__, | \\_/\\_/ \\___|_| \\__|\\__, |\\___\\___/|_|_| |_| \n"
" | | __/ | \n"
" |_| |___/ \n"
" \n";
const std::string nonWindowsAsciiArt =
"\n \n"
" ██████╗ ██╗ ██╗███████╗██████╗ ████████╗██╗ ██╗ ██████╗ ██████╗ ██╗███╗ ██╗\n"
"██╔═══██╗██║ ██║██╔════╝██╔══██╗╚══██╔══╝╚██╗ ██╔╝██╔════╝██╔═══██╗██║████╗ ██║\n"
"██║ ██║██║ █╗ ██║█████╗ ██████╔╝ ██║ ╚████╔╝ ██║ ██║ ██║██║██╔██╗ ██║\n"
"██║▄▄ ██║██║███╗██║██╔══╝ ██╔══██╗ ██║ ╚██╔╝ ██║ ██║ ██║██║██║╚██╗██║\n"
"╚██████╔╝╚███╔███╔╝███████╗██║ ██║ ██║ ██║ ╚██████╗╚██████╔╝██║██║ ╚████║\n"
" ╚══▀▀═╝ ╚══╝╚══╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝╚═╝ ╚═══╝\n"
" \n";

Change Block Time

lib/global/CryptoNoteConfig.h

Block time is measured in seconds. Qwertycoin has 2 minute blocks.

const uint64_t DIFFICULTY_TARGET = 120; // seconds

Change Wallet Address Prefix

lib/global/CryptoNoteConfig.h

Qwertycoin has an address prefix of QWC. Every wallet that is generated will begin with the same prefix. You can use the generator on this page to generate your prefix in hexadecimal.

const uint64_t CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX = 0x14820c;

Change Mined Coins Unlocked Timeframe

lib/global/CryptoNoteConfig.h

Mined coins should wait about 20 minutes before being awarded to the miners. You can adjust this to suit your coin's parameters.

const size_t CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW = 60;

Change Money Supply

lib/global/CryptoNoteConfig.h

The coin supply is measured in Atomic Units. The amount of decimal places that you have determines how many coins this number truly represents.

  • (uint64_t)(-1) = 18446744073709551616 coins

  • You can define number explicitly like so: UINT64_C(18446744073709551616)

const uint64_t MONEY_SUPPLY = (uint64_t)(-1);

Change Emission Speed

lib/global/CryptoNoteConfig.h

The emission speed governs how much of the coin's total available supply is awarded to miners with each block. You can play around with the emission speed using this tool.

const unsigned EMISSION_SPEED_FACTOR = 19;

Change Decimal Points

lib/global/CryptoNoteConfig.h

Change this number to suit your needs.

const size_t CRYPTONOTE_DISPLAY_DECIMAL_POINT = 8;

Change Minimum and Maximum Transaction Fees

lib/global/CryptoNoteConfig.h

Set the fees in Atomic Units for each transaction. Make sure this number isn't too low or you might run into spam transaction attacks.

const uint64_t MINIMUM_FEE = UINT64_C(100000000);
const uint64_t MAXIMUM_FEE = UINT64_C(100000000);

Change Remote Node Fee

lib/global/CryptoNoteConfig.h

This section defines the fees that the remote node will receive from the sender.

const double REMOTE_NODE_FEE_FACTOR = 0.25; // percent

Set Dust Limit

lib/global/CryptoNoteConfig.h

Dust is the word for the smallest pieces of a coin that are too small to be included with in a block. Any amount lower than this will not be spendable. This number is measured in Atomic Units.

const uint64_t DEFAULT_DUST_THRESHOLD = UINT64_C(100000);

Set mixin Level

lib/global/CryptoNoteConfig.h

Mixin determines how private transactions are. A high mixin on a new network can cause transactions to fail so it is suggested to allow zero mixin and to start off with reasonable limits and increase later.

const uint64_t MIN_TX_MIXIN_SIZE = 0;
const uint64_t MAX_TX_MIXIN_SIZE = 20;
const uint64_t MIN_TX_MIXIN_SIZE_V1 = 2;
const uint64_t MAX_TX_MIXIN_SIZE_V1 = 20;
const uint64_t MIN_TX_MIXIN_SIZE_V2 = 2;
const uint64_t MAX_TX_MIXIN_SIZE_V2 = 20;
const uint64_t MIN_TX_MIXIN_SIZE_V3 = 3;
const uint64_t MAX_TX_MIXIN_SIZE_V3 = 3;
/* The heights to activate the mixin limits at */
const uint32_t MIXIN_LIMITS_V1_HEIGHT = 200000;
const uint32_t MIXIN_LIMITS_V2_HEIGHT = 1000000;
const uint32_t MIXIN_LIMITS_V3_HEIGHT = 1200000;

Change Hashing Algorithm

lib/global/CryptoNoteConfig.h

If you want to be an ASIC mined coin, make this number very high (~300000-350000). If you don't want to be ASIC mined, set this number to 3. You can also change V5 and V6 for your coin.

const uint32_t UPGRADE_HEIGHT_V4 = 110520;

Change Coin Name

lib/global/CryptoNoteConfig.h

const char CRYPTONOTE_NAME[] = "Qwertycoin";

Change P2P and RPC Ports

lib/global/CryptoNoteConfig.h

Set these to personal preference.

const int P2P_DEFAULT_PORT = 8196;
const int RPC_DEFAULT_PORT = 8197;

Software Update URL

lib/global/CryptoNoteConfig.h

Set this according to your preferences.

const char LATEST_VERSION_URL[] = "https://releases.qwertycoin.org";

Change Seed Nodes

lib/global/CryptoNoteConfig.h

Seed nodes are full daemons that serve up a copy of the blockchain data for peers just joining the network. Minimum amount is one but several are recommended.

const char *const SEED_NODES[] = {
"node-00.qwertycoin.org:8196",
"node-01.qwertycoin.org:8196",
"node-02.qwertycoin.org:8196",
"node-03.qwertycoin.org:8196",
"node-04.qwertycoin.org:8196",
"node-05.qwertycoin.org:8196",
"198.147.30.115:8196", //loop
"198.147.30.116:8196" //pool
};

Remove Checkpoints

lib/global/Checkpoints.h

Remove checkpoints.

const std::initializer_list<CheckpointData> CHECKPOINTS = {};

Change CLI Wallet Config

lib/Global/Constants.h

Change to your personal preference.

namespace WalletConfig {
/*!
The prefix your coins address starts with
*/
const uint64_t addressPrefix = 0x14820c;
/*!
Your coins 'Ticker', e.g. Monero = XMR, Bitcoin = BTC
*/
const std::string ticker = "QWC";
/*!
The filename to output the CSV to in save_csv
*/
const std::string csvFilename = "transactions.csv";
/*!
The filename to read+write the address book to - consider starting with
a leading '.' to make it hidden under mac+linux
*/
const std::string addressBookFilename = ".addressBook.json";
/*!
The name of your deamon
*/
const std::string daemonName = "qwertycoind";
/*!
The name to call this wallet
*/
const std::string walletName = "simplewallet";
/*!
The name of service/walletd, the programmatic rpc interface to a wallet
*/
const std::string walletdName = "qwertycoin-service";
/*!
The full name of your crypto
*/
const std::string coinName = std::string(CryptoNote::CRYPTONOTE_NAME);
/*!
Where can your users contact you for support? E.g. discord
*/
const std::string contactLink = "http://chat.qwertycoin.org";

Set Address Length

lib/Global/Constants.h

Your address length should be 95 + the number of letters in your address prefix.

const uint16_t standardAddressLength = 98;

How to Compile and Deploy Your Coin on Linux

Prerequisites

Example for Ubuntu

sudo apt-get install build-essential cmake git

Building

  • After installing dependencies run simple script:

git clone --recurse-submodules https://github.com/qwertycoin-org/qwertycoin
cd ./qwertycoin
mkdir ./build
cd ./build
cmake -DBUILD_ALL:BOOL=TRUE ..
cmake --build . --config Release
  • If all went well, it will complete successfully, and you will find all your binaries in the ./build/src directory.

Deploy

On the seed nodes that you listed in src/config/CryptoNoteConfig.h, launch your newly compiled daemons. It is suggested that you run the daemons inside of tmux to keep them running. Here's how to start the daemons inside a basic loop to relaunch the daemon if it fails.

tmux
while true ; do ./qwertycoind ; done
  • Type control b + d to exit tmux

Advanced Parameters

Coming soon....