【问题标题】:How to create a genesis block of my altercoin?如何创建我的替代币的创世块?
【发布时间】:2014-01-13 09:18:18
【问题描述】:

我创建了我的新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<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 说:

    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

我还可以改变什么来让创世块工作吗?

【问题讨论】:

  • 这可能属于这里:bitcoin.stackexchange.com
  • 不好意思我急着回答
  • 这个问题似乎是题外话,因为它应该在 bitcoin.stackexchange.com

标签: bitcoin


【解决方案1】:

你必须挖掘创世区块。在最近的山寨币源头中没有代码可以为您进行挖掘,尽管早期版本的源代码会在那时自动创建一个新的创世块,而不是使断言失败。这被删除了,因为它不是必需的,如果他们的本地数据库不可用,实际上可能会给普通矿工带来更多的麻烦。

您可以尝试在您的源代码树上及时回溯,以找到您分叉的源的早期版本,并尝试找到创建创世块的代码。当它运行时,它会尝试挖掘一个新的创世块,当它运行时,它会在该断言上再次失败一次。然后,您必须将该哈希和随机数放入您的 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());

一旦它找到一个产生满足目标的散列的随机数,它将停止并打印随机数和散列值。您需要将这些新的创世块随机数和哈希值放入您的代码中,以便它下次通过断言。

如果您的代码基于较旧的(未优化的)源代码,那么您将没有函数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 文件中。您需要查看那里才能找到它。

干杯!

【讨论】:

  • 嘿,我不确定你是否还能回答这个问题,但我已经成功地在莱特币源上运行了这段代码,但是,我的目标是:00000ffff0000000000000000000000000000000000000000000000000000000 我觉得是非常不正确的你如何破译有效目标和无效目标?
  • 我回答得有点晚了,但您现在可能已经知道这是目标的正确格式。一个块的所有有效散列在数值上都将小于目标散列的 (
  • 嗨,似乎最新的来源不适用于此解决方案。你知道怎么解决吗?谢谢。
  • chainparams.cpp:131:27:错误:'operator
【解决方案2】:

如果你想生成我们自己独特的创世块,你应该生成并替换至少以下参数:

  • nTime(unix 时间。如果这是 5 周前,您的钱包将显示“5 周后没有可用的块源” 现在)
  • pszTimeStamp(“证明”没有发生预挖的“时间戳”)
  • hashMerkleRoot(基于区块的coinbase交易的merkle根)
  • hashGenesisBlock(创世哈希本身!)
  • nNonce(在搜索满足目标的哈希时递增的正确 nounce (=difficulty))

输出交易脚本中的公钥也可以更改为唯一值。但是,由于无论如何都不能使用创世块,因此可以使用相同的公钥,例如比特币。

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

https://github.com/lhartikk/GenesisH0

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

https://github.com/Gnaf/GenesisBlockZero

【讨论】:

  • 此代码基于旧版本。我想知道基于最新源(比特币 0.15.1)的代码。变量、位置与旧版本不匹配。
【解决方案3】:

错误是因为您生成的起源与工作量证明算法不匹配。 您生成的哈希必须与满足 pow 逻辑的块哈希匹配。 block.GetHash() 应该与 hashGenesisBlock 相同 由 pow 通过更改 nonce 参数计算的 hashGenesisBlock,在某些时候你会得到一个应该满足 pow 逻辑(条件)的哈希

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多