基本的なデータ型

さまざまなタイプのオブジェクトがそれぞれ異なる方法で一意に識別されます。

アカウントアドレスで識別されます。例えば、"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59"など。アドレスは常に「r」で始まります。rippledメソッドの多くは、16進数表記に対応しています。

トランザクションは、トランザクションのバイナリフォーマットのハッシュで識別されます。また、トランザクションは送信アカウントとシーケンス番号でも識別できます。

閉鎖された各レジャーは、レジャーインデックスハッシュ値を保有します。レジャーを指定する場合、いずれか1つを使用できます。

アドレス

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内の多くのオブジェクト、特にトランザクションとレジャーは、256ビットのハッシュ値で一意に識別されます。通常、この値は「SHA-512ハーフ」として算出されます。SHA-512ハーフは、あるコンテンツからSHA-512 ハッシュを計算し、出力の前半を取得したものです。(これは256ビット、つまり32バイトで、16進数表記では64文字です。)オブジェクトのハッシュは、極めて競合の発生しにくい方法でコンテンツから生成されるため、2つのオブジェクトが同じハッシュを持つ場合、それらのオブジェクトは同じものと見なされます。

XRP Ledgerのハッシュ値には、以下の特徴があります。

  • 長さは64文字ちょうどです
  • 16進数 の文字セット: 0-9およびA-Fです。
  • 通常は大文字で記述されます。

注記: SHA-512ハーフは、公式に定義されている SHA-512/256 ハッシュ関数とほぼ同等のセキュリティーを持ちます。しかし、XRP LedgerはSHA-512/256より前から利用されているため、既存のSHA-512関数上に実装することも容易にできます。(この記事の時点で、暗号ライブラリーでのSHA-512のサポートはSHA-512/256よりはるかに一般的です。)

ハッシュプレフィクス

[ソース]

多くの場合、XRP Ledgerではオブジェクトのバイナリデータに4バイトのプレフィクスを付けてからハッシュを計算するため、異なるタイプのオブジェクトが同じバイナリフォーマットである場合でも、異なるハッシュが設定されます。既存の4バイトコードは、ASCIIでエンコードされた英字3文字の後に0バイトが続く構成となっています。

ある種のハッシュは、APIの要求と応答に使用されます。またある種のデータに署名するときの最初のステップで計算されるだけのものや、より高度なハッシュを計算するためのものもあります。XRP Ledgerで使用されるすべての4バイトのハッシュプレフィクスは以下の表の通りです。

オブジェクトタイプ APIフィールド ハッシュプレフィクス(16進数) ハッシュプレフィクス(テキスト)
コンセンサスの提案 なし 0x50525000 PRP\0
レジャーバージョン ledger_hash 0x4C575200 LWR\0
レジャー状態データ account_stateレジャーヘッダー内) 0x4D4C4E00 MLN\0
レジャーデータ内部ノード なし 0x4D494E00 MIN\0
レジャーデータ内部ノード(SHAMapv2 なし 0x494E5200 INR\0
Payment Channelのクレーム なし 0x434C4D00 CLM\0
署名済みのトランザクション トランザクションのhash 0x54584E00 TXN\0
メタデータを持つトランザクション なし 0x534E4400 SND\0
未署名のトランザクション(シングル署名) なし 0x53545800 STX\0
未署名のトランザクション(マルチ署名) なし 0x534D5400 SMT\0
検証の投票 なし 0x56414C00 VAL\0
バリデータサブキー認証(「バリデータマニフェスト」) なし 0x4D414E00 MAN\0

レジャーオブジェクトIDも似た方法で計算されますが、ここで説明したプレフィクスの代わりに「スペースキー」という2バイトのプレフィクスを使用します。

アカウントシーケンス

シーケンス番号とは、32ビットの符号なし整数であり、指定された送金元からのトランザクションが正しい順序で1回だけ実行されるようにするために使用されます。

すべてのXRP Ledgerアカウントには、Sequenceフィールドに1つのシーケンス番号があり、アカウントがトランザクションを送信し、そのトランザクションが検証済みレジャーに記録されるたびに、1ずつ増加します。シーケンス番号は各トランザクションSequenceフィールドにもあり、そのトランザクションが実行される際にアカウントの現在のシーケンス番号と一致している必要があります。各アカウントで、各シーケンス番号は番号順に一度だけ使用できます。

DeletableAccounts Amendment を適用する場合、アカウントのSequence番号の始まりが、アカウントが作成されたレジャーバージョンのレジャーインデックスと一致します。DeletableAccountsを適用しない場合、どのアカウントのSequence番号も1で始まります。

トランザクションがレジャーに記録されると、トランザクションの実行が成功したかtecクラスのエラーコードで失敗したかを問わず、シーケンス番号が1つ消費されます。トランザクションのその他の失敗についてはレジャーに記録されないため、送金元のシーケンス番号は変更されません(その他の影響もありません)。

レジャー内では、アドレスとシーケンス番号を一緒に使用して、その送金元とシーケンス番号を持つ検証済みトランザクションによって作成されたオブジェクトが識別されることがあります。この方法で識別されたオブジェクトの例として、Escrowオファーが挙げられます。

複数の未確定のトランザクションが、同じ送金元と同じシーケンス番号を持つことが可能です。そのようなトランザクションは互いに排他的であり、検証済みレジャーに記録されるのはいずれか一方のみです。(それ以外は最終的に影響ありません。)

レジャーインデックス

レジャーインデックスは、32ビットの符号なし整数であり、レジャーを識別するために使用します。レジャーインデックスは、レジャーの シーケンス番号 と呼ばれることもあります。(アカウントシーケンスとは異なります。)一番最初のレジャーでは、レジャーインデックスは1でした。新しいレジャーのレジャーインデックスは、その直前のレジャーのレジャーインデックスに1を加算した値になります。

レジャーインデックスがレジャーの順番を示すのに対し、ハッシュ値はレジャーの正確なコンテンツを示します。2つのレジャーが同じハッシュ値を持つ場合、それらは必ず同じものです。検証済みレジャーでは、ハッシュ値とレジャーインデックスは等しく有効で、1:1の関係です。しかし、進行中のレジャーに対しては、以下の理由によりその限りでありません。

  • ネットワーク全体でのトランザクションの伝搬遅延が原因で、2つの異なるrippledサーバーで、同じレジャーインデックスを持つ現行レジャーに対するコンテンツが異なる場合があります。
  • 決済済みレジャーバージョンが複数あり、コンセンサスによる検証が競合している場合があります。このようなレジャーバージョンでは、レジャーインデックスは同じですが、コンテンツは異なります(ハッシュも異なります)。これらの決済済みレジャーのうち、検証済みになるのは1つだけです。
  • 現行のオープンレジャーのハッシュは計算されません。これは、現行レジャーのレジャーインデックスは同じままであっても、コンテンツは時間とともに変化し、ハッシュが変わる可能性があるためです。レジャーのハッシュは、レジャーが閉鎖されるときにのみ計算されます。

レジャーの指定

APIメソッドの多くは、レジャーのインスタンスを指定する必要があります。その場合、共有されたレジャーの特定バージョンで最新と見なされるデータで指定する必要があります。レジャーバージョンを受け入れるコマンドは、すべて同様に機能します。使用するレジャーを指定するには、以下の3つの方法があります。

  1. ledger_indexパラメーターにレジャーのレジャーインデックスを指定します。閉鎖された各レジャーには識別用のレジャーインデックスが付いていて、その前に検証されたレジャーより1つ大きい番号になります。(最初のレジャーのインデックスは1です。)
  2. ledger_hashパラメーターにレジャーのハッシュ値を指定します。
  3. ledger_indexパラメーターに以下のいずれかのショートカットを指定します。
    • validated: ネットワーク全体で検証された最新のレジャー
    • closed: 変更できないように閉鎖され、検証を提案されている最新のレジャー
    • current: サーバーで現在処理中のレジャーバージョン

上記3つのフォーマットすべてを受け入れる、廃止予定のledgerパラメーターもあります。このパラメーターは使用しないでください。今後予告なしに廃止される可能性があります。

レジャーを指定しない場合、デフォルトでcurrent(処理中)レジャーが選択されます。レジャーを指定するフィールドを複数指定した場合、廃止予定のledgerフィールドが最初に使用され(存在する場合)、ledger_hashに戻ります。ledger_indexフィールドは、他の2つのフィールドがいずれも存在しない場合を除いて無視されます。

注記: レジャーを指定する際に上記のデフォルトの動作に頼らないでください。変更される場合があります。可能であれば、常に要求にてレジャーバージョンを指定してください。

通貨

XRP Ledgerには2種類の通貨があります。XRPとその他のあらゆる通貨です。この2つには多くの相違点があります。

XRP 発行済み通貨
発行者なし 必ずXRP Ledgerアカウントが発行
文字列として指定 オブジェクトとして指定
アカウント内で追跡 トラストライン内で追跡
作成は一切不可、消却のみ可能 自由に発行または清算可能
最大値: 1000000000001e11 最大値: 9999999999999999e80
「drop」(0.000001 XRP)に近い精度 10進15桁の精度で非ゼロの最少絶対値は 1000000000000000e-96

注意: XRP Ledgerでは、通常の浮動小数点数とは異なる精度の小数点計算を使用するため、通貨額は常に文字列として表されます。

通貨額の指定

一部のAPIメソッドでは、通貨額を指定する必要があります。取扱通貨がネットワーク固有のXRP通貨であるかその他の通貨単位(イシュアンス)であるかによって、指定方法が大きく異なります。

XRP

XRPの額は文字列で表します。(XRPの精度は64ビット整数と同等ですが、JSON 整数は32ビットに制限されるため、JSON整数で表す場合はXRPがオーバーフローする恐れがあります。)XRPは正式には「drop」で指定します。これは0.000001(百万分の1)のXRPと等価です。したがって、JSON文書で1.0 XRPを表示するには、次のように書きます。

"1000000"

XRPをオブジェクトに指定しないでください。

単体テストでは、XRPの値(dropではありません)を小数点を使用して指定できます。例えば、「1.23」は1.23 XRPを意味します。それ以外のすべての場合では、XRPは常にdrop単位で指定し、小数点は使用しません。例えば、「1230000」は1.23 XRPを意味します。

非XRP

XRP以外の通貨(法定通貨としてのドル、貴金属、暗号資産、その他のカスタム通貨を含む)を指定する場合、通貨指定オブジェクトを使用して指定する必要があります。以下は、3つのフィールドを持つJSONオブジェクトです。

Field 説明
currency 文字列 - 通貨コード 通貨を発行するための任意コード。XRPは使用できません。
value 文字列 通貨の金額を表す引用符付き10進数表記。これには科学的記数法が含まれ、例えば1.23e11は123,000,000,000を意味します。eEのどちらも使用できます。
issuer 文字列 通貨を発行する組織の一意のアカウントアドレス。つまり、通貨を清算できる個人または企業です。

注意: これらのフィールド名は大文字小文字の区別があります。

例えば、アカウントr9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59によって発行された$153.75 USドルは、以下のように指定します。

{
    "currency": "USD",
    "value": "153.75",
    "issuer": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59"
}

単体テストでは、非XRP通貨の金額値をスラッシュで区切られた文字列で指定できます。例えば、"amount/currency/issuer"のフォーマットになります。その他すべての場合では、前述のJSONオブジェクトのフォーマットを使用する必要があります。

金額なしでの通貨の指定

XRP以外の通貨を金額なしで指定する場合は(主に、通貨取引オファーのオーダーブックを定義する場合など)、上記のように指定しますが、valueフィールドは省略します。

XRPを金額なしで指定する場合は(主に、オーダーブックを定義する場合など)、JSONオブジェクトとして指定しますが、使用するフィールドはcurrencyフィールド のみ です。XRPの場合はissuerフィールドを指定してはいけません。

最後に、支払いの受取人アカウントが複数のイシュアー(通貨発行者)を信頼している場合は、受取人が受け入れているイシュアーがどのように組み合わされても支払いが行われるように指定できます。これを行うには、受取人アカウントのアドレスをJSONオブジェクトにissuer値として指定します。

通貨コード

XRP Ledgerには、以下の2種類の通貨コードがあります。

  • 3文字の通貨コード。ISO 4217の通貨コード をすべて大文字で使用することをお勧めします。しかし、次の文字の組み合わせであれば、いずれも許可されます。すなわち、すべての大文字と小文字、数字、記号(?!@#$%^&*<>(){}[])、および|です。通貨コードXRP(すべて大文字)はXRP用に予約されているため、発行済み通貨には使用できません。
  • 160ビットの16進値。例えば0158415500000000C1F76FF6ECB0BAC600000000など、XRP Ledgerの内部通貨フォーマットに準じたものです。この表記は一般的ではありません。

時間の指定

rippledサーバーとそのAPIでは、時間を符号なし整数で表します。この数値は、「Rippleエポック」である2000年1月1日(00:00 UTC)から経過した秒数を表しています。これはUNIXエポック と同様に機能しますが、RippleエポックはUNIXエポックより946684800秒遅れています。

Rippleエポック時間を32ビット変数でUNIXエポック時間に変換しないでください。整数のオーバーフローが発生する恐れがあります。