Author

Topic: [Guide] Πως να φτιάξετε το δικό σας altcoin (Read 337 times)

hero member
Activity: 773
Merit: 528
Ευχαριστούμε για τον οδηγό.

Απλά θα ήθελα να προσθέσω ότι το να φτιάξει κάποιος ένα altcoin με βάση το bitcoin δεν έχει νόημα πέρα από καθαρά εκπαιδευτικούς σκοπούς.
legendary
Activity: 1512
Merit: 7340
Farewell, Leo
Ακόμα κι αν δεν είμαι υπέρ της φιλοσοφίας των altcoins και βάζω πάνω από όλα το bitcoin, θεωρώ πως ο καθένας έχει το δικαίωμα να δημιουργήσει το δικό του κρυπτονόμισμα καθώς ο κώδικας είναι open source. Η αλήθεια είναι πως από τότε που ξεκίνησα να τον διαβάζω κατάλαβα πως δεν μπορεί κάποιος τόσο εύκολα να ξεκινήσει «το δικό του blockchain» ακόμα κι αν έχουμε τα αρχεία του Bitcoin Core.

Για οποιονδήποτε θέλει να συνεχίσει να διαβάζει, να ξέρει πως χρειάζεται Windows 10 και υπομονή. Αν δεν τα έχει αυτά τα δύο, δεν μπορεί να φτιάξει altcoin, τουλάχιστον με τον τρόπο που θα παρουσιάσω. Το τελικό αποτέλεσμα θα τρέχει σε windows μόνο. Όχι πως είναι δύσκολο να τρέχει και σε linux, απλά είναι extra βήματα. Οποιοσδήποτε ακουληθεί αυτόν τον οδηγό πιθανότατα να μην τον νοιάζει αυτό προς το παρόν.

Αρχικά πρέπει να εγκαταστήσουμε ένα Ubuntu terminal για να κάνουμε τη ζωή μας πιο εύκολη, γι'αυτό θα πάτε στο windows store και θα ψάξετε για Ubuntu 18.04:


(Μόλις το ανοίξετε βάλτε ένα username και ένα password)

Τώρα θα ακολουθήσω τα βήματα του build-windows.md από το github για να εγκαταστίσουμε κάποια dependencies. (εξαρτήσεις)

Αντιγράψτε κάθε γραμμή από κάτω και τρέξτε την στο terminal:
Code:
sudo apt update
sudo apt upgrade
sudo apt install build-essential libtool autotools-dev automake pkg-config bsdmainutils curl git

Αυτό ίσως πάρει λίγη ώρα. Μετά θα κάνετε clone τον source code του bitcoin core από το github. Δεξιά από το bitcoin.git είναι το όνομα του φακέλου που θα δημιουργηθεί και το όνομα του κρυπτονομίσματος που θα φτιάξουμε. Σε αυτό το topic θα βάλω χρησιμοποιήσω το κλασικό παράδειγμα "altcoin". Εάν αποφασίσετε να χρησιμοποιήσετε ένα άλλο όνομα, φροντίστε να το αλλάξετε και σε κάθε άλλο μέρος αυτού του tutorial:
Code:
git clone https://github.com/bitcoin/bitcoin.git altcoin

Μόλις τελειώσει κι αυτό, πρέπει να βρείτε τα αρχεία του bitcoin core κάπου στον υπολογιστή σας. Πιθανότατα θα βρίσκονται στο:
Code:
C:\Users\\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs\home\
είναι το όνομα του user στα windows και το αντίστοιχο για τα ubuntu που δώσατε στην αρχή.

Στον φάκελο "altcoin" τα αρχεία θα πρέπει να φαίνονται έτσι:


Αυτή τη στιγμή μπορούμε να τα χτίσουμε, το πρόβλημα είναι πως θα φτιάξουμε ένα αντίγραφο του bitcoin core που θα ακολουθεί στο blockchain του bitcoin, κάτι που προφανώς δεν θέλουμε. Θέλουμε το δικό μας blockchain. Το πρώτο πράγμα που πρέπει να καλύψουμε είναι να αντικαταστήσουμε όπου υπάρχει η λέξη "bitcoin" σε "altcoin".

