首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建一个创生块我的硬币?

如何创建一个创生块我的硬币?
EN

Stack Overflow用户
提问于 2013-12-25 12:04:15
回答 3查看 16.1K关注 0票数 7

我创建我的新的互斥币,但当我第一次运行它,它已经显示:“没有块来源提供5周后”。我在局域网里启动了另一台计算机,它们成功地连接在一起。我使用的代码是。

代码语言:javascript
复制
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<unsigned char>((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:"<<hash.ToString().c_str();
        printf("%s\n", hashGenesisBlock.ToString().c_str());
        qDebug()<<"hashGenesisBlock:"<<hashGenesisBlock.ToString().c_str();
        printf("%s\n", block.hashMerkleRoot.ToString().c_str());
         qDebug()<<"block.hashMerkleRoot:"<<block.hashMerkleRoot.ToString().c_str();
        assert(block.hashMerkleRoot == uint256("a0c44c1b6dd50fcaa2bc1c4d7f8ca406506caee88578d751fb3824b41bc34d84"));
        block.print();

        assert(hash == hashGenesisBlock);
        {
            CValidationState state;
            assert(block.CheckBlock(state, true, true));
            assert(CheckProofOfWork(block.GetHeaderHash(), block.nBits, block.bnPrimeChainMultiplier, block.nPrimeChainType, block.nPrimeChainLength));
        }

在assert(CheckProofOfWork(block.GetHeaderHash(),block.nBits,block.bnPrimeChainMultiplier,block.nPrimeChainType,block.nPrimeChainLength上失败);debug.log说:

代码语言:javascript
复制
    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

我还能改变什么使创世纪块起作用呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-09 23:54:44

你必须开采创世地块。在最近的钱币源中,没有任何代码可以为您进行挖掘,尽管源代码的早期版本将在此时自动创建一个新的成因块,而不是失败断言。这是被删除的,因为它是不需要的,而且如果本地数据库不可用,可能会给一般矿工带来更多的麻烦。

您可以尝试回到源代码树上,以找到您分叉的源的早期版本,并尝试找到创建成因块的代码。当它运行时,它将尝试挖掘一个新的成因块,当它运行时,它将再次失败。然后,您必须将这个散列和现在放在你的main.h文件中,并对主网和测试网都这样做。在此之后,断言将不再失败,您现在已经在代码中获得了成因块的散列。

下面是代码,以防你在旧的源代码中找不到它。

代码语言:javascript
复制
    // 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());

一旦它找到了一个使散列满足目标的值,它就会停止并打印该值和散列值。您需要将这些新的成因块,现在和哈希值放入您的代码中,以便下次它将传递断言。

如果您的代码是基于旧的(非优化的)源代码,那么您将没有一个函数scrypt_blockhash(),您可能需要使用原始函数。因此,更改代码:

代码语言:javascript
复制
            thash = scrypt_blockhash(BEGIN(block.nVersion));

代码语言:javascript
复制
            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文件中。你得找那里才能找到。

干杯!

票数 14
EN

Stack Overflow用户

发布于 2014-03-14 13:38:52

如果您想要生成我们自己独特的成因块,您应该至少生成和替换以下参数:

  • nTime ( unix time.如果你的钱包是从现在开始的5周的话,你的钱包就会显示上面提到的“5周后没有可用的块源”。
  • pszTimeStamp (用于“证明”没有进行任何预挖掘的“时间戳”)
  • hashMerkleRoot (基于块的coinbase事务的merkle根)
  • hashGenesisBlock (成因散列本身!)
  • nNonce (在搜索满足目标的哈希时增加的正确数字(=难度))

输出事务脚本中的公键也可以更改为唯一值。但是,由于成因块无论如何都不能使用,所以可以使用与比特币相同的公开密钥。

您可以使用此脚本为the 256/scrypt创建值:

https://github.com/lhartikk/GenesisH0

在C中也有一个更快的实现,但仅限于sha256:

https://github.com/Gnaf/GenesisBlockZero

票数 4
EN

Stack Overflow用户

发布于 2018-11-29 05:12:53

错误,因为您生成的成因与工作算法的证明不匹配。生成的哈希必须与满足pow逻辑的块哈希匹配。block.GetHash()应该是hashGenesisBlock,通过更改some参数来计算pow计算的hashGenesisBlock,在某个时候,您将得到一个应该满足pow逻辑(条件)的散列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20772606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档