Bitcoin version byte

How to create Bitcoin Address ยท 1 - Take the corresponding public key generated with it (33 bytes, 1 byte 0x02 (y-coord is even), and 32 bytes.
Table of contents

The checksum is an additional four bytes added to the end of the data that is being encoded. The checksum is derived from the hash of the encoded data and can therefore be used to detect and prevent transcription and typing errors.

How to buy bitcoin

When presented with a Base58Check code, the decoding software will calculate the checksum of the data and compare it to the checksum included in the code. If the two do not match, that indicates that an error has been introduced and the Base58Check data is invalid. For example, this prevents a mistyped bitcoin address from being accepted by the wallet software as a valid destination, an error that would otherwise result in loss of funds. For example, in the case of a bitcoin address the prefix is zero 0x00 in hex , whereas the prefix used when encoding a private key is 0x80 in hex.

A list of common version prefixes is shown in Table From the resulting byte hash hash-of-a-hash , we take only the first four bytes. These four bytes serve as the error-checking code, or checksum. The checksum is concatenated appended to the end. The result is composed of three items: a prefix, the data, and a checksum.

This result is encoded using the Base58 alphabet described previously. Figure illustrates the Base58Check encoding process.

Introduction

In bitcoin, most of the data presented to the user is Base58Check-encoded to make it compact, easy to read, and easy to detect errors. The version prefix in Base58Check encoding is used to create easily distinguishable formats, which when encoded in Base58 contain specific characters at the beginning of the Base58Check-encoded payload. These characters make it easy for humans to identify the type of data that is encoded and how to use it. This is what differentiates, for example, a Base58Check-encoded bitcoin address that starts with a 1 from a Base58Check-encoded private key WIF format that starts with a 5.

Some example version prefixes and the resulting Base58 characters are shown in Table The code example uses the libbitcoin library introduced in Alternative Clients, Libraries, and Toolkits for some helper functions. The code uses a predefined private key so that it produces the same bitcoin address every time it is run, as shown in Example Both private and public keys can be represented in a number of different formats.

These representations all encode the same number, even though they look different. These formats are primarily used to make it easy for people to read and transcribe keys without introducing errors. The private key can be represented in a number of different formats, all of which correspond to the same bit number. Table shows three common formats used to represent private keys.

Table shows the private key generated in these three formats. All of these representations are different ways of showing the same number, the same private key. They look different, but any one format can easily be converted to any other format. You can use sx tools to decode the Base58Check format on the command line. We use the base58check-decode command:. To encode into Base58Check the opposite of the previous command , we provide the hex private key, followed by the Wallet Import Format WIF version prefix Public keys are also presented in different ways, most importantly as either compressed or uncompressed public keys.

As we saw previously, the public key is a point on the elliptic curve consisting of a pair of coordinates x,y. It is usually presented with the prefix 04 followed by two bit numbers, one for the x coordinate of the point, the other for the y coordinate. The prefix 04 is used to distinguish uncompressed public keys from compressed public keys that begin with a 02 or a Compressed public keys were introduced to bitcoin to reduce the size of transactions and conserve disk space on nodes that store the bitcoin blockchain database.

As we saw in the section Public Keys , a public key is a point x,y on an elliptic curve. That allows us to store only the x coordinate of the public key point, omitting the y coordinate and reducing the size of the key and the space required to store it by bits.

Whereas uncompressed public keys have a prefix of 04 , compressed public keys start with either a 02 or a 03 prefix. Visually, this means that the resulting y coordinate can be above the x-axis or below the x-axis.

Technical background of version 1 Bitcoin addresses - Bitcoin Wiki

As you can see from the graph of the elliptic curve in Figure , the curve is symmetric, meaning it is reflected like a mirror by the x-axis. So, while we can omit the y coordinate we have to store the sign of y positive or negative , or in other words, we have to remember if it was above or below the x-axis because each of those options represents a different point and a different public key. Therefore, to distinguish between the two possible values of y, we store a compressed public key with the prefix 02 if the y is even, and 03 if it is odd, allowing the software to correctly deduce the y coordinate from the x coordinate and uncompress the public key to the full coordinates of the point.

Public key compression is illustrated in Figure This compressed public key corresponds to the same private key, meaning that it is generated from the same private key. However, it looks different from the uncompressed public key. This can be confusing, because it means that a single private key can produce a public key expressed in two different formats compressed and uncompressed that produce two different bitcoin addresses.

However, the private key is identical for both bitcoin addresses.

Mastering Bitcoin, 2nd Edition by Andreas M. Antonopoulos

Compressed public keys are gradually becoming the default across bitcoin clients, which is having a significant impact on reducing the size of transactions and therefore the blockchain. However, not all clients support compressed public keys yet. Newer clients that support compressed public keys have to account for transactions from older clients that do not support compressed public keys. This is especially important when a wallet application is importing private keys from another bitcoin wallet application, because the new wallet needs to scan the blockchain to find transactions corresponding to these imported keys.

Which bitcoin addresses should the bitcoin wallet scan for? The bitcoin addresses produced by uncompressed public keys, or the bitcoin addresses produced by compressed public keys? Both are valid bitcoin addresses, and can be signed for by the private key, but they are different addresses!

Your Answer

To resolve this issue, when private keys are exported from a wallet, the Wallet Import Format that is used to represent them is implemented differently in newer bitcoin wallets, to indicate that these private keys have been used to produce compressed public keys and therefore compressed bitcoin addresses. This allows the importing wallet to distinguish between private keys originating from older or newer wallets and search the blockchain for transactions with bitcoin addresses corresponding to the uncompressed, or the compressed, public keys, respectively.

That is because it has the added 01 suffix, which signifies it comes from a newer wallet and should only be used to produce compressed public keys. Private keys are not compressed and cannot be compressed. Remember, these formats are not used interchangeably.

In a newer wallet that implements compressed public keys, the private keys will only ever be exported as WIF-compressed with a K or L prefix. If the wallet is an older implementation and does not use compressed public keys, the private keys will only ever be exported as WIF with a 5 prefix. The goal here is to signal to the wallet importing these private keys whether it must search the blockchain for compressed or uncompressed public keys and addresses. If a bitcoin wallet is able to implement compressed public keys, it will use those in all transactions.

The private keys in the wallet will be used to derive the public key points on the curve, which will be compressed. The compressed public keys will be used to produce bitcoin addresses and those will be used in transactions. When exporting private keys from a new wallet that implements compressed public keys, the Wallet Import Format is modified, with the addition of a one-byte suffix 01 to the private key.

They are not compressed; rather, the WIF-compressed format signifies that they should only be used to derive compressed public keys and their corresponding bitcoin addresses. The most comprehensive bitcoin library in Python is pybitcointools by Vitalik Buterin.

Chapter 4. Keys, Addresses, Wallets

Example shows the output from running this code. Example is another example, using the Python ECDSA library for the elliptic curve math and without using any specialized bitcoin libraries. Example shows the output produced by running this script. Wallets are containers for private keys, usually implemented as structured files or simple databases. Another method for making keys is deterministic key generation.


  1. Navigation menu!
  2. Mastering Bitcoin by.
  3. lauda bitcoin.
  4. Cryptography in Bitcoin: How to Create an Address with C // nick?
  5. Cryptography in Bitcoin: How to Create an Address with C.
  6. Bitcoin Addresses (Legacy P2PKH).
  7. Version bytes.

Here you derive each new private key, using a one-way hash function from a previous private key, linking them in a sequence. As long as you can re-create that sequence, you only need the first key known as a seed or master key to generate them all. In this section we will examine the different methods of key generation and the wallet structures that are built around them.

Bitcoin wallets contain keys, not coins. Each user has a wallet containing keys. Users sign transactions with the keys, thereby proving they own the transaction outputs their coins. The coins are stored on the blockchain in the form of transaction-ouputs often noted as vout or txout. In the first bitcoin clients, wallets were simply collections of randomly generated private keys. This type of wallet is called a Type-0 nondeterministic wallet.

For example, the Bitcoin Core client pregenerates random private keys when first started and generates more keys as needed, using each key only once.