Τρέξτε αυτές τις γραμμές:
Code:
cd altcoin
find . -type f -print0 | xargs -0 sed -i 's/bitcoin/altcoin/g'
find . -type f -print0 | xargs -0 sed -i 's/Bitcoin/Altcoin/g'
find . -type f -print0 | xargs -0 sed -i 's/BTC/ATC/g'
find . -type f -print0 | xargs -0 sed -i 's/BITCOIN/ALTCOIN/g'
find . -type f -print0 | xargs -0 sed -i 's/BitCoin/AltCoin/g'
(Θα πάρει λίγη ώρα)

Αφού τελειώσει πρέπει να αντικαθαστίσουμε όποιο αρχείο περιλαμβάνει τη λέξη "bitcoin" σε "altcoin" στο τίτλο του. Τρέξτε πάλι κάθε γραμμή ξεχωριστά:
Code:
cd ..
find altcoin -type d -exec chmod 755 {} \;
cd altcoin
find -iname \*.* | rename -v "s/bitcoin/altcoin/g"


Αλλαγές στον κώδικα

Και τώρα ας αρχίσει το ωραίο πράμα. Πρέπει να διαφοροποιήσουμε το δικό μας blockchain από του bitcoin, αλλάζοντας τα ports. Πηγαίνετε στα αρχεία από windows explorer και πατήστε στον src.
Στο chainparamsbase.cpp αλλάξτε το nRPCPort σε ό,τι νούμερο θέλετε. Εγώ προτείνω απλά να αλλάξετε το οχτάρι πχ:
Code:
if (chain == CBaseChainParams::MAIN) {
        return MakeUnique("", 2332, 2334);
    } else if (chain == CBaseChainParams::TESTNET) {
        return MakeUnique("testnet3", 12332, 12334);
    } else if (chain == CBaseChainParams::SIGNET) {
        return MakeUnique("signet", 32332, 32334);
    } else if (chain == CBaseChainParams::REGTEST) {
        return MakeUnique("regtest", 12443, 12445);
    }

Κάντε το ίδιο και στο nDefaultPort του chainparams.cpp:
Code:
nDefaultPort = 2333;

Τώρα θα διαλέξουμε ένα διαφορετικό signature message στο pchMessageStart του chainparams.cpp. Είναι πολύ σημαντικό σημείο αυτό, εάν δεν αλλαχτεί και συνδεθείτε με έναν node του bitcoin θα θεωρήσει το bitcoin blockchain ως το σωστό. Κάντε το έτσι:
Code:
pchMessageStart[0] = 0xf0;
pchMessageStart[1] = 0xb0;
pchMessageStart[2] = 0xb0;
pchMessageStart[3] = 0xd0;

Αν και προαιρετικό, μπορείτε να αλλάξετε το address prefix. (1, 3, bc1)
Σε αυτό το λινκ είναι όλα τα prefixes: https://en.bitcoin.it/wiki/List_of_address_prefixes
Στο base58Prefixes του chainparams.cpp θα βάλω το "X" για prefix:
Code:
base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,75);

Επίσης προαιρετικό, μπορείτε να αλλάξετε το block reward του νομίσματός σας. Στο bitcoin ξεκινάει με BTC50 για κάθε block.
Ψάξτε για GetBlockSubsidy στο validation.cpp:
Code:
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{
    int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
    // Force block reward to zero when right shift is undefined.
    if (halvings >= 64)
        return 0;

    CAmount nSubsidy = 50 * COIN;
    // Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
    nSubsidy >>= halvings;
    return nSubsidy;
}
Το αφήνω στα 50.

Πρέπει να ορίσουμε το difficulty = 1, καθώς θα είστε οι μόνοι που θα κάνετε mine στην αρχή. Στο chainparams.cpp ψάξτε για nMinimumChainWork και κάντε το:
Code:
consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000000000000000000100010001");

Στο chainparams.cpp υπάρχουν κάποιες γραμμές που περιλαμβάνουν κάποια IP addresses. Αυτό το έχουν κάνει για να συνδέεσαι αυτόματα με το που το ξεκινάς, χωρίς να προσθέσεις κάποιον node με το addnode "xxx.xxx.xx.xx" add. Το νόμισμα που φτιάχνουμε τώρα δεν θα έχει αυτήν την πολυτέλεια, καθώς είναι περίπλοκο. Οπότε, όπου βρείτε γραμμή που να ξεκινάει με vSeeds.emplace_back την σβήνετε. Επίσης, όποια γραμμή ξεκινάει με vFixedSeeds θα την αντικαταστήσετε με:
Code:
vFixedSeeds.clear();

Δεν πρέπει να υπάρχει vFixedSeeds που να κάνει κάτι άλλο.

