ペイメントチャネルの作成方法 | JavaScriptでのXRPL開発 四段編
この章では、ペイメントチャネルの作成方法について紹介します。
ペイメントチャネルは簡単にいうと、デポジットした分のXRP
から支払いが後に発生する仕組みです。チャネルを作成し、事前にデポジットをすることで、オフチェーン支払いが可能になります。
また、XRPLのペイメントチャネル機能はスマートコントラクトや外部に依存したものではなく、ネイティブに提供されている機能のため、安全に取引を行えることが事前に保証(※)されており、開発者フレンドリーな機能となっています。
※XRPLのコアのバグは除きます。
スクリプトの作成
-
プロジェクトディレクトリに
createPaymentChannel.js
という新しいファイルを作成します。 -
以下のコードを
createAccounts.js
に貼り付けます。import { xrpToDrops, unixTimeToRippleTime } from 'xrpl';import { client, aliceWallet, bobWallet } from './config.js';const createPaymentChannel = async () => {try {const tx = {TransactionType: 'PaymentChannelCreate', // トランザクションタイプ: PaymentChannelCreateAccount: 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();
スクリプトの実行
-
コマンドラインで以下のコマンドを実行して、スクリプトを実行します。
Terminal window node createPaymentChannel.js -
成功すれば、コンソールに以下が表示されます。
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
を使用してオフレジャー取引を行います。具体的な手順は次のセクションで解説します。