2017 m. lapkričio 28 d., antradienis

Creating crypto

 Here is some relevant code from main.h:

static const int64 MIN_TX_FEE = 0.1 * CENT;
static const int64 MIN_RELAY_TX_FEE = 0.1 * CENT;
static const int64 MAX_MONEY = 2000000000 * COIN;
static const int64 MAX_MINT_PROOF_OF_WORK = 9999 * COIN;
static const int64 MIN_TXOUT_AMOUNT = MIN_TX_FEE;
static const int STAKE_TARGET_SPACING = 1 * 60; // 1-minute block
static const int STAKE_MIN_AGE = 60 * 60; // minimum age for coin age
static const int STAKE_MAX_AGE = 60 * 60 * 24 * 5; // stake age of full weight
static const int STAKE_START_TIME = 1418470264; // Sat 13 Dec 2014 06:31:04 AM EST
static const unsigned int POW_START_TIME = 1418403600; // Fri 12 Dec 2014 12:00:00 PM EST
static const unsigned int POW_END_TIME = 1419181200; // Sun 21 Dec 2014 12:00:00 PM EST
static const unsigned int MODIFIER_INTERVAL = 10 * 60;
static const int64 NUMBER_OF_PRIMENODE = 50;
static const int64 MINIMUM_FOR_ORION = 50 * COIN;
static const int64 MINIMUM_FOR_PRIMENODE = 125000 * COIN;

Create a new genesis block.
Once set it will look something like this:

static const uint256 hashGenesisBlockOfficial("0x0");
block.nNonce = 0;
assert(block.hashMerkleRoot == uint256("0x0"));

Resources-tutorials:
https://themerkle.com/altcoins-dying-make-one-hour/
https://youtu.be/86jqAfySi64 - tutorial making your own crypto
https://build-a-co.in - crypto currency generator



Kriptovaliutos kūrimas pirminio kodo keitimas

Kad įsitikintume, ar prievadai neužimti peržiūrime okupuotų prievadų lentelę, kurią galime rasti – (https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers) .

src/init.cpp: (P2P PORT + Testnet Port)
 LINE 235 "  -port= " + _("Listen for connections on  (default: 55884 or testnet: 45884)") + "\n" +
src/init.cpp: (RPC PORT)
 LINE 271 "  -rpcport= " + _("Listen for JSON-RPC connections on  (default: 55883)") + "\n" +

Tolesni nustatymai aprašo monetų generavimo intervalus, sudėtingumo perskaičiavimo laiką.
src/main.cpp: (Monetų kiekis, kurį gauna kasėjai suradę bloką)
 LINE 831 int64 nSubsidy = 1 * COIN;
 LINE 832 if(nHeight < 10) // pirmas motetos po 10 bloko
src/main.cpp: (Parodo kas kiek laiko keičiamas sudėtingumo lygis)
 LINE 837 static const int64 nTargetTimespan = 0.35 * 24 * 60 * 60 //0.35 blokų perskaičiavimo laikas
 LINE 836 static const int64 nTargetSpacing = 15; // blokų generavimas kas 15s

src/main.h: (Bendras monetų kiekis ir Blokų skaičius per parą)
LINE 43 static const int64 MAX_MONEY = 10000 * COIN; // maksimalus monetų kiekis
LINE 550 return dPriority > COIN * 720 / 250; // 720 blokai randami per parą.

