Checkの取消し
Checks Amendmentにより追加されました。
このチュートリアルでは、Checkを取り消す手順を説明します。この手順を実行すると、送金を行わずにレジャーのCheckオブジェクトが削除されます。
着信したCheckが不要な場合、取り消すことができます。送信時に内容を誤って入力した場合や状況が変化した場合に、送信したCheckを取り消すこともできます。有効期限切れのCheckはレジャーから削除する必要があります。これにより、送金元に所有者準備金が戻ります。
前提条件
このチュートリアルでCheckを取り消すには、以下が必要です。
- 現在レジャーに記録されているCheckオブジェクトのIDが必要です。
- たとえばこのチュートリアルの例では、IDが
49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0
のCheckを取り消しますが、この手順を自身で実行する場合は異なるIDを使用する必要があります。
- たとえばこのチュートリアルの例では、IDが
- CheckCancelトランザクションを送信する資金供給のあるアカウントのアドレスとシークレットキー。Checkが有効期限切れでない限り、このアドレスは、Checkの送金元または受取人のいずれかでなければなりません。
- トランザクションに安全に署名できる手段。
- クライアントライブラリまたはHTTPライブラリ、WebSocketライブラリなど。
1. CheckCancelトランザクションの準備
CheckCancelトランザクションのフィールドの値を決定します。以下のフィールドは必要最小限のフィールドです。その他のフィールドはオプションまたは署名時に自動入力可能なフィールドです。
フィールド | 値 | 説明 |
---|---|---|
TransactionType | 文字列 | Checkを取り消す場合は文字列CheckCancel を使用します。 |
Account | 文字列(アドレス) | Checkを取り消す送信元のアドレス。(あなたのアドレスです。) |
CheckID | 文字列 | レジャーで取り消すCheckオブジェクトのID。この情報を確認するには、txメソッドを使用してCheckCreateトランザクションのメタデータを調べるか、またはaccount_objectsメソッドを使用してCheckを探します。 |
CheckCancelトランザクションの準備の例
Checkを取り消す例を以下に示します。
{ "TransactionType": "CheckCancel", "Account": "rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo", "CheckID": "49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0", "Fee": "12" }
2. CheckCancelトランザクションの署名
トランザクションに署名する最も安全な方法は、クライアントライブラリを使用してローカルで署名することです。signメソッドを使用してトランザクションに署名することもできますが、その場合は信頼できる暗号化された接続を使用するか、ローカル接続を使用して、自分が管理しているサーバに対してのみに行うようにしてください。
いずれの場合も、後のために、署名したトランザクションの識別用ハッシュを書き留めておいてください。
リクエストの例
'use strict' const RippleAPI = require('ripple-lib').RippleAPI // Can sign offline if the txJSON has all required fields const api = new RippleAPI() const txJSON = '{"Account":"rBXsgNkPcDN2runsvWmwxk3Lh97zdgo9za","TransactionType":"CheckCancel","CheckID":"2E0AD0740B79BE0AAE5EDD1D5FC79E3C5C221D23C6A7F771D85569B5B91195C2","Flags":2147483648,"LastLedgerSequence":8004884,"Fee":"12","Sequence":7}' // Be careful where you store your real secret. const secret = 's████████████████████████████' const signed = api.sign(txJSON, secret) console.log("tx_blob is:", signed.signedTransaction) console.log("tx hash is:", signed.id)
レスポンスの例
tx_blob is: 12001222800000002400000007201B007A251450182E0AD0740B79BE0AAE5EDD1D5FC79E3C5C221D23C6A7F771D85569B5B91195C268400000000000000C732103B6FCD7FAC4F665FE92415DD6E8450AD90F7D6B3D45A6CFCF2E359045FF4BB4007446304402205D77451B0D7BCDA1FE5B98763C5B3B2837453371FE93C2B86157C44B1867AE36022003800273848BC2F8E1C6EC7EE4B0CB2425A888AE80E586886C306C796B25678B8114735FF88E5269C80CD7F7AF10530DAB840BBF6FDF tx hash is: 54A7A917BE9AC13962251BCF1D09803C7BBE75882B8BFC987B5933A566A48215
3. 署名済みCheckCancelトランザクションの送信
前のステップで署名したトランザクションblobをrippled
サーバに送信します。これはrippled
サーバを実行していなくても安全にできます。レスポンスには仮の結果が含まれ、それはtesSUCCESS
であるべきですが、この結果は通常は最終的なものではありません。キューに入れられたトランザクションは通常、次のオープンレジャーのバージョンに含まれるからです(通常、送信から約10秒後となります)。
ヒント: 仮の結果が tefMAX_LEDGER
であった場合、そのトランザクションのLastLedgerSequence
パラメータが現在のレジャー番号よりも低いため、そのトランザクションが失敗しています。これは、トランザクション情報を準備してから送信するまでに、予想されるレジャーのバージョン数よりも長くかかった場合に起こります。このような場合は、LastLedgerSequence
の値を大きくしてステップ1からやり直してください。
リクエストの例
'use strict' const RippleAPI = require('ripple-lib').RippleAPI // This example connects to a public Test Net server const api = new RippleAPI({server: 'wss://s.altnet.rippletest.net:51233'}) api.connect().then(() => { console.log('Connected') const tx_blob = "12001222800000002400000007201B007A251450182E0AD0740B79BE0AAE5EDD1D5FC79E3C5C221D23C6A7F771D85569B5B91195C268400000000000000C732103B6FCD7FAC4F665FE92415DD6E8450AD90F7D6B3D45A6CFCF2E359045FF4BB4007446304402205D77451B0D7BCDA1FE5B98763C5B3B2837453371FE93C2B86157C44B1867AE36022003800273848BC2F8E1C6EC7EE4B0CB2425A888AE80E586886C306C796B25678B8114735FF88E5269C80CD7F7AF10530DAB840BBF6FDF" return api.submit(tx_blob) }).then(response => { console.log("Preliminary transaction result:", response.resultCode) // Disconnect and return }).then(() => { api.disconnect().then(() => { console.log('Disconnected') process.exit() }) }).catch(console.error)
レスポンスの例
Connected
Preliminary transaction result: tesSUCCESS
Disconnected
4. 検証の待機
本番環境のネットワークやTestnetでは、レジャーが自動的に閉鎖するまでに4~7秒かかる場合があります。
スタンドアロンモードでrippled
を実行している場合は、[ledger_acceptメソッド][]を使用してレジャーを手動で閉鎖します。
5. 最終結果の確認
トランザクションのステータスを確認するには、CheckCancelトランザクションの識別用ハッシュを指定したtxメソッドを使用します。トランザクションが成功したことを示す"TransactionResult": "tesSUCCESS"
フィールドをトランザクションメタデータから検索し、またこの結果が最終結果であることを示す"validated": true
フィールドを結果から検索します。
トランザクションによってCheckレジャーオブジェクトが削除されたことを示す"LedgerEntryType": "Check"
を含むDeletedNode
オブジェクトを、トランザクションメタデータから検索します。このオブジェクトのLedgerIndex
はCheckのIDに一致している必要があります。
リクエストの例
'use strict' const RippleAPI = require('ripple-lib').RippleAPI // This example connects to a public Test Net server const api = new RippleAPI({server: 'wss://s.altnet.rippletest.net:51233'}) api.connect().then(() => { console.log('Connected') const tx_hash = "54A7A917BE9AC13962251BCF1D09803C7BBE75882B8BFC987B5933A566A48215" return api.getTransaction(tx_hash) }).then(response => { console.log("Final transaction result:", response) // Disconnect and return }).then(() => { api.disconnect().then(() => { console.log('Disconnected') process.exit() }) }).catch(console.error)
レスポンスの例
Connected Final transaction result: { type: 'checkCancel', address: 'rBXsgNkPcDN2runsvWmwxk3Lh97zdgo9za', sequence: 7, id: '54A7A917BE9AC13962251BCF1D09803C7BBE75882B8BFC987B5933A566A48215', specification: { checkID: '2E0AD0740B79BE0AAE5EDD1D5FC79E3C5C221D23C6A7F771D85569B5B91195C2' }, outcome: { result: 'tesSUCCESS', timestamp: '2018-04-02T23:42:22.000Z', fee: '0.000012', balanceChanges: { rBXsgNkPcDN2runsvWmwxk3Lh97zdgo9za: [Array] }, orderbookChanges: {}, ledgerVersion: 8004870, indexInLedger: 3 } } Disconnected