結果のファイナリティー
トランザクションがコンセンサスレジャーに適用される順序は、レジャーがクローズされ、そのトランザクションセットがコンセンサスプロセスによって承認されるまで確定されません。最初に成功したトランザクションはその後で失敗する可能性があり、最初に失敗したトランザクションはその後で成功する可能性があります。さらに、あるラウンドでコンセンサスプロセスによって拒否されたトランザクションは、後のラウンドでコンセンサスに達する可能性があります。
検証済みレジャーには、失敗したトランザクション(tec
結果コード)だけでなく、成功したトランザクション(tes
結果コード)も含まれる可能性があります。それ以外の結果のトランザクションはレジャーに含まれません。
結果コードがそれ以外の場合は、結果が最終的なものかどうかを判断するのは困難です。次の表は、トランザクションの結果がいつ確定するかをまとめたものです。この内容は、トランザクション送信からの結果コードに基づいています。
結果コード | ファイナリティー |
---|---|
tesSUCCESS |
検証済みレジャーに含まれる場合は確定 |
すべてのtec コード |
検証済みレジャーに含まれる場合は確定 |
すべてのtem コード |
確定(トランザクションが有効になるようにプロトコルが変更される場合を除く) |
tefPAST_SEQ |
検証済みレジャーに同じシーケンス番号の別のトランザクションが含まれている場合は確定 |
tefMAX_LEDGER |
検証済みレジャーにトランザクションのLastLedgerSequence フィールドよりも大きいレジャーインデックスがあり、検証済みレジャーにそのトランザクションが含まれていない場合は確定 |
他のトランザクション結果は確定でない可能性があります。その場合、トランザクションはその後に成功または失敗する可能性があります(特に、条件の変更によってトランザクションの適用を妨げる原因がなくなった場合)。例えば、まだ存在していないアカウントにXRP以外の通貨を送信しようとしても失敗しますが、別のトランザクションで送信先アカウントを作成するのに十分なXRPを送信すれば成功します。サーバーは、一時的に失敗した署名付きのトランザクションを保存してから、事前に確認せずに後でそれを正常に適用する場合があります。
未確定の結果はどのように変更できますか?
最初にトランザクションを送信すると、rippled
サーバーはそのトランザクションを現在のオープンレジャーに暫定的に適用し、その結果から暫定的なトランザクションの結果を返します。ただし、トランザクションの最終結果は、暫定的な結果とは大きく異なる場合があります。考えられる理由を以下に示します。
-
トランザクションは、後のレジャーバージョンまで延期されるか、検証済みレジャーに取り込まれない場合があります。ほとんどの場合、XRP Ledgerでは、すべての有効なトランザクションをできるだけ早く処理するという原則に従います。ただし、次のような例外があります。
-
提案されたトランザクションがコンセンサスラウンドの開始時点で過半数のバリデータに中継されていない場合は、残りのバリデータがトランザクションを取得して有効であることを確認する時間を確保できるように、次のレジャーバージョンまで延期される場合があります。
-
アドレスが同じシーケンス番号を使用して2つの異なるトランザクションを送信する場合、それらのトランザクションのうち最大1つが検証されます。そのようなトランザクションが異なるパスのネットワーク経由で中継される場合、サーバーによっては、他の競合するトランザクションが先に過半数のサーバーに到達したために、暫定的に成功したトランザクションが失敗する可能性があります。
-
ネットワークをスパムから保護するには、すべてのトランザクションでXRPのトランザクションコストを消却し、XRP Ledgerピアツーピアネットワーク全体に中継する必要があります。ピアツーピアネットワークの負荷が大きいためにトランザクションコストが増加する場合、暫定的に成功したトランザクションは、コンセンサスを達成するのに十分なサーバーに中継されないか、後でキューに入れられる可能性があります。
-
一時的なインターネットの停止または遅延により、
LastLedgerSequence
フィールドで設定されたトランザクションの指定有効期限内であっても、提案されたトランザクションが正常に中継されない場合があります。(トランザクションに有効期限が設定されていない場合、トランザクションは有効状態を維持し、後で成功する可能性がありますが、独自の方法では望ましくない場合があります。詳細は、信頼できるトランザクションの送信を参照してください。) -
上記の要因が2つ以上同時に発生する場合もあります。
-
通常、トランザクションが決済済みレジャーに適用される順序は、それらのトランザクションが現在のオープンレジャーに一時的に適用された順序とは異なります。そのため、関連するトランザクションに応じて、一時的に成功したトランザクションが失敗したり、一時的に失敗したトランザクションが成功したりする場合があります。以下に例を示します。
-
2つのトランザクションでそれぞれ、同じオファーを分散型取引所で完全に使用する場合、どちらか一方が先に成功すると、もう一方は失敗します。それらのトランザクションが適用される順序は変わる可能性があるため、成功したトランザクションが失敗したり、失敗したトランザクションが成功したりする可能性があります。オファーは部分的に実行できるため、成功する可能性もありますが、程度は異なります。
-
分散型取引所でオファーを使用することで複数通貨間の支払いは成功したが、別のトランザクションが同じオーダーブックでオファーを使用または作成した場合、複数通貨間の支払いは仮に実行されたときとは異なる為替レートで成功する場合があります。Partial Paymentでは、別の金額を送金することもできます。
-
送金元に十分な資金がないために一時的に失敗したPaymentトランザクションは、必要な資金を送金する別の取引が正規の順序で先に行われることにより、後で成功する可能性があります。逆も同様です。一時的に成功したトランザクションは、必要な資金を送金するトランザクションが標準的な順序に入れられたものの先に来なかったために失敗する可能性があります。
ヒント: 上記の理由により、XRP Ledgerに対してテストを実行しており、同じデータに影響する複数のアカウントがある場合、必ずトランザクション間のレジャーが閉じられるまでお待ちください。スタンドアロンモードのサーバーに対してテストを実行する場合は、レジャーを手動で閉じる必要があります。