mirror of
https://github.com/bitcoinbook/bitcoinbook
synced 2025-01-10 15:51:04 +00:00
CH04::base58check: update info for later usage
This commit is contained in:
parent
eeef3cdd34
commit
5fd0f159ca
@ -640,7 +640,7 @@ output, causing them to be lost forever. In <<base58>>, we'll
|
||||
look at compact encoding and reliable checksums.
|
||||
|
||||
[[base58]]
|
||||
==== Base58 and Base58Check Encoding
|
||||
=== Base58Check Encoding
|
||||
|
||||
((("keys and addresses", "Bitcoin addresses", "Base58 and Base58check
|
||||
encoding")))((("Base58 and Base58check encoding",
|
||||
@ -648,18 +648,18 @@ id="base5804")))((("addresses", "Base58 and Base58check encoding",
|
||||
id="Abase5804")))In order to represent long numbers in a compact way,
|
||||
using fewer symbols, many computer systems use mixed-alphanumeric
|
||||
representations with a base (or radix) higher than 10. For example,
|
||||
whereas the traditional decimal system uses the 10 numerals 0 through 9,
|
||||
whereas the traditional decimal system uses 10 numerals, 0 through 9,
|
||||
the hexadecimal system uses 16, with the letters A through F as the six
|
||||
additional symbols. A number represented in hexadecimal format is
|
||||
shorter than the equivalent decimal representation. Even more compact,
|
||||
Base64 representation uses 26 lowercase letters, 26 capital letters, 10
|
||||
numerals, and 2 more characters such as “`+`” and "/" to
|
||||
transmit binary data over text-based media such as email. Base64 is most
|
||||
commonly used to add binary attachments to email. Base58 is a text-based
|
||||
binary-encoding format developed for use in bitcoin and used in many
|
||||
other cryptocurrencies. It offers a balance between compact
|
||||
representation, readability, and error detection and prevention. Base58
|
||||
is a subset of Base64, using upper- and lowercase letters and numbers,
|
||||
commonly used to add binary attachments to email.
|
||||
|
||||
Base58 is a text-based binary-encoding format that offers a balance
|
||||
between compact representation and readability. Base58 is similar to
|
||||
Base64, using upper- and lowercase letters and numbers,
|
||||
but omitting some characters that are frequently mistaken for one
|
||||
another and can appear identical when displayed in certain fonts.
|
||||
Specifically, Base58 is Base64 without the 0 (number zero), O (capital
|
||||
@ -677,11 +677,11 @@ shows the full Base58 alphabet.
|
||||
====
|
||||
|
||||
To add extra security against typos or transcription errors, Base58Check
|
||||
is a Base58 encoding format, frequently used in bitcoin, which has a
|
||||
is a Base58 encoding format, frequently used in Bitcoin, which has a
|
||||
built-in error-checking code. 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. When presented with
|
||||
detect transcription and typing errors. When presented with
|
||||
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, an error has been introduced and the Base58Check data is
|
||||
@ -691,10 +691,10 @@ otherwise result in loss of funds.
|
||||
|
||||
To convert data (a number) into a Base58Check format, we first add a
|
||||
prefix to the data, called the "version byte," which serves to easily
|
||||
identify the type of data that is encoded. 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 128 (0x80 in hex). A list of common
|
||||
version prefixes is shown in <<base58check_versions>>.
|
||||
identify the type of data that is encoded. For example, the prefix zero
|
||||
(0x00 in hex) indicates that the data should be used as the commitment (hash) in
|
||||
a legacy P2PKH scriptPubKey. A list of common version prefixes is shown
|
||||
in <<base58check_versions>>.
|
||||
|
||||
Next, we compute the "double-SHA" checksum, meaning we apply the SHA256
|
||||
hash-algorithm twice on the previous result (prefix and data):
|
||||
@ -705,7 +705,7 @@ checksum = SHA256(SHA256(prefix+data))
|
||||
|
||||
From the resulting 32-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.
|
||||
checksum. The checksum is 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
|
||||
@ -716,8 +716,8 @@ encoding process.
|
||||
.Base58Check encoding: a Base58, versioned, and checksummed format for unambiguously encoding bitcoin data
|
||||
image::images/mbc2_0406.png["Base58CheckEncoding"]
|
||||
|
||||
In bitcoin, most of the data presented to the user is
|
||||
Base58Check-encoded to make it compact, easy to read, and easy to detect
|
||||
In Bitcoin, more than just addresses are presented to the user in
|
||||
Base58Check encoding 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.
|
||||
@ -733,21 +733,23 @@ version prefixes and the resulting Base58 characters are shown in
|
||||
[options="header"]
|
||||
|=======
|
||||
|Type| Version prefix (hex)| Base58 result prefix
|
||||
| Bitcoin Address | 0x00 | 1
|
||||
| Pay-to-Script-Hash Address | 0x05 | 3
|
||||
| Bitcoin Testnet Address | 0x6F | m or n
|
||||
| Address for Pay-to-Public-Key-Hash (P2PKH) | 0x00 | 1
|
||||
| Address for Pay-to-Script-Hash (P2SH) | 0x05 | 3
|
||||
| Testnet Address for P2PKH | 0x6F | m or n
|
||||
| Testnet Address for P2SH | 0xC4 | 2
|
||||
| Private Key WIF | 0x80 | 5, K, or L
|
||||
| BIP-38 Encrypted Private Key | 0x0142 | 6P
|
||||
| BIP-32 Extended Public Key | 0x0488B21E | xpub
|
||||
|=======
|
||||
|
||||
==== Key Formats
|
||||
Putting together public keys, hash-based commitments, and Base58Check
|
||||
encocding, we can see the illustration of the conversion of a public key
|
||||
into a Bitcoin address in <<pubkey_to_address>>.
|
||||
|
||||
[[pubkey_to_address]]
|
||||
.Public key to Bitcoin address: conversion of a public key into a Bitcoin address
|
||||
image::images/mbc2_0405.png["pubkey_to_address"]
|
||||
|
||||
===== Decode from Base58Check
|
||||
==== Decode from Base58Check
|
||||
|
||||
The Bitcoin Explorer commands (see <<appdx_bx>>) make it easy to write
|
||||
shell scripts and command-line "pipes" that manipulate bitcoin keys,
|
||||
@ -781,8 +783,6 @@ wrapper
|
||||
}
|
||||
----
|
||||
|
||||
FIXME:HERE
|
||||
|
||||
[[comp_pub]]
|
||||
=== Compressed public keys
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user