アドレス
XRP Ledgerのアカウントは、XRP Ledgerの[base58][]フォーマットのアドレスで識別されます。このアドレスはアカウントのマスター公開鍵から生成され、マスター公開鍵は秘密鍵から生成されます。アドレスはJSON文字列で記述され、以下の特徴があります。
- 長さは25から35文字
- 文字
r
から始まる - 数字"
0
"、大文字"O
"、大文字"I
"、小文字"l
"を除く英数字 - 大文字と小文字を区別
- 4バイトのチェックサムが含まれており、ランダムな文字から有効なアドレスが生成される確率はおよそ232分の1
宛先タグをアドレスに「組み込む」Xアドレス形式もあります。これらのアドレスはX
(メインネット用)またはT
(テストネットワーク用)で始まります。取引所とウォレットは、顧客が知る必要のあるすべてのデータを1つの値で表すためにXアドレスを使用できます。詳細については、Xアドレスフォーマットサイトとコーデックをご覧ください
XRP Ledgerプロトコルは「クラシック」アドレスのみをネイティブにサポートしていますが、多くのクライアントライブラリはXアドレスもサポートしています。
有効なアドレスであれば、資金を入金することでXRP Ledgerのアカウントになることができます。また、レギュラーキーや署名者リストのメンバーとして、資金提供されていないアドレスを使用することもできます。資金を供給されたアカウントだけがトランザクションの送信者になることができます。
キーペアの生成を始めとする有効なアドレスの作成は、厳密には数学的な作業です。キーペアの生成とアドレスの計算は、XRP Ledgerや他のいかなる第三者とも通信することなく、完全にオフラインで行うことができます。公開鍵からアドレスへの変換には一方向ハッシュ関数が使用されるため、公開鍵とアドレスの一致を確認することは可能ですが、アドレスのみから公開鍵を導き出すことは不可能です。(これが署名付きトランザクションに公開鍵と送信者のアドレスを含める理由の一部です)。
特別なアドレス
XRP Ledgerでは、特別な意味や歴史的な役割を持つアドレスがあります。多くの場合、これらは"ブラックホール"アドレスであり、そのアドレスは既知の秘密鍵に由来するものではありません。アドレスから秘密鍵を推測することは事実上不可能であるため、ブラックホールアドレスが保有するXRPは永遠に失われます。
アドレス | 名称 | 意味 | ブラック ホール? |
---|---|---|---|
rrrrrrrrrrrrrrrrrrrrrhoLvTp | ACCOUNT_ZERO | 値0をbase58形式にエンコードしたXRP Ledgerのアドレス。ピアツーピア通信では、このアドレスは、XRPの発行者としてrippled で使用されます。 | はい |
rrrrrrrrrrrrrrrrrrrrBZbvji | ACCOUNT_ONE | 値1をbase58形式にエンコードしたXRP Ledgerのアドレス。レジャーのRippleStateエントリでは、このアドレスは、トラストライン残高の発行者のプレースホルダーとして使用されます。 | はい |
rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh | ジェネシスアカウント | rippled で(スタンドアロンモードなど)新しいジェネシスレジャーが一から開始される場合、このアカウントはすべてのXRPを保持します。このアドレスは、シード値masterpassphrase から生成されており、この値はハードコーディングされています。 | いいえ |
rrrrrrrrrrrrrrrrrNAMEtxvNvQ | Ripple Namesの登録用ブラックホール | 以前、Ripple社は、Ripple Namesを登録するために、このアカウントにXRPを送金するようユーザに求めていました。 | はい |
rrrrrrrrrrrrrrrrrrrn5RM1rHd | NaNアドレス | 以前のバージョンのripple-libでは、XRP Ledgerのbase58文字列エンコード形式を使用して、値NaNをエンコードするときにこのアドレスを生成しました。 | はい |
アドレスのエンコード
ヒント: これらの技術的な詳細は、XRP Ledgerとの互換性を保つために低レベルのライブラリソフトウェアを構築しているユーザのみを対象としています!
XRP Ledgerのアドレスは、base58形式の ディクショナリ rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz
を使用してエンコードされています。XRP Ledgerはbase58でいくつかのタイプのキーをエンコードするため、それらを区別するためにエンコードされたデータの前に1バイトの「タイプ接頭辞」(「バージョン接頭辞」とも呼ばれます)を付けます。タイプ接頭辞によりアドレスは通常、base58形式の異なる文字で始まります。
次の図は、キーとアドレスの関係を示しています
公開鍵からXRP Ledgerアドレスを計算する式は次の通りです。完全なサンプルコードついては、encode_address.js
をご覧ください。パスフレーズまたはシード値から公開鍵を導出するプロセスについては、鍵の導出をご覧ください。
次の必須アルゴリズムをインポートします。SHA-256、RIPEMD160、base58。base58のディクショナリを設定します。
'use strict'; const assert = require('assert'); const crypto = require('crypto'); const R_B58_DICT = 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'; const base58 = require('base-x')(R_B58_DICT); assert(crypto.getHashes().includes('sha256')); assert(crypto.getHashes().includes('ripemd160'));
33バイトのECDSA secp256k1公開鍵、または32バイトのEd25519公開鍵で始めます。Ed25519キーの場合は、キーの前にバイト文字
0xED
を付与します。const pubkey_hex = 'ED9434799226374926EDA3B54B1B461B4ABF7237962EAE18528FEA67595397FA32'; const pubkey = Buffer.from(pubkey_hex, 'hex'); assert(pubkey.length == 33);
公開鍵のSHA-256ハッシュのRIPEMD160ハッシュを計算します。この値は「Account ID」です。
const pubkey_inner_hash = crypto.createHash('sha256').update(pubkey); const pubkey_outer_hash = crypto.createHash('ripemd160'); pubkey_outer_hash.update(pubkey_inner_hash.digest()); const account_id = pubkey_outer_hash.digest();
アカウントIDのSHA-256ハッシュのSHA-256ハッシュを計算します。最初の4バイトを使用します。この値が「チェックサム」です。
const address_type_prefix = Buffer.from([0x00]); const payload = Buffer.concat([address_type_prefix, account_id]); const chksum_hash1 = crypto.createHash('sha256').update(payload).digest(); const chksum_hash2 = crypto.createHash('sha256').update(chksum_hash1).digest(); const checksum = chksum_hash2.slice(0,4);
ペイロードとチェックサムを連結します。連結バッファーのbase58値を計算します。この結果が、アドレスになります。
const dataToEncode = Buffer.concat([payload, checksum]); const address = base58.encode(dataToEncode); console.log(address); // rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN