Перейти к публикации
Cryptorussia.net
Alex

Как форкнуть Dash - мануал (ч. 6)

Рекомендованные сообщения

В этой части мы будем редактировать наши исходники.

Итак, проехали:

  1. Начнем с файла chainparams.cpp
    Это чек-поинты. Открываем в Notepad++, убираем лишние и ставим наши генезис-блоки, а также timeStamp . В моем случае при генезис-блоках:
    Main
    00000205a2b36c89d27547db95cdf4a3038662dd26cf21af8b9c8978a64b06a2
    
    Testnet
    00000416024caa7a7900f9a73c120660773ca4019d0671ee5d5bb528acbaa633
    
    Regtest
    17a08f326f61be14e0502edeb93d46013596a0bf1d8ddd9d5909f37dab7305a4

    Т.о. из такого:

    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
        };

    Мы должны получить нечто такое:

    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
        };
  2. Далее открываем main
    //вставляем любые hex-символы, например такие:
    pchMessageStart[0] = 0xbf;
    pchMessageStart[1] = 0x0c;
    pchMessageStart[2] = 0x6b;
    pchMessageStart[3] = 0xbd;
    
    
    //Сюда мы вписываем public key, который генерировали ранее – тот  что mainalert
    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 - наша фраза, которую мы придумывали в самом начале
    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<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
    
    //Награда за блок
    txNew.vout[0].nValue = 50 * COIN;
    
    //Здесь в кавычках заменяем на наш public key генезис блока
    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, которую мы вставляли при генерации генезис-блока для майнента
    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
  3. Проделываем то же самое для тестнета и регтеста.
    В регтесте обратите внимание:
    bits: 0x207fffff
  4. Также не забываем везде менять порты:
    main
    9999 на 9887
    testnet
    19999 на 19887
    regtest
    19994 на 19883
    Unite=test
    18445 на 18334
  5. Сохраняем main и открываем activemasternode.cpp
    Находим следующий кусок и заменяем порт на наш (9887):
    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;
            }

    И также в этом куске:

    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;
        }
  6. Открываем 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";
        }
    };
  7. Открываем chainparamsseeds.h
    Тут прописываем вшитые seed-фразы.
    Переходим сюда или любой другой конвертер ip-адреса в hex-формат. Пишем там свой ip-адрес (например, 127.0.0.1 возвращает 0x7f000001). Отбрасываем 0х, и разделяем по два знака: 7f 00 00 01.
    Теперь заменяем после 0xff 0xff, не забываем про порт.
    Должно получиться что-то вроде:
    // ***TODO*** fix generate-seeds.py and REGENERATE
    static SeedSpec6 pnSeed6_main[] = {
        {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7f,0x00,0x00,0x01}, 9887}
    };
    
    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
  8. Открываем clientversion.h
    Здесь указывается версия клиента. Чтобы сделать ее 1.0.0.1 нужно изменить так:
    //! 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
  9. Управление сложностью майнига и наградами мастер нодам в main.cpp
    Тут я ничего не менял, но вы можете поэксперементировать! 😉

    ac230271adab_1620448e60d2543d605d49c45efa1eac.thumb.png.b3975c2cc16c17f47ad195b6e40e607d.png
     
  10. Открываем masternode.cpp
    Снова находим, где нужно заменить порты на 9887:
    if(Params().NetworkID() == CBaseChainParams::MAIN) {
            if(addr.GetPort() != 9999) return false;
        } else if(addr.GetPort() == 9999) return false;
  11. Открываем masternodeconfig.cpp и опять меняем порты на 9887:
    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;
    }

     

  12. Открываем masternodeman.cpp и изменяем порты на 9887:
    if(Params().NetworkID() == CBaseChainParams::MAIN){
    	if(addr.GetPort() != 9999) return;
    } else if(addr.GetPort() == 9999) return;
  13. Сохраняем все исходники
  14. Переходим сюда:
    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)
  15. Переходим сюда:
    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
  16. Переходим сюда:
    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()
  17. Идем сюда:
    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
  18. Идем сюда
    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", прыгаем в конец документа и снова заменяем порты:

    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(":::", ""));
  19. Идем сюда
    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}\/)$")
  20. Идем сюда
    D:\owncoin\owncoin\share\seeds

    В обоих текстовых документах удаляем все ip-адреса и пишем свой.

  21. Открываем 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')
  22. Переходим сюда
    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)
  23. Переходим сюда
    D:\owncoin\owncoin\contrib\gitian-descriptors

    И в каждом файле изменяем 

    name: "owncoin-win-0.12"
    enable_cache: true

    На

    name: "owncoin-win-1.0.0.1"
    enable_cache: true

    Не забываем все сохранить!

  24. Заходим в клиент гитхаба и снова все коммитим

  25. Идем в репозиторий нового коина на гитхабе

    https://github.com/username/owncoin
  26. Жмем на "Releases" и потом "Draft a new release". В таге пишем версию 1.0.0.1, жмем "Publish release"
  27. Идем в консоль Debian и убеждаемся, что мы в корневом каталоге пользователя debian
  28. Выполняем:
    git clone https://github.com/mycointest/owncoin
  29. Выполняем:
    cd gitian-builder
  30. Выполняем:
    cd ~debian/owncoin
  31. Выполняем:
    git pull
  32. Выполняем:
    cd ~debian/gitian-builder 
  33. Снова качаем зависимости
    make -C ../owncoin/depends download SOURCES_PATH=`pwd`/cache/common
  34. Собираем
    ./bin/gbuild --commit owncoin=v1.0.0.1 ../owncoin/contrib/gitian-descriptors/gitian-win.yml
  35. Снова открываем параллельно 2 сессии по SSH, в них переходим:
    cd gitian-builder
  36. Смотрим сборку с помощью
    tail -f var/install.log
    tail -f var/build.log
  37. Дожидаемся компиляции, берем клиент с ftp, делаем вторую папку под data, запускам первый клиент и второй клиент с
    -datadir=owncoin2 –listen=0 –gen=1
  38. В конфигурационном файл не забываем прописать
    addnode=127.0.0.1
  39. Запускаем сначала тот что c –listen=1, а после уже тот что с 0, и наблюдаем генерацию монеток☺️🤗🤗
    65e80c9c349f_f4f53ead7e0260f5f15cee9e2e1fe3d9.thumb.png.1c5a9ceedc9c6205559c4a5c7ba817bb.png
     

Поздравляю! Мы создали собственный форк Dash! 😎🤗
Можно перекурить

 

Другие части мануала:

Первая часть

Вторая часть

Третья часть

Четвертая часть

Пятая часть

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.


×
×
  • Создать...

Важная информация

Для полноценной работы с порталом Cryptorussia.net необходимо принять следующие положения и правила:
1. Условия использования
2. Политика конфиденциальности
3. Правила

Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.