# 基本的なデータ型 さまざまなタイプのオブジェクトがそれぞれ異なる方法で一意に識別されます。 [アカウント](/ja/docs/concepts/accounts)は`"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59"`のような[アドレス](#%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9)で一意に識別されます。アドレスは常に「r」で始まります。`rippled`メソッドの多くは、16進数表記に対応しています。 [トランザクション](/ja/docs/references/protocol/transactions)は、トランザクションのバイナリフォーマットの[ハッシュ](#%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5)で識別されます。また、トランザクションは送信アカウントと[シーケンス番号](#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9)でも識別できます。 閉鎖された各[レジャー](/ja/docs/references/protocol/ledger-data)は、[レジャーインデックス](#%E3%83%AC%E3%82%B8%E3%83%A3%E3%83%BC%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9)と[ハッシュ](#%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5)値を保有します。[レジャーを指定する](#%E3%83%AC%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%AE%E6%8C%87%E5%AE%9A)場合、いずれか1つを使用できます。 ## アドレス XRP Ledgerのアカウントは、XRP Ledgerの[base58](/ja/docs/references/protocol/data-types/base58-encodings)フォーマットのアドレスで識別されます。このアドレスはアカウントのマスター[公開鍵](https://en.wikipedia.org/wiki/Public-key_cryptography)から生成され、マスター公開鍵は秘密鍵から生成されます。アドレスはJSON文字列で記述され、以下の特徴があります。 * 長さは25から35文字 * 文字`r`から始まる * 数字"`0`"、大文字"`O`"、大文字"`I`"、小文字"`l`"を除く英数字 * 大文字と小文字を区別 * 4バイトのチェックサムが含まれており、ランダムな文字から有効なアドレスが生成される確率はおよそ232分の1 注記 [宛先タグ](/ja/docs/concepts/transactions/source-and-destination-tags)をアドレスに「組み込む」**X**アドレス形式もあります。これらのアドレスは`X`(メインネット用)または`T`([テストネットワーク](/ja/docs/concepts/networks-and-servers/parallel-networks)用)で始まります。取引所とウォレットは、顧客が知る必要のあるすべてのデータを1つの値で表すためにXアドレスを使用できます。詳細については、[Xアドレスフォーマットサイト](https://xrpaddress.info/)と[コーデック](https://github.com/xrp-community/xrpl-tagged-address-codec)をご覧ください XRP Ledgerプロトコルは「クラシック」アドレスのみをネイティブにサポートしていますが、多くの[クライアントライブラリ](/ja/docs/references/client-libraries)はXアドレスもサポートしています。 ## ハッシュ XRP Ledger内の多くのオブジェクト、特にトランザクションとレジャーは、256ビットのハッシュ値で一意に識別されます。通常、この値は「SHA-512ハーフ」として算出されます。SHA-512ハーフは、あるコンテンツから[SHA-512](http://dx.doi.org/10.6028/NIST.FIPS.180-4)ハッシュを計算し、出力の前半を取得したものです。(これは256ビット、つまり32バイトで、16進数表記では64文字です。)オブジェクトのハッシュは、極めて競合の発生しにくい方法でコンテンツから生成されるため、2つのオブジェクトが同じハッシュを持つ場合、それらのオブジェクトは同じものと見なされます。 XRP Ledgerのハッシュ値には、以下の特徴があります。 * 長さは64文字ちょうどです * [16進数](https://en.wikipedia.org/wiki/Hexadecimal)の文字セット: 0-9およびA-Fです。 * 通常は大文字で記述されます。 SHA-512ハーフは、公式に定義されている *SHA-512/256* ハッシュ関数とほぼ同等のセキュリティーを持ちます。しかし、XRP LedgerはSHA-512/256より前から利用されているため、既存のSHA-512関数上に実装することも容易にできます。(この記事の時点で、暗号ライブラリーでのSHA-512のサポートはSHA-512/256よりはるかに一般的です。) ### ハッシュプレフィクス [[ソース]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/HashPrefix.h) 多くの場合、XRP Ledgerではオブジェクトのバイナリデータに4バイトのプレフィクスを付けてからハッシュを計算するため、異なるタイプのオブジェクトが同じバイナリフォーマットである場合でも、異なるハッシュが設定されます。既存の4バイトコードは、ASCIIでエンコードされた英字3文字の後に0バイトが続く構成となっています。 ある種のハッシュは、APIのリクエストとレスポンスに使用されます。またある種のデータに署名するときの最初のステップで計算されるだけのものや、より高度なハッシュを計算するためのものもあります。XRP Ledgerで使用されるすべての4バイトのハッシュプレフィクスは以下の表の通りです。 | オブジェクトタイプ | APIフィールド | ハッシュプレフィクス(16進数) | ハッシュプレフィクス(テキスト) | | --- | --- | --- | --- | | コンセンサスの提案 | なし | `0x50525000` | `PRP\0` | | レジャーバージョン | `ledger_hash` | `0x4C575200` | `LWR\0` | | レジャー状態データ | `account_state` ([レジャーヘッダー](/ja/docs/references/protocol/ledger-data/ledger-header)内) | `0x4D4C4E00` | `MLN\0` | | レジャーデータ内部ノード | なし | `0x4D494E00` | `MIN\0` | | レジャーデータ内部ノード([SHAMapv2](/resources/known-amendments#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](/ja/docs/references/protocol/ledger-data/common-fields)も似た方法で計算されますが、ここで説明したプレフィクスの代わりに「スペースキー」という2バイトのプレフィクスを使用します。 ## アカウントシーケンス シーケンス番号とは、32ビットの符号なし整数であり、指定された送金元からのトランザクションが正しい順序で1回だけ実行されるようにするために使用されます。 すべての[XRP Ledgerアカウント](/ja/docs/concepts/accounts)には、`Sequence`フィールドに1つのシーケンス番号があり、アカウントがトランザクションを送信し、そのトランザクションが[検証済みレジャー](/ja/docs/concepts/ledgers)に記録されるたびに、1ずつ増加します。シーケンス番号は各[トランザクション](/ja/docs/concepts/transactions)の`Sequence`フィールドにもあり、そのトランザクションが実行される際にアカウントの現在のシーケンス番号と一致している必要があります。各アカウントで、各シーケンス番号は番号順に一度だけ使用できます。 [チケット](/ja/docs/concepts/accounts/tickets) は、通常の順序とは異なるトランザクションを送信できるように、これらのルールにいくつかの例外を設けています。チケットは、後で使用するために予約されたシーケンス番号を表します。トランザクションは、通常のシーケンス番号の代わりにチケットを使用することができます。 [DeletableAccounts Amendment](/resources/known-amendments#deletableaccounts) を適用する場合、アカウントの`Sequence`番号の始まりが、アカウントが作成されたレジャーバージョンの[レジャーインデックス][]と一致します。DeletableAccountsを適用しない場合、どのアカウントの`Sequence`番号も1で始まります。 トランザクションがレジャーに記録されると、トランザクションの実行が成功したか[`tec`クラスのエラーコード](/ja/docs/references/protocol/transactions/transaction-results/tec-codes)で失敗したかを問わず、シーケンス番号が1つ消費されます。トランザクションのその他の失敗についてはレジャーに記録されないため、送金元のシーケンス番号は変更されません(その他の影響もありません)。 レジャー内では、[アドレス][]とシーケンス番号を一緒に使用して、その送金元とシーケンス番号を持つ検証済みトランザクションによって作成されたオブジェクトが識別されることがあります。この方法で識別されたオブジェクトの例として、[Escrow](/ja/docs/concepts/payment-types/escrow)と[オファー](/ja/docs/concepts/tokens/decentralized-exchange/offers)が挙げられます。 複数の未確定のトランザクションが、同じ送金元と同じシーケンス番号を持つことが可能です。そのようなトランザクションは互いに排他的であり、検証済みレジャーに記録されるのはいずれか一方のみです。(それ以外は最終的に影響ありません。) ## レジャーインデックス レジャーインデックスは、32ビットの符号なし整数であり、レジャーを識別するために使用します。レジャーインデックスは、レジャーの *シーケンス番号* と呼ばれることもあります。([アカウントシーケンス](/ja/docs/references/protocol/data-types/basic-data-types#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9)とは異なります。)一番最初のレジャーでは、レジャーインデックスは1でした。新しいレジャーのレジャーインデックスは、その直前のレジャーのレジャーインデックスに1を加算した値になります。 レジャーインデックスがレジャーの順番を示すのに対し、[ハッシュ][]値はレジャーの正確なコンテンツを示します。2つのレジャーが同じハッシュ値を持つ場合、それらは必ず同じものです。検証済みレジャーでは、ハッシュ値とレジャーインデックスは等しく有効で、1:1の関係です。しかし、進行中のレジャーに対しては、以下の理由によりその限りでありません。 * ネットワーク全体でのトランザクションの伝搬遅延が原因で、2つの異なる`rippled`サーバで、同じレジャーインデックスを持つ現行レジャーに対するコンテンツが異なる場合があります。 * 決済済みレジャーバージョンが複数あり、コンセンサスによる検証が競合している場合があります。このようなレジャーバージョンでは、レジャーインデックスは同じですが、コンテンツは異なります(ハッシュも異なります)。これらの決済済みレジャーのうち、検証済みになるのは1つだけです。 * 現行のオープンレジャーのハッシュは計算されません。これは、現行レジャーのレジャーインデックスは同じままであっても、コンテンツは時間とともに変化し、ハッシュが変わる可能性があるためです。レジャーのハッシュは、レジャーが閉鎖されるときにのみ計算されます。 ### レジャーの指定 APIメソッドの多くは、レジャーのインスタンスを指定する必要があります。その場合、共有されたレジャーの特定バージョンで最新と見なされるデータで指定する必要があります。レジャーバージョンを受け入れるコマンドは、すべて同様に機能します。使用するレジャーを指定するには、以下の3つの方法があります。 1. `ledger_index`パラメータにレジャーの[レジャーインデックス](#%E3%83%AC%E3%82%B8%E3%83%A3%E3%83%BC%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9)を指定します。閉鎖された各レジャーには識別用のレジャーインデックスが付いていて、その前に検証されたレジャーより1つ大きい番号になります。(最初のレジャーのインデックスは1です。) ``` "ledger_index": 61546724 ``` 2. `ledger_hash`パラメータにレジャーの[ハッシュ](#%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5)値を指定します。 ``` "ledger_hash": "8BB204CE37CFA7A021A16B5F6143400831C4D1779E6FE538D9AC561ABBF4A929" ``` 3. `ledger_index`パラメータに以下のいずれかのショートカットを指定します。 * `validated`: [コンセンサスで検証](/ja/docs/concepts/consensus-protocol/consensus-structure#%E6%A4%9C%E8%A8%BC)された最新のレジャー ``` "ledger_index": "validated" ``` * `closed`: 変更できないように閉鎖され、検証を提案されている最新のレジャー * `current`: サーバで現在処理中のレジャーバージョン 上記3つのフォーマットすべてを受け入れる、廃止予定の`ledger`パラメーターもあります。このパラメーターは使用*しないでください*。今後予告なしに廃止される可能性があります。 レジャーを指定しない場合、デフォルトで`current`(処理中)レジャーが選択されます。レジャーを指定しなかった場合、サーバはリクエストにどのレジャーを使うかを決めます。デフォルトでは、サーバは`current`(進行中)のレジャーを選択します。[レポートモード](/ja/docs/concepts/networks-and-servers/rippled-server-modes#%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%83%A2%E3%83%BC%E3%83%89)では、サーバは最新の検証済みレジャーを使います。レジャーを指定するフィールドは複数指定しないでください。 レジャーを指定する際に上記のデフォルトの動作に頼らないでください。変更される場合があります。可能であれば、常にリクエストでレジャーバージョンを指定してください。 レポートモードでは、検証済みとなるまでレジャーデータは記録されません。レポートモードサーバに`current`または`closed`のレジャーをリクエストすると、サーバはそのリクエストを P2Pモードサーバに転送します。検証されていないレジャー番号またはハッシュをリクエストした場合、レポートモードのサーバは`lgrNotFound`エラーを返します。 ### 通貨額の指定 XRP LedgerにはXRPとトークンの2種類の通貨があります。これら2種類の通貨は、異なるフォーマット、異なる精度と丸め動作で指定されます。 [Paymentトランザクション](/ja/docs/references/protocol/transactions/types/payment)で送金する`Amount`のようないくつかのフィールドは、どちらのタイプにもすることができます。`Fee`フィールド([トランザクションコスト](/ja/docs/concepts/transactions/transaction-cost))のように、XRPのみを使用可能なフィールドもあります。 XRPは、XRPの “drop"数を含む整数の文字列として指定され、100万ドロップが1XRPに相当します。トークンは、10進数の金額、通貨コード、発行者のフィールドを持つオブジェクトとして指定されます。 - **XRP** - `Amount`フィールドに13.1 XRPを指定するには: ``` "Amount": "13100000" ``` - **トークン** - `rf1B...`が発行した13.1 FOOという値で`Amount`フィールドを指定するには: ``` "Amount": { "value": "13.1", "currency": "FOO", "issuer": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn" } ``` 詳しくは[通貨フォーマット](/ja/docs/references/protocol/data-types/currency-formats)をご覧ください。 ## 時間の指定 `rippled`サーバとそのAPIでは、時間を符号なし整数で表します。この数値は、「Rippleエポック」である2000年1月1日(00:00 UTC)から経過した秒数を表しています。これは[UNIXエポック](http://en.wikipedia.org/wiki/Unix_time)と同様に機能しますが、RippleエポックはUNIXエポックより946684800秒遅れています。 Rippleエポック時間を32ビット変数でUNIXエポック時間に変換しないでください。整数のオーバーフローが発生する恐れがあります。