「Base58Check encoding」の版間の差分
細 (1版 をインポートしました) |
|||
1行目: | 1行目: | ||
− | + | ['Bitcoin address | Bitcoin addresses]をエンコードするために、' '' 'Base58Check' ''として知られている変更されたBase 58 [http://en.wikipedia.org/wiki/Binary-to-text_encodingバイナリからテキストへのエンコーディング] ]。 | |
− | + | より一般的には、Base58Checkエンコーディングは、Bitcoinのバイト配列を人間が入力可能な文字列にエンコードするために使用されます。 | |
− | == | + | ==背景== |
− | + | オリジナルのBitcoinクライアントソースコードは、base58エンコーディングの背後にある推論を説明しています。 | |
− | 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の結果です。' '' | |
− | + | より詳細な例は、[[Technical_background_of_version_1_Bitcoin_addresses#How_to_create_Bitcoin_Address |テクニカルバックグラウンド]]。 | |
− | == | + | == Bitcoinアドレスのエンコード== |
− | + | Bitcoinアドレスは、次のいずれかのハッシュのBase58Checkエンコードを使用して実装されます。 | |
− | + | ( '' 'redeemScript' ''))</ code>ここで、 '' redeemScript ''は、 'は、財布がどのように使うべきかを知っているスクリプトです。バージョン<code> 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以外の文字は除外されます)。 | |
− | {| class="wikitable" | + | {| class = "wikitable" |
− | |- | + | | - !値 |
− | + | !キャラクター | |
− | + | !値 | |
− | + | !キャラクター | |
− | + | !値 | |
− | + | !キャラクター | |
− | + | !値 | |
− | + | !キャラクター | |
− | + | | - | |
− | |- | + | | 0 |
− | |0 | + | | 1 |
− | |1 | + | | 1 |
− | |1 | + | | 2 |
− | |2 | + | | 2 |
− | |2 | + | | 3 |
− | |3 | + | | 3 |
− | |3 | + | | 4 |
− | |4 | + | | - |
− | |- | + | | 4 |
− | |4 | + | | 5 |
− | |5 | + | | 5 |
− | |5 | + | | 6 |
− | |6 | + | | 6 |
− | |6 | + | | 7 |
− | |7 | + | | 7 |
− | |7 | + | | 8 |
− | |8 | + | | - |
− | |- | + | | 8 |
− | |8 | + | | 9 |
− | |9 | + | | 9 |
− | |9 | + | | A |
− | |A | + | | 10 |
− | |10 | + | | B |
− | |B | + | | 11 |
− | |11 | + | | C |
− | |C | + | | - |
− | |- | + | | 12 |
− | |12 | + | | D |
− | |D | + | | 13 |
− | |13 | + | | E |
− | |E | + | | 14 |
− | |14 | + | | F |
− | |F | + | | 15 |
− | |15 | + | | G |
− | |G | + | | - |
− | |- | + | | 16 |
− | |16 | + | | H |
− | |H | + | | 17 |
− | |17 | + | | J |
− | |J | + | | 18 |
− | |18 | + | | K |
− | |K | + | | 19 |
− | |19 | + | | L |
− | |L | + | | - |
− | |- | + | | 20 |
− | |20 | + | | M |
− | |M | + | | 21 |
− | |21 | + | | N |
− | |N | + | | 22 |
− | |22 | + | | P |
− | |P | + | | 23 |
− | |23 | + | | Q |
− | |Q | + | | - |
− | |- | + | | 24 |
− | |24 | + | | R |
− | |R | + | | 25 |
− | |25 | + | | S |
− | |S | + | | 26 |
− | |26 | + | | T |
− | |T | + | | 27 |
− | |27 | + | | U |
− | |U | + | | - |
− | |- | + | | 28 |
− | |28 | + | | V |
− | |V | + | | 29 |
− | |29 | + | | W |
− | |W | + | | 30 |
− | |30 | + | | X |
− | |X | + | | 31 |
− | |31 | + | | Y |
− | |Y | + | | - |
− | |- | + | | 32 |
− | |32 | + | | Z |
− | |Z | + | | 33 |
− | |33 | + | | a |
− | |a | + | | 34 |
− | |34 | + | | b |
− | |b | + | | 35 |
− | |35 | + | | c |
− | |c | + | | - |
− | |- | + | | 36 |
− | |36 | + | | d |
− | |d | + | | 37 |
− | |37 | + | | e |
− | |e | + | | 38 |
− | |38 | + | | f |
− | |f | + | | 39 |
− | |39 | + | | g |
− | |g | + | | - |
− | |- | + | | 40 |
− | |40 | + | | h |
− | |h | + | | 41 |
− | |41 | + | | i |
− | |i | + | | 42 |
− | |42 | + | | j |
− | |j | + | | 43 |
− | |43 | + | | k |
− | |k | + | | - |
− | |- | + | | 44 |
− | |44 | + | | m |
− | |m | + | | 45 |
− | |45 | + | | n |
− | |n | + | | 46 |
− | |46 | + | | o |
− | |o | + | | 47 |
− | |47 | + | | p |
− | |p | + | | - |
− | |- | + | | 48 |
− | |48 | + | | q |
− | |q | + | | 49 |
− | |49 | + | | r |
− | |r | + | | 50 |
− | |50 | + | | s |
− | |s | + | | 51 |
− | |51 | + | | t |
− | |t | + | | - |
− | |- | + | | 52 |
− | |52 | + | |あなた |
− | | | + | | 53 |
− | |53 | + | | v |
− | |v | + | | 54 |
− | |54 | + | | w |
− | |w | + | | 55 |
− | |55 | + | | x |
− | |x | + | | - |
− | |- | + | | 56 |
− | |56 | + | | y |
− | |y | + | | 57 |
− | |57 | + | | z |
− | |z | ||
|} | |} | ||
− | + | address_byte_stringを符号化するアルゴリズム(1バイトのバージョン+ハッシュまたはその他のデータ+ 4バイトのチェックコードからなる)は、 | |
code_string = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" | code_string = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" | ||
− | x = | + | x = convert_bytes_to_big_integer(hash_result) |
output_string = "" | output_string = "" | ||
− | + | 一方、(x> 0) | |
{ | { | ||
− | + | (x、剰余)=除算(x、58) | |
− | output_string. | + | output_string.append(code_string [remainder]) |
} | } | ||
− | + | 繰り返し(number_of_leading_zero_bytes_in_hash) | |
{ | { | ||
− | output_string. | + | output_string.append(code_string [0]); |
} | } | ||
− | output_string. | + | output_string.reverse(); |
− | == | + | ==バージョンバイト== |
− | + | ここにいくつかの共通バージョンのバイトがあります: | |
− | {| class="wikitable" | + | {| class = "wikitable" |
− | |- | + | | - |
− | + | !10進数バージョン | |
− | + | !先頭のシンボル | |
− | + | !つかいます | |
− | |- | + | | - |
− | |0 | + | | 0 |
− | |1 | + | | 1 |
− | |Bitcoin pubkey hash | + | | Bitcoin pubkey hash |
− | |- | + | | - |
− | |5 | + | | 5 |
− | |3 | + | | 3 |
− | | | + | | Bitcoinスクリプトハッシュ |
− | |- | + | | - |
− | |21 | + | | 21 |
− | |4 | + | | 4 |
− | | | + | | Bitcoin(コンパクト)公開鍵(提案) |
− | |- | + | | - |
− | |52 | + | | 52 |
− | | | + | | MまたはN |
− | |Namecoin pubkey hash | + | | Namecoin pubkey hash |
− | |- | + | | - |
− | |128 | + | | 128 |
− | |5 | + | | 5 |
− | | | + | |秘密鍵 |
− | |- | + | | - |
− | |111 | + | | 111 |
− | | | + | | mまたはn |
− | |Bitcoin testnet | + | | Bitcoin testnet pubkeyハッシュ |
− | |- | + | | - |
− | |196 | + | | 196 |
− | |2 | + | | 2 |
− | |Bitcoin | + | | Bitcoin testnetスクリプトハッシュ |
|} | |} | ||
− | [[ | + | [[アドレスプレフィックス一覧]]より完全なリストです。 |
− | == | + | ==関連項目== |
− | * [http://lenschulwitz.com/ | + | * [http://lenschulwitz.com/base58オンラインBase58デコーダ、エンコーダ、バリデータ] |
− | == | + | ==ソースコード== |
− | * [https://github.com/bitcoin/bitcoin/blob/master/src/base58.cpp "Satoshi" C++ | + | * [https://github.com/bitcoin/bitcoin/blob/master/src/base58.cpp "Satoshi" C ++コードベース(デコードとエンコード、外部ライブラリは不要)] |
− | * [https://github.com/luke-jr/libbase58 libbase58 | + | * [https://github.com/luke-jr/libbase58 libbase58 Cコード(デコードとエンコード、外部ライブラリは不要)] |
− | * [http://lenschulwitz.com/b58/base58perl.txt | + | * [http://lenschulwitz.com/b58/base58perl.txt PerlでBase58のデコード、エンコード、検証] |
− | [[ | + | [[Category:技術]] |
− | [[ | + | [[es:CodificaciónBase58Check]] |
2018年4月12日 (木) 12:31時点における版
['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スクリプトハッシュ |
アドレスプレフィックス一覧より完全なリストです。