Base58 をデコードする方法
- 入力 · Base58 に文字列を貼り付けます。空白と改行は無視されます。
- 出力 · Hex(16進数)でバイト列を確認します。出力の下で大文字/小文字を切り替えたり、空白や
:などの区切り文字を加えたり、1 行あたりのバイト数を 16 や 32 にしてダンプを折り返したりできます。 - 文字列が Bitcoin 形式の Base58 でない場合は、入力の下のアルファベットを Flickr か Ripple に変更します。
- 別の表示にしたいときは変換先を変えます。データが文字列だったならテキスト、API や設定ファイル用なら Base64 です。Base58 を Base64 にはこの変換用に用意したページです。
- 出力をコピーするか、16進数をダウンロードするか、バイトを保存でデコードしたバイト列をファイルとして取得します。
よくある Base58 文字列のデコード結果
| Base58 | バイト列(16進数) | 内容 |
|---|---|---|
11111111111111111111111111111111 | 32 × 00 | Solana の System Program(ゼロだけの 32 バイトの鍵) |
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | 06ddf6e1d765…7eff00a9(32 バイト) | Solana の SPL Token のプログラム ID |
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa | 00 62e907b1…ebb88f18 c29b7d93 | Bitcoin のジェネシスブロックのアドレス:バージョン、ハッシュ、チェックサム |
QmQudp5N7EzTxrBk3yESEKyEroMYNd7R22G2KWffwNZyzq | 1220 262a86b6…e0882d8a | IPFS CIDv0:SHA-256 のマルチハッシュヘッダーと 32 バイトのダイジェスト |
9Ajdvzr | 48656c6c6f | テキストの Hello |
バイト列を読めば構造がわかります。00 か 05 で始まる 25 バイトはチェックサムが付いたままの Bitcoin アドレス、1220 で始まる 34 バイトは CIDv0、目に見える構造のない 32 バイトはおそらく公開鍵です。
先頭の 1 はゼロバイト
Base58 では、先頭の 1 はそれぞれ 1 つの 00 バイトにデコードされ、残りの文字列は 1 つの数としてデコードされます。このデコーダーはそのバイトを保持するので、上のジェネシスアドレスは 24 バイトではなく 25 バイトを返します。数だけを変換するデコーダーはこれを失い、最初の兆候はたいてい、鍵が 1 バイト足りない、あるいはチェックサムがどうしても一致しない、というものです。
このルールは逆方向にも当てはまります。1111 は 4 つのゼロバイトですが、2 は 1 バイトの 01 です。
デコードに失敗するとき
- 予期しない文字
"0"、"O"、"I"、"l"。 この 4 つは他の文字と紛らわしいため、Base58 のアルファベットから除かれています。エラーには位置が表示されます。たいていは書き写しの誤りです。 - 予期しない
+、/、=。 文字列は Base64 です。Base64 デコーダーを使ってください。 - 入力が
bc1で始まる。 それは Bech32 の SegWit アドレスで、独自のチェックサムとアルファベットを持つ別のエンコーディングです。ここでは失敗するか、意味のないバイト列にデコードされます。 - 16進数は正しいが 4 バイト長い。 Base58Check の値を素の Base58 としてデコードしています。最後の 4 バイトがチェックサムです。取り除くか、Base58Check を使ってください。
- 入力が 64 KB を超える。 Base58 は入力全体を 1 つの数として扱うため、ツールは応答性を保つために 64 KB で止めます。実際の Base58 の値は数十文字です。
JavaScript で Base58 を 16進数にデコードする
BigInt を使えば変換は短く書けます。ブラウザでも Node.js でも動きます。
const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
function base58ToHex(s) {
let n = 0n;
for (const ch of s) {
const v = ALPHABET.indexOf(ch);
if (v < 0) throw new Error(`not Base58: ${ch}`);
n = n * 58n + BigInt(v);
}
let hex = n === 0n ? "" : n.toString(16);
if (hex.length % 2) hex = "0" + hex;
const zeros = s.length - s.replace(/^1+/, "").length;
return "00".repeat(zeros) + hex;
}
base58ToHex("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa");
// '0062e907b15cbf27d5425399ebf6f0fb50ebb88f18c29b7d93'
JavaScript でのバイト列の扱いについては JavaScript のページをご覧ください。
よくある質問
Solana のアドレスをデコードするにはどうすればいいですか?
ここに貼り付けてください。16進数の出力が 32 バイトの Ed25519 公開鍵です。System Program のアドレス 11111111111111111111111111111111 は 32 個のゼロバイトにデコードされ、先頭のゼロのルールを手早く確かめられます。
Bitcoin アドレスが 25 バイトにデコードされるのはなぜですか?
従来型のアドレスは Base58Check で、バージョンバイト 1、公開鍵ハッシュ 20 バイト、チェックサム 4 バイトからなります。素の Base58 のデコードでは 25 バイトすべてが返ります。Base58Check デコーダーはチェックサムを検証して取り除きます。
デコーダーが文字列を拒否するのはなぜですか?
Base58 には 0、O、I、l がないので、これらがあればたいていは入力ミスか別のエンコーディングです。+、/、= を含む文字列は Base64、0x… は 16進数です。
JavaScript で Base58 を 16進数に変換するには?
BigInt を 1 桁ずつ掛け合わせて積み上げ、toString(16) で出力し、先頭の 1 ごとに 00 を付け足します。このページのスニペットに関数全体があります。