Bitcoin-Core-Development

如何計算 BIP34Hash?

  • July 1, 2020

我知道這將是一個重複的問題,但是我仍然對 BIP34 的實現感到困惑,尤其是在它的雜湊值方面。

參考 github 上的 chainparams.cpp:

<https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp>

static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
{
   CMutableTransaction txNew;
   txNew.nVersion = 1;
   txNew.vin.resize(1);
   txNew.vout.resize(1);
   txNew.vin[0].scriptSig = CScript() &lt;&lt; 486604799 &lt;&lt; CScriptNum(4) &lt;&lt; std::vector&lt;unsigned char&gt;((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
   txNew.vout[0].nValue = genesisReward;
   txNew.vout[0].scriptPubKey = genesisOutputScript;

   CBlock genesis;
   genesis.nTime    = nTime;
   genesis.nBits    = nBits;
   genesis.nNonce   = nNonce;
   genesis.nVersion = nVersion;
   genesis.vtx.push_back(MakeTransactionRef(std::move(txNew)));
   genesis.hashPrevBlock.SetNull();
   genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
   return genesis;
}

/**
* Build the genesis block. Note that the output of its generation
* transaction cannot be spent since it did not originally exist in the
* database.
*
* CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893, vtx=1)
*   CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0)
*     CTxIn(COutPoint(000000, -1), coinbase 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73)
*     CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
*   vMerkleTree: 4a5e1e
*/

static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t     nBits, int32_t nVersion, const CAmount& genesisReward)
{
   const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
   const CScript genesisOutputScript = CScript() &lt;&lt; ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") &lt;&lt; OP_CHECKSIG;
   return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
}

void CChainParams::UpdateVersionBitsParameters(Consensus::DeploymentPos d, int64_t nStartTime, int64_t nTimeout)
{
   consensus.vDeployments[d].nStartTime = nStartTime;
   consensus.vDeployments[d].nTimeout = nTimeout;
}

/**
* Main network
*/
/**
* What makes a good checkpoint block?
* + Is surrounded by blocks with reasonable timestamps
*   (no blocks before with a timestamp after, none after with
*    timestamp before)
* + Contains no strange transactions
*/

class CMainParams : public CChainParams {
public:
   CMainParams() {
   strNetworkID = "main";
   consensus.nSubsidyHalvingInterval = 210000;
   consensus.BIP34Height = 227931;
   consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8");
   consensus.BIP65Height = 388381; // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0
   consensus.BIP66Height = 363725; // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931
   consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
   consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
   consensus.nPowTargetSpacing = 10 * 60;
   consensus.fPowAllowMinDifficultyBlocks = false;
   consensus.fPowNoRetargeting = false;
   consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016
   consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
   consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
   consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
   consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008

   // Deployment of BIP68, BIP112, and BIP113.
   consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;
   consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1462060800; // May 1st, 2016
   consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1493596800; // May 1st, 2017

   // Deployment of SegWit (BIP141, BIP143, and BIP147)
   consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;
   consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 1479168000; // November 15th, 2016.
   consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = 1510704000; // November 15th, 2017.

   // The best chain should have at least this much work.
   consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000003f94d1ad391682fe038bf5");

   // By default assume that the signatures in ancestors of this block are valid.
   consensus.defaultAssumeValid = uint256S("0x00000000000000000013176bf8d7dfeab4e1db31dc93bc311b436e82ab226b90"); //453354

   /**
    * The message start string is designed to be unlikely to occur in normal data.
    * The characters are rarely used upper ASCII, not valid as UTF-8, and produce
    * a large 32-bit integer with any alignment.
    */
   pchMessageStart[0] = 0xf9;
   pchMessageStart[1] = 0xbe;
   pchMessageStart[2] = 0xb4;
   pchMessageStart[3] = 0xd9;
   nDefaultPort = 8333;
   nPruneAfterHeight = 100000;

   genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);
   consensus.hashGenesisBlock = genesis.GetHash();
   assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));
   assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));

   // Note that of those with the service bits flag, most only support a subset of possible options
   vSeeds.push_back(CDNSSeedData("bitcoin.sipa.be", "seed.bitcoin.sipa.be", true)); // Pieter Wuille, only supports x1, x5, x9, and xd
   vSeeds.push_back(CDNSSeedData("bluematt.me", "dnsseed.bluematt.me", true)); // Matt Corallo, only supports x9
   vSeeds.push_back(CDNSSeedData("dashjr.org", "dnsseed.bitcoin.dashjr.org")); // Luke Dashjr
   vSeeds.push_back(CDNSSeedData("bitcoinstats.com", "seed.bitcoinstats.com", true)); // Christian Decker, supports x1 - xf
   vSeeds.push_back(CDNSSeedData("bitcoin.jonasschnelli.ch", "seed.bitcoin.jonasschnelli.ch", true)); // Jonas Schnelli, only supports x1, x5, x9, and xd
   vSeeds.push_back(CDNSSeedData("petertodd.org", "seed.btc.petertodd.org", true)); // Peter Todd, only supports x1, x5, x9, and xd

   base58Prefixes[PUBKEY_ADDRESS] = std::vector&lt;unsigned char&gt;(1,0);
   base58Prefixes[SCRIPT_ADDRESS] = std::vector&lt;unsigned char&gt;(1,5);
   base58Prefixes[SECRET_KEY] =     std::vector&lt;unsigned char&gt;(1,128);
   base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x88)(0xB2)(0x1E).convert_to_container&lt;std::vector&lt;unsigned char&gt; &gt;();
   base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x88)(0xAD)(0xE4).convert_to_container&lt;std::vector&lt;unsigned char&gt; &gt;();

   vFixedSeeds = std::vector&lt;SeedSpec6&gt;(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));

   fDefaultConsistencyChecks = false;
   fRequireStandard = true;
   fMineBlocksOnDemand = false;

   checkpointData = (CCheckpointData) {
       boost::assign::map_list_of
       ( 11111, uint256S("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d"))
       ( 33333, uint256S("0x000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6"))
       ( 74000, uint256S("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20"))
       (105000, uint256S("0x00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97"))
       (134444, uint256S("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe"))
       (168000, uint256S("0x000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763"))
       (193000, uint256S("0x000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317"))
       (210000, uint256S("0x000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e"))
       (216116, uint256S("0x00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e"))
       (225430, uint256S("0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932"))
       (250000, uint256S("0x000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214"))
       (279000, uint256S("0x0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40"))
       (295000, uint256S("0x00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983"))
   };

   chainTxData = ChainTxData{
       // Data as of block 00000000000000000166d612d5595e2b1cd88d71d695fc580af64d8da8658c23 (height 446482).
       1483472411, // * UNIX timestamp of last known number of transactions
       184495391,  // * total number of transactions between genesis and that timestamp
                   //   (the tx=... number in the SetBestChain debug.log lines)
       3.2         // * estimated number of transactions per second after that timestamp
   };
   }
};

共識.BIP34Hash = uint256S(“0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8”)

你們如何設法為 BIP34 生成雜湊?

另一方面,參考 BIP34 wiki:

<https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki>

規格:

1.Treat transactions with a version greater than 1 as non-standard (official Satoshi client will not mine or relay them).

2.Add height as the first item in the coinbase transaction's scriptSig, and increase block version to 2. The format of the height is "serialized CScript" -- first byte is number of bytes in the number (will be 0x03 on main net for the next 300 or so years), following bytes are little-endian representation of the number.

3.If 75% of the last 1,000 blocks are version 2 or greater, reject invalid version 2 blocks. (testnet3: 51 of last 100)

4."Point of no return" If 95% of the last 1,000 blocks are version 2 or greater, reject all version 1 blocks. (testnet3: 75 of last 100)

你們能拿出公式或例子嗎?另外,consensus.BIP34Height 函式是如何生成的?

謝謝

BIP34Height 和 BIP34Hash 只是 BIP34 啟動的歷史高度和區塊雜湊。

它們是一種優化。早期版本的程式碼實現了 BIP34 的確切規則,檢查每個塊是否滿足轉換標準。這是相對昂貴的,而且由於 BIP34 的啟動是很久以前的事了,該檢查已被替換為更簡單的檢查,該檢查僅查看特定高度的鏈的高度和雜湊值。

如果您從頭開始創建一個新鏈,您只需將其設置為 0/genesis 即可讓 BIP34 從一開始就處於活動狀態。

引用自:https://bitcoin.stackexchange.com/questions/54219