チケットの使用

チケットは、通常の順序ではないトランザクションを送信する方法を提供します。このチュートリアルでは、チケットを作成し、それを使って別のトランザクションを送信する手順を説明します。

前提条件

このページでは、xrpl.js ライブラリを使用したJavaScriptのサンプルを提供しています。設定方法は、JavaScriptを使ってみようをご覧ください。

JavaScriptはWebブラウザ上で動作するため、セットアップなしで読み進められ、インタラクティブな手順を利用することができます。

手順

このチュートリアルはいくつかの段階に分かれています。

  • (Steps 1-2) 準備: XRP Ledgerのアドレスとシークレットが必要です。本番環境では、同じアドレスとシークレットを一貫して使用することができます。このチュートリアルでは、必要に応じて新しいテスト認証情報を生成することができます。また、ネットワークに接続されている必要があります。
  • (Steps 3-6) チケットの作成: トランザクションを送信して、いくつかのチケットを確保します。
  • (任意) 休憩: チケットを作成した後、以下のステップの前、中、後にいつでも様々な他のトランザクションを送信することができます。
  • (Steps 7-10) チケットの使用: 設定されているチケットのうち1枚を使ってトランザクションを送信します。使用するチケットが1枚でも残っていれば、前の部分を飛ばしてこの手順を繰り返すことができます。

1. クレデンシャルの入手

XRP Ledgerでトランザクションを送信するには、アドレスと秘密鍵、そしてXRPが必要です。開発用には、Devnetで以下のようなインターフェースを使ってこれらを入手することができます。

Caution: Ripple provides the Testnet and Devnet for testing purposes only, and sometimes resets the state of these test networks along with all balances. As a precaution, do not use the same addresses on Testnet/Devnet and Mainnet.

本番環境のソフトウェアを作成する場合には、既存のアカウントを使用し、安全な署名を使用して鍵を管理する必要があります。

2. ネットワークへの接続

トランザクションをネットワークに送信するには、ネットワークに接続している必要があります。チケットは今のところDevnetでしか利用できないので、Devnetサーバーに接続する必要があります。例えば、以下のようになります。

