I'm trying to create and build a working fork of Bitcoin -- in order to understand how it works at the source code level. I see a lot of articles explaining how to create altcoins but they are not very helpful for the learning purpose as they skip a lot of details and tend to tell you what to do without explaining why.

Regarding this question, I couldn't find any article/document even remotely mentioning anything about the public key used for generating the genesis block -- I believe this is an important things to know, at least because it's been used to generate the genesis block of Bitcoin. Looking at the source code:

Bitcoin 0.1.5 - main.cpp @1490:

txNew.vout[0].scriptPubKey = CScript() << CBigNum("0x5F1DF16B2B704C8A578D0BBAF74D385CDE12C11EE50455F3C438EF4C3FBCF649B6DE611FEAE06279A60939E028A8D65C10B73071A6F16719274855FEB0FD8A6704") << OP_CHECKSIG;

Bitcoin 0.8.0 main.cpp @2715

txNew.vout[0].scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;

These two public keys are same. First one appeared in the very first version of Bitcoin -- as far as I can see in the Github repo. Second one is the latest usage before it being totally removed from the source code.

My questions are:

  1. What is this public key? Is this [supposedly] Satoshi's personal public key or just a random key generated for the sake of generating the genesis block?

  2. Is there any other application for this public key or it's only useful when generating the genesis block? e.g. signing transactions? verifying the integrity of the mined blocks?

  3. There are different formats used for Public/Private key pairs. What is the format used for this specific key? Is there any built-in API/utility inside the Bitcoin source that could be used for generating or testing the validity of the key?

  4. What are the consequences of using a broken/invalid public key at this stage? Given the fact that the genesis block is unspendable.

up vote 3 down vote accepted

Second one is the latest usage before it being totally removed from the source code.

It wasn't removed. It just got moved:

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() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
    return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
}

(Source.)

  1. If you mean "Is it the key that he used to sign announcements and emails," no. That's the PGP key 5EC948A1. If you mean, "Is this the key that can broadcast alerts," no. That's defined here:

    https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp#L90

    The key is thought to belong to Satoshi Nakamoto, though.

  2. It's useless. You don't actually need the private component of the key to generate or verify the genesis block. And, like you say, you can't even spend the associated Bitcoins. For all we know, it might just be a random point on the ECDSA curve, with no associated private key.

  3. This appears to be a normal uncompressed key. It starts with 0x04, followed by 64 bytes. The difference in how it was expressed between 0.1.5 and 0.8.0 is just a result of endianness. As for how to generate it, just call getnewaddress followed by validateaddress on the result.

  4. Nothing.

  • Now I see why there isn't that much content about this topic! ;) – Mahdi Aug 15 '15 at 16:06
  • I lean towards the theory that the Genesis block was hard-coded anyway, as opposed to being truly generated like following blocks. In fact, starting from block #0 to create block 1 is a boundary condition that is problematic with the algorithm. Your point #2 is right on target in either case. – SDsolar Dec 4 '17 at 3:39

As a great answer to a related question points out: "merkle root of the genesis block is equal to the hash of the transaction in it" How do I compute merkle root for genesis block?

  • Please give us an excerpt from that article that sheds some light on this. My mathematical interest is in the boundary condition of creating a 1 from a 0. I am not convinced it is possible, as it is with all following blocks. – SDsolar Dec 4 '17 at 3:41

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.