コンテンツにスキップ

ペイメントチャネルの作成方法 | JavaScriptでのXRPL開発 四段編

この章では、ペイメントチャネルの作成方法について紹介します。

ペイメントチャネルは簡単にいうと、デポジットした分のXRPから支払いが後に発生する仕組みです。チャネルを作成し、事前にデポジットをすることで、オフチェーン支払いが可能になります。

また、XRPLのペイメントチャネル機能はスマートコントラクトや外部に依存したものではなく、ネイティブに提供されている機能のため、安全に取引を行えることが事前に保証(※)されており、開発者フレンドリーな機能となっています。

※XRPLのコアのバグは除きます。

スクリプトの作成

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

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

    import { xrpToDrops, unixTimeToRippleTime } from 'xrpl';
    import { client, aliceWallet, bobWallet } from './config.js';
    const createPaymentChannel = async () => {
    try {
    const tx = {
    TransactionType: 'PaymentChannelCreate', // トランザクションタイプ: PaymentChannelCreate
    Account: bobWallet.address, // 送金者(ボブ)のアカウントアドレス
    Amount: xrpToDrops('10'), // チャネルにデポジットするXRPの量(ここでは10 XRP)
    Destination: aliceWallet.address, // 受領者(アリス)のアカウントアドレス
    SettleDelay: 86400, // 未請求のXRPがある場合に、ソースアドレスがチャネルを閉じる前の猶予時間。待機秒数(ここでは1日)
    PublicKey: bobWallet.publicKey, // 送金者(ボブ)の公開鍵
    CancelAfter: unixTimeToRippleTime(Math.floor(Date.now() / 1000) + 86400 * 30), // チャネルがキャンセルされるまでの秒数(ここでは1ヶ月)
    };
    console.log('Submitting a PaymentChannelCreate transaction...');
    const paymentChannelResponse = await client.submitAndWait(tx, {
    wallet: bobWallet,
    });
    console.log(
    'PaymentChannelCreate transaction response:',
    paymentChannelResponse
    );
    // channel_idの取得
    const response = await client.request({
    command: 'account_channels',
    account: bobWallet.address,
    });
    const channelId = response.result.channels[0].channel_id;
    console.log(`Created Payment Channel with ID: ${channelId}`);
    return channelId;
    } catch (error) {
    console.error('Error creating Payment Channel:', error);
    }
    };
    const main = async () => {
    try {
    await client.connect();
    const channelId = await createPaymentChannel();
    } catch (error) {
    console.error('Error connecting to XRPL:', error);
    } finally {
    await client.disconnect();
    }
    };
    main();

スクリプトの実行

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

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

    Terminal window
    Submitting a PaymentChannelCreate transaction...
    PaymentChannelCreate transaction response: {
    id: 10,
    result: {
    Account: 'rDW8W3rzDFUyU4pw5Ei8QL1J9nQ947h68f',
    Amount: '10000000',
    CancelAfter: 1719738684,
    Destination: 'rM6Nt2E1WKJLKMN1tbkcifveAshzVuyJmj',
    Fee: '12',
    Flags: 0,
    LastLedgerSequence: 1742776,
    PublicKey: 'ED9F9B58A0A209A1D0F90832FE83F3ED49C0091259E3F67A2FCAA3D3EAAF718FFE',
    Sequence: 1742740,
    SettleDelay: 86400,
    SigningPubKey: 'ED9F9B58A0A209A1D0F90832FE83F3ED49C0091259E3F67A2FCAA3D3EAAF718FFE',
    TransactionType: 'PaymentChannelCreate',
    TxnSignature: '8B87011388FFED13070AFB88D936D7903D26A481036043ABD27BEC13CA5531610A667BCFE18B2F7090EB04E611EAFDC3DA0082C72937FCB9DB2EEDE6AA5F4602',
    ctid: 'C01A97A600070001',
    date: 772449090,
    hash: '860DD9F668836971343AE84BE111D451A3F0C4BBE4BD92E36D3BCAC5E2571BB4',
    inLedger: 1742758,
    ledger_index: 1742758,
    meta: {
    AffectedNodes: [Array],
    TransactionIndex: 7,
    TransactionResult: 'tesSUCCESS'
    },
    validated: true
    },
    type: 'response'
    }
    Created Payment Channel with ID: 25C67138FB51F65A7015632C07E00AD0AE1C8A21F0282FD0401BAEDFDFD3423E

    上記ログの最後に出力されたID(25C67138FB51F65A7015632C07E00AD0AE1C8A21F0282FD0401BAEDFDFD3423E)がChannel IDとなりますので、メモしておきましょう。

    ※実際の開発では、取得したIDをそのまま引き継いでオフレジャー取引などを行う必要があります。

次に、作成されたChannel IDを使用してオフレジャー取引を行います。具体的な手順は次のセクションで解説します。