Base58 を Base64 に変換する方法
- 入力 · Base58 に Base58 文字列を貼り付けます。改行と空白は無視されます。
- Bitcoin のアルファベットでない場合は、入力の下のアルファベットを Flickr か Ripple に変更します。
- 出力 · Base64 で Base64 を確認します。パディングなしの Base64 にするには出力の下のパディング(=)のチェックを外し、折り返しを 64 桁や 76 桁に設定することもできます。
- 出力をコピーします。逆方向には、方向の切り替えで Base64 → Base58 を使います。Base64 を Base58 にのページは最初からその方向で開きます。
ツールの下のカウンターには、入力の長さ、デコードしたバイト数、出力の長さが表示されます。バイト数を見れば、鍵を丸ごと貼り付けたかをすぐに確認できます。Solana の公開鍵なら 32、署名やキーペアなら 64、IPFS CIDv0 なら 34 です。
例
| Base58 | Base64 | バイト数 |
|---|---|---|
9Ajdvzr | SGVsbG8= | 5、テキストの Hello |
11111111111111111111111111111111 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= | 32 個のゼロバイト |
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | Bt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk= | 32、Solana の SPL Token プログラム |
QmQudp5N7EzTxrBk3yESEKyEroMYNd7R22G2KWffwNZyzq | EiAmKoa2duWGnt1dGt+P/QHWKcMVS/3q7PyM+g2Q4Igtig== | 34、IPFS CIDv0 |
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa | AGLpB7FcvyfVQlOZ6/bw+1DruI8Ywpt9kw== | 25、チェックサム付きの Bitcoin アドレス |
どの CIDv0 も、Base64 に変換すると EiA で始まります。これはマルチハッシュのヘッダー 12 20(SHA-256、32 バイト)です。最初の 2 バイトを取り除けば素のダイジェストになり、SHA-256 のツールが出力する形と同じです。
Solana のデータが両方のエンコーディングで現れる理由
Solana のウォレットやエクスプローラーでは、公開鍵、プログラム ID、トランザクションの署名が Base58 で表示されます。一方、JSON-RPC API はシリアライズしたトランザクションを Base64 か Base58 で受け付け、Base58 は遅く非推奨の選択肢とされています。アカウントデータは、そのエンコーディングを指定すれば Base64 で返ってきます。そのため、同じ 32 バイトの鍵が、ある場所では Base58 で、別の場所では Base64 の中に現れることがあります。
変換してもバイト列は変わらないので、2 つの値を比較する安全な方法になります。Base58 の鍵と Base64 の鍵がここで同じ Base64 になれば、それは同じ鍵です。
Python で Base58 を Base64 に変換する
標準ライブラリには Base64 はありますが Base58 はないので、前半は短いループで書きます。
import base64
ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
def base58_to_base64(s: str) -> str:
n = 0
for ch in s:
n = n * 58 + ALPHABET.index(ch)
body = n.to_bytes((n.bit_length() + 7) // 8, "big")
zeros = len(s) - len(s.lstrip("1"))
return base64.b64encode(b"\0" * zeros + body).decode()
base58_to_base64("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA")
# 'Bt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk='
ALPHABET.index は、0 や l など Base58 以外の文字に対して ValueError を発生させます。Python での Base64 の扱いについては Python のページをご覧ください。
よくある問題
- バイト数が 1 つ足りない。 以前に使った変換ツールが先頭のゼロバイトを落としています。このページはそれを保持するので、出力を比較してみてください。
0、O、I、lの位置でエラーになる。 これらの文字は Base58 にありません。コピーや OCR の誤りを確認してください。- 入力が
bc1、0x、bafyで始まる。 それぞれ Bech32、16進数、Base32(IPFS CIDv1)で、Base58 ではありません。CIDv1 の読み方は Base32 デコーダーで説明しています。 - 出力が想定より 4 バイト長い。 文字列は Base58Check で、チェックサムが付いたままです。
よくある質問
Solana の公開鍵を Base64 に変換するにはどうすればいいですか?
入力欄にアドレスを貼り付けてください。有効な Solana の公開鍵はちょうど 32 バイトにデコードされるので、Base64 の出力は常に = 1 つで終わる 44 文字、パディングなしなら 43 文字です。
Base64 が A で始まるのはなぜですか?
Base58 の入力が 1 で始まっており、それがゼロバイトにデコードされるからです。Base64 の最初の文字は最初の 6 ビットで決まり、6 つのゼロビットは A です。Bitcoin のアドレス 1A1zP1… が AGLp… になるのはこのためです。
URLセーフな Base64 にするには?
結果を Base64 から Base64URL へにコピーしてください。+ と / を - と _ に置き換え、パディングを取り除きます。= を落とすだけでよければ、ここでパディング(=)のチェックを外してください。
Base58Check の文字列では出力が変わりますか?
変換自体は同じですが、Base64 にはバージョンバイトと 4 バイトのチェックサムが含まれます。ペイロードだけが欲しい場合は、先に Base58Check ツールでデコードしてください。