コンテンツにスキップ

ペイメントチャネルの残高を請求する | JavaScriptでのXRPL開発 四段編

この章では、作成したペイメントチャネルの残高から資金を請求する方法について紹介します。

前提

ボブはアリスに対し、以下の事項を行なっている前提となります。

  • 事前にチャネルを作成し10 XRPをデポジット済みです。
  • 事前に合計1 XRP分のオフレジャー取引を完了済みです。

スクリプトの作成

  1. プロジェクトディレクトリにclaimPaymentChannel.jsという新しいファイルを作成します。

  2. 以下のコードをclaimPaymentChannel.jsに貼り付けます。

    このコードは、指定されたチャネルID、支払い量、署名に対して取引を請求するサンプルコードです。

    claimPaymentChannel.js
    import { xrpToDrops, signPaymentChannelClaim } from 'xrpl';
    import { client, aliceWallet, bobWallet } from './config.js';
    const claimPaymentChannel = async (channelId, amount, paychanSignature) => {
    try {
    // PaymentChannelClaimトランザクションを作成
    const tx = {
    TransactionType: 'PaymentChannelClaim',
    Account: aliceWallet.address, // 受領人(アリス)のアドレス
    Channel: channelId, // チャネルID
    Balance: xrpToDrops(amount), // 要求する金額(drop単位)
    Amount: xrpToDrops(amount), // 支払う金額(drop単位)
    Signature: paychanSignature, // オフレジャー取引の署名の文字列
    PublicKey: bobWallet.publicKey, // 送金人の公開鍵
    };
    console.log('Submitting a PaymentChannelClaim transaction...');
    const response = await client.submitAndWait(tx, { wallet: aliceWallet }); // 受領人(アリス)が署名
    console.log('PaymentChannelClaim transaction response:', response);
    } catch (error) {
    console.error('Error claiming Payment Channel:', error);
    }
    };
    const main = async () => {
    try {
    await client.connect();
    const channelId = 'CHANNEL_ID_HERE'; // 事前に作成したチャネルIDを入力
    const amount = '1'; // XRPでの金額を入力
    // 事前に作成したオフレジャー支払いへの署名を指定
    const paychanSignature = 'SIGNATURE_HERE';
    // 実行
    await claimPaymentChannel(channelId, amount, paychanSignature);
    } catch (error) {
    console.error('Error connecting to XRPL:', error);
    } finally {
    await client.disconnect();
    }
    };
    main();

スクリプトの実行

  1. コマンドラインで以下のコマンドを実行して、スクリプトを実行します。

    Terminal window
    node claimPaymentChannel.js
  2. 成功すれば、コンソールに以下が表示されます。

    Terminal window
    Submitting a PaymentChannelClaim transaction...
    PaymentChannelClaim transaction response: {
    id: 12,
    result: {
    Account: 'rM6Nt2E1WKJLKMN1tbkcifveAshzVuyJmj', // アリスのアドレス
    Amount: '1000000',
    Balance: '1000000',
    Channel: '25C67138FB51F65A7015632C07E00AD0AE1C8A21F0282FD0401BAEDFDFD3423E',
    Fee: '12',
    Flags: 0,
    LastLedgerSequence: 1743094,
    PublicKey: 'ED9F9B58A0A209A1D0F90832FE83F3ED49C0091259E3F67A2FCAA3D3EAAF718FFE',
    Sequence: 1742737,
    Signature: '7465B7BCC66F1053D4CB8EF3785BE951A235868420F546160EF446429DA58632EEBBA90810F6714500E7B0A73E9DBABFE47307DC6BEC9D911D24DB473988BE04',
    SigningPubKey: 'EDE80DD6F71A48928EC70B22912D6E9B4005D1D9666939C658F931186CC9DA80B7',
    TransactionType: 'PaymentChannelClaim',
    TxnSignature: 'A9CC66C22C9000CE5B939E828FDB621419A8EE7180604B3844D52D32D27BD4F00CCB93D8AF85C0E7F08EA7DD27D5E475F8CA00FEA1EF2B6BB826EB6DA95A4902',
    ctid: 'C01A98E400000001',
    date: 772450171,
    hash: '885C753CDE40000A7452F31FB120293EFDCE39F3A442B1C5E6E924440FD32381',
    inLedger: 1743076,
    ledger_index: 1743076,
    meta: {
    AffectedNodes: [Array],
    TransactionIndex: 0,
    TransactionResult: 'tesSUCCESS' // 成功
    },
    validated: true
    },
    type: 'response'
    }

    アリスから指定されたチャネルIDに対して、請求が確定されました。

  3. もう一度、同様の請求を行った場合は、当然ながら失敗します。

    Terminal window
    Submitting a PaymentChannelClaim transaction...
    PaymentChannelClaim transaction response: {
    id: 12,
    result: {
    Account: 'rM6Nt2E1WKJLKMN1tbkcifveAshzVuyJmj',
    Amount: '1000000',
    Balance: '1000000',
    Channel: '25C67138FB51F65A7015632C07E00AD0AE1C8A21F0282FD0401BAEDFDFD3423E',
    Fee: '12',
    Flags: 0,
    LastLedgerSequence: 1744099,
    PublicKey: 'ED9F9B58A0A209A1D0F90832FE83F3ED49C0091259E3F67A2FCAA3D3EAAF718FFE',
    Sequence: 1742738,
    Signature: '7465B7BCC66F1053D4CB8EF3785BE951A235868420F546160EF446429DA58632EEBBA90810F6714500E7B0A73E9DBABFE47307DC6BEC9D911D24DB473988BE04',
    SigningPubKey: 'EDE80DD6F71A48928EC70B22912D6E9B4005D1D9666939C658F931186CC9DA80B7',
    TransactionType: 'PaymentChannelClaim',
    TxnSignature: 'A95B769AC9AD834D4798C1409B3B6708D1D4DFF79DF2F59AA185B358810930A925B948D7BD3E83EF20308FDE75275AFC5B75C164A4D70F8CB49BCDC9148A8D01',
    ctid: 'C01A9CD100330001',
    date: 772453560,
    hash: 'D3F6D62CAE3A3B8C2DAD0DEE314A55145AA1EBF2544C8B09CDD1F698EDE6621E',
    inLedger: 1744081,
    ledger_index: 1744081,
    meta: {
    AffectedNodes: [Array],
    TransactionIndex: 51,
    TransactionResult: 'tecUNFUNDED_PAYMENT' // 失敗
    },
    validated: true
    },
    type: 'response'
    }

まとめ

この時点で以下の残高になっていれば、成功していると言えるでしょう。

  • アリス: 100.999988 XRP
  • ボブ: 89.999988 XRP

アリスとボブのアドレスを、テストネット用のエクスプローラにて確認してみましょう。

  • アリスはボブの作成したペイメントチャネルに対して1 XRPを請求しましたが、このときトランザクション手数料を負担しているので、実際には0.999988 XRPを受け取ったことになっています。
  • ボブは事前に、PaymentChannelCreateトランザクションで10 XRPをデポジットした際にデポジット分と手数料を支払っているため、残高は89.999988 XRPになっているかと思います。

さらにトランザクションデータの中身を確認してみると、尚良いかと思います。