コンテンツにスキップ

オフレジャー支払いへの署名と検証 | JavaScriptでのXRPL開発 四段編

このガイドでは、オフレジャー支払いと署名、検証を行う方法について紹介します。

スクリプトの作成

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

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

    このコードは、1,000件の支払いを行うサンプルコードです。

    ※以下は、毎回0.001ずつ支払いが増えていき、最終的に最大1 XRP支払うループです。

    signPaymentChannelClaim.js
    import {
    signPaymentChannelClaim,
    verifyPaymentChannelClaim,
    xrpToDrops,
    } from 'xrpl';
    import { client, bobWallet } from './config.js';
    const signAndVerifyClaims = async (channelId) => {
    let paychanSignature = '';
    console.time();
    for (let i = 1; i <= 1000; i++) {
    const amount = (0.001 * i).toFixed(6); // 小数点以下6桁に固定
    const amountFormatted = parseFloat(amount).toString(); // XRP建
    // 送金人: オフレジャー支払いへの署名
    paychanSignature = signPaymentChannelClaim(
    channelId,
    amountFormatted, // XRP建の量での指定
    bobWallet.privateKey
    );
    // 受取人: オフレジャー支払い情報の検証
    if (
    !verifyPaymentChannelClaim(
    channelId,
    amountFormatted, // XRP建の量での指定
    paychanSignature,
    bobWallet.publicKey
    )
    ) {
    throw new Error('Invalid signature');
    }
    }
    console.timeEnd();
    return paychanSignature;
    };
    const main = async () => {
    try {
    await client.connect();
    const channelId = 'CHANNEL_ID_HERE'; // 事前に作成したチャネルIDを入力
    const signature = await signAndVerifyClaims(channelId);
    console.log(`Generated signature: ${signature}`);
    } catch (error) {
    console.error('Error connecting to XRPL:', error);
    } finally {
    await client.disconnect();
    }
    };
    main();

スクリプトの実行

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

    Terminal window
    node signPaymentChannelClaim.js
  2. 成功すれば、以下のような結果がコンソールに表示されますので、Generated signature:の右側に表示された文字列を確認し、メモしてください。

    Terminal window
    default: 1.605s
    Generated signature: 7465B7BCC66F1053D4CB8EF3785BE951A235868420F546160EF446429DA58632EEBBA90810F6714500E7B0A73E9DBABFE47307DC6BEC9D911D24DB473988BE04

    1,000件のオフレジャー支払いにかかった時間はたったの1.605sでした。(筆者のローカル環境での結果となります。)

    このように、オフレジャー取引を行うことで1,000件を超える支払いを数秒で完了させることができます。

    上記結果のsignatureの値、7465B7BCC66F1053D4CB8EF3785BE951A235868420F546160EF446429DA58632EEBBA90810F6714500E7B0A73E9DBABFE47307DC6BEC9D911D24DB473988BE04 に当たる文字列は次章で必要になりますので、メモしておいてください。

チャネルの状態を確認する

ここで一度、チャネルの状態を確認してみましょう。

スクリプトの作成

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

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

    チャネルの状態を確認するにはaccount_channelsコマンドを使用します。

    checkChannelBalance.js
    import { client, aliceWallet, bobWallet } from './config.js';
    const checkChannelBalance = async (channelId) => {
    try {
    // チャネル情報を取得
    const response = await client.request({
    command: 'account_channels',
    account: bobWallet.address, // チャネルの送金人のアカウント
    destination_account: aliceWallet.address, // チャネルの受領人のアカウント
    });
    const channel = response.result.channels.find(
    (ch) => ch.channel_id === channelId
    );
    if (channel) {
    console.log(`Channel ID: ${channel.channel_id}`);
    console.log(`Balance: ${channel.balance} drops`);
    console.log(`Amount: ${channel.amount} drops`);
    } else {
    console.log(`Channel with ID ${channelId} not found.`);
    }
    } catch (error) {
    console.error('Error checking channel balance:', error);
    }
    };
    const main = async () => {
    try {
    await client.connect();
    // 事前に作成したチャネルIDを入力
    const channelId = 'CHANNEL_ID_HERE';
    await checkChannelBalance(channelId);
    } catch (error) {
    console.error('Error connecting to XRPL:', error);
    } finally {
    await client.disconnect();
    }
    };
    main();

スクリプトの実行

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

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

    Terminal window
    Channel ID: E965B919E140BCF98280B29F6861C23BBB753B9D5515EDD57A285391BA20CCA2
    Balance: 1000000 drops // チャネルに対してオフレジャー取引を行った総量(現在: 1 XRP)
    Amount: 10000000 drops // デポジットした量(10 XRP)

まとめ

この章では、オフレジャー支払いの署名と検証、およびペイメントチャネルの状態を確認する方法について解説しました。

オフレジャー支払いは、署名と検証を通じてその有効性を確認することで、迅速かつ効率的に複数の支払いを行うことができます。
また、ペイメントチャネルの状態を確認することで、チャネル内の現在の残高やデポジットされた総額を把握することができました。

次章では、実際に資金を請求する方法について紹介します。取得した署名を使用して、チャネルの残高を請求する手順を学びましょう。