前往【体验区块链】查看更多:初识区块链——前序
现在离程序运行起来,就差创世块的参数设置了
一、删除或注释点bitcoin的链中区块校验Hash,增加一条 ( 0, uint256("0x1")) //这个0x1后面创世块Hash算出来时再改过来 ,mapCheckpoints、mapCheckpointsTestnet、mapCheckpointsRegtest 同样处理。
二、修改参数 CMainParams、CTestNetParams、CRegTestParams
先准备几个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时间戳;
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的位置,加入如下代码:
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 !