アカウント
XRP Ledgerの「アカウント」は、XRPの所有者とトランザクションの送信者を表します。アカウントの主な要素は次のとおりです。
- 識別用のアドレス。例えば、
rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn
注記: XRPコミュニティは、取引所およびウォレットで宛先タグ の代わりに使用できる新しいフォーマット、Xアドレスを提案 (これをサポートするコーデック も開発)しました。これらの「パック化」したアドレスは、r
ではなくX
で開始します。詳細は、XRPL 𝗫-address format のサイトを参照してください。
- XRPの残高。このXRPの一部は、準備金用に確保されています。
- シーケンス番号。このアカウントから送信されるトランザクションがすべて、正しい順序で、それぞれ1回のみ適用されるようにします。トランザクションを実行するには、トランザクションのシーケンス番号と送金元のシーケンス番号が一致する必要があります。その後も、トランザクションが適用されている限り、アカウントのシーケンス番号は1ずつ増加します。(関連項目: 基本的なデータタイプ: アカウントシーケンス)
- このアカウントと残高に影響を及ぼした取引の履歴。
- トランザクションの承認方法。以下に例を示します。
- アカウント固有のマスターキーのペア。(無効にできますが、変更はできません。)
- ローテーションで使用できる「レギュラー」キーペア。
- マルチ署名の署名者のリスト。(アカウントのコアデータとは別に保存されます。)
アカウントのコアデータは、レジャーのデータツリーのAccountRootレジャーのオブジェクトタイプに保存されます。アカウントは、他の複数のタイプのデータの所有者(または部分的な所有者)になることもできます。
ヒント: XRP Ledgerの「アカウント」は、財務上の用途(例:「銀行口座」)やコンピューター上の用途(例:「UNIXアカウント」)で使用されます。XRP以外の通貨および資産はXRP Ledgerアカウント自体には保存されません。そのような資産はそれぞれ、両当事者を結ぶ「トラストライン」と呼ばれる会計関係に保存されます。
アカウントの作成
「アカウント作成」専用のトランザクションはありません。Paymentトランザクション でまだアカウントを所有していない数学的に有効なアドレスにアカウントの準備金以上のXRPが送信されると、Paymentトランザクションで自動的に新しいアカウントが作成されます。これはアカウントの 資金提供 と呼ばれ、レジャーにAccountRootオブジェクトが作成されます。それ以外のトランザクションでアカウントを作成することはできません。
注意: アカウントを資金提供することによって、そのアカウントに対して特別な権限を持つことにはなりません。アカウントのアドレスに対応するシークレットキーを持っている人なら誰でも、アカウントとそれに含まれるすべてのXRPの完全制御権を持っています。一部のアドレスでは、誰もシークレットキーを持っていない場合があります。その場合、アカウントはブラックホールになり、XRPは永久に失われます。
XRP Ledgerでアカウントを取得する一般的な方法は次のとおりです。
-
ランダム性の強いソースからキーペアを生成し、そのキーペアのアドレスを計算します。(例えば、wallet_proposeメソッドを使用して計算することができます。)
-
XRP Ledgerにアカウントをすでに持っているユーザーに、生成したアドレスにXRPを送信してもらいます。
-
例えば、一般の取引所でXRPを購入し、その取引所から、指定したアドレスにXRPを引き出すことができます。
注意: 自身のXRP Ledgerアドレスで初めてXRPを受け取る場合はアカウントの準備金(現在は20 XRP)を支払う必要があります。この金額のXRPは無期限に使用できなくなります。一方で、一般の取引所では通常、顧客のXRPはすべて、共有されたいくつかのXRP Ledgerアカウントに保有されているため、顧客はその取引所で個々のアカウントの準備金を支払う必要はありません。引き出す前に、XRP Ledgerに直接アカウントを保有することが、金額に見合う価値があるかどうかを検討してください。
アドレス
XRP Ledgerのアカウントは、XRP Ledgerのbase58フォーマットのアドレスで識別されます。このアドレスはアカウントのマスター公開鍵 から生成され、マスター公開鍵は秘密鍵から生成されます。アドレスはJSON文字列で記述され、以下の特徴があります。
- 長さは25から35文字です
- 文字
r
で始まります
注記: XRPコミュニティは、取引所およびウォレットで宛先タグ の代わりに使用できる新しいフォーマット、Xアドレスを提案 (これをサポートするコーデック も開発)しました。これらの「パック化」したアドレスは、r
ではなくX
で開始します。詳細は、XRPL 𝗫-address format のサイトを参照してください。
- 英数字を使用します(数字「
0
」、大文字「O
」、大文字「I
」、小文字「l
」を除く) - 大/小文字を区別します
- 4バイトのチェックサムを含むため、ランダムな文字から有効なアドレスが生成される確率はおよそ2^32分の1となります
詳しくは、アカウントとbase58エンコードを参照してください。
有効なアドレスに資金供給することで、そのアドレスをXRP Ledgerのアカウントにすることができます。レギュラーキーまたは署名者リストのメンバーを表すために資金供給されていないアドレスを使用することもできます。資金供給されたアカウントのみがトランザクションの送信者になることができます。
キーペアを始め、有効なアドレスの作成は、厳密な数学的演算です。キーペアの生成と、そのアドレスの計算は完全にオフラインで行うことができます。XRP Ledgerやその他の関係者と通信する必要はありません。公開鍵からアドレスへの変換には一方向のハッシュ関数が含まれるため、公開鍵がアドレスと一致することは確認できますが、アドレスのみから公開鍵を導出することはできません。(このことが、署名付きのトランザクションに送信者の公開鍵 と アドレスが含まれる理由の1つとなっています。)
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名予約のブラックホール | 以前は、Rippleでは、このアカウントにXRPを送信してRipple名を予約するようユーザーに求めていました。 | はい |
rrrrrrrrrrrrrrrrrrrn5RM1rHd | NaNアドレス | 以前のバージョンのripple-lib では、XRP Ledgerのbase58文字列エンコード形式を使用して、値NaN をエンコードするときにこのアドレスを生成しました。 | はい |
アカウントの削除
DeletableAccounts amendment(有効2020-05-08)では、アカウントの削除は可能になりました。
削除するには、アカウントが次の要件を満たしている必要があります。
- アカウントの
Sequence
番号に256を加えた値が、現在のレジャーインデックス未満であること。 - アカウントが次のタイプのレジャーオブジェクトのいずれにも(送金元または受取人として)関連付けられていないこと。
Escrow
PayChannel
RippleState
Check
- アカウントがレジャー内に所有するオブジェクトが1000個未満であること。
- AccountDeleteトランザクションでは、少なくとも1アイテムの所有者準備金(現在5 XRP)に相当する特別なトランザクションコストを支払う必要があります。
アカウントは、削除した後、通常のアカウント作成方法でレジャーに再作成できます。削除後に再作成されたアカウントと、初めて作成されたアカウントに違いはありません。
Bitcoinやその他の多くの暗号資産とは異なり、新バージョンのXRP Ledgerの公開レジャーチェーンにはそれぞれレジャーの全状態が含まれており、新規アカウントが増えるごとにサイズが大きくなります。そのため、XRP Ledgerの新規アカウントは必要な場合以外は作成しないでください。アカウントを削除することで、アカウントの準備金である20 XRPの一部を復元できますが、そのためには少なくとも5 XRPを消却する必要があります。
多くのユーザーに代わって価値を送受信する金融機関などは、XRP Ledgerでは1つ(または少数)のアカウントのみを使用し、顧客との間の個別の決済を区別するためにソースタグと宛先タグを使用できます。
トランザクション履歴
XRP Ledgerでは、トランザクション(取引)履歴をトランザクションの「スレッド」によって追跡することができます。これはトランザクションの識別用のハッシュとレジャーインデックスにリンクされています。AccountRoot
レジャーオブジェクトには、それを最後に修正したトランザクションの識別用のハッシュとレジャーが含まれます。そのトランザクションのメタデータには、AccountRoot
ノードの前の状態が含まれているため、この方法で1つのアカウントの履歴を繰り返すことができます。このトランザクション履歴には、AccountRoot
ノードを直接変更するトランザクションが含まれます。以下に例を示します。
- アカウントによって送信されるトランザクション。アカウントの
Sequence
番号が変更されるため。このようなトランザクションでは、トランザクションコストによりアカウントのXRP残高も変更されます。 - アカウントのXRP残高を変更したトランザクション。例えば、着信するPaymentトランザクションや他のタイプの取引(例:PaymentChannelClaimやEscrowFinish)。
アカウントの 概念的な トランザクション履歴には、アカウントの所有オブジェクトとXRP以外の残高を変更したトランザクションも含まれます。これらのオブジェクトは別個のレジャーオブジェクトであり、それぞれに影響を及ぼした独自のトランザクションスレッドが含まれます。アカウントのレジャーの履歴全体がある場合は、それをたどって、その履歴によって作成または変更されたレジャーオブジェクトを見つけることができます。「完全」なトランザクション履歴には、トランザクションで所有されているオブジェクトの履歴が含まれます。例を以下に示します。
RippleState
オブジェクト(トラストライン)。アカウントに関連付けられています。DirectoryNode
オブジェクト(特にアカウントの所有オブジェクトを追跡する所有者ディレクトリ)。Offer
オブジェクト。分散型取引所でのアカウントの未処理の取引注文を表すオブジェクト。PayChannel
アカウントとの間の非同期のPayment Channelを表すオブジェクト。Escrow
時間または暗号条件によってロックされ、アカウントとの間の保留中の支払いを表すオブジェクト。SignerList
マルチ署名によってアカウントのトランザクションを承認できるアドレスのリストを表すオブジェクト。
これらの各オブジェクトの詳細は、レジャーフォーマットのリファレンスを参照してください。
アドレスのエンコード
ヒント: これらの技術的な詳細は、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