16進数 → Base58 変換ツール

16進数のバイト列を貼り付けると、Bitcoin、Solana、IPFS で使われる Base58 文字列を出力します。先頭の 00 バイトはそれぞれ先頭の 1 になり、それ以外のバイトはすべてそのまま保持されます。

すべてブラウザ内で処理され、データはアップロードされません。

使い方

  1. 16進数のバイト列を入力欄に貼り付けます。スペース、コロン、0x プレフィックスも使用できます。
  2. 出力欄で Base58 の結果を確認します。
  3. 結果をコピーするか、「入力と出力を入れ替え」ボタンを押して Base58 を16進数にデコードします。

16進数を Base58 に変換する仕組み

16進数はまず 2 桁ずつバイトに変換されるため、入力の桁数は偶数である必要があります。次に、そのバイト列をビッグエンディアンの 1 つの数として読み取り、Bitcoin アルファベットを使って 58進法で書き直します。先頭の 00 バイトはそれぞれ 1 として書かれます。そのため、0000ff は 115Q になり、ff だけなら 5Q になります。

Base58 は 1 バイトあたり約 1.37 文字を必要とするため、64 桁の16進数(32 バイト)は 43 文字または 44 文字に縮まります。アルファベットには 0、O、I、l、+、/ が含まれないため、結果は読み上げやすく、ダブルクリックで選択でき、URL にもそのまま入れられます。計算はすべてブラウザ内で行われます。

Solana と IPFS の識別子を作成する

  • Solana:アドレスは 32 バイトの Ed25519 公開鍵を Base58 で表したもので、プレフィックスもチェックサムもありません。64 桁の16進数の鍵を貼り付けると、アドレスが得られます。
  • IPFS CIDv0:CIDv0 は sha2-256 マルチハッシュを Base58 で表したものです。64 桁のダイジェストの前に 1220 を付けると、Qm で始まる 46 文字の文字列になります。ダイジェストは IPFS がエンコード済みのブロックに対して計算したものでなければならず、元のファイルの SHA-256 とは異なります。
1220 9d6c2be50f706953479ab9df2ce3edca90b68053c00b3004b7f0accbe1e8eedf
QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG

Bitcoin アドレスにはチェックサムが必要

hash160 だけではアドレスになりません。レガシーの Bitcoin アドレスは、バージョンバイト 00 に 20 バイトの hash160 を続けたものを Base58Check でエンコードしたもので、エンコード前に SHA-256 を 2 回適用した 4 バイトのチェックサムが付加されます。00 と hash160 を通常の Base58 でエンコードすると、チェックサムのない短い文字列になり、ウォレットでは受け付けられません。

代わりに Base58Check のページを使ってください。「入力形式」を「16進数」に切り替え、00 に続けて hash160 を入力すると、チェックサムが自動的に付加されます。16進数の末尾にすでに正しいチェックサムが付いている場合は、このページでも同じアドレスが得られます。

0062e907b15cbf27d5425399ebf6f0fb50ebb88f18    (Base58Check)
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

コードで16進数を Base58 に変換する

# Python (pip install base58)
import base58
base58.b58encode(bytes.fromhex('0000ff'))     # b'115Q'

// JavaScript (npm install bs58)
import bs58 from 'bs58';
bs58.encode(Buffer.from('0000ff', 'hex'));    // '115Q'

よくある質問

hash160 を Bitcoin アドレスに変換するにはどうすればよいですか?
先頭にバージョンバイト 00 を付け、通常の Base58 ではなく Base58Check でエンコードします。Base58Check のページでバイト列を16進数で入力すれば、この処理を行えます。
結果がいくつかの 1 で始まるのはなぜですか?

入力した16進数が、同じ数の 00 バイトで始まっているためです。Base58 は、文字列をデコードしたときに復元できるよう、それらを先頭の 1 として保持します。

16進数の入力がエラーになるのはなぜですか?

16進数は桁数が偶数で、0-9 と a-f の文字(大文字・小文字は問いません)だけで構成されている必要があります。スペース、コロン、0x プレフィックスは自動的に取り除かれますが、紛れ込んだ g などの文字や桁の不足はエラーになります。

このページではどの Base58 アルファベットを使っていますか?
Bitcoin アルファベットです。Solana や IPFS をはじめ、ほとんどのプロジェクトでも同じものが使われています。Flickr や Ripple のアルファベットを使う場合は、Base58 のページで「アルファベット」を選び、「入力形式」を「16進数」にしてバイト列を入力してください。