Στο chainparams.cpp, θα πρέπει να ορίσουμε μηδενική τιμή στο εσωτερικό του checkpointData. Με λίγα λόγια, βεβαιωθείτε πως όλα τα checkpointData είναι έτσι:
Code:
checkpointData = {
            {
                { 0, uint256S("0x0")}
            }
        };

Σε αυτό το tutorial δεν θα εξηγήσω πως να φτιάξουμε το δικό μας genesis block, αφού πάμε να πετύχουμε κάτι το απλό. Όποιος το δει πιο σοβαρά, μπορεί να ψαχτεί και να μάθει πως γίνεται. Αλλιώς μπορεί να περιμένει μέχρι να ανανεώσω το παρόν τόπικ με τις ανάλογες οδηγίες. Επειδή δεν θα αλλάξω το genesis block, καταλαβαίνετε πως η διαφορά του block 0 με του 1ου θα είναι ολόκληρη δεκαετία. Για να είναι valid κάτι τέτοιο πρέπει να αλλάξουμε την τιμή του nMaxTipAge στο validation.cpp.

Γι'αυτό ας την πολλαπλασιάσουμε με το 10000 που είναι αρκετά μεγάλο νούμερο:
Code:
int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE * 10000;

Στο consensus/consensus.h πρέπει να αλλάξει το COINBASE_MATURITY που σημαίνει το πόσο «βαθιά» πρέπει να είναι ένα block για να μπορεί ο miner να ξοδέψει τα coins του. Στο bitcoin είναι 100, δηλαδή κάποιος που θα κάνει mine 1 block πρέπει να περιμένει 100 blocks για να ξοδέψει το block reward του. Μπορούμε να του δώσουμε οποιαδήποτε τιμή, εγώ θα το βάλω ίσο με 3:
Code:
static const int COINBASE_MATURITY = 3;

Τέλος, πρέπει να αλλάξουμε αυτές τις δύο γραμμές του chainparams.cpp:
Code:
m_assumed_blockchain_size = 350;
m_assumed_chain_state_size = 6;

Βάλτε και τα δύο ίσο με 1:
Code:
m_assumed_blockchain_size = 1;
m_assumed_chain_state_size = 1;
Αυτά καθορίζουν μετά από ποιο block μπορούν οι nodes να μεταφέρουν την πληροφορία. (Τουλάχιστον αυτό έχω καταλάβει εγώ)

Τα περισσότερα notepads των windows αλλάζουν permissions όταν μπλέκουμε με αρχεία Linux. Γι'αυτό τρέξτε τις ακόλουθες γραμμές (μία προς μία):
Code:
cd src
sudo chmod 640 validation.cpp
sudo chmod 640 chainparams.cpp
sudo chmod 640 chainparamsbase.cpp
cd consensus
sudo chmod 640 consensus.h
cd ..
cd ..


Χτίσιμο.

Πριν ξεκινήσουμε πρέπει να εγκαταστήσουμε το mingw-w64 cross-compilation tool chain:
Code:
sudo apt install g++-mingw-w64-x86-64

Όταν τελειώσει, χτίζουμε με τις ακόλουθες εντολές:
Code:
PATH=$(echo "$PATH" | sed -e 's/:\/mnt.*//g')
sudo bash -c "echo 0 > /proc/sys/fs/binfmt_misc/status"
cd depends
make HOST=x86_64-w64-mingw32
cd ..
./autogen.sh
CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site ./configure --prefix=/
make
(Μπορεί να πάρει αρκετή ώρα)

Τα αρχείο για να ανοίξει το νέο Altcoin Core βρίσκεται στο altcoin/src/qt:



Μπορείτε να ξεκινήσετε το mining πατώντας window -> console -> generatetoaddress 1 1000000000
Οι εικόνες του bitcoin core μπορούν να αλλάξουν προφανώς αν τις αντικαταστήσουμε στην αρχή και μετά πάμε στο χτίσιμο.

Αυτό ήταν. Μπορείτε πλέον να δώσετε τα αρχεία του altcoin core σας σε όποιον φίλο έχετε, να συνδεθείτε ως nodes και να αρχίζετε να εξορίζετε. Το tutorial αυτό ίσως να αλλάξει στο μέλλον για πρόσθεση νέων οδηγιών. Όποιος αντιμετωπίζει κάποιο πρόβλημα εννοείται πως θα κάνει reply εδώ.
Jump to: