Base58Check encoding
['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スクリプトハッシュ |
アドレスプレフィックス一覧より完全なリストです。