1

I'm just starting to write a bitcoin script parser and I am wondering how to get the address from the genesis block? blockexplorer.com shows the coinbase value to be

04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73

in the raw block data. But it also shows the receiving address for this transaction to be

1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

How can I derive the address from the raw transaction? I found a page in the wiki that talks about creating an address, but this seems like it is going about the process in a back-to-front order. Surely the address must exist first before the raw block can allocate the mined coins to it? Otherwise, the blockchain would simply have to allocate mined funds into the ether. The receiving address must have been known to the mining algorithm before it generated the very first mining transaction.

Please could someone walk me through the steps of deriving the address from the raw transaction script.

2

Surely the address must exist first before the raw block can allocate the mined coins to it?

No. The network has no concept of addresses. When you send money, you're actually sending funds to a public key or public key hash. The Bitcoin address format you're familiar with is just a way of representing public key hashes in a human-readable way.

This is especially true of generation transactions, which typically send money directly to a public key. Bitcoin-Qt normally doesn't calculate or display the address in such cases, though it's still possible to calculate it.

The "coinbase" doesn't contain the address or public key. That's just mostly-arbitrary data. It contains the block height, extraNonce, etc. The address is in "scriptPubKey". In the genesis block's generation transaction, the scriptPubKey is:

04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG

This is a direct-to-public-key transaction, not a normal address transaction. 04678... is the uncompressed ECDSA public key. Follow the instructions on that wiki page to get the address, 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa. But again, this transaction doesn't contain this address, or even its base58-decoded (binary) equivalent. The address is just a way of representing the public key.

  • Small nit: signatures are encoded using DER, but public keys aren't. The standard for encoding public keys is described by SEC1 (secg.org/index.php?action=secg,docs_secg). – Pieter Wuille Oct 30 '13 at 0:43
  • Another nit: from the point of view of the network rules, the output of the genesis block is actually unspendable (intentionally or due to a bug), so its address is really irrelevant. – Pieter Wuille Oct 30 '13 at 0:44
  • @PieterWuille I fixed the DER bit, thanks. Even though the genesis transaction is unspendable, I think that its address is not totally irrelevant. For example, you can use it to easily see that people have sent BTC to the public key listed by Satoshi in the genesis transaction. This is interesting info. – theymos Oct 30 '13 at 1:00
  • i don't think my question "Surely the address must exist first before the raw block can allocate the mined coins to it?" was clearly phrased, so i have updated it to explain better what i mean. – mulllhausen Oct 30 '13 at 11:12
  • The payout address is indeed known before block mining begins, by the way. – Pieter Wuille Oct 30 '13 at 11:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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