最終更新:
編集

Ticket

(TicketBatch amendmentにより追加されました。)

XRP Ledgerのチケットは、取引をすぐに送信せずに、その取引のためにシーケンス番号を確保する方法です。チケットを使うことで、通常の順序以外で取引を送信することができます。この使用例としては、必要な署名を集めるのに時間がかかるようなマルチサイン取引などが挙げられます。

背景

トランザクションにはシーケンス番号が付いているので、任意のトランザクションを2回以上実行することはできません。シーケンス番号はまた、任意のトランザクションが一意であることを保証します。全く同じ金額を同じ人に複数回送信する場合、シーケンス番号は毎回異なることが保証される1つの詳細です。最後に、シーケンス番号は、ネットワーク全体に送信される際に一部のトランザクションが順不同で届いたとしても、トランザクションを一貫した順序で並べるためのエレガントな方法を提供します。

しかし、シーケンス番号では限界がある場合もあります。たとえば、次のような場合です。

  • 2人以上のユーザがアカウントへのアクセスを共有し、それぞれが独立してトランザクションを送信することができる状態。これらのユーザが事前に調整することなく同時期に取引を送信しようとすると、それぞれが同じシーケンス番号を異なる取引に使用しようとする可能性があり、成功するのは1人だけです。
  • トランザクションを事前に準備して署名し、安全な場所に保存しておいて、特定のイベントが発生したときにいつでも実行できるようにしておきたい場合があります。しかし、その間も通常通りにアカウントを使用したい場合、準備しておくトランザクションに使用するシーケンス番号がわかりません。
  • トランザクションを有効にするために複数人が署名しなければならない場合、一度に複数のトランザクションを計画するのは難しいでしょう。トランザクションに別々のシーケンス番号をつけると、全員が前のトランザクションに署名するまで、後の番号のトランザクションを送信することができません。しかし、保留中のトランザクションに同じシーケンス番号を使用すると、1つのトランザクションのみ成功します。

チケットでは、これらの問題を解決するために、通常の順番とは別に、後からでも(ただし、それぞれ1回まで)使用可能なシーケンス番号を用意しています。

チケットは予約済みのシーケンス番号

チケットとは、あるシーケンス番号が後に使用されるために確保されたという記録です。アカウントは、まずTicketCreateトランザクションを送信して、1つまたは複数のシーケンス番号をチケットとして確保します。これにより、台帳の状態データに、予約された各シーケンス番号についてTicketオブジェクトの形で記録が残されます。

チケットには、チケット作成時に設定されたシーケンス番号が使用されます。例えば、あなたのアカウントの現在のシーケンス番号が101で、3枚のチケットを作成した場合、それらのチケットにはチケットシーケンス番号102、103、104が付けられます。これにより、あなたのアカウントのシーケンス番号は105になります。

......作成アカウントID: rf1Bi...Sequence: 101レジャーの状態データ(前)TicketAccount: rf1Bi...Sequence: 104TicketAccount: rf1Bi...Sequence: 103TicketAccount: rf1Bi...Sequence: 102アカウントID: rf1Bi...Sequence: 105レジャーの状態データ(後)TicketCreateトランザクションAccount: rf1Bi...TicketCount: 3Sequence: 101更新

後から、シーケンス番号の代わりに特定のチケットを使用してトランザクションを送信することができます。これにより、元帳の状態データから対応するチケットが削除され、アカウントの通常のシーケンス番号は変更されません。また、チケットを使用せずに、通常のシーケンス番号を使用してトランザクションを送信することもできます。利用可能なチケットは、いつでもどのような順番でも使用できますが、各チケットは1回しか使用できません。

......Ticket 103削除TicketAccount: rf1Bi...Sequence: 104TicketAccount: rf1Bi...Sequence: 102変更なしアカウントID: rf1Bi...Sequence: 105レジャーの状態データ(前)(任意のトランザクション)Account: rf1Bi...Sequence: 0TicketSequence: 103...TicketAccount: rf1Bi...Sequence: 104TicketAccount: rf1Bi...Sequence: 103TicketAccount: rf1Bi...Sequence: 102アカウントID: rf1Bi...Sequence: 105レジャーの状態データ(後)使用

上記の例では、シーケンス番号105または作成した3つのチケットのいずれかを使用してトランザクションを送信できます。チケット103を使ってトランザクションを送信すると、それによってチケット103は元帳から削除されます。その後の次のトランザクションでは、シーケンス番号105、チケット102、またはチケット104を使用できます。

注意
チケットは1枚ごとに所有者準備金としてカウントされますので、チケット1枚につき2XRPを確保する必要があります。 (このXRPは、チケットを使用した後に再び使用可能になります)一度に多くのチケットを作成すると、このコストはすぐに膨れ上がります。

シーケンス番号と同様に、トランザクションの送信は、そのトランザクションがコンセンサスによって確認された場合にのみ、チケットを使用します。しかし、意図した通りにならなかった取引でも、tecクラスの結果コードを用いてコンセンサスで確認することができます。

あるアカウントで利用可能なチケットを調べるには、account_objectsメソッドを使用します。

制約事項

どのアカウントでも、どのような種類の取引でもチケットを作成し、使用することができます。ただし、いくつかの制限があります。

  • 各チケットは一度しか使用できません。同じチケットシーケンスを使用する複数の異なるトランザクション候補があることは可能ですが、コンセンサスで検証できるのはそのうちの1つだけです。
  • 各アカウントでは、一度に250枚以上のチケットをレジャーに登録することはできません。また、一度に250枚以上のチケットを作成することもできません。
  • チケットを使って別のチケットを作ることは できます。その場合、使用したチケットは、一度に所持できるチケットの合計数にはカウントされません。
  • 各チケットは所有者準備金にカウントされるため、まだ使用していないチケット1枚につき2XRPを確保する必要があります。このXRPは、チケットを使用した後、再び使用することができます。
  • 個々の元帳の中では、チケットを使用した取引は、同じ送信者からの他の取引の後に実行されます。1つのアカウントが同じ元帳のバージョンでTicketを使用する複数のトランザクションを持つ場合、それらのTicketは最も低いTicket Sequenceから最も高いTicket Sequenceの順に実行されます。 (詳細については、コンセンサスの正規順序に関するドキュメントをご覧ください)。
  • 個々の元帳の中では、チケットを使用した取引は、同じ送信者からの他の取引の後に実行されます。1つのアカウントが同じ元帳のバージョンでチケットを使用する複数のトランザクションを持つ場合、それらのチケットは最も低いチケット シーケンス番号から最も高いチケット シーケンス番号の順に実行されます。 (詳細については、コンセンサスの正規順序に関するドキュメントをご覧ください)。

関連項目