Base58Check encoding

提供: tezos-wiki
移動先: 案内検索

['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スクリプトハッシュ

アドレスプレフィックス一覧より完全なリストです。

関連項目

ソースコード

Category:技術

es:CodificaciónBase58Check