「Base58Check encoding」の版間の差分
48行目: | 48行目: | ||
Bitcoinで使用されるBase58シンボルチャートは、Bitcoinプロジェクトに固有のもので、Bitcoinのコンテキスト外で使用される他のBase58実装と同じではありません(0、O、I、およびl以外の文字は除外されます)。 | Bitcoinで使用されるBase58シンボルチャートは、Bitcoinプロジェクトに固有のもので、Bitcoinのコンテキスト外で使用される他のBase58実装と同じではありません(0、O、I、およびl以外の文字は除外されます)。 | ||
{| class = "wikitable" | {| class = "wikitable" | ||
− | | - | + | |- !値 |
− | + | !キャラクター | |
− | + | !値 | |
− | + | !キャラクター | |
− | + | !値 | |
− | + | !キャラクター | |
− | + | !値 | |
− | + | !キャラクター | |
− | | - | + | !値 |
+ | |- | ||
| 0 | | 0 | ||
| 1 | | 1 | ||
65行目: | 66行目: | ||
| 3 | | 3 | ||
| 4 | | 4 | ||
− | | - | + | |- |
| 4 | | 4 | ||
| 5 | | 5 | ||
74行目: | 75行目: | ||
| 7 | | 7 | ||
| 8 | | 8 | ||
− | | - | + | |- |
| 8 | | 8 | ||
| 9 | | 9 | ||
83行目: | 84行目: | ||
| 11 | | 11 | ||
| C | | C | ||
− | | - | + | |- |
| 12 | | 12 | ||
| D | | D | ||
92行目: | 93行目: | ||
| 15 | | 15 | ||
| G | | G | ||
− | | - | + | |- |
| 16 | | 16 | ||
| H | | H | ||
101行目: | 102行目: | ||
| 19 | | 19 | ||
| L | | L | ||
− | | - | + | |- |
| 20 | | 20 | ||
| M | | M | ||
110行目: | 111行目: | ||
| 23 | | 23 | ||
| Q | | Q | ||
− | | - | + | |- |
| 24 | | 24 | ||
| R | | R | ||
119行目: | 120行目: | ||
| 27 | | 27 | ||
| U | | U | ||
− | | - | + | |- |
| 28 | | 28 | ||
| V | | V | ||
128行目: | 129行目: | ||
| 31 | | 31 | ||
| Y | | Y | ||
− | | - | + | |- |
| 32 | | 32 | ||
| Z | | Z | ||
137行目: | 138行目: | ||
| 35 | | 35 | ||
| c | | c | ||
− | | - | + | |- |
| 36 | | 36 | ||
| d | | d | ||
146行目: | 147行目: | ||
| 39 | | 39 | ||
| g | | g | ||
− | | - | + | |- |
| 40 | | 40 | ||
| h | | h | ||
155行目: | 156行目: | ||
| 43 | | 43 | ||
| k | | k | ||
− | | - | + | |- |
| 44 | | 44 | ||
| m | | m | ||
164行目: | 165行目: | ||
| 47 | | 47 | ||
| p | | p | ||
− | | - | + | |- |
| 48 | | 48 | ||
| q | | q | ||
173行目: | 174行目: | ||
| 51 | | 51 | ||
| t | | t | ||
− | | - | + | |- |
| 52 | | 52 | ||
|あなた | |あなた | ||
182行目: | 183行目: | ||
| 55 | | 55 | ||
| x | | x | ||
− | | - | + | |- |
| 56 | | 56 | ||
| y | | y | ||
213行目: | 214行目: | ||
{| class = "wikitable" | {| class = "wikitable" | ||
− | | - | + | |- |
− | + | !10進数バージョン | |
− | + | !先頭のシンボル | |
− | + | !つかいます | |
− | | - | + | |- |
| 0 | | 0 | ||
| 1 | | 1 | ||
| Bitcoin pubkey hash | | Bitcoin pubkey hash | ||
− | | - | + | |- |
| 5 | | 5 | ||
| 3 | | 3 | ||
| Bitcoinスクリプトハッシュ | | Bitcoinスクリプトハッシュ | ||
− | | - | + | |- |
| 21 | | 21 | ||
| 4 | | 4 | ||
| Bitcoin(コンパクト)公開鍵(提案) | | Bitcoin(コンパクト)公開鍵(提案) | ||
− | | - | + | |- |
| 52 | | 52 | ||
| MまたはN | | MまたはN | ||
| Namecoin pubkey hash | | Namecoin pubkey hash | ||
− | | - | + | |- |
| 128 | | 128 | ||
| 5 | | 5 | ||
|秘密鍵 | |秘密鍵 | ||
− | | - | + | |- |
| 111 | | 111 | ||
| mまたはn | | mまたはn | ||
| Bitcoin testnet pubkeyハッシュ | | Bitcoin testnet pubkeyハッシュ | ||
− | | - | + | |- |
| 196 | | 196 | ||
| 2 | | 2 |
2018年5月6日 (日) 10:58時点における版
['Bitcoin address | Bitcoin addresses]をエンコードするために、' 'Base58Check' として知られている変更されたBase 58 [1] ]。
より一般的には、Base58Checkエンコーディングは、Bitcoinのバイト配列を人間が入力可能な文字列にエンコードするために使用されます。
目次
背景
オリジナルのBitcoinクライアントソースコードは、base58エンコーディングの背後にある推論を説明しています。
base58.h:
//標準base-64エンコーディングの代わりにbase-58を使用する理由 // - いくつかのフォントで同じように見える0の文字を望んではいけません。 //視覚的に同じ見た目の口座番号を作成するために使用できます。 // - 英数字以外の文字列は、口座番号ほど簡単には受け入れられません。 // - 電子メールは通常、折り返す句読点がない場合は改行しません。 // - Doubleclickingは、数字がすべて英数字の場合は1つの単語として選択します。
Base58Checkの機能
Base58Checkには、次の機能があります。
- 任意のサイズのペイロード。
- 簡単に区別できる大文字と小文字からなる58文字の英数字記号のセット(0101は使用されません)
- 1バイトのバージョン/アプリケーション情報。 Bitcoinアドレスはこのバイトに0x00を使用します(将来の0x05を使用する可能性があります)。
- 4バイト(32ビット)のSHA256ベースのエラーチェックコード。このコードは、誤植を自動的に検出し、訂正するために使用できます。
- データの先行ゼロを保存するための追加ステップ。
Base58Check文字列の作成
Base58Check文字列は、バージョン/アプリケーションバイトとペイロードから次のように作成されます。 #バージョンのバイトとペイロードのバイトを取り出し、一緒に連結します(バイト単位)。 #SHA256の最初の4バイトを取得する(SHA256(ステップ1の結果)) #手順1の結果と手順2の結果を結合します(バイト単位)。 #ステップ3の結果を一連のバイトとして扱う - 単一のビッグエンディアンのbignumberとして、通常の数学的ステップ(bignumber除算)と下で説明するbase-58アルファベットを使用してbase-58に変換します。結果は、先行するbase-58のゼロ(文字 '1')を持たないように正規化する必要があります。 #先頭の文字 '1'は、base58の値が0であり、先行ゼロの バイト '全体を表すために予約されています。シンボル。 1つ以上の先行ゼロバイトを表すのに必要なときに、1つ以上の先行する '1'が存在することがあります。ステップ3の結果であった先頭の0バイトの数を数えます(古いBitcoinアドレスの場合、バージョン/アプリケーションバイトには常に1つ以上あります;新しいアドレスの場合は決して存在しません)。先頭の各ゼロバイトは、最終結果においてそれ自身の文字「1」によって表される。 #ステップ5の1をステップ4の結果と連結します。 'これはBase58Checkの結果です。' より詳細な例は、テクニカルバックグラウンド。
Bitcoinアドレスのエンコード
Bitcoinアドレスは、次のいずれかのハッシュのBase58Checkエンコードを使用して実装されます。
( 'redeemScript' ))</ code>ここで、 redeemScript は、 'は、財布がどのように使うべきかを知っているスクリプトです。バージョン 0x05 </ code>(これらのアドレスは数字「3」で始まります)
Payload to Pubkey-Hash(p2pkh):ペイロードは<code> RIPEMD160([ 'ECDSA_publicKey' ))</ code>ウォレットが秘密鍵を知っている公開鍵です。バージョン<code> 0x00 </ code>(これらのアドレスは数字「1」で始まります)
これらの場合のハッシュ結果は常に正確に20バイトです。 これらはビッグエンディアンです(最上位バイトが最初です)。 (先頭の0x00バイトをクリップするbignumber実装に注意するか、または符号を示すために余分な0x00バイトを前に付けてください - あなたのコードはこれらのケースを適切に処理しなければなりません。そうでなければ、送信することができますが、から - それは硬貨の恒久的な損失につながる)。
秘密鍵の符号化
Base58Checkエンコードは、ウォレットのインポート形式の ECDSA秘密鍵のエンコードにも使用されます。 これは、バージョン/アプリケーションバイトに0x80が使用され、ペイロードが20ではなく32バイトであることを除いて、Bitcoinアドレスとまったく同じように形成されます(Bitcoinの秘密鍵は単一の32バイトの符号なしビッグエンディアン整数です) 。 圧縮されていない公開鍵に関連付けられた秘密鍵の場合、そのようなエンコーディングは常に '5'、またはより具体的には '5H'、 '5J'または '5K'で始まる51文字の文字列を生成します。
Base58シンボルチャート
Bitcoinで使用されるBase58シンボルチャートは、Bitcoinプロジェクトに固有のもので、Bitcoinのコンテキスト外で使用される他のBase58実装と同じではありません(0、O、I、およびl以外の文字は除外されます)。
キャラクター | 値 | キャラクター | 値 | キャラクター | 値 | キャラクター | 値 |
---|---|---|---|---|---|---|---|
0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 |
4 | 5 | 5 | 6 | 6 | 7 | 7 | 8 |
8 | 9 | 9 | A | 10 | B | 11 | C |
12 | D | 13 | E | 14 | F | 15 | G |
16 | H | 17 | J | 18 | K | 19 | L |
20 | M | 21 | N | 22 | P | 23 | Q |
24 | R | 25 | S | 26 | T | 27 | U |
28 | V | 29 | W | 30 | X | 31 | Y |
32 | Z | 33 | a | 34 | b | 35 | c |
36 | d | 37 | e | 38 | f | 39 | g |
40 | h | 41 | i | 42 | j | 43 | k |
44 | m | 45 | n | 46 | o | 47 | p |
48 | q | 49 | r | 50 | s | 51 | t |
52 | あなた | 53 | v | 54 | w | 55 | x |
56 | y | 57 | z |
address_byte_stringを符号化するアルゴリズム(1バイトのバージョン+ハッシュまたはその他のデータ+ 4バイトのチェックコードからなる)は、
code_string = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" x = convert_bytes_to_big_integer(hash_result) output_string = "" 一方、(x> 0) { (x、剰余)=除算(x、58) output_string.append(code_string [remainder]) } 繰り返し(number_of_leading_zero_bytes_in_hash) { output_string.append(code_string [0]); } output_string.reverse();
バージョンバイト
ここにいくつかの共通バージョンのバイトがあります:
10進数バージョン | 先頭のシンボル | つかいます |
---|---|---|
0 | 1 | Bitcoin pubkey hash |
5 | 3 | Bitcoinスクリプトハッシュ |
21 | 4 | Bitcoin(コンパクト)公開鍵(提案) |
52 | MまたはN | Namecoin pubkey hash |
128 | 5 | 秘密鍵 |
111 | mまたはn | Bitcoin testnet pubkeyハッシュ |
196 | 2 | Bitcoin testnetスクリプトハッシュ |
アドレスプレフィックス一覧より完全なリストです。