--- html: xrpljs2-migration-guide.html blurb: JavaScriptコードをより新しいクライアントライブラリに移行する方法を学びましょう。 parent: https://js.xrpl.org/ --- # ripple-lib 1.xからxrpl.js 2.xへの移行ガイド **ripple-lib** (1.x)ライブラリからJavaScript / TypeScriptコードを移行し、代わりにXRP Ledger用**xrpl.js** (2.x)ライブラリーを使用するためには、以下の手順に従ってください。 **ヒント:** 必要な場合は、依然[legacy 1.x "RippleAPI"用ドキュメンテーション](https://github.com/XRPLF/xrpl.js/blob/1.x/docs/index.md)にアクセスできます。 ## 差異の概略 xrpl.js v2.0では、多くのフィールドと機能に"新しい"名前があります。より正確には、xrpl.jsは現在、[HTTP / WebSocket APIs](http-websocket-apis.html)と同じ名前を使用しています。XRP Ledgerで実行可能な"OfferCancel"のような[トランザクションタイプ](transaction-types.html)をライブラリが使用する場所では、"orderCancellation"オブジェクトのようなripple-libに特有の構造はなくなりました。ripple-lib 1.xでこれらの構造をリターンする多くのAPIメソッドはなくなりました。2.0では、WebSocket APIと同じフォーマットでリクエスト、レスポンスを行います。 ripple-lib 1.xからの包括的な`RippleAPI`クラスもなくなりました。xrpl.js 2.xでは、ネットワーク運用のための`Client`クラスがあり、その他全ての運用は厳格にオフラインです。アドレスとキーのための新しい`Wallet`クラス、また、トップレベルの`xrpl`オブジェクトの下にその他のクラスとプロパティがあります。 ## 定型文での比較 **ripple-lib 1.10.0:** ```js const ripple = require('ripple-lib'); (async function() { const api = new ripple.RippleAPI({ server: 'wss://xrplcluster.com' }); await api.connect(); // Your code here api.disconnect(); })(); ``` **xrpl.js 2.0.0:** ```js const xrpl = require("xrpl"); (async function() { const client = new xrpl.Client('wss://xrplcluster.com'); await client.connect(); // Your code here client.disconnect(); })(); ``` ## バリデーション結果 デフォルトでは、ripple-lib 1.xにおけるほとんどのメソッドは、[コンセンサスプロセス](consensus.html)によって検証された最終結果をリターンするのみでした。xrpl.jsと同等の多くのメソッドは、WebSocket APIをコールするために[`Client.request()`メソッド](https://js.xrpl.org/classes/Client.html#request)を使用します。WebSocket APIにおいて、XRP Ledgerサーバーのデフォルト設定では、検証済みデータだけはなく未検証のデータを含むことがあります。 [分散型取引所](decentralized-exchange.html)の状態を調べる時のように、完了見込みの多数のトランザクション結果が保留中であるため、現時点のオープンレジャーを使用したい場合があります。また、完了したトランザクション結果を取り込んだ検証済みのレジャーを使用したい場合もあります。 xrpl.js 2.0が`Client.request()`を使用してAPIリクエストをする際、明確に[使用するレジャー番号を指定する](basic-data-types.html#specifying-ledgers)必要があります。例えば、最新の_検証済みレジャー_を使用してトラストラインを調べるためには: **ripple-lib 1.x:** ```js const trustlines = await api.getTrustlines("rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn") console.log(trustlines) ``` **xrpl.js 2.0:** ```js const trustlines = await client.request({ "command": "account_lines", "account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "ledger_index": "validated" }) console.log(trustlines.result) ``` ## トランザクションの送信 xrpl.jsには、トランザクションの署名および送信のための、また、XRP Ledgerブロックチェーンのトランザクション最終結果の確認を待機するための特有の補助機能があります: - トランザクション送信および[最終結果](finality-of-results.html)の待機のために`submitAndWait()`を使用します。トランザクションが検証された場合、これは[txメソッド][]レスポンスにリゾルブし、そうでない場合、例外処理(exception)となります。例外処理(exception)は、トランザクションが検証されなかったことを保証しません。例えば、サーバーに[より大きなギャップ](reliable-transaction-submission.html#ledger-gaps)がある場合、トランザクションは、そのギャップの中で検証される可能性があります。 - 即時の送信およびリターンのために`submit()`を使用します。これは[submitメソッド][]レスポンスにリゾルブし、仮の(最終ではない)結果を表示します。もしXRP Ledgerサーバーへのトランザクション送信に問題があった場合、このメソッドは例外処理(exception)のみとなります。 どちらのメソッドに関しても、準備済みトランザクション説明と[`Wallet`インスタンス](#キーおよびウォレット)をパスすることによって、署名済みトランザクションをメソッドに直接パス、もしくは、送信直前にトランザクションに署名することができます。 ```js const tx_json = await client.autofill({ "TransactionType": "AccountSet", "Account": wallet.address, // "wallet"はWalletクラスのインスタンス "SetFlag": xrpl.AccountSetAsfFlags.asfRequireDest }) try { const submit_result = await client.submitAndWait(tx_json, wallet) // submitAndWait() はトランザクションの結果が確定するまでreturnしません。 // トランザクションがネットワークに確認されなかった場合、XrplErrorが発生します。 // ディザスタリカバリには対応しません。 console.log("Transaction result:", submit_result) } catch(err) { console.log("Error submitting transaction:", err) } ``` もしくは、トランザクション署名のためにwalletの`sign`メソッドを、送信のために`submitAndWait(tx_blob)`を使用することができます。 停電やその他災害から復旧させる[信頼できるトランザクションの送信](reliable-transaction-submission.html)のビルドに便利です。(ライブラリは単独でディザスタリカバリに対処しません。) ### LastLedgerSequenceのコントロール ripple-lib 1.xでは、トランザクションを準備し、準備済みトランザクションの`LastLedgerSequence`パラメータを、その時点で最新の検証済みレジャー番号 _以降_ のレジャー番号を指定する際、`instructions.maxLedgerVersionOffset`を利用できました。2.0では、最新の検証済みレジャー番号を調べ、トランザクションのオートフィル前に`LastLedgerSequence`を明確に指定することが可能です。 **xrpl.js 2.0:** ```js const vli = await client.getLedgerIndex() const prepared = await client.autofill({ "TransactionType": "Payment", "Account": sender, "Amount": xrpl.xrpToDrops("50.2"), "Destination": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", "LastLedgerSequence": vli+75 // デフォルトの1分以内ではなく5分以内 }) ``` 旧メソッド同様、デフォルトでは、`Client.autofill()`は合理的な`LastLedgerSequence`値を提示します。`LastLedgerSequence`フィールドが _ない_ トランザクションを準備するには、`null`値の`LastLedgerSequence`を提示します: ```js const prepared = await client.autofill({ "TransactionType": "Payment", "Account": sender, "Amount": xrpl.xrpToDrops("50.2"), "Destination": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", "LastLedgerSequence": null // トランザクションは有効期限切れになりません }) ``` ## キーおよびウォレット xrpl.js 2.0は、[暗号鍵](cryptographic-keys.html)の管理およびトランザクションの署名のために、新しい[`Wallet`クラス](https://js.xrpl.org/classes/Wallet.html)を採用します。 これは、ripple-lib 1.xにおいてシードや秘密鍵を取得していた機能に代わるもので、多様なアドレス符号化やタスク生成も処理します。 ### キーの生成 **ripple-lib 1.x:** ```js const api = new RippleAPI() const {address, secret} = api.generateAddress({algorithm: "ed25519"}) console.log(address, secret) // rJvMQ3cwtyrNpVJDTW4pZzLnGeovHcdE6E s████████████████████████████ ``` **xrpl.js 2.0:** ```js const wallet = xrpl.Wallet.generate("ed25519") console.log(wallet) // Wallet { // publicKey: 'ED872A4099B61B0C187C6A27258F49B421AC384FBAD23F31330E666A5F50E0ED7E', // privateKey: 'ED224D2BDCF6382030C7612654D2118C5CEE16344C81CB36EC7A01EC7D95C5F737', // classicAddress: 'rMV3CPSXAdRpW96bvvnSu4zHTZ6ETBkQkd', // seed: 's████████████████████████████' // } ``` ### シードおよび署名からの取得 **ripple-lib 1.x:** ```js const api = new RippleAPI() const seed = 's████████████████████████████'; const keypair = api.deriveKeypair(seed) const address = api.deriveAddress(keypair.publicKey) const tx_json = { "Account": address, "TransactionType":"Payment", "Destination":"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", "Amount":"13000000", "Flags":2147483648, "LastLedgerSequence":7835923, "Fee":"13", "Sequence":2 } const signed = api.sign(JSON.stringify(tx_json), seed) ``` **xrpl.js 2.0:** ```js const wallet = xrpl.Wallet.fromSeed('s████████████████████████████') const tx_json = { "Account": wallet.address, "TransactionType":"Payment", "Destination":"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", "Amount":"13000000", "Flags":2147483648, "LastLedgerSequence":7835923, "Fee":"13", "Sequence":2 } const signed = wallet.sign(tx_json) ``` ## イベントおよびサブスクリプション 1.xでは、`RippleAPI`クラスの`.on()`メソッドを使用してレジャーイベントとAPIエラーにサブスクリプションできました。もしくは、`.connection.on()`を使用して特定のWebSocketメッセージタイプにサブスクリプションできました。これらは、[`Client.on()`メソッド](https://js.xrpl.org/classes/Client.html#on)に統合されました。さらに、XRP Ledgerサーバーに接続する際、クライアントライブラリは、自動的にレジャークローズイベントにサブスクリプションしなくなったため、ハンドラを追加するだけでなく、レジャークローズイベントを取得するために **明確に台帳ストリームにサブスクリプションする必要があります** 。 レジャークローズイベントにサブスクリプションするには、`Client.(method)`を使用し、`"streams": ["ledger"]`で[subscribeメソッド][]をコールします。イベントハンドラを追加するには、`Client.on(event_type, callback)`を使用します。これらのコールは任意の順で実行可能です。 1.xからのRippleAPI特有の`ledger`イベントタイプは削除され、代わりに、`ledgerClosed`イベントを使用します。これらのイベントメッセージは同じデータを含んでいますが、フォーマットはWebSocket APIの[レジャーストリーム](subscribe.html#レジャーストリーム)メッセージに対応しています。 例: **ripple-lib 1.x:** ```js api.on("ledger", (ledger) => { console.log(`Ledger #${ledger.ledgerVersion} closed! It contains ${ledger.transactionCount} transaction(s) and has the ledger_hash ${ledger.ledgerHash}.` ) }) // "ledger"イベントはAPI接続が確立後自動的に開始します。 ``` **xrpl.js 2.0:** ```js client.on("ledgerClosed", (ledger) => { console.log(`Ledger #${ledger.ledger_index} closed! It contains ${ledger.txn_count} transaction(s) and has the ledger_hash ${ledger.ledger_hash}.` ) }) // ”ledgerClosed "イベントを取得するには、"ledger "ストリームを明示的にサブスクライブする必要があります。 client.request({ "command": "subscribe", "streams": ["ledger"] }) ``` ## 比較対照 ripple-lib 1.xでは、全てのメソッドとプロパティは、`RippleAPI`クラスのインスタンスでした。xrpl.js 2.xでは、ライブラリの静的メソッドと特定のクラスに属するメソッドがあります。以下のテーブルにおいて、`Client.method()`という表記方法は、`method()`が`Client`クラスのインスタンスに属することを意味します。 **注記: 以下のテーブルには、3カラムあります。縦にスクロールすると、全ての情報を確認できます。** | RippleAPIインスタンスメソッド/プロパティ | xrpl.jsメソッド/プロパティ | 注記 | |-------------------|----------------|---| | `new ripple.RippleAPI({server: url})` | [`new xrpl.Client(url)`](https://js.xrpl.org/classes/Client.html#constructor) | 複数のサーバに接続するには`xrpl.BroadcastClient([url1, url2, ..])` を使用してください。 | | `request(command, options)` | [`Client.request(options)`](https://js.xrpl.org/classes/Client.html#request) |