パス
XRP Ledgerでは、発行済み通貨の支払いが送金元から受取人に届くまでにたどる中間ステップの道筋をパスによって定義します。パスは、XRP Ledgerの分散型取引所のオーダーを介して送金元と受取人を結び付けることで、複数通貨間の支払いを可能にします。また、負債を相殺するような複雑な決済もパスにより可能になります。
XRP Ledgerでは1つのPaymentトランザクションは複数のパスを使用でき、複数のソースの流動性を組み合わせて必要な額を送金することができます。そのため、トランザクションには使用可能なパスをまとめた パスセット が含まれます。パスセットの中のパスでは開始時と終了時には同一通貨が使用される必要があります。
XRPは任意のアドレスに直接送金できるため、XRP間のトランザクションではパスは使用されません。
パスのステップ
パスは、支払いの送金元と受取人を結ぶステップで構成されています。すべてのステップは次のいずれかを行います。
- 同一通貨の別のアドレスを通じたRippling
- オーダーブックでの通貨の取引
別のアドレスを通じたRipplingは、負債を移動するプロセスです。一般的なケースでは、ある当事者に対するイシュアーの債務が削減され、別の当事者に対する債務が増加します。Ripplingは、トラストラインで結ばれているすべてのアドレスの間で発生させることができます。Ripplingのその他の例については、NoRippleフラグについてを参照してください。
通貨取引ステップの場合、パスステップにより変換先の通貨が指定されますが、オーダーブックにはオファーの状態は記録されません。レジャーが検証されるまではトランザクションの正規の順序は最終的ではないため、トランザクションの検証が完了するまでは、トランザクションがどのオファーをとるかは不明です。(各トランザクションは最終レジャーでの実行時に利用可能なオファーの中から最適なオファーをとるため、経験に基づいて推測することができます。)
いずれのタイプのステップでも、中間アドレスでは取得する価値と失う価値はほぼ同等です。トラストラインから同じ通貨の別のトラストラインへ残高がripplingするか、または以前に出されたオーダーに基づいて通貨が交換されます。場合によっては、送金手数料、トラストラインクオリティ、または数値の丸め方が原因で、取得する価値と失われる価値が厳密に同等ではないことがあります。
技術詳細
Pathfinding
rippled
APIではPathfindingに使用できるメソッドが2つあります。ripple_path_findメソッドは、1回限りのパスセットの検索を実行します。path_findメソッド(WebSocketのみ)は、レジャーが閉鎖するか、またはサーバーがより適切なパスを検出するたびに、フォローアップ応答によって検索を拡大します。
署名時にrippled
によりパスが自動的に入力されるようにするには、signメソッドまたはsubmit
コマンド(署名と送信モード)への要求にbuild_path
フィールドを指定します。ただし、トラブルを回避するために、署名前にPathfindingを個別に実行し、結果を確認することが推奨されます。
注意: rippled
は可能な限り低コストのパスを検出するように設計されていますが、常にこのようなパスを検出できるわけではありません。信頼できないrippled
インスタンスが改ざんされ、利益目的でこの動作が変更される可能性もあります。パスに沿った支払いの実行にかかる実際のコストは、送信時とトランザクション実行時で異なることがあります。
パスの検出は、新しいレジャーが検証されるたびに数秒ごとに変化する非常に難しい課題であるため、rippled
は完全に最適なパスを検出するようには設計されていません。ただし、いくつかの有効なパスを検出し、特定額の送金コストを推定することができます。
暗黙のステップ
規約として、パスのステップのいくつかはPaymentトランザクションのフィールドにより黙示的に示されます。これらのフィールドは、Account
(送金元)、Destination
(受取人)、Amount
(通貨と納入額)、SendMax
(通貨と送金額(指定されている場合))です。暗黙のステップは次のとおりです。
- パスの1番目のステップは、トランザクションの
Account
フィールドに定義されるとおり、トランザクションの送信者であると常に黙示されます。 - トランザクションに、そのトランザクションの送信者ではない
issuer
が指定されているSendMax
フィールドが含まれている場合、そのイシュアーはパスの2番目のパスとして黙示されます。 SendMax
のissuer
が送信側アドレス である 場合、パスはその送信側アドレスから始まり、そのアドレスの特定の通貨のトラストラインのいずれかを使用できます。詳細は、SendMaxおよびAmountの特殊な値を参照してください。- トランザクションの
Amount
フィールドに、トランザクションのDestination
とは異なるissuer
が指定されている場合、そのイシュアーはパスの最後から2番目のステップであると黙示されます。 - 最後に、トランザクションの
Destination
フィールドに定義されるとおり、パスの最終ステップはトランザクションの受信者であることが常に黙示されます。
デフォルトパス
明示的に指定されたパスの他に、トランザクションは デフォルトパス に沿って実行できます。デフォルトパスは、トランザクションの暗黙のステップを接続する最も簡単な方法です。
デフォルトパスは次のいずれかになります。
- トランザクションで(イシュアーに関係なく)1種類の通貨のみが使用される場合、デフォルトパスでは支払いが、関連するアドレスを通じてRipplingされると想定されます。このパスは、これらのアドレスがトラストラインで接続されている場合にのみ機能します。
SendMax
が省略されているか、またはSendMax
のissuer
が送金元の場合、デフォルトパスが機能するためには送金元Account
から宛先Amount
のissuer
へのトラストラインが必要です。SendMax
とAmount
に異なるissuer
値が指定されており、そのいずれも送金元または受取人ではない場合、これらの2つのイシュアー間のトラストラインでRipplingが必要となるため、デフォルトパスは有用ではない可能性があります。一般にイシュアーが互いに直接信頼し合うことはお勧めしません。- 複数通貨間のトランザクションの場合、デフォルトパスは支払元通貨(
SendMax
フィールドで指定)と宛先通貨(Amount
フィールドで指定)の間でオーダーブックを使用します。
デフォルトパスを無効にするにはtfNoDirectRipple
フラグを使用します。このケースでは、トランザクションに明示的に指定されたパスを使用してトランザクションを実行することだけが可能です。トレーダーはこのオプションを使用して裁定取引を実行できます。
パスの仕様
パスセットは配列です。パスセットの各要素は、個々の パス を表す別の配列です。パスの各要素は、ステップを指定するオブジェクトです。ステップのフィールドを次に示します。
フィールド | 値 | 説明 |
---|---|---|
account |
文字列 - アドレス | (省略可) 指定されている場合、このパスステップは指定されたアドレスを通じたRipplingを表します。このステップにcurrency フィールドまたはissuer フィールドが指定されている場合は、このフィールドを指定しないでください。 |
currency |
文字列 - 通貨コード | (省略可) 指定されている場合、このパスステップはオーダーブックを通じた通貨の変換を表します。指定される通貨は新しい通貨を表します。このステップにaccount フィールドが指定されている場合は、このフィールドを指定しないでください。 |
issuer |
文字列 - アドレス | (省略可) 指定されている場合、このパスステップは通貨の変換を表し、このアドレスは新しい通貨のイシュアーを定義します。XRP以外のcurrency のステップでこのフィールドが省略されている場合、パスの直前のステップがイシュアーを定義します。currency が省略され、このフィールドが指定されている場合、イシュアーが異なる同名の通貨間でオーダーブックを使用するパスステップを示します。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 フィールドが指定されています。 |
関連項目
- コンセプト:
- 複数通貨間の支払い
- 分散型取引所
- Partial Payments
- リファレンス:
- Paymentトランザクション
- path_findメソッド(WebSocketのみ)
- ripple_path_findメソッド