我创建了我的新altercoin,但是当我第一次运行它时,它已经显示:"5周后没有可用的阻止源".我在局域网中启动另一台计算机,它们成功连接.我使用Datacoin的代码.
static const uint256 hashGenesisBlockOfficial("f9f6d9a689f7a4093c71f397d8fe3fbef3a05cd6f919d51b4a9447aa22743dfb"); static const uint256 hashGenesisBlockTestNet("f9f6d9a689f7a4093c71f397d8fe3fbef3a05cd6f919d51b4a9447aa22743dfb"); // Genesis block qDebug()<<"Genesis block"; const char* pszStartTopic = "The Times 26/Dec/2013 Chancellor on brink of second bailout for banks";//https://bitcointalk.org/index.php?topic=325735.0"; CTransaction txNew; txNew.vin.resize(1); txNew.vout.resize(1); txNew.vin[0].scriptSig = CScript() << 0 << CBigNum(999) << vector((const unsigned char*)pszStartTopic, (const unsigned char*)pszStartTopic + strlen(pszStartTopic)); txNew.vout[0].nValue = COIN; txNew.vout[0].scriptPubKey = CScript(); CBlock block; block.vtx.push_back(txNew); block.hashPrevBlock = 0; block.hashMerkleRoot = block.BuildMerkleTree(); block.nTime = 1387977869 ;//http://www.unixtimestamp.com/index.php block.nBits = TargetFromInt(6); block.nNonce = 49030125; block.bnPrimeChainMultiplier = (uint64) 5651310; if (fTestNet) { block.nTime = 1387977869 ; block.nBits = TargetFromInt(4); block.nNonce = 46032; block.bnPrimeChainMultiplier = (uint64) 211890; } //// debug print uint256 hash = block.GetHash(); printf("%s\n", hash.ToString().c_str()); qDebug()<<"hash:"< 在失败的断言(CheckProofOfWork(block.GetHeaderHash(),block.nBits,block.bnPrimeChainMultiplier,block.nPrimeChainType,block.nPrimeChainLength)); .而debug.log说:
CBlock(hash=f9f6d9a689f7a4093c71f397d8fe3fbef3a05cd6f919d51b4a9447aa22743dfb, hashBlockHeader=7d6aeeb7ca2b87d2f48bbd7a675c8374691c4f44f0db1a10de66436bfbcb0188, ver=2, hashPrevBlock=0000000000000000000000000000000000000000000000000000000000000000, hashMerkleRoot=a0c44c1b6dd50fcaa2bc1c4d7f8ca406506caee88578d751fb3824b41bc34d84, nTime=1387977869, nBits=06000000, nNonce=49030125, vtx=1) CTransaction(hash=a0c44c1b6dd50fcaa2bc1c4d7f8ca406506caee88578d751fb3824b41bc34d84, ver=1, vin.size=1, vout.size=1, nLockTime=0, data.size=0) CTxIn(COutPoint(0000000000000000000000000000000000000000000000000000000000000000, 4294967295), coinbase 0002e703455468652054696d65732032362f4465632f32303133204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73) CTxOut(error) ERROR: CheckPrimeProofOfWork() : block header hash under limit ERROR: CheckProofOfWork() : check failed for prime proof-of-work我可以改变其他任何东西来使创世块工作吗?
你必须挖掘创世块.虽然早期版本的源代码会在此时自动创建一个新的创世块,而不是使断言失败,但最近的altcoin源代码中没有可以为您进行挖掘的代码.这被取出,因为它不需要,如果他们的本地数据库变得不可用,实际上可能会给普通矿工带来更多麻烦.
您可以尝试在源代码树上回溯,找到您分叉的源的早期版本,并尝试查找创建genesis块的代码.当它运行时,它将尝试挖掘一个新的创世块,当它运行时,它会在该断言再次失败.然后,您必须将hash和nonce放入main.h文件中,并为主网和测试网执行此操作.在那之后,断言不会再失败了,你现在在代码中有你的创世块的哈希值.
这是执行它的代码,以防您在旧资源中找不到它.
// If genesis block hash does not match, then generate new genesis hash. if (block.GetHash() != hashGenesisBlock) { printf("Searching for genesis block...\n"); // This will figure out a valid hash and Nonce if you're // creating a different genesis block: uint256 hashTarget = CBigNum().SetCompact(block.nBits).getuint256(); uint256 thash; while(true) { thash = scrypt_blockhash(BEGIN(block.nVersion)); if (thash <= hashTarget) break; if ((block.nNonce & 0xFFF) == 0) { printf("nonce %08X: hash = %s (target = %s)\n", block.nNonce, thash.ToString().c_str(), hashTarget.ToString().c_str()); } ++block.nNonce; if (block.nNonce == 0) { printf("NONCE WRAPPED, incrementing time\n"); ++block.nTime; } } printf("block.nTime = %u \n", block.nTime); printf("block.nNonce = %u \n", block.nNonce); printf("block.GetHash = %s\n", block.GetHash().ToString().c_str());
一旦找到一个产生满足目标的哈希值的nonce,它就会停止并打印nonce和hash值.您需要将这些新的genesis块nonce和hash值放入代码中,以便下次传递断言.
如果您的代码基于较旧(未优化)的源代码,那么您将没有函数,scrypt_blockhash()
并且您可能需要使用原始函数.所以改变代码:
thash = scrypt_blockhash(BEGIN(block.nVersion));
至
static char scratchpad[SCRYPT_SCRATCHPAD_SIZE]; scrypt_1024_1_1_256_sp(BEGIN(block.nVersion), BEGIN(thash), scratchpad);
如果确实需要使用旧函数,scrypt_1024_1_1_256_sp
那么您也应该SCRYPT_SCRATCHPAD_SIZE
在头文件中找到定义.
最后,所有这些都打印在debug.log文件中.你需要在那里找到它.
干杯!