Pirma adreso raidė yra parenkama naudojant base58 algoritmą. Pagal puslapį, base58 reikšmes galima rasti puslapyje (https://en.bitcoin.it/wiki/Base58Check_encoding).
src/base58.h:
 LINE 280 PUBKEY_ADDRESS = 38, //Nurodomas adreso pirmas bitas

Eros laikas
Pirmas dalykas, kurį turime pakeisti prieš pradedant generuoti blokus, tai pradinis monetos gimimo laikas. Nuo vidurnakčio 1970 metų 00:00:00 Unix (Epoch ar POSIX) buvo pradėtas skaičiuoti laikas . Žemiau pateikiamas pavyzdys:
398419697 (ISO 8601:2014-04-25T09:54:57Z)
Tikslų epochos laiką randame (http://www.epochconverter.com) su galimybe apskaičiuoti būsimą epochos laiką.
Unix sistemoje laikas randamas komanda:
$ date +%s
$ 1369590088
Yra dvi pagrindinės vietos, kuriose reikia pakeisti laiką pirminiame kode.
src/main.cpp: (Tesnet laikas)
 LINE 2034 block.nTime    = 1398459635;
src/main.cpp: (Pagrindinis laikas)
 LINE 2040 block.nTime    = 1398459635;

Kompiliavimas
Dabar atlikę pakeitimus, galime pradėti sukompiliuoti barcoin failą. Kompiliuojame naudodami komandą:
barcoin/src% make -f makefile.unix USE_UPNP=-

Paleidžiame sukompiliuotą programą tesnet režimu:

root@Projektas:~/barcoin/src# ./barcoin -testnetd
barcoin: main.cpp:2082: bool LoadBlockIndex(bool): Assertion `block.GetHash() == hashGenesisBlock' failed.
Aborted
root@Projektas:~/barcoin/src# LoadBlockIndex(bool): Assertion `block.GetHash() == hashGenesisBlock' failed.

/debug.log
Gfcoin version v0.6.3.0-ga19eb2d-beta (2014-04-25 22:58:31 +0300)
Startup time: 04/26/14 10:44:51
Default data directory /root/.gfcoin
Used data directory /root/.gfcoin
Bound to [::]:29931
Bound to 0.0.0.0:29931
Loading block index...
dbenv.open LogDir=/root/.gfcoin/database ErrorFile=/root/.gfcoin/db.log
800426389bc34c1f79fe330efcc6e5f187821a4f69a7982d3c46c58df442f21f
384b060671f4a93948e9c168216dadb0ca2fbc54aa11c86b0345b6af1c59b2f5
5a2e19825b4162f68602039040f1e05d9f924ff00a3aff7327ca6abd6f3279bc
CBlock(hash=800426389bc34c1f79fe, PoW=837b089eb934d1dd50e9, ver=1, hashPrevBlock=00000000000000000000, hashMerkleRoot=5a2e19825b, nTime=1398459635, nBits=1e0ffff0, nNonce=2085386442, vtx=1)
CTransaction(hash=5a2e19825b, ver=1, vin.size=1, vout.size=1, nLockTime=0)
CTxIn(COutPoint(0000000000, -1), coinbase 04ffff001d010441746f646f3a207265706c616365207769746820736f6d657468696e67207468617420656e7375726573206e6f207072656d696e696e6720746f6f6b20706c616365)
CTxOut(error)
vMerkleTree: 5a2e19825b

Ši eilute -
800426389bc34c1f79fe330efcc6e5f187821a4f69a7982d3c46c58df442f21f -  nusako bloką su neegzistuojančią Merkel maišą naudota main.cpp faile:

Žemiau nurodyta eilutė sugeneruota sugeneruoja teisingą Merkel maišą naudojant epochos laiką iš main.cpp dokumento:
5a2e19825b4162f68602039040f1e05d9f924ff00a3aff7327ca6abd6f3279bc

Įrašome teisingai sugeneruota maišą main.cpp dokumente.
src/main.cpp
 LINE 2048 assert(block.hashMerkleRoot == uint256("0x5a2e19825b4162f68602039040f1e05d9f924ff00a3aff7327ca6abd6f3279bc"));

Kad būtų sukurtas Pradinis blokas, reikia pakeisti main.cpp eilutėlės reikšmę į true, ji paprastai nebūna nustatyta, nes reikalinga tik pirmojo bloko generavimui.

src/main.cpp
 LINE 2034 if (true && block.GetHash() != hashGenesisBlock)

Kad pakeitimai įsigaliotų klientas turi būtų perkompiliuotas
barcoin/src$ make -f makefile.unix

Atlikus pakeitimus, programa kompiliuojama. Dar karta paleidžiame programą.
barcoin/src$ ./ barcoin –testnet

3.3 Pradžios bloko generavimas
Pradinio bloko „kasimas“, tai veiksmas reikalaujantis daug kompiuterio resursų, debug.log dokumente galime matyti, kaip yra ieškoma bloko, keičiant nonce reikšmę. Pradinio bloko sprendimas gali užtrukti ilgą laiką.
/debug.log
block.nTime = 1000000000
nonce 00115000: hash = cbf6230ccf415873cd8c10b33c092943224d04458671cff39898ffb636b865dd (target = 00000ffff0000000000000000000000000000000000000000000000000000000)
nonce 00116000: hash = 8ed7cc737432e37c2617c57b01305e3aff041479bf1d5391dc234bc9935bfa4c (target = 00000ffff0000000000000000000000000000000000000000000000000000000)
nonce 00117000: hash = a44c797fd7bd0ef7211f092cbfa0a214e74f5b16929860b7001d8725df2562a7 (target = 00000ffff0000000000000000000000000000000000000000000000000000000)
nonce 00118000: hash = b2b3ec59ea20e29ca0024cdfda994bb759b633cd12695dc1e6126fed0ab67162 (target = 00000ffff0000000000000000000000000000000000000000000000000000000)
nonce 00119000: hash = 521e992768cdd42607ae9f064e98623686fc96f33c04630f8a973c35a3e381cc (target = 00000ffff0000000000000000000000000000000000000000000000000000000)
nonce 0011A000: hash = dbb91176dc6e9ca7559bda664fa2bc854c447969a41afb9593a8a3b0b45bafea (target = 00000ffff0000000000000000000000000000000000000000000000000000000)
nonce 0011B000: hash = 2dd8fa5990dda1be7595f30ce7d801de7a457aa687700badf895a085abd8f932 (target = 00000ffff0000000000000000000000000000000000000000000000000000000)
nonce 0011C000: hash = 7fa071b3217feda33745c967cc0226b8c47269588c8cbb8d4bc69822eda31cd5 (target = 00000ffff0000000000000000000000000000000000000000000000000000000)

block.nNonce = 1167091
block.GetHash = c528c52daedce24e8d7a735e7e947946f41b3b578dfbab6de7a2e28bb713a5a1
CBlock(hash=c528c52daedce24e8d7a, PoW=00000dc4adbe12efe41a, ver=1, hashPrevBlock=00000000000000000000, hashMerkleRoot=2fc1b7ef46, nTime=1000000000, nBits=1e0ffff0, nNonce=1167091, vtx=1)
  CTransaction(hash=2fc1b7ef46, ver=1, vin.size=1, vout.size=1, nLockTime=0)
    CTxIn(COutPoint(0000000000, -1), coinbase 04ffff001d0104284275696c64696e67206120636f696e20746f2073686f772074686520776f726c6420686f772e2e2e)
    CTxOut(error)

Kaip matome iš debug.log dokumento, buvo atrasta bloko maiša, kartu su ja matome none reikšmę.

block.nNonce = 1167091
 block.GetHash = c528c52daedce24e8d7a735e7e947946f41b3b578dfbab6de7a2e28bb713a5a1

Viskas kas mums lieka padaryti, tai pakeisti pradžios bloko atraštę ir nonce main.cpp dokumente.
src/main.cpp:
 LINE 1984 hashGenesisBlock = uint256("0xc528c52daedce24e8d7a735e7e947946f41b3b578dfbab6de7a2e28bb713a5a1");
Yes, you need to leave the 0x in front of the hashes. You also need to enter the nNonce:
src/main.cpp:
 LINE 2024 block.nNonce   = 1167091;

Dabar esame pasirengę padėti bandymus testent režime. Prisijungti prie kito kompiuterio yra gana sudėtinga. Reikės prijungti du kompiuterius su the -connect=x.x.x.x kintamuoju, įvedant IP adresą komanda:
barcoin/src% ./barcoin -testnet -connect= 88.223.50.210

barcoin/src% ./barcoin -testnet -connect= 188.226.131.112

Sėkmingai sujungus ir įvedus komanda getinfo gaunamas pranešimas.
barcoin/src%./barcoin getinfo                       
 {
     "version" : 1000000,
     "protocolversion" : 60001,
     "walletversion" : 60000,
     "balance" : 0.00000000,
     "blocks" : 0,
     "connections" : 1,
     "proxy" : "",
     "difficulty" : 0.00024414,
     "testnet" : true,
     "keypoololdest" : 1369621665,
     "keypoolsize" : 101,
     "paytxfee" : 0.00000000,
     "mininput" : 0.00010000,
     "errors" : ""
   }

3.4 Kriptovaliutos „kasimas“


Dabar kai klientai sujungti galima pradėti generuoti monetas naudodami komanda:
barcoin/src% ./barcoin setgenerate true 3

Skaičius 3 nurodo kiek gijų procesorius naudos blokų „kasimui“. Po kurio laiko išvysime kažką panašaus į:
barcoin/src% ./barcoin getmininginfo
 {
     "blocks" : 0,
     "currentblocksize" : 1000,
     "currentblocktx" : 0,
     "difficulty" : 0.00024414,
     "errors" : "",
     "generate" : true,
     "genproclimit" : 16,
     "hashespersec" : 1432,
     "networkhashps" : -9223372036854775808,
     "pooledtx" : 0,
     "testnet" : true
 }