# チケットの使用 [チケット](/ja/docs/references/protocol/ledger-data/ledger-entry-types/ticket)は、通常の順序ではないトランザクションを送信する方法を提供します。このチュートリアルでは、チケットを作成し、それを使って別のトランザクションを送信する手順を説明します。 ## 前提条件 script script このページでは、[xrpl.js](https://js.xrpl.org/)ライブラリを使用したJavaScriptのサンプルを提供しています。設定方法は、[JavaScriptを使ってみよう](/ja/docs/tutorials/javascript/build-apps/get-started)をご覧ください。 JavaScriptはWebブラウザ上で動作するため、セットアップなしで読み進められ、インタラクティブな手順を利用することができます。 ## 手順 このチュートリアルはいくつかの段階に分かれています。 - (Steps 1-2) **準備:** XRP Ledgerのアドレスとシークレットが必要です。本番環境では、同じアドレスとシークレットを一貫して使用することができます。このチュートリアルでは、必要に応じて新しいテスト認証情報を生成することができます。また、ネットワークに接続されている必要があります。 - (Steps 3-6) **チケットの作成:** トランザクションを送信して、いくつかのチケットを確保します。 - (任意) **休憩:** チケットを作成した後、以下のステップの前、中、後にいつでも様々な他のトランザクションを送信することができます。 - (Steps 7-10) **チケットの使用:** 設定されているチケットのうち1枚を使ってトランザクションを送信します。使用するチケットが1枚でも残っていれば、前の部分を飛ばしてこの手順を繰り返すことができます。 ### 1. クレデンシャルの入手 XRP Ledgerでトランザクションを送信するには、アドレスと秘密鍵、そしてXRPが必要です。開発用には、[Testnet](/ja/docs/concepts/networks-and-servers/parallel-networks)で以下のようなインターフェースを使ってこれらを入手することができます。 Testnetの暗号鍵を作成する div Rippleは[TestnetとDevnet](/ja/docs/concepts/networks-and-servers/parallel-networks)をテストの目的でのみ運用しており、その状態とすべての残高を定期的にリセットしています。予防措置として、Testnet、DevnetとMainnetで同じアドレスを使用**しない**ことをお勧めします。 [本番環境のソフトウェアを作成する場合](/docs/tutorials)には、既存のアカウントを使用し、[安全な署名](/ja/docs/concepts/transactions/secure-signing)を使用して鍵を管理する必要があります。 ### 2. ネットワークへの接続 トランザクションをネットワークに送信するには、ネットワークに接続している必要があります。チケットは今のところDevnetでしか利用できないので、Devnetサーバに接続する必要があります。例えば、以下のようになります。 JavaScript // 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`パターン](https://javascript.info/async-await)を使用しています。`await`は`async`関数の中で使用する必要があるため、残りのコードサンプルはここから始まる`main()`関数の中で続けるように書かれています。なお、`async`/`await`の代わりにPromiseのメソッド`.then()`や`.catch()`を使うこともできます。 このチュートリアルでは、以下のボタンをクリックして接続します。 Testnetに接続する div strong 接続ステータス: span 接続されていません ### 3. シーケンス番号の確認 チケットを作成する前に、自分のアカウントの[シーケンス番号](/ja/docs/references/protocol/data-types/basic-data-types#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9)を確認しておきましょう。次のステップのために現在のシーケンス番号が必要であり、設定されるチケットのシーケンス番号はこの番号から始まります。 JavaScript // Check Sequence Number ----------------------------------------------------- const account_info = await client.request({ "command": "account_info", "account": wallet.address }) let current_sequence = account_info.result.account_data.Sequence Check Sequence Check Sequence Number div ### 4. TicketCreateの準備と署名 前のステップで決定したシーケンス番号を使用して、[TicketCreateトランザクション](/ja/docs/references/protocol/transactions/types/ticketcreate)を構築します。`TicketCount`フィールドを使って、作成するチケットの枚数を指定します。例えば、10枚のチケットを作成するトランザクションを準備するには、次のようにします。 JavaScript // 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`の値を記録しておけば、[後で検証されたかどうかを確認](/ja/docs/concepts/transactions/reliable-transaction-submission)することができます。 Prepare & Sign Prepare & Sign div ### 5. TicketCreateの提出 前のステップで作成した署名付きトランザクションBlobを送信します。例えば、以下のようになります。 JavaScript // Submit TicketCreate ------------------------------------------------------- const tx = await client.submitAndWait(signed.tx_blob) console.log(tx) Submit Submit div ### 6. 検証の待機 ほとんどのトランザクションは、送信された後に次の台帳のバージョンに受け入れられます。つまり、トランザクションの結果が確定するまでに4~7秒かかることがあります。XRP Ledgerが混雑している場合や、ネットワークの接続性が悪いためにトランザクションがネットワーク全体に中継されない場合は、トランザクションが確定するまでに時間がかかることがあります。(トランザクションの有効期限を設定する方法については、[信頼できるトランザクションの送信](/ja/docs/concepts/transactions/reliable-transaction-submission)をご覧ください)。 JavaScript // Wait for Validation ------------------------------------------------------- // submitAndWait() handles this automatically, but it can take 4-7s. table tr th トランザクションのID: td (無) tr th 最新の検証レジャーインデックス: td 接続されていません tr th 送信時のレジャーインデックス: td (まだ送信されません) tr th トランザクションの code LastLedgerSequence : td (準備されません) tr ### (任意) 休憩 チケットの強みは、チケットを使ったトランザクションの準備をしている間も、アカウントの業務を通常通り行うことができる点にあります。チケットを使用してトランザクションを送信する場合、別のチケットを使用しているものも含め、他のトランザクションの送信と並行して行うことができ、いつでもチケット付きトランザクションを送信することができます。唯一の制約は、1つのチケットは1回しか使用できないということです。 以下のステップの間または途中で、ここに戻ってきてシーケンス取引を送信することができますが、その際、チケット取引の成功を妨げることはありません。 Intermission Payment EscrowCreate AccountSet div ### 7. 有効なチケットの確認 チケット付きのトランザクションを送信したい場合、どのチケットシーケンス番号を使用するかを知る必要があります。アカウントを注意深く管理していれば、どのチケットを持っているかはすでにわかっていると思いますが、よくわからない場合は、[account_objectsメソッド](/ja/docs/references/http-websocket-apis/public-api-methods/account-methods/account_objects)を使って、利用可能なチケットを調べることができます。例えば、以下のようになります。 JavaScript // 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 Check Tickets Check Tickets div チケットが残っている限り、ここから最後まで同じ手順を繰り返すことができます。 ### 8. チケット付きトランザクションの準備 チケットが利用できるようになったので、それを使用するトランザクションを準備します。 ここでは、好きな[トランザクションのタイプ](/ja/docs/references/protocol/transactions/types)を使用することができます。次の例では、何も行わない[AccountSetトランザクション](/ja/docs/references/protocol/transactions/types/accountset)を使用していますが、これはレジャーに他の設定を必要としないからです。`Sequence`フィールドを`0`に設定して、利用可能なチケットの1つのチケットシーケンス番号を持つ`TicketSequence`フィールドを含めます。 JavaScript // 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`を省略します。サーバはデフォルトでは値を提供しません。 Prepare Ticketed Tx div h4 Select a Ticket: div button Prepare Ticketed Transaction div ### 9. チケット付きトランザクションの送信 前のステップで作成した署名付きトランザクションBlobを送信します。例えば、以下のようになります。 JavaScript // Submit Ticketed Transaction ----------------------------------------------- const tx_t = await client.submitAndWait(signed_t.tx_blob) console.log(tx_t) Submit Ticketed Tx Submit div ### 10. 検証の待機 チケット付きトランザクションは、シーケンス付きトランザクションと同じようにコンセンサスプロセスを経ます。 table tr th トランザクションのID: td (無) tr th 最新の検証レジャーインデックス: td 接続されていません tr th 送信時のレジャーインデックス: td (まだ送信されません) tr th トランザクションの code LastLedgerSequence : td (準備されません) tr ## マルチシグで使用する チケットの主な使用例としては、複数の[マルチシグ](/ja/docs/concepts/accounts/multi-signing)を並行して集めることができます。チケットを使用することで、複数署名されたトランザクションが完全に署名されて準備が整った時点で、どれが先に準備されるかを気にすることなく送信することができます。 このシナリオでは、[step8,「チケット付きトランザクションの準備」](#8-%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E4%BB%98%E3%81%8D%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%BA%96%E5%82%99)が若干異なります。準備と署名を一度に行うのではなく、[任意のマルチシグトランザクションの送信](/ja/docs/tutorials/how-tos/manage-account-settings/send-a-multi-signed-transaction)の手順に従うことになります。まずトランザクションを準備し、次に信頼できる署名者の間でトランザクションを循環させて署名を集め、最後に署名を組み合わせて最終的なマルチシグトランザクションを作成します。 複数の異なるトランザクションを処理する場合、それぞれが異なるチケットを使用する限り、この作業を並行して行うことができます。 ## 関連項目 - **Concepts:** - [チケット](/ja/docs/concepts/accounts/tickets) - [マルチシグ](/ja/docs/concepts/accounts/multi-signing) - **Tutorials:** - [マルチシグの設定](/ja/docs/tutorials/how-tos/manage-account-settings/set-up-multi-signing) - [信頼出来るトランザクションの送信](/ja/docs/concepts/transactions/reliable-transaction-submission) - **References:** - [account_objectsメソッド](/ja/docs/references/http-websocket-apis/public-api-methods/account-methods/account_objects) - [sign_forメソッド](/ja/docs/references/http-websocket-apis/admin-api-methods/signing-methods/sign_for) - [submit_multisignedメソッド](/ja/docs/references/http-websocket-apis/public-api-methods/transaction-methods/submit_multisigned) - [TicketCreateトランザクション](/ja/docs/references/protocol/transactions/types/ticketcreate) - [トランザクションの共通フィールド](/ja/docs/references/protocol/transactions/common-fields)