// Connect to Devnet (since that's where tickets are available)
async function main() {
  const client = new xrpl.Client("wss://s.devnet.rippletest.net:51233")
  await client.connect()

注記: このチュートリアルのコードサンプルでは、JavaScriptのasync/awaitパターン を使用しています。awaitasync関数の中で使用する必要があるため、残りのコードサンプルはここから始まるmain()関数の中で続けるように書かれています。なお、async/awaitの代わりにPromiseのメソッド.then().catch()を使うこともできます。

このチュートリアルでは、以下のボタンをクリックして接続します。

3. シーケンス番号の確認

チケットを作成する前に、自分のアカウントのシーケンス番号を確認しておきましょう。次のステップのために現在のシーケンス番号が必要であり、設定されるチケットのシーケンス番号はこの番号から始まります。

// Check Sequence Number -----------------------------------------------------
  const account_info = await client.request({
    "command": "account_info",
    "account": wallet.address
  })
  let current_sequence = account_info.result.account_data.Sequence

4. TicketCreateの準備と署名

前のステップで決定したシーケンス番号を使用して、TicketCreate トランザクションを構築します。TicketCountフィールドを使って、作成するチケットの枚数を指定します。例えば、10枚のチケットを作成するトランザクションを準備するには、次のようにします。

// Prepare and Sign TicketCreate ---------------------------------------------
  const prepared = await client.autofill({
    "TransactionType": "TicketCreate",
    "Account": wallet.address,
    "TicketCount": 10,
    "Sequence": current_sequence
  })
  const signed = wallet.sign(prepared)
  console.log(`Prepared TicketCreate transaction ${signed.hash}`)

トランザクションのハッシュとLastLedgerSequenceの値を記録しておけば、後で検証されたかどうかを確認することができます。

5. TicketCreateの提出

前のステップで作成した署名付きトランザクションBlobを送信します。例えば、以下のようになります。

// Submit TicketCreate -------------------------------------------------------
  const tx = await client.submitAndWait(signed.tx_blob)
  console.log(tx)

6. 検証の待機

ほとんどのトランザクションは、送信された後に次の台帳のバージョンに受け入れられます。つまり、トランザクションの結果が確定するまでに4~7秒かかることがあります。XRP Ledgerが混雑している場合や、ネットワークの接続性が悪いためにトランザクションがネットワーク全体に中継されない場合は、トランザクションが確定するまでに時間がかかることがあります。(トランザクションの有効期限を設定する方法については、信頼できるトランザクションの送信を参照してください)。

// Wait for Validation -------------------------------------------------------
  // submitAndWait() handles this automatically, but it can take 4-7s.
Transaction ID: (None)
Latest Validated Ledger Index: (Not connected)
Ledger Index at Time of Submission: (Not submitted)
Transaction LastLedgerSequence: (Not prepared)

(任意) 休憩

チケットの強みは、チケットを使ったトランザクションの準備をしている間も、アカウントの業務を通常通り行うことができる点にあります。チケットを使用してトランザクションを送信する場合、別のチケットを使用しているものも含め、他のトランザクションの送信と並行して行うことができ、いつでもチケット付きトランザクションを送信することができます。唯一の制約は、1つのチケットは1回しか使用できないということです。

ヒント: 以下のステップの間または途中で、ここに戻ってきてシーケンス取引を送信することができますが、その際、チケット取引の成功を妨げることはありません。

7. 有効なチケットの確認

チケット付きのトランザクションを送信したい場合、どのチケットシーケンス番号を使用するかを知る必要があります。アカウントを注意深く管理していれば、どのチケットを持っているかはすでにわかっていると思いますが、よくわからない場合は、account_objects メソッドを使って、利用可能なチケットを調べることができます。例えば、以下のようになります。

// Check Available Tickets ---------------------------------------------------
  let response = await client.request({
    "command": "account_objects",
    "account": wallet.address,
    "type": "ticket"
  })
  console.log("Available Tickets:", response.result.account_objects)

  // Choose an arbitrary Ticket to use
  use_ticket = response.result.account_objects[0].TicketSequence

ヒント: チケットが残っている限り、ここから最後まで同じ手順を繰り返すことができます。

8. チケット付きトランザクションの準備

チケットが利用できるようになったので、それを使用するトランザクションを準備します。

ここでは、好きなトランザクションのタイプを使用することができます。次の例では、何も行わないAccountSet トランザクションを使用していますが、これはレジャーに他の設定を必要としないからです。Sequenceフィールドを0に設定して、利用可能なチケットの1つのチケットシーケンス番号を持つTicketSequenceフィールドを含めます。

// Prepare and Sign Ticketed Transaction -------------------------------------
  const prepared_t = await client.autofill({
    "TransactionType": "AccountSet",
    "Account": wallet.address,
    "TicketSequence": use_ticket,
    "LastLedgerSequence": null, // Never expire this transaction.
    "Sequence": 0
  })
  const signed_t = wallet.sign(prepared_t)
  console.log(`Prepared ticketed transaction ${signed_t.hash}`)

ヒント: TicketCreateトランザクションをすぐに送信する予定がない場合は、トランザクションが期限切れにならないように、LastLedgerSequenceを設定しないようにする必要があります。これを行う方法はライブラリによって異なります。

  • xrpl.js: トランザクションの自動入力の際に、"LastLedgerSequence": nullを指定する。
  • rippled: 用意された指示からLastLedgerSequenceを省略します。サーバーはデフォルトでは値を提供しません。

9. チケット付きトランザクションの送信

前のステップで作成した署名付きトランザクションBlobを送信します。例えば、以下のようになります。

// Submit Ticketed Transaction -----------------------------------------------
  const tx_t = await client.submitAndWait(signed_t.tx_blob)
  console.log(tx_t)

10. 検証の待機

チケット付きトランザクションは、シーケンス付きトランザクションと同じようにコンセンサスプロセスを経ます。

Transaction ID: (None)
Latest Validated Ledger Index: (Not connected)
Ledger Index at Time of Submission: (Not submitted)
Transaction LastLedgerSequence: (Not prepared)

マルチ署名で使用する

チケットの主な使用例としては、複数のマルチ署名を並行して集めることができます。チケットを使用することで、複数署名されたトランザクションが完全に署名されて準備が整った時点で、どれが先に準備されるかを気にすることなく送信することができます。

このシナリオでは、step8,「チケット付きトランザクションの準備」が若干異なります。準備と署名を一度に行うのではなく、任意のマルチ署名トランザクションの送信の手順に従うことになります。まずトランザクションを準備し、次に信頼できる署名者の間でトランザクションを循環させて署名を集め、最後に署名を組み合わせて最終的なマルチ署名トランザクションを作成します。

複数の異なるトランザクションを処理する場合、それぞれが異なるチケットを使用する限り、この作業を並行して行うことができます。

関連項目