体验区块链——自己DIY虚拟币(四、修改参数&fly)

前往【体验区块链】查看更多:初识区块链——前序

体验区块链——自己DIY虚拟币(四、修改参数&fly)_第1张图片
区块链技术交流群 709245667  加群暗号:


现在离程序运行起来,就差创世块的参数设置了

一、删除或注释点bitcoin的链中区块校验Hash,增加一条 ( 0, uint256("0x1")) //这个0x1后面创世块Hash算出来时再改过来 ,mapCheckpoints、mapCheckpointsTestnet、mapCheckpointsRegtest 同样处理。

体验区块链——自己DIY虚拟币(四、修改参数&fly)_第2张图片

二、修改参数 CMainParams、CTestNetParams、CRegTestParams

体验区块链——自己DIY虚拟币(四、修改参数&fly)_第3张图片

先准备几个Hash

openssl ecparam -genkey -name secp256k1 -out alertkey.pem

openssl ec -in alertkey.pem -text > alertkey.hex

openssl ecparam -genkey -name secp256k1 -out testnetalert.pem

openssl ec -in testnetalert.pem -text > testnetalert.hex

openssl ecparam -genkey -name secp256k1 -out genesiscoinbase.pem

openssl ec -in testnetalert.pem -text > genesiscoinbase.hex


1、cat alertkey.hex  -->vAlertPubKey = ParseHex(“…”);

然后读出Hash,填到vAlertPubKey,testnetalert同理

2、4字节的消息ID,每个字节填你喜欢的Ascii码对应的16进制数:


3、 const char* pszTimestamp = "The Times 24/Feb/2018 The rebirth starts"; 当前日期 消息文本按你喜欢改,不过不要太长,毕竟消息传输太大不好,多大不宜我没有测过

4、cat genesiscoinbase.hex  -->txNew.vout[0].scriptPubKey = CScript() << ParseHex("...") << OP_CHECKSIG;

5、 genesis.nTime = 当前Unix时间戳;

体验区块链——自己DIY虚拟币(四、修改参数&fly)_第4张图片

6、设置工作量证明POW的 难度,没明白就不动它,具体意义看pow.cpp,看懂了再去调整

genesis.nBits    = 0x1d00ffff;//这是8个0的难度,CPU大概平均10分钟找出Hash解的参谋

7、 genesis.nNonce  = 0;//我们常听说挖矿浪费那么多算力电力就去找一个随机数,没错,传说中的随机数就是它

实事上求解满足以上难度Hash时, “随机数”我们是依次递增,当然你也可以用Radom函数去生产随机数来碰撞也没问题,不过敲代码用For或While 然后Nonce++更快捷。

8、删除Bitcoin的创世块Hash值,在如下位置:

        hashGenesisBlock = genesis.GetHash();

        assert(hashGenesisBlock == uint256("0x1"));//

        assert(genesis.hashMerkleRoot == uint256("0x1"));

9、设置种子服务器域名或IP,如果你在公网有7*24小时的机器,那就可以用上,没有就暂时先Clear掉,后面运行Client时用Addnode命名去连结节点

vFixedSeeds.clear();

vSeeds.clear();


三、添加代码来生成创世块Hash,在刚才改过Hash的位置,加入如下代码:


体验区块链——自己DIY虚拟币(四、修改参数&fly)_第5张图片

        hashGenesisBlock = uint256("0x01");

        if (true && genesis.GetHash() != hashGenesisBlock)

                {

                    printf("bnProofOfWorkLimit:  %u \n", bnProofOfWorkLimit);

                    printf("CMainParams recalculating params for mainnet.\n");

                    printf("old mainnet genesis nonce:  %u \n", genesis.nNonce);

                    printf("old mainnet genesis hash:  %s\n", hashGenesisBlock.ToString().c_str());

                    // deliberately empty for loop finds nonce value.

                    for(genesis.nNonce == 0; genesis.GetHash() > bnProofOfWorkLimit; genesis.nNonce++){ }

                    printf("new mainnet genesis merkle root: %s\n", genesis.hashMerkleRoot.ToString().c_str());

                    printf("new mainnet genesis nonce:  %u \n", genesis.nNonce);

                    printf("new mainnet genesis hash: %s\n", genesis.GetHash().ToString().c_str());

                }

        当“随机数改变到”块Hash值满足难度要求时,循环退出就出打印出来我们的需要的参数了。

四、make 后执行 src/qt/bitcoin-qt 或src/bitcoind 运行程序,等待Hash结果,8个0估计会有10分钟左右,看运气吧。

genesis.nNonce =算出来时的nNonce;

 assert(hashGenesisBlock == uint256("0x填刚算出来的Hash"));//

 assert(genesis.hashMerkleRoot == uint256("0x填刚算出来的Hash"));

        if (false && genesis.GetHash() != hashGenesisBlock) //留下这段代码,或许你还会回来再重算创世块。

别忘了 最开始第一步 mapCheckpoints 那里(0,XX)  也要填上,0就是创世发块Index。

五、再Make 再src/qt/bitcoin-qt 或src/bitcoind 运行程序,就可以开始心情享受你的虚拟币了


        至此,好奇心得到了满足,想深入区块的实现细节,也不难了。emm~玩玩还是将就,然后你想发布到公网然后筹点资金做做ICO?

NoNoNo,境内政策红线不能碰在先,其次,技术上你还会遇到更多有意思的问题。路漫漫,你看着办……

Just 4 fun !

你可能感兴趣的:(体验区块链——自己DIY虚拟币(四、修改参数&fly))