使い方
- テキストやバイト列を Base58 に変換するには「エンコード」を、Base58 文字列をデータに戻すには「デコード」を選択します。
- 「アルファベット」を選択します。デフォルトは Bitcoin で、IPFS や Solana でも同じものが使われています。
- データを入力または貼り付けます。ハッシュ値や公開鍵などの生のバイト列を扱う場合は、「入力形式」を「16進数」に切り替えます。
- 文字列に 4 バイトのチェックサムが含まれる場合にのみ「Base58Check チェックサム」をオンにし、結果をコピーまたはダウンロードします。
Base58 とは
Base58 は、Bitcoin のために考案されたバイナリ・テキスト変換方式です。アルファベットは、数字とラテン文字の 62 文字から、見間違えやすい 4 文字、0(ゼロ)、O(大文字のオー)、I(大文字のアイ)、l(小文字のエル)を除いたものです。+、/、= も含まないため、Base58 文字列はダブルクリックで全体を選択でき、エスケープせずに URL に入れられます。
Base64 とは異なり、Base58 は入力をビット単位のグループに区切りません。入力全体を 1 つの大きな数として扱い、58 進数で表記します。そのためパディングはなく、1 バイト変わるだけで出力の多くの文字が変わることがあります。先頭のゼロバイトは数値としては意味を持たないため、それを保持するために、1 バイトにつきアルファベットの最初の文字(Bitcoin アルファベットでは 1)で表します。出力サイズは入力の約 1.37 倍になります。
Base58 の用途
- Bitcoin。レガシーアドレスと WIF 形式の秘密鍵は Base58Check、つまりバージョンバイトとチェックサムを加えた Base58 です。
- IPFS。バージョン 0 のコンテンツ識別子(CIDv0)は、SHA-256 マルチハッシュを Base58 で表したものです。そのため、これらの CID は 46 文字で、
Qmで始まります。 - Solana。公開鍵、アカウントアドレス、トランザクション署名は、チェックサムのない通常の Base58 で表記されます。32 バイトの鍵は、通常 43 文字または 44 文字になります。
- Flickr と XRP Ledger。Flickr の短縮リンクは Flickr アルファベットを、XRP のアドレスは Ripple アルファベットを使います。XRP のアドレスが
rで始まるのはこのためです。
Base58 と生のバイト列を相互に変換するには、Base58 → 16進数と16進数 → Base58 を使います。英数字だけで構成される ID が必要な場合は、Base62 と比べてみてください。
Base58 のアルファベット
| アルファベット | 文字(順番どおり) |
|---|---|
| Bitcoin | 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz |
| Flickr | 123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ |
| Ripple | rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz |
3 つとも同じ 58 文字を異なる順序で並べたものです。そのため、あるアルファベットでエンコードした文字列を別のアルファベットでデコードすると、異なるバイト列になるか、エラーになります。
コードで Base58 を扱う
# Python(pip install base58)
import base58
base58.b58encode(b'hello') # b'Cn8eVZg'
base58.b58decode('Cn8eVZg') # b'hello'
// JavaScript(npm install bs58)
import bs58 from 'bs58';
bs58.encode(new TextEncoder().encode('hello'));
仕様
| 使用文字 | 1-9 A-Z a-z(0 O I l を除く) |
|---|---|
| 出力サイズ | 約 137%(多倍長整数による変換) |
| パディング | なし(先頭のゼロバイトは「1」になる) |
| 規格 | Bitcoin Base58 |
| 大文字と小文字の区別 | あり |
エンコード例
| 入力 (UTF-8) | 出力 |
|---|---|
Hello, World! | 72k1xXWG59fYdzSNoA |
Base64.is | r1Nm3AS7ZcnN |
你好 | 2xuZUfBKa |
よくある質問
先頭のゼロバイトが 1 になるのはなぜですか?
1)を書き出します。32 個のゼロバイトをエンコードすると 1 が 32 個並ぶのはこのためです。Base58 は大文字と小文字を区別しますか?
はい。大文字と小文字は別の数字として扱われるため、1 文字でも大文字と小文字を変えると、デコード結果のバイト列が変わるか、文字列が無効になります。