XRP Ledger Apex is back in Amsterdam

Register Now
Last updated
Edit

アドレス

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は永遠に失われます。

アドレス名称意味ブラック ホール?
rrrrrrrrrrrrrrrrrrrrrhoLvTpACCOUNT_ZERO値0をbase58形式にエンコードしたXRP Ledgerのアドレス。ピアツーピア通信では、このアドレスは、XRPの発行者としてrippledで使用されます。はい
rrrrrrrrrrrrrrrrrrrrBZbvjiACCOUNT_ONE値1をbase58形式にエンコードしたXRP Ledgerのアドレス。レジャーのRippleStateエントリでは、このアドレスは、トラストライン残高の発行者のプレースホルダーとして使用されます。はい
rHb9CJAWyB4rj91VRWn96DkukG4bwdtyThジェネシスアカウントrippledで(スタンドアロンモードなど)新しいジェネシスレジャーが一から開始される場合、このアカウントはすべてのXRPを保持します。このアドレスは、シード値masterpassphraseから生成されており、この値はハードコーディングされています。いいえ
rrrrrrrrrrrrrrrrrNAMEtxvNvQRipple Namesの登録用ブラックホール以前、Ripple社は、Ripple Namesを登録するために、このアカウントにXRPを送金するようユーザに求めていました。はい
rrrrrrrrrrrrrrrrrrrn5RM1rHdNaNアドレス以前のバージョンのripple-libでは、XRP Ledgerのbase58文字列エンコード形式を使用して、値NaNをエンコードするときにこのアドレスを生成しました。はい

アドレスのエンコード

ヒント: これらの技術的な詳細は、XRP Ledgerとの互換性を保つために低レベルのライブラリソフトウェアを構築しているユーザのみを対象としています!

[ソース]

XRP Ledgerのアドレスは、base58形式の ディクショナリ rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyzを使用してエンコードされています。XRP Ledgerはbase58でいくつかのタイプのキーをエンコードするため、それらを区別するためにエンコードされたデータの前に1バイトの「タイプ接頭辞」(「バージョン接頭辞」とも呼ばれます)を付けます。タイプ接頭辞によりアドレスは通常、base58形式の異なる文字で始まります。

次の図は、キーとアドレスの関係を示しています

+アドレスのエンコードbase58チェックサム(4バイト)タイプ接頭辞0x00(XRPL base58の 「r」)アドレスタイプ接頭辞(1バイト)AccountID (20バイト)チェックサム(4バイト)Account ID(20バイト)マスター公開鍵33バイト (secp256k1)0xED + 32バイト (Ed25519)SHA-256を2回SHA-256のRIPEMD160

公開鍵からXRP Ledgerアドレスを計算する式は次の通りです。完全なサンプルコードついては、encode_address.jsをご覧ください。パスフレーズまたはシード値から公開鍵を導出するプロセスについては、鍵の導出をご覧ください。

  1. 次の必須アルゴリズムをインポートします。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'));
    
  2. 33バイトのECDSA secp256k1公開鍵、または32バイトのEd25519公開鍵で始めます。Ed25519キーの場合は、キーの前にバイト文字0xEDを付与します。

    const pubkey_hex =
      'ED9434799226374926EDA3B54B1B461B4ABF7237962EAE18528FEA67595397FA32';
    const pubkey = Buffer.from(pubkey_hex, 'hex');
    assert(pubkey.length == 33);
    
  3. 公開鍵の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();
    
  4. アカウント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);
    
  5. ペイロードとチェックサムを連結します。連結バッファーのbase58値を計算します。この結果が、アドレスになります。

    const dataToEncode = Buffer.concat([payload, checksum]);
    const address = base58.encode(dataToEncode);
    console.log(address);
    // rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN