# パス

XRP Ledgerでは、[トークン](/ja/docs/concepts/tokens)の支払いが送金元から受取人に届くまでにたどる中間ステップの道筋をパスによって定義します。パスは、XRP Ledgerの[分散型取引所](/ja/docs/concepts/tokens/decentralized-exchange)の注文と[自動マーケットメーカー](/ja/docs/concepts/tokens/decentralized-exchange/automated-market-makers)を介して送金元と受取人を結び付けることで、[クロスカレンシー支払い](/ja/docs/concepts/payment-types/cross-currency-payments)を可能にします。また、負債を相殺するような複雑な決済もパスにより可能になります。

XRP Ledgerでは1つのPaymentトランザクションは複数のパスを使用でき、複数のソースの流動性を組み合わせて必要な額を送金することができます。そのため、トランザクションには使用可能なパスをまとめた *パスセット* が含まれます。パスセットの中のパスでは開始時と終了時には同一通貨が使用される必要があります。

XRPは任意のアドレスに直接送金できるため、[XRP間のトランザクション](/ja/docs/concepts/payment-types/direct-xrp-payments)ではパスは使用されません。

## パスのステップ

パスは、支払いの送金元と受取人を結ぶステップで構成されています。すべてのステップは次のいずれかを行います。

* 同一通貨の別のアドレスを通じたRippling
* オーダーブックとAMMでの通貨の取引


別のアドレスを通じたRipplingは、負債を移動するプロセスです。一般的なケースでは、ある当事者に対するイシュアーの債務が削減され、別の当事者に対する債務が増加します。Ripplingは、トラストラインで結ばれているすべてのアドレスの間で発生させることができます。Ripplingのその他の例については、[NoRippleフラグについて](/ja/docs/concepts/tokens/fungible-tokens/rippling)をご覧ください。

[トークンとXRPの交換](/ja/docs/concepts/tokens/decentralized-exchange)は、オーダーブックまたはAMMを介して行われます。トランザクションは、送金元と受取人の間で最も良い交換レートを提供するオーダーブックまたはAMMを見つけるために、パスのステップを使用します。パスのステップは、通貨の変換先を指定しますが、オーダーブックのOfferの状態を記録しません。トランザクションの順序は、レジャーが検証されるまで確定しないため、トランザクションが取引するOfferやAMMを確定することはできません。(ただし、各トランザクションは最終的なレジャーで最良の利用可能な交換レートを取得します。)

いずれのタイプのステップでも、中間アドレスでは取得する価値と失う価値はほぼ同等です。トラストラインから同じ通貨の別のトラストラインへ残高がripplingするか、または以前に出されたオーダーに基づいて通貨が交換されます。場合によっては、[送金手数料](/ja/docs/concepts/tokens/fungible-tokens/transfer-fees)、AMM手数料、トラストライン残高の増減、または数値の丸め方が原因で、取得する価値と失われる価値が厳密に同等ではないことがあります。

[](/assets/paths-examples.ja.861ca28e1ac80077e9121822894f9afa8ab6bcad9c308d62284f162d66092955.ac57e6ef.svg)

# 技術詳細

## Pathfinding

`rippled` APIではPathfindingに使用できるメソッドが2つあります。[ripple_path_findメソッド](/ja/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/ripple_path_find)は、1回限りのパスセットの検索を実行します。[path_findメソッド](/ja/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/path_find)（WebSocketのみ）は、レジャーが閉鎖するか、またはサーバがより適切なパスを検出するたびに、フォローアップレスポンスによって検索を拡大します。

署名時に`rippled`によりパスが自動的に入力されるようにするには、[signメソッド](/ja/docs/references/http-websocket-apis/admin-api-methods/signing-methods/sign)または[`submit`コマンド（署名と送信モード）](/ja/docs/references/http-websocket-apis/public-api-methods/transaction-methods/submit#%E7%BD%B2%E5%90%8D%E3%81%A8%E9%80%81%E4%BF%A1%E3%83%A2%E3%83%BC%E3%83%89)へのリクエストに`build_path`フィールドを指定します。ただし、トラブルを回避するために、署名前にPathfindingを個別に実行し、結果を確認することが推奨されます。

`rippled`は可能な限り低コストのパスを検出するように設計されていますが、常にこのようなパスを検出できるわけではありません。信頼できない`rippled`インスタンスが改ざんされ、利益目的でこの動作が変更される可能性もあります。パスに沿った支払いの実行にかかる実際のコストは、送信時とトランザクション実行時で異なることがあります。

パスの検出は、新しいレジャーが検証されるたびに数秒ごとに変化する非常に難しい課題であるため、`rippled`は完全に最適なパスを検出するようには設計されていません。ただし、いくつかの有効なパスを検出し、特定額の送金コストを推定することができます。

## 暗黙のステップ

規約として、パスのステップのいくつかは[Paymentトランザクションのフィールド](/ja/docs/references/protocol/transactions/types/payment)により黙示的に示されます。これらのフィールドは、`Account`（送金元）、`Destination`（受取人）、`Amount`（通貨と納入額）、`SendMax`（通貨と送金額（指定されている場合））です。暗黙のステップは次のとおりです。

* パスの1番目のステップは、トランザクションの`Account`フィールドに定義されるとおり、トランザクションの送信者であると常に黙示されます。
* トランザクションに、そのトランザクションの送信者ではない`issuer`が指定されている`SendMax`フィールドが含まれている場合、そのイシュアーはパスの2番目のパスとして黙示されます。
  * `SendMax`の`issuer`が送信側アドレス *である* 場合、パスはその送信側アドレスから始まり、そのアドレスの特定の通貨のトラストラインのいずれかを使用できます。詳細は、[SendMaxおよびAmountの特殊な値](/ja/docs/references/protocol/transactions/types/payment#sendmax%E3%81%8A%E3%82%88%E3%81%B3amount%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E7%89%B9%E6%AE%8A%E3%81%AAissuer%E3%81%AE%E5%80%A4)をご覧ください。
* トランザクションの`Amount`フィールドに、トランザクションの`Destination`とは異なる`issuer`が指定されている場合、そのイシュアーはパスの最後から2番目のステップであると黙示されます。
* 最後に、トランザクションの`Destination`フィールドに定義されるとおり、パスの最終ステップはトランザクションの受信者であることが常に黙示されます。


## デフォルトパス

明示的に指定されたパスの他に、トランザクションは *デフォルトパス* に沿って実行できます。デフォルトパスは、トランザクションの[暗黙のステップ](#%E6%9A%97%E9%BB%99%E3%81%AE%E3%82%B9%E3%83%86%E3%83%83%E3%83%97)を接続する最も簡単な方法です。

デフォルトパスは次のいずれかになります。

* トランザクションで（イシュアーに関係なく）1種類の通貨のみが使用される場合、デフォルトパスでは支払いが、関連するアドレスを通じてRipplingされると想定されます。このパスは、これらのアドレスがトラストラインで接続されている場合にのみ機能します。
  * `SendMax`が省略されているか、または`SendMax`の`issuer`が送金元の場合、デフォルトパスが機能するためには送金元`Account`から宛先`Amount`の`issuer`へのトラストラインが必要です。
  * `SendMax`と`Amount`に異なる`issuer`値が指定されており、そのいずれも送金元または受取人ではない場合、これらの2つのイシュアー間のトラストラインでRipplingが必要となるため、デフォルトパスは有用ではない可能性があります。一般にイシュアーが互いに直接信頼し合うことはお勧めしません。
* クロスカレンシー支払いの場合、デフォルトパスは支払元通貨（`SendMax`フィールドで指定）と宛先通貨（`Amount`フィールドで指定）の間でオーダーブックやAMMを使用します。


有効なすべてのデフォルトパスを次の図に示します。
[](/assets/default-paths.ja.1090cb999d584a1b002513e02c80270a38efd59e460327f0e5cdf938c9a4a88d.ac57e6ef.svg)

デフォルトパスを無効にするには[`tfNoDirectRipple`フラグ](/ja/docs/references/protocol/transactions/types/payment#payment%E3%81%AE%E3%83%95%E3%83%A9%E3%82%B0)を使用します。このケースでは、トランザクションに明示的に指定されたパスを使用してトランザクションを実行することだけが可能です。トレーダーはこのオプションを使用して裁定取引を実行できます。

## パスの仕様

パスセットは配列です。パスセットの各要素は、個々の *パス* を表す別の配列です。パスの各要素は、ステップを指定するオブジェクトです。ステップのフィールドを次に示します。

| フィールド | 値 | 説明 |
|  --- | --- | --- |
| `account` | 文字列 - アドレス | *（省略可）* 指定されている場合、このパスステップは指定されたアドレスを通じたRipplingを表します。このステップに`currency`フィールドまたは`issuer`フィールドが指定されている場合は、このフィールドを指定しないでください。 |
| `currency` | 文字列 - 通貨コード | *（省略可）* 指定されている場合、このパスステップはオーダーブックやAMMを通じた通貨の変換を表します。指定される通貨は新しい通貨を表します。このステップに`account`フィールドが指定されている場合は、このフィールドを指定しないでください。 |
| `issuer` | 文字列 - アドレス | *（省略可）* 指定されている場合、このパスステップは通貨の変換を表し、このアドレスは新しい通貨の発行者を定義します。XRP以外の`currency`のステップでこのフィールドが省略されている場合、パスの直前のステップが発行者を定義します。`currency`が省略され、このフィールドが指定されている場合、発行者が異なる同名の通貨間でオーダーブックやAMMを使用するパスステップを示します。`currency`がXRPの場合は省略する必要があります。このステップに`account`フィールドが指定されている場合は、このフィールドを指定しないでください。 |
| `type` | 整数 | **廃止予定***（省略可）* 他にどのフィールドが指定されているかを示します。 |
| `type_hex` | 文字列 | **廃止予定**: *（省略可）*`type`フィールドの16進数表現です。 |


要約すると、以下のフィールドの組み合わせが有効であり、またオプションで`type`、`type_hex`のいずれかまたは両方を指定できます。

- `account`のみ
- `currency`のみ
- `currency`と`issuer`（`currency`がXRP以外の場合）
- `issuer`のみ


パスステップで`account`、`currency`、`issuer`の各フィールドを上記以外の方法で指定することは無効です。

パスセットのバイナリシリアル化に使用される`type`フィールドは、実際には1つの整数上でビット演算により作成されます。ビットの定義は次のとおりです。

| 値（16進数） | 値（10進数） | 説明 |
|  --- | --- | --- |
| 0x01 | 1 | アドレスの変更（Rippling）:`account`フィールドが指定されています。 |
| 0x10 | 16 | 通貨の変更:`currency`フィールドが指定されています。 |
| 0x20 | 32 | イシュアーの変更:`issuer`フィールドが指定されています。 |


## 関連項目

- **コンセプト:**
  - [クロスカレンシー支払い](/ja/docs/concepts/payment-types/cross-currency-payments)
  - [分散型取引所](/ja/docs/concepts/tokens/decentralized-exchange)
  - [Partial Payments](/ja/docs/concepts/payment-types/partial-payments)
- **リファレンス:**
  - [Paymentトランザクション](/ja/docs/references/protocol/transactions/types/payment)
  - [path_findメソッド](/ja/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/path_find)（WebSocketのみ）
  - [ripple_path_findメソッド](/ja/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/ripple_path_find)